2011-08-01 53 views
1

無法在任何地方找到解決方案。我使用的是從CodeIgniter的框架模板分析器類和我通過模板列表,並使用它像這樣:CodeIgniter - 模板類迭代列表不止一次

{categories} 
    <li><a href="{id}">{name}</a></li> 
{/categories} 

再後來就在模板中,我再次使用它。

{categories} 
    <li><a href="{id}">{name}</a></li> 
{/categories} 

但是,它不會第二次工作,輸出html是。

{categories} 
{name} 
{/categories} 

完全忽略語法,爲什麼只能在模板中迭代一次列表?

+0

*您正在使用哪個*模板分析器類?你期望它應該如何工作,你爲什麼期望如此? – hakre

+0

內置模板解析器類。我期望我能夠多次遍歷列表{list} {/ list},並且因爲那是多麼聰明。 – user781439

回答

1

模板解析器類是而不是一個完整的模板解析解決方案。爲了保持最佳性能,我們一直非常精益求精。 REF

看起來像重置數組之前迭代它不是一個功能。隨時在項目主頁上報告問題。

+0

非常感謝。猜猜我會尋找更好的模板解決方案。 – user781439

+0

或將問題報告給項目。我認爲這是值得的,因爲你想使用它。應該很容易實現。 – hakre

2

我知道這篇文章已經超過一歲了,但我有一個解決方案。 CI模板解析器的輕量級是我最近需要的一個項目,但我也遇到了同一個模板中多次出現相同變量對的問題。我依靠str_replace()替換字符串數組的能力解決了這個問題。將以下代碼投入到./application/libraries/MY_Parser.php中:

<?php if (! defined('BASEPATH')) exit('No direct script access allowed'); 

/** 
* Overrides the CI Template Parser to allow for multiple occurrences of the 
* same variable pair 
* 
*/ 
class MY_Parser extends CI_Parser { 

    /** 
    * Parse a tag pair 
    * 
    * Parses tag pairs: {some_tag} string... {/some_tag} 
    * 
    * @access private 
    * @param string 
    * @param array 
    * @param string 
    * @return string 
    */ 
    function _parse_pair($variable, $data, $string) 
    { 
     if (FALSE === ($match = $this->_match_pair($string, $variable))) 
     { 
      return $string; 
     } 

     $str = array(); 

     foreach ($match['0'] as $mkey => $mval) 
     { 
      $str[$mkey] = ''; 

      foreach ($data as $row) 
      { 
       $temp = $match['1'][$mkey]; 
       foreach ($row as $key => $val) 
       { 
        if (! is_array($val)) 
        { 
         $temp = $this->_parse_single($key, $val, $temp); 
        } 
        else 
        { 
         $temp = $this->_parse_pair($key, $val, $temp); 
        } 
       } 

       $str[$mkey] .= $temp; 
      } 
     } 

     return str_replace($match['0'], $str, $string); 
    } 

    // -------------------------------------------------------------------- 

    /** 
    * Matches a variable pair 
    * 
    * @access private 
    * @param string 
    * @param string 
    * @return mixed 
    */ 
    function _match_pair($string, $variable) 
    { 
     if (! preg_match_all("|" . preg_quote($this->l_delim) . $variable . preg_quote($this->r_delim) . "(.+?)". preg_quote($this->l_delim) . '/' . $variable . preg_quote($this->r_delim) . "|s", $string, $match)) 
     { 
      return FALSE; 
     } 

     return $match; 
    } 
} 
// END Parser Class 

/* End of file MY_Parser.php */ 
/* Location: ./application/libraries/MY_Parser.php */