我正在尝试将已创建的表单类型(TagsType
)从select2 v3更新为v4。但我发现新的select2使用选择而不是文本字段的问题。以下代码适用于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中动态创建了新选项。
我的问题:
答案 0 :(得分:0)
忘记所有关于','并将字符串转换为数组,反之亦然,并单独保存每个标记实体。
因此,要使您的表单与select2-v4.x兼容,您需要一个EntityType字段,其中'multiple'属性设置为TRUE。
每件事都由symfony处理,表单的select标签中的每个选项都连接到它的实体。
我刚刚找到了这个解决方案,它对我有用,但我不知道也许有些东西不见了......
答案 1 :(得分:0)
非常老的问题,但我是从搜索引擎中找到的。我试图用simple_array +数据转换器来实现它-这是错误的方式(如@YaserKH所说)。最好将标签制作为实体标签等。(您可以在official docs中找到)。但是如果由于某些原因(例如我)需要简单的解决方案:
$builder->add('tagsForSearch', HiddenType::class, [ 'required' => false ])
{{ form_row(form.tagsForSearch) }}
<select id="tags" multiple="multiple">
{% for tag in form.tagsForSearch.vars.value|split(',')|default %}
<option value="{{ tag|raw }}" selected="selected">{{ tag|raw }}</option>
{% endfor %}
</select>
$('#tags').select2({
tags: true
});
$('#form').submit(function () {
var tags = $('#tags').select2().val().join(',');
$('#{{ form.tags.vars.id }}').val(tags);
});