我有以下用例:
用户可以从下拉列表中选择选项,但是如果他们想要选择其他人可以选择的其他内容,则会显示一个Javascript prompt()
,然后将其添加为{{ 1}}到option
并选中。
我的问题是如何在加载页面时将此值加载到select中。我可以看到我可以使用
select
将额外元素添加到列表中,但是如何获取现有元素列表?我确定我不必再对它们进行编码,但我无法找到获取选项列表的路线。
这是下拉列表的类别:
$builder->addEventListener(
FormEvents::PRE_SET_DATA,
所以重新解释一下我的问题,对于这段代码:
use Symfony\Component\Form\AbstractType;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
class HeatGeneratedFormType extends AbstractType
{
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(
array('choices'=>
array(
null=> 'Select',
'Grasses / Straw' => 'Grasses / Straw',
'Wood Chip' => 'Wood Chip',
'Wood Logs' => 'Wood Logs',
'Wood Pellets' => 'Wood Pellets',
'Other' => 'Other'
)
)
);
}
public function getParent()
{
return 'choice';
}
public function getName()
{
return 'HeatGenerated';
}
}
if (!in_array($object->getHeatGenerated(), $form->get('heatGenerated')->getChoices()) {
$form->get('heatGenerated')->addChoice($object->getHeatGenerated());
}
和->getChoices()
不是真正的方法,我如何使用它来获取和编辑选项列表?
答案 0 :(得分:0)
这就是我的所作所为:
class MyFormType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
// other fields chopped
->add('myField', new CustomChoiceFormType()) // This type has the preset choices
;
$builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) {
$data = $event->getData();
$form = $event->getForm();
$choices = $form->get('myField')->getConfig()->getOption('choices');
$choice = $data->getMyField();
if (!in_array($choice, $choices)) {
$newChoices = array_merge($choices, array($choice=>$choice)); // Need to add the key and the value, for me these are the same, but ofcourse they could be different
$form->remove('myField');
$form->add('myField', 'choice', array('choices'=>$newChoices));
}
});
}
}