Добавление поля поиска для фильтрации списка результатов в Symfony? - PullRequest
3 голосов
/ 06 апреля 2011

Мне нужно поместить поле поиска в список объектов в результате типичного действия indexSuccess в Symfony.Цель проста: отфильтровать список в соответствии с критериями.

Я читал подход Zend Lucene в уроке Jobeet , но похоже, что с помощью кувалды взломатьорех (по крайней мере, для моих требований).

Меня больше интересуют автоматически сгенерированные формы фильтра администратора, но я не знаю, как реализовать его в веб-интерфейсе.

Я мог быпросто передайте содержимое поля поиска в действие и создайте собственный запрос, но есть ли лучший способ сделать это?

РЕДАКТИРОВАТЬ

Я забыл упомянуть, что яхотел бы иметь одно общее поле ввода вместо поля ввода для каждого атрибута модели.

Спасибо!

Ответы [ 2 ]

3 голосов
/ 06 апреля 2011

Я использую это решение, вместо интеграции с Zend Lucene мне удается использовать автоматически сгенерированные фильтры Symonfy. Вот как я это делаю:

//module/actions.class.php
public function executeIndex(sfWebRequest $request)
{
      //set the form filter
      $this->searchForm = new EmployeeFormFilter();
      //bind it empty to fetch all data
      $this->searchForm->bind(array());
      //fetch all
      $this->employees = $this->searchForm->getQuery()->execute();
      ...
}

Я совершил поисковое действие, которое выполняет поиск

public function executeSearch(sfWebRequest $request)
{
  //create filter
  $this->searchForm = new EmployeeFormFilter();
  //bind parameter
  $fields = $request->getParameter($this->searchForm->getName());
  //bind
  $this->searchForm->bind($fields);
  //set paginator
  $this->employees = $this->searchForm->getQuery()->execute();
  ...
  //template
  $this->setTemplate("index");
}

Важно, чтобы форма поиска перешла на mymodule / search action.

На самом деле, я также использую sfDoctrinePager для разбивки на страницы непосредственно для запроса, генерируемого формой, для правильного разбиения на страницы результатов.

Если вы хотите добавить больше полей в форму поиска, отметьте this :)

0 голосов
/ 08 апреля 2011

Я наконец создал пользовательскую форму, используя стандартную форму 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();
}

На самом деле код более сложный, потому что я написал несколькочастичные и некоторые методы в родительских классах для повторного использования кода.Но это лучшее, что я могу придумать.

...