【问题标题】:Symfony sfDoctrineGuard plugin sfGuardUser moduleSymfony sfDoctrineGuard 插件 sfGuardUser 模块
【发布时间】:2010-06-08 15:21:54
【问题描述】:

使用 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 表中添加字段名称就可以了工作,但遗憾的是它没有。

【问题讨论】:

    标签: php symfony1 sfguard sfdoctrineguard


    【解决方案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));
    

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

    【讨论】:

      【解决方案2】:

      首先,您必须将新的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)
      )));
      

      祝你好运:)

      【讨论】:

        猜你喜欢
        • 2011-09-28
        • 1970-01-01
        • 2011-11-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-01
        • 2011-04-15
        • 1970-01-01
        相关资源
        最近更新 更多