CodeIgniter - шаблонный класс, повторяющий списки более одного раза - PullRequest
1 голос
/ 02 августа 2011

Не могу найти решение нигде. Я использую класс синтаксического анализатора шаблона из среды CodeIgniter, и я передаю шаблону список и использую его следующим образом:

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

затем в шаблоне я использую его снова.

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

Однако, это не работает во второй раз, выходной html -.

{categories}
{name}
{/categories}

Полностью игнорируя синтаксис, почему вы можете повторять список только один раз в шаблоне?

Ответы [ 2 ]

2 голосов
/ 11 декабря 2012

Я знаю, что этому посту уже более года, но у меня есть решение.Легковесность синтаксического анализатора шаблона 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 голос
/ 02 августа 2011

Класс анализатора шаблонов - это , а не - полнофункциональное решение для анализа шаблонов.Мы держали его очень нарочито, чтобы поддерживать максимальную производительность. REF

Похоже, что сброс массива до итерации по нему не является функцией.Не стесняйтесь сообщать о проблеме на главной странице проекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...