自定义布局到sfWidgetFormDoctrineChoice禁用复选框

时间:2013-11-21 10:33:11

标签: php forms symfony-1.4

早上好,

在Symfony 1.4中,
我试着做这里解释的内容:Customizing layout to 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()
  )));

感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

根据文档,您必须将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选项。