1

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

4

1 回答 1

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一个函数(推进符号)。对于 first_name,我们有:addMyFieldColumnCriteriasfGuardUserProfileFormFilter

    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);
        }
    }
于 2012-07-21T13:10:06.267 回答