我有一张表, TableModule ,有2个外键,假设 fk1 和 fk2 。
fk1 转到 pk1 表表1
fk2 转到 pk2 表表2
我创建了一个模块。比方说,模块,它使用 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)
当然,这会显示 Table1 和 Table2 的结果。
现在,在我的 config.yml 中,我得到了:
...
filter:
display: [fk1, fk1TextFilter, fk2, fk2TextFilter]
...
这是: fk1 和 fk2 将作为下拉列表进行过滤, partials fk1TextFilter 和必须自定义fk2TextFilter 以使用文本输入进行过滤。
为什么我创建了 partials ?因为我无法在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个下拉列表。
如果我使用-could是输入文本或下拉列表 - 只需 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.
我找到了一些链接(1,2),但不适合我。我在symfony docs中没有具体的例子。
我必须创建什么以及如何创建?
到目前为止,我有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;
}
不适合我。你能帮帮我吗?
答案 0 :(得分: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%");
}
}
答案 1 :(得分:0)
黑魔法:
有许多不同的方法。没有人为我工作,至少在我发布的链接中。
尽管如此,使用:添加[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
做一些回声以澄清
答案 2 :(得分:0)
我认为在每个“addXColumnQuery函数”上放置 addWhere 而不是 where 会更好,因为这种方式会保留并合并其他过滤器集。