2010-10-19 13 views
1

我需要對視圖中的數組進行遞歸迭代,並想知道這種情況下的最佳實踐是什麼?我試圖避免在控制器或模型中構建我想要的html輸出。如何處理視圖中的遞歸(mvc)?

僅供參考我正在使用框架codeigniter。

+1

你對「結構」有什麼意思?你能提供一個例子嗎? – thomaux 2010-10-19 05:51:21

+0

如果您顯示代碼的相關部分,則回答此問題會更容易。 – Mischa 2010-10-19 06:28:32

+0

@Anzeo:當我說結構我打算說數據結構;在我的情況下,一個數組 – simon99 2010-10-19 17:44:41

回答

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));// 

這種方法的好處是,你的意見是由其他控制器或動作可重複使用。

+0

感謝您的回覆。我會嘗試按照你的「另一個評價」來實現遞歸視圖 – simon99 2010-10-19 17:51:13

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} 

用了把類似於:

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-> data傳遞給解析器之前,該數組首先被分配給$ this-> data-> 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