在zend中的html表中显示数据的最佳方法

时间:2011-02-01 19:14:14

标签: php database zend-framework

我正在使用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类,在哪里我们需要它,然后我们在Action中创建该类的实例,并在phtml中呈现该对象,以html表格式显示数据,如下所示:

 $this->data->render();

我们怎么做?任何好的例子,教程或链接。

4 个答案:

答案 0 :(得分:7)

我认为一个好方法是使用partialLoop视图助手。例如,您可以在 APPLICATION_PATH / views / scripts / _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 :(得分:6)

创建一个View Helper

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

答案 2 :(得分:2)

您可以创建自己的视图助手来执行此操作。 http://framework.zend.com/manual/en/zend.view.helpers.html

答案 3 :(得分:1)

如果您创建了一个连接到Zend_Db_Table类的Zend_Db_Table_Rowset的后代类,那么您可以在该rowset类上实现一个render()函数,该函数将执行您正在讨论的内容。

例如,这是假设的表类,其中定义了rowset属性:

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(); ?>