我终于使用 Symfony 生成的默认 MyModuleForm 制作了一个自定义表单
public function executeIndex {
...
// Add a form to filter results
$this->form = new MyModuleForm();
}
但只显示一个自定义字段:
<div id="search_box">
<input type="text" name="criteria" id="search_box_criteria" value="Search..." />
<?php echo link_to('Search', '@my_module_search?criteria=') ?>
</div>
然后我创建了一个名为@my_module_search 的路由链接到索引操作:
my_module_search:
url: my_module/search/:criteria
param: { module: my_module, action: index }
requirements: { criteria: .* } # Terms are optional, show all by default
使用 Javascript(在本例中为 jQuery)我将输入的文本附加到链接的 href 属性中的条件参数:
$('#search_box a').click(function(){
$(this).attr('href', $(this).attr('href') + $(this).prev().val());
});
最后,回到executeIndex 操作,我检测是否输入了文本并将自定义过滤器添加到DoctrineQuery 对象:
public function executeIndex {
...
// Deal with search criteria
if ( $text = $request->getParameter('criteria') ) {
$query = $this->pager->getQuery()
->where("MyTable.name LIKE ?", "%$text%")
->orWhere("MyTable.remarks LIKE ?", "%$text%")
...;
}
$this->pager->setQuery($query);
...
// Add a form to filter results
$this->form = new MyModuleForm();
}
其实代码比较复杂,因为我在父类中写了一些partials和一些方法来复用代码。但这是我能想到的最好的了。