如何使用select2 v4为标记创建symfony表单类型

时间:2016-01-09 19:29:24

标签: php symfony symfony-forms jquery-select2-4

我正在尝试将已创建的表单类型(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中动态创建了新选项。

我的问题:

  • 如何在symfony中使用动态选项实现选择?
  • 如何从字段数据(数组)
  • 设置默认选项

2 个答案:

答案 0 :(得分:0)

忘记所有关于','并将字符串转换为数组,反之亦然,并单独保存每个标记实体。

因此,要使您的表单与select2-v4.x兼容,您需要一个EntityType字段,其中'multiple'属性设置为TRUE。

每件事都由symfony处理,表单的select标签中的每个选项都连接到它的实体。

我刚刚找到了这个解决方案,它对我有用,但我不知道也许有些东西不见了......

答案 1 :(得分:0)

非常老的问题,但我是从搜索引擎中找到的。我试图用simple_array +数据转换器来实现它-这是错误的方式(如@YaserKH所说)。最好将标签制作为实体标签等。(您可以在official docs中找到)。但是如果由于某些原因(例如我)需要简单的解决方案:

  1. 在数据库中创建文本类型列(不是simple_array)
  2. 在表单构建器中将其定义为HiddenType:
    $builder->add('tagsForSearch', HiddenType::class, [ 'required' => false ])
  1. 使树枝像:
    {{ 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>
  1. 和脚本:
$('#tags').select2({
    tags: true
});
$('#form').submit(function () {
    var tags = $('#tags').select2().val().join(',');
    $('#{{ form.tags.vars.id }}').val(tags);
});