扩展模板分析器:CodeIgniter ...嵌套数组的问题

时间:2011-07-08 02:54:26

标签: parsing templates codeigniter

我目前正在使用Extended Template Parser Library进行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重复   文件名:libraries / Parser.php Line   编号:474

我开始认为该库不支持嵌套数组,因为我需要多个子数组。该库附带了许多测试。需要进行特定测试:

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

                )

并在视图中正确呈现它。但是,正如您所看到的,我的要求是它进一步进入一层。

是否有其他人使用此库并遇到类似问题? 如果没有,您使用什么CodeIgniter模板解析?怎么嵌套呢?我愿意接受所有建议,并在需要时转移到另一个图书馆。

4 个答案:

答案 0 :(得分:3)

Codeigniter和解析器是我个人遇到的麻烦。找到一个支持良好的图书馆并不容易,但那里有一些不错的图书馆。

我使用的是Dwoo,这是我尝试过的唯一一个直接开箱的人。从我使用它开始,它得到了相当好的支持;它确实支持嵌套循环并且具有相当不错的缓存系统..我个人并不认为它像Smarty一样重要。

Dwoo Codeigniter包装是由一个叫Phill Sturgeon的人写的,你可以在这里找到它:

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

您可以在此处找到有关Dwoo的更多信息:

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

这是一个链接到它支持的一些功能(我最初找不到这个页面,即使它正好在导航窗格中哈哈)

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

如果它没有达到你想要的效果,那么扩展它就非常简单了...这就是Wiki中的所有内容..祝你好运!

答案 1 :(得分:0)

不幸的是,这似乎是CodeIgniter中的一个错误。我见过的最早的参考文献是2009年(不知怎的,我原本在这里复制了错误的链接(我现在找不到链接)...想要用尽它?不管怎样,感谢Wesley Murch指出来),但我似乎没有在任何错误修复中看到它。

那么,问题是什么?数字索引很麻烦。有几种方法可以解决它。首先,你可以将视图加载到一个字符串中,并操纵它和你的数组,然后输出结果......(声音很糟糕)

或者......您可以尝试修复您拥有的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;
}

答案 2 :(得分:0)

有一种简单的方法可以修复它: 将数组作为模型

中的第一个变量

答案 3 :(得分:0)

此功能包含在内置模板类中。 (我不知道你第一次发布这个问题时是否存在,但它现在在那里,我自己使用它。)诀窍是创建适当的数组结构传递给解析器。我刚才在实时页面中测试了这个例子,在CI 2.1.3中100%工作。

作为一个具体的例子,请考虑这个代码,它显示(格式最小化)酒店提供的一系列房间,并显示每个房间每天旅行的费率。 (在本例中为2天。)

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

out out类似于:

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
相关问题