1

我有一个表TableModule,有 2 个外键,比如说fk1fk2

  • fk1到表1中的pk1

  • fk2到表2中的pk2

我创建了一个模块。假设Module,它使用TableModule(带有fk's 的那个)

我想为这些fk创建 4 个过滤器:2 个输入文本和 2 个下拉菜单。特别是,我想为每个 fk创建两个过滤器。这是:

For fk1 I would get:
  -InputText
  -Dropdown (choice in propel) 
For fk2 I would get:
  -InputText
  -Dropdown (choice in propel)

当然,这将显示Table1Table2的结果。

现在,在我的config.yml中,我得到了:

    ...
    filter:
      display: [fk1, fk1TextFilter, fk2, fk2TextFilter]
    ...  

这是:fk1fk2将作为下拉列表过滤,必须自定义部分 fk1TextFilter 和 fk2TextFilter 以使用文本输入 进行过滤

为什么我创建了这些部分?因为我不能复制 config.yml 中的 fk !!

lib/filter/table1/ModuleFormFilter我做了(注意在table1中):

 public function configure()
 {
  $this->setWidgets(array(
  'fk1'                => new sfWidgetFormPropelChoice(array('model' => 'table1',  'add_empty' => true,)),
  'fk1TextFilter'      => new sfWidgetFormInput(),
  'fk2'                => new sfWidgetFormPropelChoice(array('model' => 'table2',  'add_empty' => true,)),
  'fk2TextFilter'      => new sfWidgetFormInput(),
  ));

$this->setValidators(array(
  'fk1TextFilter'      => new sfValidatorPropelChoice(array('model' => 'table1', 'column' => 'id', 'required' => false)),
  'fk1'                => new sfValidatorPropelChoice(array('model' => 'table1', 'column' => 'id', 'required' => false)),
  'fk2TextFilter'      => new sfValidatorPropelChoice(array('model' => 'table2', 'column' => 'id', 'required' => false)),
  'fk2'                => new sfValidatorPropelChoice(array('model' => 'table2', 'column' => 'id', 'required' => false)),
));

$this->validatorSchema->setPostValidator(
  new sfValidatorPropelUnique(array('model' => 'table2', 'column' => array('fk2')))
);

$this->widgetSchema->setNameFormat('model[%s]');

$this->errorSchema = new sfValidatorErrorSchema($this->validatorSchema);

}

这是:如前所述,创建了 2 个 textInput 和 2 个下拉菜单。

如果我使用 - 可能是输入文本或下拉列表 - 只是fk这将正常工作。问题是我无法复制 fk 的. 我不能这样做:

  $this->setWidgets(array(
  'fk1'   => new sfWidgetFormPropelChoice(array('model' => 'table1',  'add_empty' => true,)),
  'fk1'   => new sfWidgetFormInput(),
  'fk2'   => new sfWidgetFormPropelChoice(array('model' => 'table2',  'add_empty' => true,)),
  'fk2'   => new sfWidgetFormInput(),
  ));

如果我运行我得到的页面:

You must define a "filterByfk1TextFilter" method in the ModelQuery class to be able to filter with the "fk1TextFilter" field.

我找到了一些链接(12),但对我不起作用。我在 symfony 文档中没有具体的例子。

我必须创建什么以及如何创建?

到目前为止,我有同样的lib/filter/table1/ModuleFormFilter

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

public function addModelfk1TextFilterQuery($query, $field, $value)
{
 //add your filter query!
 //for example in your case
 $rootAlias = $query->getRootAlias();
 $query =  ModelQuery::create()
  ->filterByfk1TextFilter()
  ->find();

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

不适合我。请问你能帮帮我吗??

4

3 回答 3

4

对于那些使用 Doctrine 的人,这是我的“用户配置文件”模型上的一个简单扩展,允许通过 sfDoctrineGuardPlugin 中的 sfGuardUser 模型上的字段进行过滤。

我的“个人资料”类被称为成员,并通过 user_id 列通过用户关系引用 sfGuardUser。

希望有人觉得它有用!

class MemberFormFilter extends BaseMemberFormFilter {

  public function configure() {
    $this->setWidget('first_name', new sfWidgetFormInputText());
    $this->setWidget('last_name', new sfWidgetFormInputText());
    $this->setWidget('email_address', new sfWidgetFormInputText());

    $this->setValidator('first_name', new sfValidatorString(array('required' => false)));
    $this->setValidator('last_name', new sfValidatorString(array('required' => false)));
    $this->setValidator('email_address', new sfValidatorString(array('required' => false)));
  }

  public function getFields() {
    return array_merge(parent::getFields(), array(
      'first_name' => 'Text',
      'last_name' => 'Text',
      'email_address' => 'Text'
    ));
  }

  public function addFirstNameColumnQuery(Doctrine_Query $query, $field, $value) {
    $rootAlias = $query->getRootAlias();
    return $query->leftJoin($rootAlias.'.User u')
      ->where('u.first_name LIKE ?', "%$value%");
  }

  public function addLastNameColumnQuery(Doctrine_Query $query, $field, $value) {
    $rootAlias = $query->getRootAlias();
    return $query->leftJoin($rootAlias.'.User u')
      ->where('u.last_name LIKE ?', "%$value%");
  }

  public function addEmailAddressColumnQuery(Doctrine_Query $query, $field, $value) {
    $rootAlias = $query->getRootAlias();
    return $query->leftJoin($rootAlias.'.User u')
      ->where('u.email_address LIKE ?', "%$value%");
  }

}
于 2012-09-25T06:13:40.013 回答
0

黑魔法:

有很多不同的方法。没有一个对我有用,至少我发布的链接中的那些。

不过,使用:add[VirtualColumnName]ColumnCriteria允许您自定义过滤器。

在这种情况下,在我编写的所有代码之后(并更改addModelfk1TextFilterQuery())只需添加:

public function addfk1TextFilterColumnCriteria($query, $field, $value)
{
  //Here just put a query in propel, for ex:

  $query = $query->useTableModel()
                 ->filterByName("*$value*")
               ->endUse()
               ->find();
 return $query;
}

希望这对其他人有所帮助!

迷你编辑:做一些回应和澄清$field$values

于 2012-04-18T14:37:50.737 回答
0

我认为将addWhere而不是where放在每个“addXColumnQuery 函数上会更好,因为这种方式将保留和组合其他过滤器集。

于 2015-06-09T21:23:21.850 回答