Формы Symfony: как изменить виджет по умолчанию для генерации форм - PullRequest
4 голосов
/ 21 мая 2010

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

Единственный подход, который я нашел, - это модификация BaseFormDoctrine.php:

public function setup()
{
    foreach($this->getWidgetSchema()->getFields() as $name=>$widget)
    {
        if($widget instanceof sfWidgetFormDate) 
        {
            $this->widgetSchema[$name] = new sfWidgetFormJQueryDate(array(
                'config' => '{}',
                'image'=>'/images/calendar.png',
            ));
        }
    }
}

Ответы [ 2 ]

5 голосов
/ 24 мая 2010

Что вы можете сделать, это создать свой собственный класс генератора форм.

class myFormGenerator extends sfDoctrineGenerator
{

  public function getWidgetClassForColumn($column)
  { 
    switch ($column->getDoctrineType())
    {
      case 'date':
        return 'sfWidgetFormJQueryDate';
        break;
      default:
        return parent::getWidgetClassForColumn($column); 
    }
  }
}

Сохраните это где-нибудь разумное в вашей папке lib, очистите кеш и т.д ..

Затем перезапустите генератор, как ...

php doctrine:build-forms --generator-class='myFormGenerator'

Я не пробовал ничего из вышеперечисленного, но я думаю, что теория обоснована ...

Взгляните на следующие файлы, чтобы узнать, откуда я это понял:

lib/vendor/symfony/lib/plugins/sfDoctrinePlugin/lib/task/sfDoctrineBuildFormsTask.class.php
lib/vendor/symfony/lib/plugins/sfDoctrinePlugin/lib/generator/sfDoctrineFormGenerator.class.php
0 голосов
/ 26 мая 2010

После ответа johnwards, так как я хочу определить параметры по умолчанию для виджета, я также переопределил функцию, чтобы сделать это:

class myFormGenerator extents sfDoctrineFormGenerator
{

  public function getWidgetClassForColumn($column)
  { 
    ...
  }

  public function getWidgetOptionsForColumn($column)
  {
    switch ($column->getDoctrineType())
    {
      case 'date':
        return "array('config' => '{}', 'image'=>'/images/calendar.png')";
    break;
      default:
        return parent::getWidgetOptionsForColumn($column); 
    }
  }
}
...