如何轻松地对视图进行排序

时间:2018-07-09 15:59:09

标签: zend-framework zend-framework3 zend-view

我想在Zend 3中对基于表的视图进行排序。

这是我的观点的一部分:

<table class="table">
<tr>
    <th>id</th>
    <th>cccid</th>
    <th>gesch id</th>
    <th><a href="<?= $this->url('mandant',array('query' => array('sort' => 'desc'))); ?>">Name</a> </th>
    <th>langname</th>
    <th>&nbsp;</th>
</tr>


<?php 

foreach ($mandants as $mandant) : 
    //  $unit=$units->fetchAllP($project->ProjectID);
//var_dump(get_object_vars($project));?>
     <tr>
         <td><?= $this->escapeHtml($mandant->id)?></td>
         <td><?= $this->escapeHtml($mandant->cccid) ?></td>
         <td><?= $this->escapeHtml($mandant->geschid) ?></td>
         <td><?= $this->escapeHtml($mandant->name) ?></td>
         <td><?= $this->escapeHtml($mandant->langname) ?></td>
        <td>
            <a href="<?= $this->url('mandant', ['action' => 'show', 'id' => $mandant->id]) ?>">Show</a> 
            <a href="<?= $this->url('mandant', ['action' => 'edit', 'id' => $mandant->id]) ?>">Edit</a> 

        </td>
    </tr>
<?php endforeach; ?>
</table>

我要单击列名对孔表进行排序。就像我单击名称,然后按名称对视图进行排序一样。

如您所见,剩下的就是一点点尝试了。无论如何,视图中是否有可能?我是否需要执行控制器操作?我真的很想用zend而不是用ajax或其他工具来做到这一点。

如何正确执行?

****编辑1

我进一步尝试并创建了一个操作sortAction,该操作返回了一个新的Viewmodel:

        return new ViewModel([
        'mandants' => $this->mandantTable->sortMandant(0,0),
    ]);

这当然可以工作,但是还需要一个新的视图脚本,并且给调用的modelfunction的给定参数选择要排序的字段。第二个参数为asc或desc。

我非常希望了解一些有关如何正确执行操作的知识,例如最佳实践。

1 个答案:

答案 0 :(得分:1)

以下代码示例未经测试就被编写。永远不要在生产中使用它。这只是朝正确方向的推动。

在控制器中查询参数

在不触摸控制器路由的情况下,查询参数是解决问题的简便方法。

YourController extends AbstractActionController
{
    protected $tableGateway;
    ...
    public function sortAction()
    {
         // contains the db field, which should the result sorted by or an empty string
         $sort = $this->params()->fromQuery('sort', '');

         // contains the sort direction the db query should ordered by (asc or desc)
         $direction = $this->params()->fromQuery('order', '');

         // executes sql query with the given parameters
         $result = $this->tableGateway->getSortedResult($sort, $direction);

         // return result to the view
         return new ViewModel([
             'result' => $result,
         ]);
    }
    ...
}

出于安全原因,在将查询参数转移到表网关功能之前,应该对其进行过滤或验证。

具有可变排序顺序的表网关

表网关功能getSortedResult应该带有两个参数$sort$direction

class YourTableGateway extends TableGateway
{
    ...
    public function getSortedResult(string $sort, string $direction) : ResultSet
    {
        $select = $this->getSql()->select();
        $select->columns([
            'column_a',
            'column_b',
            'column_c',
        ]);
        $select->order($sort . ' ' . $direction);

        $resultset = $this->selectWith($select);

        return $restulset;
    }
    ...
}

如您所见,给定参数直接插入到select语句的order函数中。 请不要将其用于生产!始终检查表和ASC和DESC方向中的字段名是否使用此参数,以避免SQL注入!

您视图中的更改

您必须在表头中设置带有查询参数的链接。

<thead>
    <tr>
        <th><a href="<?= $this->url('name', [ 'action' => 'show', 'id' => 1 ], [ 'query' => [ 'sort' => 'name', 'order' => 'ASC' ]]); ?>">Table Headline 1</a></th>
        <th><a href="<?= $this->url('name', [ 'action' => 'show', 'id' => 1 ], [ 'query' => [ 'sort' => 'gender', 'order' => 'ASC' ]]); ?>">Table Headline 2</a></th>
    </tr>
</thead>

URL视图帮助器通常使用三个参数,而最后一个参数是可选的。第一个参数是您的路线名称。第二个定义了在路由配置中定义的路由参数。第三个参数用于查询参数等可选参数。对于查询参数sortorder,您必须注意query键,它具有列名的数组值,该值应按方向排序,其次应为方向排序依据。

像馅饼一样简单,哈? ;)

结论

JavaScript解决方案的性能更高,因为您不必每次都想对结果进行排序时都触发请求。这可以通过初始请求来完成,而排序将由客户端来完成。无论如何...我认为这是您想要的无JavaScript免费Zend Framework解决方案。