1

使用 sfDoctrineGuard 插件时,它会自动生成后端管理功能,我可以在其中编辑系统用户并为他们分配权限。

因此,我访问http://.../backend_dev.php/sf_guard_user/:id/edit了显示用户信息的位置,包括可供选择的可用权限。

默认情况下,权限显示为多选框,HTML 如下:

<select name="sf_guard_user[permissions_list][]" multiple="multiple" id="sf_guard_user_permissions_list">
  <option value="1">Permission1</option>
  <option value="2">Permission2</option>
  <option value="3">Permission3</option>
  <option value="4">Permission4</option>
</select>

我更喜欢的是复选框列表。所以我四处搜索,发现如果我将选项“expanded”设置为true添加到以下代码:

'permissions_list' => new sfWidgetFormDoctrineChoice(array('multiple' => true, 'model' => 'sfGuardPermission', 'expanded' => true,)),

代码是该文件的一部分:lib/form/doctrine/sfDoctrineGuardPlugin/base/BasesfGuardUserForm.class.php。我认为我不应该编辑此文件(如果重新安装 sfDoctrineGuard,可能会覆盖更改),但想不出另一种方法来使其工作。

生成的 HTML 如下:

<ul class="checkbox_list">
 <li><input name="sf_guard_user[permissions_list][]" type="checkbox" value="1" id="sf_guard_user_permissions_list_1" />&nbsp;<label for="sf_guard_user_permissions_list_1">Permission1</label></li>
 <li><input name="sf_guard_user[permissions_list][]" type="checkbox" value="2" id="sf_guard_user_permissions_list_2" />&nbsp;<label for="sf_guard_user_permissions_list_2">Permission2</label></li>
 <li><input name="sf_guard_user[permissions_list][]" type="checkbox" value="3" id="sf_guard_user_permissions_list_3" />&nbsp;<label for="sf_guard_user_permissions_list_3">Permission3</label></li>
 <li><input name="sf_guard_user[permissions_list][]" type="checkbox" value="4" id="sf_guard_user_permissions_list_4" />&nbsp;<label for="sf_guard_user_permissions_list_4">Permission4</label></li>
</ul>

我现在需要做的是根据前缀拆分权限。例如,如果我有名为 user_action1、user_action2、file_action1、file_action2 的权限,它们将显示如下:

User
checkbox  (custom label) Action One
checkbox                 Action Two

File
checkbox  (custom label) Action One
checkbox                 Action Two

但不知道从哪里开始。如果有要编辑的模板会很容易,但是由于我正在处理 Forms 框架,因此我理解模板是动态生成的 - 我可以在我的 symonfy 缓存文件夹中看到它们。

我该怎么办?

我开始编写自己的 sfWidgetFormDoctrineChoicePermission 类,该类扩展了与 sfWidgetFormDoctrineChoice 相同的类,但我正在努力正确编辑渲染函数以获得所需的输出。这是进行这项工作的正确方法吗?

我还需要将我的 sfGuardUserProfile 模型集成到编辑用户页面(与上面相同),我在某处读到编辑 sfGuardUser 插件模块的 generator.yml 文件并简单地从 sfGuardUserProfile 表中添加字段名称就可以了,但是可悲的是它没有。

4

2 回答 2

1

首先永远不要编辑基类。您要编辑的是:

lib/form/doctrine/sfDoctrineGuardPlugin/sfGuardUserForm.class.php

从这里您可以通过调用覆盖默认小部件:

$this->setWidget('permissions_list', new sfWidgetFormDoctrineChoice(array('multiple' => true, 'model' => 'sfGuardPermission', 'expanded' => true)));

您应该创建自己的小部件并从 sfWidgetFormDoctrineChoice 扩展它是最好的开始。基本上它将返回 html 作为 php 字符串,这将得到回显。这很简单,最终让你明白。

在编辑主用户表单时包含您的个人资料表单非常简单,在同一个 sfGuardUserForm 类中:

$this->embedForm('profile', new sfGuardUserProfileForm($this->getObject->NAME_OF_PROFILE_RELATIONSHIP));

最后一个电话不在我的脑海中,所以语法可能是错误的,所以检查一下,当然也用你的个人资料关系的名称替换关系。

于 2010-06-12T12:35:41.320 回答
0

首先,您必须将新用户configure()放入UserAdmin表单(后端),而不是来自(前端)的常规用户。

然后,您的configure()方法将具有新的小部件声明:

$this->setWidget('permission_list', new sfWidgetFormDoctrineChoice(array(
'muliple' => true,   // this makes checkboxes (default=false=radio)
'model' => sfGuardPermission,
'expanded' => true   // changes from select menu -> radio or check (based on 'multiple' setting)
)));

祝你好运:)

于 2010-08-23T17:03:10.863 回答