Symfony: свой фильтр в admin generator
Кратко о том, как сделать фильтр для админ генератора. В моем проекте используется 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