Поведение фильтра Symfony изменено с [field = value] на [field LIKE% value%] - PullRequest
0 голосов
/ 14 декабря 2011

В моем фильтре поведение поля заключается в поиске в таблице БД строки, которая имеет значение поля equal, равное значению, указанному в форме фильтрации. Я хотел бы изменить его поведение, чтобы искать в таблице БД строку / строки, значения полей которых соответствуют значениям, указанным в форме (%LIKE%).

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

Поле является внешним ключом, и я хочу, чтобы оно работало как обычное текстовое поле.

ОБНОВЛЕНИЕ : это была глупая ошибка. Мне нужно было назначить sfWidgetFormFilterInput для widgetSchema, но я использовал sfWidgetFormInput, который заставлял его искать равенство, а не соответствие.

1 Ответ

1 голос
/ 14 декабря 2011

Я никогда не слышал о другом способе ... взгляните на класс sfFormFilterDoctrine, расположенный в lib\vendor\symfony\lib\plugins\sfDoctrinePlugin\lib\form, чтобы понять, как работает эта система и как вы можете написать свой addFieldnameColumnQuery

UPDATE Чтобы изменить только поведение фильтра для поля, скажем, myfield, с внешний ключ на обычный текст , вы можете просто установить виджет и переопределить getFields() в MymoduleFormFilter классе с помощью некоторый код, подобный этому:

  public function configure()
  {
      $this->setWidget('myfield', new sfWidgetFormFilterInput());
      $this->setValidator('myfield', new sfValidatorPass(array('required' => false)));
  }

  public function getFields()
  {
      $fields = parent::getFields();
      $fields['myfield'] = 'Text';
      return $fields;
  }

Вместо этого, если вы определяете поле для поиска в объединенной таблице, вам еще предстоит установить виджет в соответствии с именем поля, которое вы написали в generator.yml

filter:
   display: [... some fields ..., myfield]

и, наконец, добавьте addMyfieldColumnQuery(Doctrine_Query $query, $field, $values) внутри join и где code. Извините, для этого нет фрагмента, потому что я использую Propel.

...