Фильтр Symfony Admin с объединением - PullRequest
4 голосов
/ 28 марта 2011

У меня есть таблица, heading, которая имеет import_profile_id. import_profile имеет bank_id.

На моей странице списка заголовков в моем админе я бы хотел добавить возможность фильтрации по bank_id. Однако, так как heading не имеет bank_id - для этого нужно пройти import_profile - я не могу просто добавить поле bank_id и ожидать, что оно будет работать.

Может кто-нибудь объяснить, как это сделать? Самое близкое, что я нашел, это это сообщение , но я не думаю, что оно действительно решает мою проблему.

1 Ответ

16 голосов
/ 30 марта 2011

Это можно сделать с помощью виртуальных столбцов , таких как сообщение, которое вы нашли. Виртуальный столбец - это способ добавить новый критерий для фильтрации с помощью автоматически сгенерированного фильтра, предоставленного Symfony. Это работает так:

1 - Перейдите к generator.yml модуля администратора и добавьте имя виртуального столбца, который будет создан, и добавьте

<!-- apps/backend/modules/module_name/config/generator.yml -->
filter:
     [virtual_column_name, and, other, filter, columns]

2 - В вашем lib / filter / {TableName} FormFilter.class.php (я думаю, в вашем случае это должен быть HeadingFormFilter) вы должны определить этот виртуальный столбец в configure () метод

  public function configure()
  {
      //Type of widget (could be sfWidgetFormChoice with bank names)
      $this->widgetSchema['virtual_column_name'] =  new sfWidgetFormInputText(array(
          'label' => 'Virtual Column Label'
      ));

      //Type of validator for filter
      $this->validatorSchema['virtual_column_name'] = new sfValidatorPass(array ('required' => false));
  }

3 - переопределить getFields () этого класса, чтобы определить его в фильтре и установить функцию фильтра

public function getFields()
{
  $fields = parent::getFields();
  //the right 'virtual_column_name' is the method to filter
  $fields['virtual_column_name'] = 'virtual_column_name';
  return $fields;
}

4 - Наконец, вы должны определить метод фильтра. Этот метод должен быть назван в соответствии с шаблоном add ... ColumnQuery , в нашем случае это должен быть addVirtualColumnNameColumnQuery (не счастливый выбор имени: P), поэтому

public function addVirtualColumnNameColumnQuery($query, $field, $value)
{
     //add your filter query!
     //for example in your case
     $rootAlias = $query->getRootAlias();
     $query->innerJoin($rootAlias . '.ImportProfile ip')
           ->andWhere('ip.BankId = ?', $value);

     //remember to return the $query!
     return $query;
}

Готово! Вы можете знать фильтр по bank_id.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...