2017-04-16 36 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

这只能通过行来分析代码,我可以使用它并修改它。但是在这里执行代码太迟了。 –