2011-02-01 103 views
3

我正在使用zend。有時我必須在HTML表格的網頁上顯示來自數據庫的數據。現在我在做這樣的事情:在zend中顯示html表格數據的最佳方法

的IndexController的的indexAction

$myModel = new Model_MyTable_Object(); 
$data = $myModel->getAllRecords(); 
$this->view->show = $data->toArray(); 

而且在index.phtml

<table> 
<tr> 
    <th>id</th> 
    <th>FirstName</th> 
    <th>LastName</th> 
    <th>Locaion</th> 
</tr> 

<?php 

foreach($this->show as $data) { 

    echo "<tr> 
      <td>" . $data['id'] . "</td> 
      <td>" . $data['firstname'] . "</td> 
      <td>" . $data['lastname'] . "</td> 
      <td>" . $data['location'] . "</td> 
     </tr>"; 
} 
?> 

</table> 

是否有Zend公司做到這一點沒有什麼好的辦法。我所看到的地方,哪裏是爲每個數據網格創建一個PHP類何地,我們需要這個,然後我們創建在行動該類的實例,並渲染對象PHTML顯示HTML表格的格式是這樣的數據:

$this->data->render(); 

我們該怎麼做?任何好的示例,教程或鏈接。

+0

如果保持視圖(index.phtml)裏面的foreach循環,它可以讓你的風格和以其它方式調整演示以最有用的方式表格,這是一件好事。也許有一天你會想把它全部改成無表格的CSS,誰知道呢? Zend所能做的就是搞定它。 – 2011-02-01 23:38:11

回答

7

我認爲一個好方法是使用partialLoop查看幫手。例如,你可以在APPLICATION_PATH /視圖/腳本/ _partials如下創建一個名爲myTableRow.phtml局部視圖文件/

<!--APPLICATION_PATH . '/views/scripts/_partials/myTableRow.phtml --> 
<tr> 
    <td> <?php echo $this->id;      ?> </td> 
    <td> <?php echo $this->escape($this->firstname); ?> </td> 
    <td> <?php echo $this->escape($this->lastname); ?> </td> 
    <td> <?php echo $this->escape($this->location); ?> </td> 
</tr> 

然後你index.phtml將如下所示:

<table> 
    <tr> 
     <th>id  </th> 
     <th>FirstName </th> 
     <th>LastName </th> 
     <th>Locaion </th> 
    </tr> 
    <!-- I assume that $myModel->getAllRecords(); returns an instance of Zend_Db_Table_Rowset_Abstract --> 
    <?php echo $this->partialLoop('_partials/myTableRow.phtml', $this->show); ?> 

</table> 

如果您需要做的是在許多觀點比你可以創建一個能夠把你的數據,構建一個表並返回它作爲字符串到視圖自己的視圖助手。

至於做$this->data->render();推移,恕我直言,這不是一個很好的辦法。原因是您需要將數據的表示嵌入到模型中。但是,通過使用ZF,您很可能想要使用其MVC系統。 MVC的主體是將模型,控制器和視圖分開。通過做$this->data->render()你實際上將模型與視圖混合在一起。

1

如果您創建了一個已連接到Zend_Db_Table類的Zend_Db_Table_Rowset的後代類,那麼可以在該rowset類上實現一個render()函數,該函數將執行您正在討論的內容。

例如,這裏的假設表類,行集屬性定義:

class MyTable extends Zend_Db_Table_Abstract { 
    $_name = 'my_table'; 
    $_rowsetClass = 'MyTableRowset'; 
} 

和這裏的行集類:

class MyTableRowset extends Zend_Db_Table_Rowset_Abstract { 
    public function render() { 
     // HTML table rendering happens here. 
     return $table; 
    } 
} 

,然後你就會把它在你的控制器,你如上所示:

$model = new MyTable(); 
$dataset = $model->getAllRecords(); // Returns an instance of MyTableRowset 
$this->view->data = $dataset; 

並在視圖腳本中:

<?php print $this->dataset->render(); ?> 
+0

再想一想,你甚至可以創建一個MyTableRow類,它有自己的渲染單個表格行的render()方法,然後MyTableRowset類的render()方法遍歷行集,調用每行的render )方法。它只需要添加

標籤和可能的列標題。 – gravelpot 2011-02-01 19:36:24

6

創建一個視圖助手

<?php 
class Zend_View_Helper_DisplayGenericTableHelper extends Zend_View_Helper_Abstract { 

    public $view; 

    public function setView(Zend_View_Interface $view) 
    { 
     $this->view = $view; 
    } 

    public function displayGenericTableHelper(Zend_Db_Table_Rowset_Abstract $rowset,$border=0) { 
     $table = ""; 
     if(count($rowset)>0) { 
      $table .= '<table border="'.$border.'"><tr>'; 
      foreach(array_keys($rowset->current()->toArray()) as $column) { 
       $table .= '<th>'.$column.'</th>'; 
      } 
      foreach($rowset as $row) { 
       $table .= '</tr><tr>'; 
       foreach($row->toArray() as $content) { 
        $table .= '<td>'.$content.'</td>'; 
       } 
      } 
      $table .='</tr></table>'; 
      } 
      return $table; 
    } 
} 
?> 

在你看來那麼

<?php 
    echo $this->displayGenericTableHelper($this->points,0); 
?> 
相關問題