如何轻松地对视图进行排序
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> </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 视图助手通常采用三个参数,其中最后一个参数是可选的。第一个参数是你的路由名称。第二个定义路由配置中定义的路由参数。第三个参数用于可选参数,如查询参数。对于你的查询参数 sort
和 order
你必须注意 query
键,它有一个列名的数组值,应该按方向排序,第二个方向应该排序依据。
很简单,哈? ;)
结论
JavaScript 解决方案的性能会更高,因为您不必在每次要对结果进行排序时都触发请求。这可以通过初始请求完成,排序将由客户端完成。无论如何...我认为这是您想要的 JavaScript 免费 Zend Framework 唯一解决方案。
我想在 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> </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 视图助手通常采用三个参数,其中最后一个参数是可选的。第一个参数是你的路由名称。第二个定义路由配置中定义的路由参数。第三个参数用于可选参数,如查询参数。对于你的查询参数 sort
和 order
你必须注意 query
键,它有一个列名的数组值,应该按方向排序,第二个方向应该排序依据。
很简单,哈? ;)
结论
JavaScript 解决方案的性能会更高,因为您不必在每次要对结果进行排序时都触发请求。这可以通过初始请求完成,排序将由客户端完成。无论如何...我认为这是您想要的 JavaScript 免费 Zend Framework 唯一解决方案。