Php Symfony 1.4:创建自定义过滤器。外键和具有不同过滤器的重复键(推进)
我有一个表,TableModule,有两个外键,比如说fk1和fk2 fk1转到表1中的pk1 fk2转到表2中的pk2 我创建了一个模块。比方说,Module,它使用TableModule,即带有fk 我想为这些fk创建4个过滤器:2个输入文本和2个下拉列表。特别是,我想为每个fk创建两个过滤器。这是: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
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%");
}
}