Расширенный анализатор шаблонов: CodeIgniter ... Ошибка с вложенными массивами - PullRequest
4 голосов
/ 08 июля 2011

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

 Array
    (
                [users] => Array
                    (
                        [0] => Array
                            (
                                [id] => 42
                                [username] => jordanarseno
                                [posts] => Array
                                    (
                                        [0] => Array
                                            (
                                                [id] => 1354
                                                [title] => foo
                                            )
                                        [1] => Array
                                            (
                                                [id] => 1350
                                                [title] => bar
                                            )
                                    )
                            )
                    ) 
    )

Я могу отобразить пользователей подробностей ... {username}, {firstname} и т. Д. Но я не могу отобразить сообщений деталей.

Код моего шаблона прост и следующий:

{users}
    {username}
    {posts}
        {title}
    {/posts}
{/users}

PHP выдает следующие ошибки:

Обнаружена ошибка PHP. Серьезность: Предупреждающее сообщение: preg_match_all () [function.preg-match-all]: компиляция не удалось: ничего не повторить по смещению 2 Имя файла: library / Parser.php Line Номер: 474

Я начинаю думать, что библиотека не поддерживает вложенные массивы, поскольку несколько вложенных массивов, как мне нужно. Библиотека поставляется со многими тестами. Существует специальный тест, который требует:

 [posts] => Array
        (
            [0] => Array
                (
                    [title] => first post
                    [paras] => Array
                        (
                            [main] => foo
                            [short] => bar
                        )

                )

И правильно отображает его в виде. Однако, как вы можете видеть, мои требования состоят в том, чтобы он шел еще на один слой.

Кто-нибудь еще использует эту библиотеку и сталкивались ли вы с подобными проблемами? Если нет, что вы используете для разбора шаблона CodeIgniter? Как вложенный это пойдет? Я открыт для всех предложений и при необходимости перейду в другую библиотеку.

Ответы [ 4 ]

3 голосов
/ 12 июля 2011

Codeigniter и парсеры - это то, с чем лично у меня были проблемы.Найти хорошо поддерживаемую библиотеку нелегко, но есть некоторые приличные.

Я использую Dwoo, это была единственная, которую я попробовал, которая работала прямо из коробки.Это достаточно хорошо поддерживается, с моего времени его использования;он поддерживает вложенные циклы и имеет довольно приличную систему кеширования. Лично я не нахожу это таким же весомым, как Smarty.

Оболочка Dwoo Codeigniter написана парнем по имени Фил Стерджен, и вы можете найти егоздесь:

https://github.com/philsturgeon/codeigniter-dwoo

Вы можете найти больше информации о Dwoo здесь:

http://wiki.dwoo.org/index.php/Main_Page

И вот ссылка на некоторые функциион поддерживает (у меня возникли проблемы с поиском этой страницы изначально, хотя она находится прямо в навигационной панели, хаха)

http://wiki.dwoo.org/index.php/Plugins

И если он не делает то, что вы хотите,расширить это довольно просто ... Это все есть в вики .. Удачи!

0 голосов
/ 23 марта 2013

Эта функциональность включена во встроенный шаблон класса. (Я не знаю, существовал ли он, когда вы впервые опубликовали вопрос, но сейчас он есть, я использую его сам.) Хитрость в том, чтобы создать правильную структуру массива для передачи парсеру. Я только что протестировал этот пример на живой странице, 100% работает в CI 2.1.3.

В качестве конкретного примера рассмотрим этот код, который отображает (с минимальным форматированием) ряд номеров, доступных в отеле, и показывает для каждой комнаты расценки за день для каждого дня вашего путешествия. (2 дня, в этом примере.)

{available_rooms}
    <p>{room_type} {total_rate}</p>
    {room_rates}
        <p>${room_rate} {room_date}</p>
    {/room_rates}
    <hr>
{/available_rooms}

Без надписи похож на:

1 King Bed 119.98
 59.99 2013-03-23
 59.99 2013-03-24

1 King Bed 119.98
 59.99 2013-03-23
 59.99 2013-03-24

2 Double Beds 139.98
 69.99 2013-03-23
 69.99 2013-03-24

2 Double Beds 139.98
 69.99 2013-03-23
 69.99 2013-03-24

Это массив, который я успешно использовал в этом примере.

> available_rooms > 0 > room_type = 1 King Bed 
> available_rooms > 0 > total_rate = 119.98 
> available_rooms > 0 > room_rates > 0 > room_rate = 59.99 
> available_rooms > 0 > room_rates > 0 > room_date = 2013-03-23 
> available_rooms > 0 > room_rates > 1 > room_rate = 59.99 
> available_rooms > 0 > room_rates > 1 > room_date = 2013-03-24 
> available_rooms > 1 > room_type = 1 King Bed 
> available_rooms > 1 > total_rate = 119.98 
> available_rooms > 1 > room_rates > 0 > room_rate = 59.99 
> available_rooms > 1 > room_rates > 0 > room_date = 2013-03-23 
> available_rooms > 1 > room_rates > 1 > room_rate = 59.99 
> available_rooms > 1 > room_rates > 1 > room_date = 2013-03-24 
> available_rooms > 2 > room_type = 2 Double Beds 
> available_rooms > 2 > total_rate = 139.98 
> available_rooms > 2 > room_rates > 0 > room_rate = 69.99 
> available_rooms > 2 > room_rates > 0 > room_date = 2013-03-23 
> available_rooms > 2 > room_rates > 1 > room_rate = 69.99 
> available_rooms > 2 > room_rates > 1 > room_date = 2013-03-24 
> available_rooms > 3 > room_type = 2 Double Beds 
> available_rooms > 3 > total_rate = 139.98 
> available_rooms > 3 > room_rates > 0 > room_rate = 69.99 
> available_rooms > 3 > room_rates > 0 > room_date = 2013-03-23 
> available_rooms > 3 > room_rates > 1 > room_rate = 69.99 
> available_rooms > 3 > room_rates > 1 > room_date = 2013-03-24
0 голосов
/ 19 сентября 2011

Существует простой способ исправить это: поставить массивы в качестве первых переменных в модели

0 голосов
/ 10 июля 2011

К сожалению, похоже, что это ошибка в CodeIgniter. Самое раннее упоминание об этом - это 2009 ( каким-то образом я скопировал неправильную ссылку здесь изначально (и сейчас не могу найти ссылку) ... списать это на мелочи? В любом случае, спасибо Уэсли Марчу за указывая на это ), но я не вижу его ни в каких исправлениях ошибок.

Итак, в чем проблема? Числовые индексы надоедливы. Есть несколько способов это исправить. Во-первых, вы можете загрузить представление в строку и манипулировать ею так же, как вашим массивом, а затем вывести результаты ... (ужасно звучит)

Или ... вы можете попытаться исправить версию CI, которая у вас есть. В MY_Parser попробуйте это ( полностью не проверено, на самом деле я собираюсь выйти из системы на ночь):

function _parse_pair($variable, $data, $string)
{
    $num = is_numeric($variable);
    if (!$num && FALSE === ($match = $this->_match_pair($string, $variable)))
    {
        return $string;
    }

    $str = '';
    foreach ($data as $row)
    {
        $temp = $num? $match['1']: $string;
        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 .= $temp;
    }

    if(!$num) return str_replace($match['0'], $str, $string);
    return $str;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...