symfony создание фильтров в Action – Filters in action

Появилась задача сделать фильтры на сайте, не в backend’e, а именно в frontend – action. Прочитал те малые статейки, что мне попадались, но ни одна не отвечала необходимым параметрам, делать через generator как-то не хотелось, да и это вызывало некоторые трудности – когда проходило некоторое время нужных классов не было в кеше и приходилось перегружать страницу… За основу взял генерируемые Symfony шаблоны немного поправил и постарался упростить. И вот что получилось:

action.class.php

<?php
class ordersActions extends sfActions
{
  publicfunction executeIndex(sfWebRequest $request)
  {
    if($request->getParameter('page'))
    {
      $this->setPage($request->getParameter('page'));
    }
    $this->pager=$this->getPager();
  }

  // выполняем действия фильтра
  publicfunction executeFilter(sfWebRequest $request)
  {
    // устанавливаем страницу на первую
    $this->setPage(1);
    // если сбрасывается страница, то убираем параметры для фильтра
    if($request->hasParameter('_reset'))
    {
      $this->setFilters(array());

      $this->redirect('@orders');
    }
    // создаем форму для фильтра
    $this->filters=new catalogOrdersFormFilter();
    // получаем параметры переданной формы
    $this->filters->bind($request->getParameter($this->filters->getName()));
    // проверяем на валидность
    if($this->filters->isValid())
    {
      $this->setFilters($this->filters->getValues());
      // все хорошо? переходим на первую страницу и пытаемся получить контент
      $this->redirect('@orders');
    }
    // все плохо или был сброс фильтра - выдаем контент (так тут вроде)
    $this->pager=$this->getPager();

    $this->setTemplate('index');
  }
  // функция вывода контента
  protectedfunction getPager()
  {
    // получаем количество позиций на страницу
    $pager=new sfDoctrinePager('catalogOrders', sfConfig::get('app_max_orders_on_page'));
    // задаем запрос для вывода контента (с фильтром или без)
    $pager->setQuery($this->buildQuery());
    // устанавливаем страницу
    $pager->setPage($this->getPage());
    // подготавливаем данные
    $pager->init();

    return$pager;
  }

  // устанавливаем страницу
  protectedfunction setPage($page)
  {
    $this->getUser()->setAttribute('orders.page',$page,'orders_module');
  }

  // получаем страницу
  protectedfunction getPage()
  {
    return$this->getUser()->getAttribute('orders.page',1,'orders_module');
  }

  // получаем фильтры, если их нет получаем установки по умолчанию
  protectedfunction getFilters()
  {
    return$this->getUser()->getAttribute('orders.filters',$this->getFilterDefaults(),'orders_module');
  }

  // устанавливаем значения фильтров
  protectedfunction setFilters(array$filters)
  {
    return$this->getUser()->setAttribute('orders.filters',$filters,'orders_module');
  }

  // значения фильтров по умолчанию
  protectedfunction getFilterDefaults()
  {
    returnarray();
  }

  // формируем запрос для вывода контента
  protectedfunction buildQuery()
  {
    // создаем форму фильтров и устанавливаем текущие данные или данные по умолчанию для формы фильтров
    if(null===$this->filters)
    {
      $this->filters=new catalogOrdersFormFilter($this->getFilters());
    }
    // устанавливаем метод для обработки данных
    // метод должен быть определен в модели !!!
    $this->filters->setTableMethod('getAllOrdersQuery');
    // добавляем к нашему методу параметры фильтрации
    $values=$this->filters->processValues($this->getFilters());
    $query=$this->filters->buildQuery($values);
    // и так понятно
    return$query;
  }
}
?>

action мы сделали теперь нужно вывести форму фильтрации. Делаем партиал _filter.php:

<?phpif($form->hasGlobalErrors()):?>
    <?phpecho$form->renderGlobalErrors()?>
  <?phpendif;?>

  <formaction="<?phpecho url_for('orders_filter')?>"method="post">
    <tablecellspacing="0">
      <tfoot>
        <tr>
          <tdcolspan="2">
            <?phpecho$form->renderHiddenFields()?>
            <inputtype="submit"value="Filter"class="button"/>
            <inputtype="submit"value="Reset"name="_reset"class="button"/>
          </td>
        </tr>
      </tfoot>
      <tbody>
      <?phpforeach($form->getWidgetSchema()->getFields()as$name=>$field):?>
      <?phpif((isset($form[$name])&&$form[$name]->isHidden())||(!isset($form[$name])&&$field->isReal()))continue?>
        <trclass="<?phpecho$name?>">
          <tdwidth="140">
            <labelclass="il"><?phpecho$form[$name]->renderLabelName()?>:
              <divclass="small"><?phpecho$form[$name]->renderHelp()?></div>
            </label>
          </td>
          <td>
            <?phpecho$form[$name]->renderError()?>
            <?phpecho$form[$name]->render(array('class'=>'iilf'))?>
          </td>
        </tr>
      <?phpendforeach;?>
      </tbody>
    </table>
  </form>
Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: