Symfony переопределить класс BaseForm - PullRequest
2 голосов
/ 02 июля 2010

Я установил плагин 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(),

Это дает правильный результат.

Проблема в том, что я не должен был редактировать базовый класс, так как каждый раз, когда я строю свою модель, файл перезаписывается.

Итак, я должен отредактировать этот файл:

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 ]

2 голосов
/ 02 июля 2010

Я считаю, что действие редактирования пользователя использует класс sfGuardUserAdminForm, который находится в каталоге плагинов

Скопируйте файл

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

в

lib / form / doctrine /

Затем добавьте эту строку в метод configure ()

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

Вам не нужно добавлять вызов parent :: configure (), это плохая практика - делать это в каркасе формы, и делать это следует только в том случае, если вы знаете, что вам нужнок.

0 голосов
/ 02 июля 2010

Попробуйте отредактировать

Библиотека / поставщика / Symfony / Библиотека / модули / sfDoctrineGuardPlugin / Библиотека / форма / учение / 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']);
  }
}

Было так просто.

Надеюсь, это поможет

Люк

...