CodeIgniter - 模板类迭代列表不止一次

时间:2011-08-01 23:56:18

标签: php templates codeigniter

无法在任何地方找到解决方案。我正在使用CodeIgniter框架中的模板解析器类,我将模板传递给列表并使用它如下:

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

然后在模板中我再次使用它。

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

但是,它第二次不起作用,输出html是。

{categories}
{name}
{/categories}

完全忽略语法,为什么你只能在模板中迭代一次列表?

2 个答案:

答案 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

看起来在迭代之前重置数组不是一个功能。您可以在项目主页上报告问题。