我最后使用的Symfony
public function executeIndex {
...
// Add a form to filter results
$this->form = new MyModuleForm();
}
生成的默认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
链接到index动作路线:
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();
}
其实,代码更复杂,因为我写了一些泛音和一些我在父类中重用以重用代码。但这是我能想到的最好的。
这迫使我使用模型属性进行过滤,即对每个小部件使用不同的输入。我正在考虑在模型列中使用'LIKE'来创建一个唯一的输入字段并构建一个自定义查询。 – elitalon 2011-04-06 13:32:33
这是一个完全不同的答案......你必须迭代每个字段并进行正确的查询。稍后我会检查我是否可以做到。 – Pabloks 2011-04-06 16:30:26
我知道:)谢谢你的努力。我一直在挖掘后端缓存,试图提出一种基于生成类的替代解决方案。如果我找到了某些东西,我会更新我的答案 – elitalon 2011-04-07 08:41:35