【问题标题】:symfony override BaseForm class howtosymfony 重写 BaseForm 类 howto
【发布时间】:2010-07-02 12:08:33
【问题描述】:

我已经安装了sfDoctrineGuard 插件。一切正常,我可以使用 /sf_guard_user/edit/:id 页面来编辑用户。

我不喜欢将权限列为选择列表的方式,我想将它们显示为根据权限名称拆分的单个复选框。为此,我创建了一个扩展 sfWidgetFormChoice 的自定义小部件。这也是我想要的方式,但我的问题如下:

为了使用我的自定义小部件,我在此文件中编辑了以下几行:

lib/form/doctrine/sfDoctrineGuardPlugin/base/BasesfGuardUserForm.class.php

之前:

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

之后:

      'groups_list'      => new sfWidgetFormDoctrineChoice(array('multiple' => true,     'model' => 'sfGuardGroup', 'expanded' => true)),
      'permissions_list' => new myCustomPermissionWidget(),

这给出了正确的结果。

问题是我不应该编辑 Base 类,因为任何时候我构建我的模型文件都会被覆盖。

所以我应该编辑这个文件:

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

    class sfGuardUserForm extends PluginsfGuardUserForm
    {
      public function configure()
      {
        parent::configure();

        $this->setWidgets(array(
          'groups_list'      => new sfWidgetFormDoctrineChoice(array('multiple' => true, 'model' => 'sfGuardGroup', 'expanded' => true)),
          'permissions_list' => new myCustomPermissionWidget(),
        ));
      }
    }

但这不起作用。我已经尝试了新函数 setup() 中的代码,在我的代码之前和之后使用 parent::setup(),但仍然没有。

PluginsfGuardUserForm 是抽象的并扩展了 BasesfGuardUserForm 但我不明白为什么这会阻止它工作。

有什么想法吗?

谢谢

【问题讨论】:

    标签: forms symfony1 symfony-forms sfguard sfdoctrineguard


    【解决方案1】:

    我相信编辑用户操作使用插件目录中的类 sfGuardUserAdminForm

    复制文件

    plugins/sfDoctrineGuardPlugin/lib/form/doctrine/sfGuardUserAdminForm.class.php

    进入

    lib/form/doctrine/

    然后在configure()方法中加入这一行

    $this->setWidget('permissions_list' => new myCustomPermissionWidget());

    您不需要添加对 parent::configure() 的调用,在表单框架中执行此操作是不好的做法,只有在您知道需要时才应该这样做。

    【讨论】:

    • 感谢您,这绝对符合我正在寻找的内容,但是我目前无法测试。假设您的答案有效,我仍然不确定为什么有一个 BasesfGuardUser 类,然后是一个 sfGuardUser 类。对我来说,我的更改在 sfGuardUser 类中是绝对有意义的,但似乎不起作用。它甚至看起来都没有被实例化,这可能是以后的问题。
    • 基类永远不应该被触及。 pluton 使用管理员用户表单在管理区域进行编辑。这是因为我猜它会做自己的事情。这意味着您确实需要对管理区域编辑进行更改。
    【解决方案2】:

    尝试编辑

    lib/vendor/symfony/lib/plugins/sfDoctrineGuardPlugin/lib/form/doctrine/PluginsfGuardUserForm.class.php

    “vendor”和“symfony”将是您在安装时拥有的任何内容。当我想从登录表单中删除记住我复选框时,这对我有用:

    <?php
    
    /**
     * sfGuardFormSignin for sfGuardAuth signin action
     *
     * @package    sfDoctrineGuardPlugin
     * @subpackage form
     * @author     Fabien Potencier <fabien.potencier@symfony-project.com>
     * @version    SVN: $Id: sfGuardFormSignin.class.php 23536 2009-11-02 21:41:21Z Kris.Wallsmith $
     */
    class sfGuardFormSignin extends BasesfGuardFormSignin
    {
      /**
       * @see sfForm
       */
      public function configure()
      {
        $this->widgetSchema->setFormFormatterName('list');
        unset($this['remember']);
      }
    }
    

    就这么简单。

    希望对你有帮助

    卢克

    【讨论】:

    • 感谢您的回复。我搜索了 PluginsfGuardUserForm.class.php 并在这里找到了它:plugins/sfDoctrineGuardPlugin/lib/form/doctrine/PluginsfGuardUserForm.class.php 我还寻找了 lib/vendor/symfony/lib/plugins/sfDoctrineGuardPlugin/lib/form/doctrine 但是好像没有那个目录。我得到了包含 2 个文件的 lib/vendor/symfony/lib/plugins/sfDoctrinePlugin/lib/form: sfFormDoctrine.class.php sfFormFilterDoctrine.class.php 所以不幸的是仍然卡住了。
    • 您是否尝试编辑您找到的 pluginsfGuardUserForm.class.php?如果是这样,什么都没发生?可能只是我们的目录结构略有不同。
    猜你喜欢
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 2018-09-12
    • 2010-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多