在Symfony 1.4中使用sfGuard插件时,如何通过sfGuardUserProfile字段进行过滤?
我认为是标准的,我创建了一个sf_guard_user_profile表来保存诸如名字,姓氏等字段。
我的管理员索引页面有一个相当库存的用户列表。我可以用用户名过滤就好了。但是我无法按照sf_guard_user_profile表中的字段进行过滤,例如last_name。
我的generator.yml看起来像
generator:
class: sfPropelGenerator
param:
model_class: sfGuardUser
config:
list:
display: [=username, first_name, last_name, last_login, role]
batch_actions: []
filter:
display: [username]
form:
class: myGuardUserAdminForm
我可以通过更改为:
让字段显示在页面上的表单中filter:
class: sfGuardUserProfileFormFilter
但是当我提交具有last_name有效值的表单时,它不会过滤。返回所有记录。
答案 0 :(得分:1)
添加sfGuardUserProfileFormFilter
作为过滤器类不是过滤first_name,last_name和其他配置文件字段的正确方法。
相反,您必须在过滤器显示列表中添加一个需要过滤的字段,如:
filter:
display: [username, first_name, last_name]
然后你必须在sfGuardUserProfileFormFilter
中合并sfGuardUserFormFilter
:
public function configure()
{
parent::configure();
$this->mergeForm(new sfGuardUserProfileFormFilter());
}
最后为要筛选的合并表单sfGuardUserFormFilter
的每个字段添加addMyFieldColumnCriteria
函数sfGuardUserProfileFormFilter
(推文符号)。对于first_name,我们有:
protected function addFirstNameColumnCriteria(Criteria $criteria, $field, $values)
{
if (!is_array($values))
return;
$criteria->addJoin(sfGuardUserPeer::ID, sfGuardUserProfilePeer::USER_ID, Criteria::INNER_JOIN);
if (isset($values['is_empty']) && $values['is_empty'])
{
$criteria->add($field, null, Criteria::ISNULL);
$criteria->addOr($field, '', Criteria::EQUAL);
}
else
{
$value = $values['text'];
if ($value == '')
return;
$criteria->add($field, '%'.$value.'%', Criteria::LIKE);
}
}