1

我正在使用 Symfony 1.4 后端使用 sfGuardUser 插件创建/更新用户,该插件包含具有不同权限的用户。

我正在使用另一个表,与 sfGuardUser 具有 1-1 关系。在这个表中,我存储了与特定类型用户相关的信息,这些用户由他的权限区分。

Symfony 已经完成了它的工作,并生成了一个选择字段,其中所有用户都存储在 sfGuardUser 中。

我想过滤此列表,以便仅显示具有特定权限的 sfGuardUsers。

我发现很多文章都是关于如何在后端创建特定过滤器的资源,但没有关于如何解决我的问题的资源。

4

2 回答 2

1

@j0k的问题对于这个问题至关重要。如果您总是需要相同的权限,那么实现您想要的东西是相当容易的。如果您希望权限是动态的,该解决方案会有点棘手。

在前一种情况下,您必须编辑用于与 sgGuardUser 相关的表的后端操作(新建和编辑)的 Form 类。您必须编辑负责检索用户列表的选择小部件:(假设关系列是user_id并且您正在使用 Doctrine):

$this->widgetSchema['user_id']->setOption('table_method' => 'retrieveForPermissionX');

然后,sfGuardUserTable.class.php您必须添加准备正确查询的函数:

public function retrieveForPermissionX()
{
    return $this->createQuery('u')
        ->innerJoin('u.sfGuardUserPermission up')
        ->innerJoin('u.Permissions p')
        ->where('p.name = "PermissionX"')
        ->orderBy('u.first_name ASC');
} 

正如我所说,如果您需要使用不同的权限,它会变得更加棘手。基本原理是相同的——您必须为表单内的小部件选择合适的用户,但您必须以某种方式告诉表单使用哪个权限。

我认为您必须覆盖自动生成的新操作和编辑操作。将所需权限作为 URL 中的参数传递(或使用特定 URL 来获得所需的给定权限)并在操作内部将权限作为选项传递给您的表单:

$this->form = new UserInfoForm(null, array('permissions' => $permissions));

然后,您可以使用此信息在选择小部件上调用适当的 table 方法(或生成查询对象 - 除了 table 方法,您还可以传递一个查询对象,该对象将用于检索小部件的对象)。

于 2013-02-21T20:15:40.277 回答
1

正是我想要的。如上所述,我对查询和代码进行了一些修改:

在 lib/model/doctrine/sfDoctrineGuardPlugin/sfGuardUserTable.class.php

public function retrieveForPermissionX()
{
     return $this->createQuery('u')
          ->leftJoin('u.sfGuardUserPermission up')
          ->innerJoin('u.Permissions p')
          ->where('p.name = "PermissionX"')
          ->orderBy('u.first_name ASC');             
}

在应用程序/your_app_name/modules/your_module_name/actions/actions.class.php

public function executeNew(sfWebRequest $request)
{
    $this->table_client = new tableClient();
    $this->form = new TableClientForm($this->table_client);

    $widgetSchema = $this->form->getWidgetSchema();
    $widgetSchema['sf_guard_user_id']->setOption('table_method', 'retrieveForPermissionX');
}
于 2013-02-22T13:14:33.090 回答