@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 方法,您还可以传递一个查询对象,该对象将用于检索小部件的对象)。