Symfony 1.4 FormFilter: как добавить флажок «не пусто»? - PullRequest
0 голосов
/ 22 декабря 2010

Я использую FormFilter в классе моей модели, и это очень полезно для меня.Но мне нужна функция, которая, кажется, не существует.

Я уже использую опцию with_empty, чтобы добавить флажок «пусто» рядом с полем.Он фильтрует объекты для отображения только тех, которые имеют значение NULL в этом поле.Но мне нужно сделать наоборот.Я хочу добавить флажок «не пустой» для отображения объектов, которые имеют значение NOT NULL в этом поле.

Итак, я создал этот класс виджетов для отображения дополнительного флажка:

<?php
/**
 * sfWidgetFormFilterInputExtended represents an HTML input tag used for filtering text.
 * It adds the possibility to insert a "is not empty" checkbox that does the opposite
 * of "is empty" checkbox
 */
class sfWidgetFormFilterInputExtended extends sfWidgetFormFilterInput
{
  protected function configure($options = array(), $attributes = array())
  {
    parent::configure($options, $attributes);
    $this->addOption('with_not_empty', true);
    $this->addOption('not_empty_label', 'is not empty');
    $this->addOption('template', '%input%<br />%empty_checkbox% %empty_label%<br />%not_empty_checkbox% %not_empty_label%');
  }

  /**
   * @param  string $name        The element name
   * @param  string $value       The value displayed in this widget
   * @param  array  $attributes  An array of HTML attributes to be merged with the default HTML attributes
   * @param  array  $errors      An array of errors for the field
   *
   * @return string An HTML tag string
   *
   * @see sfWidgetForm
   */
  public function render($name, $value = null, $attributes = array(), $errors = array())
  {
    $values = array_merge(
      array(
        'text' => '',
        'is_empty' => false,
        'is_not_empty' => false,
      ),
      is_array($value) ? $value : array()
    );

    return strtr($this->getOption('template'), array(
      '%input%'              => $this->renderTag('input', array_merge(array('type' => 'text', 'id' => $this->generateId($name), 'name' => $name.'[text]', 'value' => $values['text']), $attributes)),
      '%empty_checkbox%'     => $this->getOption('with_empty') ? $this->renderTag('input', array('type' => 'checkbox', 'name' => $name.'[is_empty]', 'checked' => $values['is_empty'] ? 'checked' : '')) : '',
      '%empty_label%'        => $this->getOption('with_empty') ? $this->renderContentTag('label', $this->translate($this->getOption('empty_label')), array('for' => $this->generateId($name.'[is_empty]'))) : '',
      '%not_empty_checkbox%' => $this->getOption('with_not_empty') ? $this->renderTag('input', array('type' => 'checkbox', 'name' => $name.'[is_not_empty]', 'checked' => $values['is_not_empty'] ? 'checked' : '')) : '',
      '%not_empty_label%'    => $this->getOption('with_not_empty') ? $this->renderContentTag('label', $this->translate($this->getOption('not_empty_label')), array('for' => $this->generateId($name.'[is_not_empty]'))) : '',
    ));
  }
}

Но теперь моя проблема в том, что мне приходится обрабатывать значение "is_not_empty" в моих формах вручную ...

Как бы вы реализовали это лучше?

Спасибо!

PS: я использую Doctrine

Ответы [ 2 ]

1 голос
/ 23 декабря 2010

Пожалуйста, смотрите метод sfFormFilterDoctrine :: doBuildQuery.

Вкратце вам нужно реализовать add% sColumnQuery.

0 голосов
/ 22 декабря 2010

Если это общее требование для ваших фильтров, я бы порекомендовал переопределить критерии добавления * для sfFormFilterPropel. Этот класс реализует опцию is_empty, поэтому вы должны добавить сюда опцию is_not_empty.

Но если вам нужно локализованное решение, лучший способ сделать это - реализовать собственную

function addYourColumnNameCriteria(Criteria $criteria, $field, $value){...}

функция в фильтре, который нуждается в этом.

...