2017-04-16 113 views
1
$global_models = 
      array(12) { 
       ["page.login"]=> 
       string(1) "2" 
       ["page.item.id"]=> 
       string(3) "new" 
       ["page.content.title"]=> 
       string(0) "" 
       ["page.trigger.date"]=> 
       string(0) "" 
       ["page.trigger.url"]=> 
       string(0) "" 
       ["page.trigger.admin_only"]=> 
       string(1) "N" 
       ["page.content.body"]=> 
       string(0) "" 
       ["page..ga"]=> 
       string(27) "GA1.2.1694644634.1491872034" 
       ["prompt.message"]=> 
       string(0) "" 
       ["prompt.error"]=> 
       string(0) "" 
       ["page.tags"]=> 
       array(1) { 
       ["name"]=> 
       array(2) { 
        [0]=> 
        string(2) "xx" 
        [1]=> 
        string(2) "yy" 
       } 
       } 
       ["page.custom"]=> 
       array(2) { 
       ["header"]=> 
       array(2) { 
        [0]=> 
        string(0) "1" 
        [1]=> 
        string(1) "a" 
       } 
       ["value"]=> 
       array(2) { 
        [0]=> 
        string(0) "2" 
        [1]=> 
        string(1) "b" 
       } 
       } 
      } 

代碼:模板引擎重構

 foreach ($global_models as $var => $data) { 
      // when model data is an array 
      if (is_array($data)) { 
       // fetch for blocks and render loops 
       $forblocks = array(); 
       preg_match_all('/(?<block>\[for:'.$var.'\](?<content>[\s\S]+)\[end:'.$var.'\])/ix', $view_output, $forblocks, PREG_SET_ORDER); 
       if (count($forblocks)) { 
        foreach ($forblocks as $foundForBlock) { 
         $foreach_data = ''; 
         foreach ($data as $mykey => $row) { 
          // set model values within the loop, ex: blocks.x value 
          $block_content = $foundForBlock['content']; 
          foreach ($row as $subvar => $value) { 
           if (!is_array($value)) { 
            $block_content = str_replace('['.$var.'.'.$subvar.']', $value, $block_content); 
            //$block_content = str_replace('['.$var.'.'.$mykey.']', $value, $block_content); 
           } 
          } 
          // append the parsed new block (of for loop) as processed view to render (ifs and setters for example) 
          $foreach_data .= $this->process_view($controller, $block_content, $recursion_level + 1); 
         } 
         $view_output = str_replace($foundForBlock['block'], $foreach_data, $view_output); 
        } 
       } 
      } else { 
       // simple model, replace model with value ex: "[stats.x]" by "18" 
       $view_output = str_replace('['.$var.']', $data, $view_output); 
      } 
     } 

問題:

關鍵值對工作

我的數據不工作的模塊...

$viewoutput = 
" 
    [page.login] 
" 

應導致

" 
2 
" 

此:

$viewoutput = 
" 
[for:page.custom] 
     [page.custom.header] - [page.custom.value] 
[end:page.custom] 
" 

應導致

" 
    1 - 2 
    a - b 
" 

此:

$viewoutput = 

" 
[for:page.tags] 
     [page.tags.name] 
[end:page.tags] 
" 

應導致

" 
    xx 
    yy 
" 

我重構了我的代碼約20次,每次我頭疼......!

有人請幫忙嗎?

感謝和萬歲啦社區! :)

+0

全碼: https://github.com/LucLaverdure/ShiftSmith/blob/master/core/core-process .php –

+0

你能告訴我你正在試圖用你的'$ global_models'來做什麼,這樣我們可以幫你解決問題。 –

+0

使用$ global_models中的值解析view_output –

回答

1

