Доброе утро,
В Symfony 1.4,
Я попытался сделать то, что объяснено здесь: Настройка макета для sfWidgetFormDoctrineChoice
Но это не сработает. Вместо добавления эскиза я просто хочу скрыть <li>
перед входом, а в некоторых случаях отключить / скрыть ввод флажка, но показать метку в любом случае .
Когда я добавляю рендерер без аргументов, я получаю эту ошибку:
sfWidgetFormMySelectCheckbox requires the following options: 'choices'.
Вот мой код форматирования:
class sfWidgetFormMySelectCheckbox extends sfWidgetFormSelectCheckbox { public function configure($options = array(), $arguments = array()) { parent::configure($options, $arguments); } protected function formatChoices($name, $value, $choices, $attributes) { ..... // new $inputs[$id] = array( 'input' => sprintf('| test | %s', $this->renderTag('input', array_merge($baseAttributes, $attributes)) ), 'label' => $this->renderContentTag('label', self::escapeOnce($option), array('for' => $id)), ); } return call_user_func($this->getOption('formatter'), $this, $inputs); } }
И теперь форма, где я это называю:
$this->setWidget('aaa', new sfWidgetFormDoctrineChoice(array( 'model' => 'Aaa', 'expanded' => true, 'multiple' => true, 'add_empty' => false, 'query' => $query, 'renderer' => new sfWidgetFormMySelectCheckbox() )));
Спасибо за вашу помощь !
Согласно документам вы должны передать опцию choices
объекту renderer
. Попробуйте что-то вроде этого:
$this->setWidget('aaa', new sfWidgetFormDoctrineChoice(array( 'model' => 'Aaa', 'expanded' => true, 'multiple' => true, 'add_empty' => false, 'query' => $query, ))); $this->widgetSchema['aaa']->setOption('renderer', new sfWidgetFormMySelectCheckbox(array( 'choices' => new sfCallable(array($this->widgetSchema['aaa'], 'getChoices')) )));
Поэтому в основном вы хотите, чтобы объект визуализации получал выбор из родительского виджета. Для этого вам нужно передать объект sfCallable
который принимает array
как первый аргумент, в котором вы передаете экземпляр родительского виджета и имя функции getChoices
.
Помните также, что expanded
параметр не используется, когда вы переопределяете renderer
.