我想在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> </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。
我非常希望了解一些有关如何正确执行操作的知识,例如最佳实践。
答案 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视图帮助器通常使用三个参数,而最后一个参数是可选的。第一个参数是您的路线名称。第二个定义了在路由配置中定义的路由参数。第三个参数用于查询参数等可选参数。对于查询参数sort
和order
,您必须注意query
键,它具有列名的数组值,该值应按方向排序,其次应为方向排序依据。
像馅饼一样简单,哈? ;)
结论
JavaScript解决方案的性能更高,因为您不必每次都想对结果进行排序时都触发请求。这可以通过初始请求来完成,而排序将由客户端来完成。无论如何...我认为这是您想要的无JavaScript免费Zend Framework解决方案。