我需要在视图中递归迭代一个数组,并想知道这种情况的最佳实践是什么?我试图避免在控制器或模型中构建我想要的html输出。
仅供参考我正在使用框架codeigniter。
答案 0 :(得分:1)
关于如何实现目标,必然会有不同的意见 - 很大程度上取决于结构的复杂性以及您希望如何组织观点。
最简单的是,您可能希望在视图中使用PHP迭代语句。这在基本CI示例中很常见,其中控制器将数据传递给视图,然后foreach循环在视图中输出数组元素或对象属性。有些人可能不喜欢在他们的观点中使用PHP(例如,如果他们与害怕PHP语法的设计师共同开发)或者希望使用CI(或第三方)诱人的类。但是在您的视图中,某些PHP没有任何问题。有人指出PHP已经是一种模板语言了。
另一种适用于复杂视图的方法是使用嵌套视图或连接视图。 您可以加载一个视图,其中包含单个迭代语句,该语句依次加载每次迭代的视图。或者相反,您可以在控制器中执行此迭代,并简单地连接每个视图的输出,如下所示:
// iterate through a DB result set to create a block of markup
foreach($result_set as $result)
{
$view_set .= $this->load->view('result_view_1',$result,TRUE); // the third argument allows us to return the output string.
}
// now determine what view will display this bock of markup
$this->load->view('results_page_A',array( 'view_set' => $view_set ));//
这种方法的优点是您的视图可以被其他控制器或操作重用。
答案 1 :(得分:0)
此功能包含在内置模板类中。我最近做了一个项目,我们希望在视图中没有任何本机PHP代码的情况下创建视图。我刚才在实时页面中测试了这个例子,在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
我使用我的控制器将数据传递给模板引擎,如下所示:
$this->parser->parse(/reservations_view', $this->data);
这是我在此示例中成功使用的数据数组。在$ this-&gt;数据传递给解析器之前,首先将数组分配给$ this-&gt; data-&gt; available_rooms。
> 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