symfony覆盖BaseForm类howto

时间:2010-07-02 12:08:34

标签: forms symfony1 symfony-forms sfguard sfdoctrineguard

我已经安装了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,但我不明白为什么会阻止它工作。

有什么想法吗?

由于

2 个答案:

答案 0 :(得分:2)

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

复制文件

插件/ sfDoctrineGuardPlugin / LIB /形式/教义/ sfGuardUserAdminForm.class.php

LIB /形式/教义/

然后将此行添加到configure()方法

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

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

答案 1 :(得分:0)

尝试编辑

  

LIB /供应商/ symfony的/ LIB /插件/ sfDoctrineGuardPlugin / LIB /形式/教义/ 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']);
  }
}

就这么简单。

希望有所帮助