Symfony2表单选项复选框不起作用

时间:2012-07-03 17:17:01

标签: php forms symfony checkbox

我正在尝试为配置模块创建一些输入复选框,但选择窗口小部件无效。

因此它仅适用于单选按钮和菜单,而对于多个菜单和复选框,我有一个错误:

  

“array”类型的预期参数,“string”给出

代码:

$builder->add('value', 'choice', array
                    (
                        'label' => $this->item->getTitle() . ':',
                        'choices' => array('1' => 'one', '2' => 'two'),
                        'multiple' => true,
                        'expanded' => true,
                                           )
        );

这是一个例子。

修改

所以在我的配置包中我有很多不同类型的输入用于描述更好的配置值,对于每一个我渲染适当的小部件。 我对所有小部件没有任何问题,除了复选框和菜单多个选项小部件,收音机和菜单工作正常。

这是表单类:

class ItemType extends AbstractType {

/**
 * The configuration item (one row's data)
 * @var Item
 */
private $item;


/**
 * Widget type
 * @var string
 */
private $widget;


/**
 * widget's options
 * @var array
 */
private $options = array();

/**
 * Class constructor
 * 
 * @param Item $item The configuration item (one row's data)
 * @return void
 */
public function __construct(Item $item, $widget, $options = array()) 
{
    $this->item = $item;
    $this->widget = $widget;
    $this->options = $options;
}

/**
 * Builds the form
 * 
 * @param FormBuilder $builder The form builder
 * @param array $options The options
 * @return void
 * 
 * @see Symfony\Component\Form\AbstractType::buildForm()
 */
public function buildForm(FormBuilder $builder, array $options) 
{
    $fieldOptions = array('attr' => array('class' => 'text'));

    switch($this->widget)
    {
        case 'menu':
        case 'MultipleMenu':
        case 'radio':
        case 'checkbox':
                        $choices = $this->getWidgetOptions($this->options['values'], ':');

                        if($this->widget == 'radio')
                        {
                            $fieldOptions = array('attr' => array('class' => 'configurationFormRadioButton'));
                        }

                        $builder->add('value', 'choice', array_merge(
                                                                        $fieldOptions, 
                                                                        $this->getChoiceOption($this->widget), 
                                                                        array
                                                                        (
                                                                            'label' => $this->item->getTitle() . ':',
                                                                            'choices' => $choices
                                                                        )
                                                                    )
                                    );
                        break;

        case 'text':
        case 'password':
        case 'email':
        case 'url':
        case 'number':
        case 'integer':
        case 'textarea':
                        $builder->add('value', $this->widget, array_merge($fieldOptions, array('label' => $this->item->getTitle() . ':')));
                        break;

        case 'date':
                        $builder->add('value', $this->widget, array_merge(
                                                                            array(
                                                                                    'attr' => array('class' => 'date'),
                                                                                    'label' => $this->item->getTitle() . ':',
                                                                                    'input' => 'string',
                                                                                    'widget' => 'single_text'
                                                                                ),
                                                                            $this->getWidgetOptions($this->options['options'], '=')
                                                                         )
                                    );
                        break;

        case 'datetime':
                            $builder->add('value', $this->widget, array_merge( 
                                                                                array(
                                                                                        'attr' => array('class' => 'date'),
                                                                                        'label' => $this->item->getTitle() . ':',
                                                                                        'input' => 'string',
                                                                                        'date_widget' => 'choice',
                                                                                        'time_widget' => 'choice'
                                                                                    ),
                                                                                $this->getWidgetOptions($this->options['options'], '=')
                                                                            )
                                        );
                            break;


        case 'time':
                            $builder->add('value', $this->widget, array_merge(
                                                                                array(
                                                                                        'attr' => array('class' => 'date'),
                                                                                        'label' => $this->item->getTitle() . ':',
                                                                                        'input' => 'string',
                                                                                        'widget' => 'choice'
                                                                                    ),
                                                                                $this->getWidgetOptions($this->options['options'], '=')
                                                                            )
                                        );
                            break;

        case 'datepicker':
                            $builder->add('value', 'text', array_merge(
                                                                        array(
                                                                                'attr' => array('class' => 'datepicker text'),
                                                                                'label' => $this->item->getTitle() . ':'
                                                                            ),
                                                                        $this->getWidgetOptions($this->options['options'], '=')
                                                                     )
                                        );
                            break;
    }

    $builder->setData($this->item);
}

/**
 * Returns the name of this type
 * @return string
 */
public function getName() 
{
    return 'configurationItemForm';
}


/**
 * Set widget type for field
 * @return array
 */
private function getChoiceOption($inputType)
{
    switch($inputType)
    {
        case 'menu':
                    return array('multiple' => false, 'expanded' => false);
                    break;

        case 'MultipleMenu':
                    return array('multiple' => true, 'expanded' => false);
                    break;

        case 'radio':
                    return array('multiple' => false, 'expanded' => true);
                    break;

        case 'checkbox':
                    return array('multiple' => true, 'expanded' => true);
                    break;
    }
}


/**
 * Get widget options from database
 * @return array
 */
private function getWidgetOptions($from, $explodeChar)
{
    $options = array();

    if($from != '')
    {
        $pairs = explode('|', $from);

        foreach($pairs as $pair)
        {
            $values[] = explode($explodeChar, $pair);
            foreach($values as $value)
            {   
                $options[$value[0]] = $value[1];
            }
        }
    }
    return $options;
}
}

1 个答案:

答案 0 :(得分:1)

你在这里的代码看起来很好。问题似乎是您的对象没有返回映射到选择字段的属性的数组值。

例如,如果您的对象是用户并且具有角色数组,$user->getRoles()应该返回一个数组,但是如果它返回一个字符串,那么如果您尝试将其映射到一个选项,它将引发错误字段。

您应该考虑使用表单事件来使表单生成更清晰,并且在这种情况下更容易调试。您可以在此处查看动态生成表单的示例http://symfony.com/doc/current/cookbook/form/dynamic_form_generation.html