如何处理视图中的递归(mvc)?

时间:2010-10-19 01:38:00

标签: php codeigniter templates

我需要在视图中递归迭代一个数组,并想知道这种情况的最佳实践是什么?我试图避免在控制器或模型中构建我想要的html输出。

仅供参考我正在使用框架codeigniter。

2 个答案:

答案 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