我正在使用Symfony 1.4后端使用sfGuardUser插件创建/更新用户,该插件包含来自不同权限的用户。
我正在使用另一张表,与sfGuardUser有1-1的关系。在此表中,我存储了与其权限区分的特定用户类型相关的信息。
Symfony完成了它的工作并生成了一个选择字段,所有用户都存储在sfGuardUser中。
我想过滤此列表,以便仅显示具有特定权限的sfGuardUsers。
我发现很多文章是关于如何在后端创建特定过滤器的资源,但没有关于如何解决我的问题。
答案 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');
}