2012-06-04 22 views
1

我是Zend Framework的新手,希望瞭解如何最好地循環訪問數據庫數據以生成鏈接列表。我的理解是,模型應該包含大部分應用程序邏輯,控制器和視圖儘可能輕。Zend Framework在循環中生成HTML標記

我在查詢數據庫以獲取一組記錄,我想遍歷它們並生成HTML鏈接。下面的Psuedocode。

控制器:

$this->view->myList = MODEL->generateHtml(); 

MODEL:

function generateHtml() { 
    query db 

    loop through record set 

    build a string of html within loop including links 

    return string to controller 

} 

VIEW:

echo $this->myList; 

這似乎把邏輯在模型中,讓控制器保持亮起狀態,並使視圖僅用於渲染。

我遇到的一個問題是,我想用$this->view->url在html I輸出中生成路由鏈接,但在模型中不能這樣做。我在網上完成的閱讀表明你不應該在模型中構建html。我可以在模型中生成所需數據的數組並返回,然後在控制器或視圖中循環,以生成html,但我不確定什麼是正確的方法,並希望得到一些建議。

感謝您給予的任何幫助。


新的問題 - 更新的代碼:

嗨再次....低於疲憊的建議,但現在有一個不同的問題。

我的代碼是現在:

MODEL:

不使用此測試。將返回類似於在控制器中創建的數組的數組。

CONTROLLER:

$aStoryList = array( 
     array(
      'headline' => 'Headline 1', 
      'story' => 'Story 1' 
     ), 
     array(
      'headline' => 'Headline 2', 
      'story' => 'Story 2' 
     ) 
    ); 
    $this->view->aStoryList = $aStoryList; 

VIEW:

echo $this->partialLoop('partials/storyList.phtml', $this->aStoryList); 

storyList.phtml:

echo "<br />" . $this->headline . $this->story; 

我已經放置在局部從而....

視圖/分音/storyList.phtml

這種放置,並在視圖中使用的路徑是從應答所得出這個計算器的問題 - Where do I save partial (views) in Zend Framework, to be accessible for all Views in my App?

當我運行此我得到以下錯誤

消息:腳本「的諧音/ storyList.phtml '找不到路徑(/ home/sites/xxxxx。com/public_html/xxxxxxx/application/views/scripts /)

現在拉出我的頭髮!

回答

2

該模型應該用於從數據源中提取數據,但不應該生成任何HTML標記。保存該視圖的HTML代。控制器將成爲模型和視圖之間的粘合劑;即控制器將完成取數據並將其傳遞到生成輸出的視圖的工作。

在您的具體情況下,PartialLoop View Helper應該用於在循環中創建標記。

我想提出以下的僞代碼,而不是你有上面貼東西:

控制器:

$this->view->myList = MODEL->getListOfItems(); // return an array of data 

MODEL:

function getListOfItems() { 
    $results = array(); // array of data to return 

    // query db 

    // loop over result set 
    foreach($result as $row) { 
     $results[] = $row; 
    } 

    return $results; 
} 

VIEW:

<?php echo $this->partialLoop('myList.phtml', $this->myList); 

myList.phtml景觀環:

<tr> 
    <td><a href="<?php echo $this->url(array('id' => $this->id))"><?php echo $this->username ?></a></td> 
    <td><?php echo $this->firstName ?> <?php echo $this->lastName ?></td> 
    <td><?php echo $this->email ?></td> 
</tr> 

總結:

  • 控制器詢問數據模型
  • 模型返回結果的一個陣列
  • 控制器通過陣列直接查看
  • 查看調用partialLoop助手,並傳遞從模型
  • partialLoop輔助迭代所有結果的陣列,使它們一次一個地向myList.phtml(注意變量範圍是如何成爲本地的視圖部分)。

我的示例假定由模型返回的數組包含鍵idusernamefirstNamelastName

希望有幫助,隨時發表評論,如果您有任何問題。

+0

你可以在另一個partialLoop中調用partialLoop嗎?另一件事(雖然我不確定)不使用局部視圖助手對性能不好,而應該使用'render'來代替? – Songo

+0

嗨 - 非常感謝您抽出寶貴的時間撰寫詳細的信息。我沒有聽說過partialloop視圖幫手,但會看看。看看你的僞代碼,它看起來正是我想要的。真的很感謝你的努力 - 歡呼聲(stackoverflow不會讓我投你的答案,因爲我是新的,但真的很欣賞你的努力) – slip0000

+1

@Songo從查看「partial」和「partialLoop」的代碼,我沒有看到任何你不能從另一個「partialLoop」中調用partialLoop的原因(只要你不通過傳遞相同的數據讓自己進入遞歸空洞)。「partialLoop」可能會調用「partial」,它會克隆你的視圖對象,清除它的變量,並將部分變量賦值給它,然後在克隆的視圖上調用render()並返回內容。在比較partialLoop vs loop和view render時看到一些基準可能會很有趣。 – drew010