Я наконец создал пользовательскую форму, используя стандартную форму MyModuleForm, сгенерированную Symfony
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());
});
* 1014И, наконец, возвращаясь к действию
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();
}
На самом деле код более сложный, потому что я написал несколькочастичные и некоторые методы в родительских классах для повторного использования кода.Но это лучшее, что я могу придумать.