需要动态列信息从Zend Paginator对象


Need dynamic column information from Zend Paginator Object

我正在构建一个网格列表插件(当然供我个人使用)。现在我集成了ZF2 Paginator链接http://framework.zend.com/manual/2.1/en/tutorials/tutorial.pagination.html。我使用数据库选择Paginator(非数组)。我需要一个动态的字段名,这样我就可以迭代它们,像这样

<?php $headers = $this->paginator->getFirstRow()->getColumns(); ?>
<tr>
<?php foreach ($headers as $col) : ?>
    <th><?php echo $col; ?></th>
<?php endforeach; ?>
</tr>
<?php foreach ($this->paginator as $row) : ?>
    <tr>
    <?php foreach ($row->getColumns() as $col) : ?>
        <td><?php echo $row->{$col}; ?></td>
    <?php endforeach; ?>
    </tr>
<?php endforeach; ?>

由于这是一个实践项目,我真的不需要集成一些已经存在的第三方网格解决方案。我只是想知道如果类似的事情是可能的使用Zend Paginator API ?

更新:问题最终修复。

In Plugin Helper:

$resultSet = $paginator->getIterator(); 
$columnNames = array_keys(get_object_vars($resultSet->getArrayObjectPrototype()));
$grid .= '<thead><tr>';
foreach($columnNames as $header)
{
    $grid .= '<th>'.$header.'</th>';
}
$grid .= '</tr></thead>';
$grid .= '<tbody>';
foreach($resultSet as $row)
{
    $grid .= '<tr>';
    foreach($columnNames as $col)
    {
        $grid .= '<td>'.$row->$col.'</td>';
    }
}
$grid .= '</tbody>';

还需要在模型中进行一个更改(唉,我需要在插件之外进行此更改,现在不知道如何修复除了由所有项目模型覆盖的模型父类)。

我需要添加结果集缓冲区来修复前向游标错误,如此结果仅为前向结果集,不支持向前移动后调用rewind()

In Model:

public function __construct(Adapter $adapter)
{
    $this->adapter = $adapter;
    $this->resultSetPrototype = new ResultSet();
    $this->resultSetPrototype->buffer();  // New Line added for buffer
    $this->resultSetPrototype->setArrayObjectPrototype(new Leads());
    $this->initialize();
}

那么,重述一下您的问题:您希望输出不知道列名称的分页器的内容,因为它们可能是动态的?

假设我们有一个有效的Paginator,其中包含结果和未知的列名。以下是正确输出它们的步骤:

  1. 获取第一行的列名,并将其放入数组中。
  2. 生成表格/网格的标题
  3. 使用数组遍历行以匹配表头序列。

可以像下面这样:

$firstItem = reset($paginator->getIterator());
$columnNames = array_keys(get_object_vars($firstItem));
// optional do some sorting here like `sort($columNames)`
echo '<thead><tr>';
foreach ($columnNames as $columnName) {
    echo '<th>' . $columnName . '</th>';
}
echo '</tr></thead>';
echo '<tbody>';
foreach ($paginator as $item) {
    echo '<tr>';
    foreach ($columnNames as $columnName) {
        echo '<td>' . $item->$columnName . '</td>';
    }
    echo '</tr>';
}
echo '</tbody>';