无法在任何地方找到解决方案。我正在使用CodeIgniter框架中的模板解析器类,我将模板传递给列表并使用它如下:
{categories}
<li><a href="{id}">{name}</a></li>
{/categories}
然后在模板中我再次使用它。
{categories}
<li><a href="{id}">{name}</a></li>
{/categories}
但是,它第二次不起作用,输出html是。
{categories}
{name}
{/categories}
完全忽略语法,为什么你只能在模板中迭代一次列表?
答案 0 :(得分: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 */
答案 1 :(得分:1)
模板分析器类不是一个完整的模板分析解决方案。为了保持最佳性能,我们一直非常精益求精。 REF
看起来在迭代之前重置数组不是一个功能。您可以在项目主页上报告问题。