修正自己...這裏提供

 // process shared models (variables) 
     foreach ($global_models as $var => $data) { 
      // when model data is an array 
      if (is_array($data)) { 
       // fetch for blocks and render loops 
       $forblocks = array(); 
       preg_match_all('/(?<block>\[for:'.$var.'\](?<content>[\s\S]+)\[end:'.$var.'\])/ix', $view_output, $forblocks, PREG_SET_ORDER); 
       if (count($forblocks)) { 
        foreach ($forblocks as $foundForBlock) { 
         $block_content = array(); 
         foreach ($data as $mykey => $row) { 
         //$foreach_data = ''; 
          // set model values within the loop, ex: blocks.x value 
          foreach ($row as $subvar => $value) { 
           if (!isset($block_content[$subvar])) $block_content[$subvar] = $foundForBlock['content']; 
           if (!is_array($value)) { 
            if (is_numeric($subvar)) { 
             $block_content[$subvar] = str_replace('['.$var.'.'.$mykey.']', $value, $block_content[$subvar]); 

            } 
           } 
          } 
          // append the parsed new block (of for loop) as processed view to render (ifs and setters for example) 
         } 
         $block_content = implode("\n", $block_content); 
         $view_output = str_replace($foundForBlock['block'], $block_content, $view_output); 
        } 
       } 
      } else { 
       // simple model, replace model with value ex: "[stats.x]" by "18" 
       $view_output = str_replace('['.$var.']', $data, $view_output); 
      } 
     } 
2

我已經盡我所能來完成它。我知道這不是一個通用的解決方案,但它會解決您當前的問題。您必須使用不同的功能才能使用loop[for:page.custom])和simple[page.login])屬性。我已經經歷了這個問題。我也通過這個解決了我的一個問題,在這裏你應該定義一個獨立的函數,它將首先決定哪個函數將處理修改,無論是循環還是簡單。但是現在我已經用一個php函數解決了你的問題。

Try this code snippet here

<?php 
ini_set('display_errors', 1); 
$global_models = array(
    "page.login" => "2", 
    "page.item.id" => "new", 
    "page.content.title" => "", 
    "page.trigger.date" => "", 
    "page.trigger.url" => "", 
    "page.trigger.admin_only" => "N", 
    "page.content.body" => "testing", 
    "page..ga" => "GA1.2.1694644634.1491872034", 
    "prompt.message" => "", 
    "prompt.error" => "", 
    "page.tags" => 
    array(
     "name" => 
     array(
      0 => "xx", 
      1 => "yy" 
     ) 
    ), 
    "page.custom" => 
    array(
     "header" => 
     array(
      0 => "1", 
      1 => "a", 
     ), 
     "value" => 
     array(
      0 => "2", 
      1 => "b", 
     ) 
    ) 
); 
$viewoutput = 
" 
    [page.content.body] 
[for:page.custom] 
     [page.custom.header] - [page.custom.value] 
[end:page.custom] 
"; 

echo modify($viewoutput); 

function modify($viewoutput) 
{ 
    $returnString=""; 
    global $global_models; 
    $segments=explode("\n", $viewoutput); 
    $counter=0; 
    while(count($segments)>0) 
    { 
     $segment=$segments[$counter]; 
     if (preg_match("/\[for:\K([\w\.]+)\]/", $segment,$matches)) 
     { 
      unset($segments[$counter]); 
      $counter++; 
      $segment=$segments[$counter]; 
      $pointer=0; 
      $data=array(); 

      preg_match_all("/\.([\w]+)\]/", $segment,$segmentMatches); 
      for($x=0;$x<count($global_models[$matches[1]][$segmentMatches[1][0]]);$x++) 
      { 
       $newString=$segment; 
       foreach($segmentMatches[1] as $toReplace) 
       { 
        $newString= str_replace("[".$matches[1].".".$toReplace."]", $global_models[$matches[1]][$toReplace][$x], $newString); 
       } 
       $data[]=$newString; 
      } 
     } 
     elseif(preg_match("/\[end:\K([\w\.]+)\]/", $segment)) 
     { 
      $returnString.= implode("\n", $data); 
     } 
     elseif(preg_match("/\[([\w\.]+)\]/", $segment,$matches1) && !preg_match("/\[for:\K([\w\.]+)\]/", $segment,$matches)) 
     { 
      $returnString=$returnString.$global_models[$matches1[1]]."\n"; 
     } 
     else 
     { 
      $returnString=$returnString.$segment."\n"; 
     } 
     unset($segments[$counter]); 
     $counter++; 
    } 
    return $returnString; 
} 
+0

我將盡快修改,問題仍然是最佳答案,歡呼! –

+0

@LucLaverdure我可以問你最適合你的答案是什麼? –

+0

這隻能通過行來分析代碼,我可以使用它並修改它。但是在這裏執行代碼太遲了。 –