2011-04-20 48 views
3

我具有分層陣列:什麼是放置視圖功能的最佳場所?

array(
    'id' => 4, //id of current element 
    'parent' => 2, //id of parent element 
    'value' => '', //some value 
    'children' => array() //array of similar arrays 
) 

每個元素可以包含多個元素,它可以包含多個元件等的足以說,最好的方式來迭代此是使用功能,這將致電給自己處理兒童:

function print_menu_hierarchy($hierarchy, $depth = 0) { 
    foreach ($hierarchy as $item) { 
     echo '<tr>'; 
     echo ' <td>' . $item['id'] . '</td>'; 
     echo ' <td>' . str_repeat('&nbsp;', $depth * 6) . $item['value'] . '</td>'; 
     echo '</tr>'; 
     if (count($item['children'])) { 
      print_menu_hierarchy($item['children'], $depth + 1); 
     } 
    } 
} 

我的問題是:放哪個函數?

要維護MVC,它必須是視圖的一部分。所以,無論是幫手還是模板。

助手很明顯,但將此函數放在助手中會使修改視圖更困難。每當我改變模板中的某些東西時,我也必須改變助手。此外,這個功能越來越大,保持乾淨是很難的。

模板也是不錯的選擇,定義函數應該在其他地方完成。

任何人有更好的主意在哪裏把這個?

(我正在使用symfony 1.4)

+0

我期望傭工只應以某種方式修改數據輸出或其他處理。你的功能是創建一個HTML結構的輸出,所以我會把它放到視圖模板也許......通過這你只能編輯一個模板,並保持只在一個地方的變化...... – shadyyx 2011-04-20 10:12:22

+2

聽起來像一個很好的例子領導程序員的模式。使用設計模式讓您的生活更輕鬆,並使您能夠編寫更敏捷的代碼,而不是限制您並阻止您表達。 – 2011-04-20 10:17:05

回答

1

雖然我不清楚你使用的是什麼框架,但是函數本身 - 就像你自己說的 - 不屬於視圖。這個函數應該放在應用程序的幫助器部分。您需要做的唯一更改是從此幫助函數調用視圖以獲得單個項目,而不是將回聲硬編碼到您的層次結構爬網程序中。事情是這樣的:

function print_menu_hierarchy($hierarchy, $depth = 0) { 
    foreach ($hierarchy as $item) { 
     call_view_function('view_name_for_menu_item', array('item' => $item, 'depth' => $depth)); 
     if (count($item['children'])) { 
      print_menu_hierarchy($item['children'], $depth + 1); 
     } 
    } 
} 

和視圖將如下所示:

<tr> 
    <td><?php echo $params['item']['id']; ?></td> 
    <td><?php echo str_repeat('&nbsp;', $params['depth'] * 6) . $params['item']['value']; ?></td> 
</tr> 
+0

我正在使用symfony 1.4。 我想過做類似的事情: include_partial('view_name_for_menu_item',array('item'=> $ item,'depth'=> $ depth)) 但這意味着很多內含物。 – Leszczu 2011-04-20 10:29:17

+0

嗯,我不知道Symphony,但我認爲它有一些方便的方法來自動解決視圖包含。無論如何,我認爲這是解決您的問題的乾淨方法。 – 2011-04-20 10:32:55

0

我會讓它成爲幫手。當您更改模板時,您將不得不對其進行修改。如果它是一個大功能,幫手是最好的地方。這意味着它也可以用在不同的地方。

此外,MVC是有幫助你。這是一個指導。不要讓它阻礙你完成工作。每一刻,你都在苦苦思索放置事物的時刻,這一刻你並沒有真正解決問題。

+0

在同一時刻,您正以接近儘可能最好的方式解決問題。 – 2011-04-20 10:17:44

+0

絕對是。但我們必須始終關注完成工作。 – JohnP 2011-04-20 10:38:20

+0

@Tomalak當然。我的意思是這些模式可以幫助我們,而不會阻礙我們 – JohnP 2011-04-20 10:51:54

相關問題