2011-01-12 107 views
11

代碼我身邊有一個MVC模式構建的應用程序。 的看法是PHP的,但大多是用最少的PHP代碼嵌入HTML,這樣的東西 -分離佈局模板

Welcome <?php echo $USERNAME ?> 

<table> 
<?php foreach ($USERS as $row) : ?> 
<tr><td><?php echo $row->name ?><td><?php echo $row->address ?></tr> 
<?php endforeach ?> 

我只希望在這個文件中顯示的佈局邏輯,我想保持簡單!

這對我來說真的很不合適,但我在某些方面掙扎着。 例如看看錶在上面的代碼和想象,每列(姓名和地址)的標題 NameAddress

現在想象一下,我想要的列排序。所以我把它做成這樣 -

<tr><th><a href="?sort=name">Name</a><td><a href="?sort=addr"> 

但是這不夠好。我的視圖需要查看正在排序的列,並添加向上或向下箭頭。如果該列已被排序,那麼它需要將當前排序的列的鏈接更改爲?sort = name_reverse,以便點擊它以其他方式對其進行排序。 這有點太複雜了,現在在我的模板寫的漂亮整潔的代碼...

所以我可以讓我的控制器創建一個包含變量 -

<tr><th><?php echo $HEADING[0] ?><th><?php $HEADING[1] ?> 

等。但這意味着我的控制器是現在生成實際的HTML,這實際上是頁面模板的責任。它以某種不同的方式消除了模板格式化頁面的能力......並且感覺不對。

但我怎麼能與這個最划算,在那裏我覺得我需要我的頁面控制器是包含HTML生成變量...

有什麼建議?

回答

4

分離代碼以創建表格到ViewHelper中。從模板配置方法調用。 ViewHelper使用所有必需的設置呈現實際的表格。然後,您的主模板應該只包含這樣一行:

<?php echo table($data, $sortOptions, $otherConfig) ?> 

基本上,構建表所需的任何邏輯將包含在視圖助手這就是爲什麼你可能要使它成爲一個類中。完整的實施將根據您的需求而有所不同。

如果你不想把所有的邏輯放到一個大的表幫助器中,考慮爲表的任何部分做輔助函數。舉例來說,像

<th><?php echo sortLink('Name', $current); ?></th> 

這樣,sortLink助手將決定是否以及如何創建並插入任何形式的聯繫,所以你不必有邏輯或主模板中的任何條件語句。

+1

我喜歡這個。 像sortlink這樣的東西可以讓「設計師」轉換數據而不會讓他們編寫複雜的代碼。原始數據仍然存在,因此它不會像強制變量中提供HTML那樣強制某種特定風格 – jcoder 2011-01-12 14:37:24

0

一個解決方案是使用Javascript排序,有一些好的jQuery

如果這是不可能的,你可能會看一些像Smarty這樣的模板解決方案來爲你處理模板。

+0

我同意你在這種情況下的JavaScript,但我主要是在代碼設計的一般答案感興趣。我相信聰明會有同樣的問題 - 在某種程度上,你會試圖將HTML標記提供給你的模板... – jcoder 2011-01-12 10:32:12

2

非常好的問題,這是這個網站非常少見。

首先,您必須接受任何現實生活模板永遠不會簡單的事實。 就是這樣。它被稱爲演示邏輯它遵循演示本身的複雜性。

因此,只需使用與以前相同的方式 - 通過使用相同的循環和條件運算符,以及 - 可能 - 一些自釀的輔助函數,這將破壞模板純度,但是極大地有所幫助。

事實上,你幾乎釘它。您可以使用預定義的變量,但是它們不應包含HTML,而只包含要顯示的值。

<tr> 
<th> 
    <a href="<?=$links['name']['url']?>"> 
    Name 
    <?if($links['name']['dir']=='asc'):?><img src="arrow.gif"><?endif?> 
    <?if($links['name']['dir']=='desc'):?><img src="reverse_arrow.gif"><?endif?> 
    </a> 
<td> 

人們很容易使一個循環了這一點,但我建議不要,因爲它會導致你發明了一些HTML生成器這是另一個故事,沒有可靠的純HTML本身。

你唯一的責任是:一位程序員,要求代碼幫助,應該帶代碼,而不是羅嗦的話。一個實際的HTML例子會好得多,這樣回答者就不會將它發現出來。

1

如果我可以添加一個建議,可以將所有PHP輸出轉換爲DOM/XML,並將其提供給XSLT處理器,因爲XSLT和XHTML都基於XML,所以表現形式更爲複雜一致。您無論是在物理位置還是用於交付的技術方面,都會將內容從內容中分離出來。

+0

有趣的想法,但它不能真正解決我的問題,即將任何複雜的代碼保留在「視圖」之外,不是全職編程人員可以創建主題。我尊重XSLT,但簡單並不是最好的方面之一。 – jcoder 2011-01-12 14:35:51