使用ZF2相册模块作为示例,如何创建要放置在索引视图上的表单,该表单能够通过两个或多个参数过滤记录?假设数据有一个genre
列和year
列,我们希望索引视图有一个带有两个相应select元素的表单。表单是一个简单的表单,所以我们不需要提交按钮;相反,我们希望用户选择触发表单操作。控制器根据路由器的输入设置$genre-filter
和$year
,这些值1)过滤发送到视图的数据,2)设置select元素的'selected'选项形式。
我该如何实现?我有一些问题无法找到相关信息:
如何让select元素触发表单操作?在HTML中,这是通过添加来完成的
onchange='this.form.submit()'
到select标记。我如何在ZF2中做到这一点?
如何指示select元素中的哪个选项
'已选中'(当前默认值)选项?在HTML中,这是通过添加来完成的
'selected'
到选项标记。我如何在ZF2中做到这一点?
如何编写表单操作脚本?
这是我到目前为止所拥有的:
// in the controller:
use Zend\Form\Element;
use Zend\Form\Form;
// ... //
$genre-filter = $this->getEvent()->getRouteMatch()->getParam('genre');
$year-filter = $this->getEvent()->getRouteMatch()->getParam('year');
// ... //
$genre = new Element\Select('genre');
$genre->setValueOptions(array(
'all' => 'all',
'jazz' => 'jazz',
'punk' => 'punk',
'emo' => 'emo',
// ... //
));
$year = new Element\Select('year');
$year->setValueOptions(array(
'all' => 'all',
'2001' => '2001',
'2002' => '2002',
'2003' => '2003',
));
$form = new Form('event-filter');
$form->add($genre);
$form->add($year);
和
// in the view script:
echo $this->form()->openTag($form);
echo "genre: " . $this->formSelect($genre);
echo "year: " . $this->formSelect($year);
echo $this->form()->closeTag();
我假设表单操作是这样写的:
// in the controller:
$genre-selection = $this->getRequest()->getPost('genre', 'all');
$year-selection = $this->getRequest()->getPost('year', 'all');
return $this->redirect()->toRoute('albums', array('action'=>'index', 'genre' => $genre-selection, 'year' => $year-selection);
答案 0 :(得分:1)
1。如何让select元素触发表单操作?在HTML中,这是通过添加onchange =' this.form.submit()'来完成的。到选择标签。我如何在ZF2中做到这一点?
您可以在定义各个表单元素时为其指定属性:
$genre = new Element\Select('genre');
$genre->setAttributes(array(
'onchange' => 'this.form.submit();'
));
然而,最好从HTML中完全删除它并且不引人注意地执行此操作。添加到您的JS文件:
if (document.getElementById('event-filter')) {
$('#event-filter select').change(function(e) {
$('#event-filter').submit();
});
}
2. 如何指出select元素中的哪个选项是“selected”(当前默认值)选项?在HTML中,这是通过添加' selected'来完成的。到选项标签。我如何在ZF2中做到这一点?
$form = new Form('event-filter');
$form->setData(array(
'genre' => 'jazz',
'year' => '2002'
));
3. 如何编写表单操作脚本?
这实际上取决于您如何加载数据,但如果您遇到任何具体问题,我们可能会提供帮助。