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

How to sort a view easily

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

这是我的部分视图脚本:

<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>

我要单击列名来对空洞进行排序 table。就像我点击名称,视图按名称排序。

如您所见,还有一些其他的尝试。视图中是否有可能,或者我是否需要控制器操作?我真的很想在 zend 中做这件事,而不是 ajax 或其他。

如何正确操作?

****编辑 1

我进一步尝试并创建了一个动作 sortAction,其中 returns 一个新的视图模型:

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

这当然有效,但还需要一个新的 viewscript 和给定的参数给被调用的模型函数选择排序依据的字段。第二个参数给出 asc 或 desc.

我真的很想学习一些关于如何正确执行它的知识,比如最佳实践。

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

控制器中的查询参数

无需触及控制器的路由,查询参数是解决问题的更简单方法。

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,
         ]);
    }
    ...
}

出于安全原因,您应该在将查询参数传输到 table 网关功能之前过滤或验证它。

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

table 网关函数 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 函数中。 请勿拿来制作!始终检查此参数中的字段名称,这些字段名称位于您的 table 和方向 ASC 和 DESC 中,以避免 SQL 注入!

你看法的变化

你必须在你的 table 头中设置一个 link 和查询参数。

<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 唯一解决方案。