2011-07-08 47 views
4

我目前使用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() [功能。 preg-match-all]:编译 失败:无法在偏移量2重复 文件名:libraries/Parser.php行 编号:474

我开始认为,根据需要,库不支持嵌套数组,只要多个子数组。图书馆有许多测试。有一个具体的测试需要:

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

       ) 

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

其他人是否使用这个库,并遇到类似的问题? 如果不是,你用什么CodeIgniter模板解析?它将如何嵌套?我愿意接受所有建议,如果需要,我会转移到另一个图书馆。

回答

3

笨和解析器是我个人遇到了麻烦。找到一个支持良好的图书馆并不容易,但也有一些体面的图书馆。

我使用的是Dwoo,这是我尝试过的唯一一个直接在盒子里工作的人。从我使用它的时候起,它得到了相当好的支持;它确实支持嵌套循环,并且有一个相当不错的缓存系统。我个人认为它不像Smarty那么重要。

的Dwoo笨包装是由一个人写的叫菲尔鲟鱼,你可以在这里找到它:

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

您可以找到有关Dwoo这里的更多信息:

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

并且继承了它支持的一些功能的链接(我原本很难找到这个页面,即使它正好在导航窗格中,哈哈)

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

而如果你想让它,扩展它是非常简单的东西没有做......这一切都没有在Wiki ..祝你好运!

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; 
} 
+0

仅供参考,2009年您链接到的线程是关于一个RSS解析器,不是一回事。解析器库OP使用的也是一个社区构建的第三方库,不包含在CI中 - 所以我认为这与Codeigniter中的潜在错误没有任何关系。 –

+0

@韦斯利默奇'错了链接,我现在找不到合适的人。 – cwallenpoole

0

有简单的方法来解决这个问题: 认沽数组作为模型

0

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

作为一个具体的例子,考虑这个代码显示(以最小的格式)在酒店可用的一系列房间,并显示每个房间每天旅行的每日费率。

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

随着出放类似于(2天,在此实例中):

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