我目前正在使用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模板解析?怎么嵌套呢?我愿意接受所有建议,并在需要时转移到另一个图书馆。
答案 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