【问题标题】:symfony admin filter with join带有连接的 symfony 管理过滤器
【发布时间】:2011-03-28 15:57:24
【问题描述】:

我有一张桌子,heading,它有一个import_profile_idimport_profile 有一个 bank_id

在我的管理员的标题列表页面上,我想添加按bank_id 过滤的功能。但是,由于heading 没有bank_id - 它需要通过import_profile 才能得到它 - 我不能只添加一个bank_id 字段并期望它能够工作。

谁能解释一下如何做到这一点?我找到的最接近的东西是this post,但我认为它并不能真正解决我的问题。

【问题讨论】:

    标签: symfony1


    【解决方案1】:

    这可以通过使用虚拟列来完成,就像您找到的帖子一样。虚拟列是一种使用 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知道过滤器。

    【讨论】:

    • 看来您是为 symfony 1.1.4 或更高版本编写此示例,所以您在哪个版本上完成了?
    • 它是为 Symfony 1.4.1 或更高版本制作的。不适用于 sf 2.0
    • 感谢@Pabloks,您的解释很棒。 +1
    猜你喜欢
    • 2016-06-15
    • 1970-01-01
    • 2011-09-05
    • 2018-02-28
    • 1970-01-01
    • 1970-01-01
    • 2011-12-14
    • 1970-01-01
    • 2013-07-20
    相关资源
    最近更新 更多