带连接的symfony admin过滤器

Jas*_*ett 4 symfony1

我有一个表,heading即有import_profile_id.import_profile有一个bank_id.

在我的管理员的标题列表页面上,我想添加过滤功能bank_id.但是,由于heading没有bank_id- 它需要经历import_profile这一点 - 我不能只是添加一个bank_id字段并期望它工作.

任何人都可以解释如何做到这一点?我发现最接近的是这篇文章,但我不认为它真的解决了我的问题.

Pab*_*oks 16

这可以通过使用您找到的帖子之类的虚拟列来完成.虚拟列是一种使用symfony提供的自动生成过滤器添加新条件进行过滤的方法.它的工作原理如下:

1 - 转到admin模块的generator.yml,并添加将创建和添加的虚拟列的名称

<!-- apps/backend/modules/module_name/config/generator.yml -->
filter:
     [virtual_column_name, and, other, filter, columns]
Run Code Online (Sandbox Code Playgroud)

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));
  }
Run Code Online (Sandbox Code Playgroud)

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;
}
Run Code Online (Sandbox Code Playgroud)

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;
}
Run Code Online (Sandbox Code Playgroud)

完成!您可以通过bank_id了解过滤器.