如何在Admin中过滤自动生成的选择字段的内容?

时间:2013-02-21 09:29:39

标签: symfony-1.4

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

我正在使用另一张表,与sfGuardUser有1-1的关系。在此表中,我存储了与其权限区分的特定用户类型相关的信息。

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

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

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

2 个答案:

答案 0 :(得分:1)

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

在前一种情况下,您必须编辑Form类,该类用于与sgGuardUser相关的表的后端(新建和编辑)中的操作。您必须编辑负责检索用户列表的选择小部件:(假设关系列为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的特定URL),并在操作内部将权限作为表单的选项传递:

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

然后,您可以使用此信息在选择窗口小部件上调用正确的表方法(或生成查询对象 - 或者对于表方法,您还可以传递将用于检索窗口小部件的对象的查询对象)。

答案 1 :(得分: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');             
}

在apps / 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');
}