我正在使用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();
我们怎么做?任何好的例子,教程或链接。
答案 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(); ?>