Я пытаюсь обновить уже созданный тип формы (TagsType
) от выбора 2 v3 до v4. Но я обнаружил проблему, заключающуюся в том, что новое select2 использует select вместо текстового поля. Следующий код прекрасно работает с v3.
class TagsType extends AbstractType
{
/**
* @inheritdoc
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->addViewTransformer(new StringToArrayTransformer());
}
/**
* {@inheritdoc}
*/
public function buildView(FormView $view, FormInterface $form, array $options)
{
$attr = isset($view->vars['attr']) ? $view->vars['attr'] : [];
$view->vars['attr'] = array_merge($attr, ['data-toggle' => 'tags']);
}
/**
* @inheritdoc
*/
public function getParent()
{
return 'text';
}
/**
* @inheritdoc
*/
public function getName()
{
return 'tags';
}
}
StringToArrayTransformer:
class StringToArrayTransformer implements DataTransformerInterface
{
/**
* @inheritdoc
*/
public function transform($value)
{
if (!$value ) {
return [];
}
if (!is_array($value)) {
throw new TransformationFailedException('Expected a Array.');
}
return implode(',', $value);
}
/**
* @inheritdoc
*/
public function reverseTransform($value)
{
if (null === $value) {
return [];
}
if (!is_string($value)) {
throw new TransformationFailedException('Expected a String.');
}
return explode(',', $value);
}
}
Приведенный выше код отлично работает с сущностью с полем типа simple_array
(разделенные запятой). Мне нужно сделать то же самое, но с использованием новой версии select2.
Рефакторинг:
class TagsType extends AbstractType
{
/**
* {@inheritdoc}
*/
public function buildView(FormView $view, FormInterface $form, array $options)
{
$attr = isset($view->vars['attr']) ? $view->vars['attr'] : [];
$view->vars['attr'] = array_merge($attr, ['data-toggle' => 'tags']);
}
/**
* @inheritdoc
*/
public function getParent()
{
return 'choice';
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(['multiple' => true]);
}/**
* @inheritdoc
*/
public function getName()
{
return 'tags';
}
}
Рефакторинг генерирует тег select с несколькими, но пустыми. А когда попробуем добавить какую-то опцию (Tag
) проверка не проходит, потому что динамическое создание новых опций в select.
Мои вопросы:
Забудьте все о ‘,’ и преобразуйте строку в массив или наоборот и сохраните каждую сущность Tag по отдельности.
Итак, чтобы сделать вашу форму совместимой с select2-v4.x, вам нужно одно поле EntityType с атрибутом «множественный», установленным в значение «ИСТИНА».
Каждая вещь обрабатывается Symfony, каждая опция (и) в теге select вашей формы связана с ее сущностью.
Я только что нашел это решение, и оно работает для меня, но я не знаю, может быть, некоторые вещи отсутствуют …
Других решений пока нет …