構成モジュールの入力チェックボックスを作成しようとしていますが、選択ウィジェットが機能しません。
したがって、ラジオボタンとメニューでのみ機能しますが、複数のメニューとチェックボックスではエラーが発生します:
タイプ「配列」、「文字列」の引数が必要です
コード:
$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;
}
}