使用sfGuard插件按UserProfile字段过滤

时间:2012-07-19 19:33:53

标签: symfony1 symfony-1.4 sfguard

在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有效值的表单时,它不会过滤。返回所有记录。

1 个答案:

答案 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);
        }
    }