Php Symfony 1.4:创建自定义过滤器。外键和具有不同过滤器的重复键(推进)

Php Symfony 1.4:创建自定义过滤器。外键和具有不同过滤器的重复键(推进),php,symfony-1.4,propel,Php,Symfony 1.4,Propel,我有一个表,TableModule,有两个外键,比如说fk1和fk2 fk1转到表1中的pk1 fk2转到表2中的pk2 我创建了一个模块。比方说,Module,它使用TableModule,即带有fk 我想为这些fk创建4个过滤器:2个输入文本和2个下拉列表。特别是,我想为每个fk创建两个过滤器。这是: For fk1 I would get: -InputText -Dropdown (choice in propel) For fk2 I would get: -InputT

我有一个表,TableModule,有两个外键,比如说fk1和fk2

fk1转到表1中的pk1

fk2转到表2中的pk2

我创建了一个模块。比方说,Module,它使用TableModule,即带有fk

我想为这些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)
当然,这将显示表1和表2的结果

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

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

为什么我要创建那些partials?因为我不能在config.yml中复制fk

在lib/filter/table1/ModuleFormFilter中,我注意到表1中有:

}

这是:如前所述,创建了2个文本输入和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.
我找到了一些链接,但不适合我。我在symfony文档中没有具体的例子

我必须创造什么,如何创造

现在,在同一个lib/filter/table1/ModuleFormFilter中,我有:

他不适合我。你能帮帮我吗?

黑魔法:

有很多不同的方法。没有一个对我有用,至少在我发布的链接中是这样

然而,使用: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进行一些回显,以进行澄清

黑魔法:

有很多不同的方法。没有一个对我有用,至少在我发布的链接中是这样

然而,使用: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做一些回应,以便澄清

对于那些使用条令的人来说,这是我的“用户配置文件”模型的一个简单扩展,允许从sfDoctrineGuardPlugin按sfGuardUser模型上的字段进行过滤

我的“profile”类被称为Member,并通过用户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%");
  }

}

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

我的“profile”类被称为Member,并通过用户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%");
  }

}

我认为最好在每个addXColumnQuery函数上放置addWhere而不是where,因为这样可以保留并组合其他过滤器集。

我认为最好在每个addXColumnQuery函数上放置addWhere而不是where,因为这种方法将保留并合并其他过滤器集。

这并不能回答问题。若要评论或要求作者澄清,请在其帖子下方留下评论-您可以随时对自己的帖子发表评论,一旦您拥有足够的声誉,您就可以对任何帖子发表评论。这并不能回答问题。若要评论或要求作者澄清,请在其帖子下方留下评论-您可以随时对自己的帖子发表评论,一旦您拥有足够的声誉,您就可以对任何帖子发表评论。
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%");
  }

}