Symfony: свой фильтр в admin generator

Опубликовано: 01.09.2018

Кратко о том, как сделать фильтр для админ генератора. В моем проекте используется Doctrine с поведением NestedSet, и фильтр мне нужен был по родительскому полю. Точнее, показать потомков выбранного элемента. Для этого я пошел в папку /lib/filters и открыл файл фильтров для нужной модели. Там будем править метод configure. В моем случае дело происходит в плагине, поэтому метод, который я буду править называется setupInheritance.

public function setupInheritance() { parent::setupInheritance(); $this->widgetSchema['parent'] = new sfWidgetFormDoctrineChoiceNestedSet(array( 'model' => 'MODEL_NAME', 'add_empty' => true )); $this->validatorSchema['parent'] = new sfValidatorDoctrineChoice(array( 'model' => 'MODEL_NAME', 'required' => false )); }

Добавили виджет и валидатор. sfWidgetFormDoctrineChoiceNestedSet это простой DoctrineChoice, в котором есть отступы и сортировка в соответствии с иерархией в NestedSet. Теперь наш виджет виден в форме, правда ни на что пока не влияет. Чтобы на что-то влиять, нам надо добавить его в список полей фильтра в том же файле.

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

Здесь надо обратить внимание не только на значение, но и на имя ключа в массиве. В качестве значения можно указывать "Number", "Text", "Date" и некоторые другие. Я не пробовал, но полагаю, что если указать одно из них, то сработает стандартный обработчик поля фильтра, как например addNumberQuery. В нашем случае формат нестандартный и обработчик будем делать сами.

Кстати говоря, если в данный момент посмотреть на наш проект - нам выбросят исключение, где будет сказано как надо назвать метод, который будет обрабатывать наше поле. В моем случае это addParentColumnQuery. Формат названия функции, скорее всего такой: add_COLUMN_NAME_ColumnQuery. А собственно вот и она сама:

public function addParentColumnQuery($q, $element, $value) { $parent = Doctrine::getTable('MODEL_NAME')->findOneById($value); return $q->andWhere('lft > ?', $parent->getLft())->andWhere('rgt < ?', $parent->getRgt()); }

Получаем Doctrine_Query в качестве параметра $q, добавляем свои условия и возвращаем. Все легко и просто. Наздоровье :)

Референс: http://robert-says.com/2010/03/symfony-how-to-add-a-custom-filter-for-the-admin-listing

rss