按下按钮后添加动态表单域

时间:2016-09-20 11:20:14

标签: javascript php symfony twig

我有一个带有简单按钮$builder->add('language_switcher', ButtonType::class);的表单,只需按下该按钮即可添加另一个字段。为此,我使用了Symfony的食谱http://symfony.com/doc/current/form/dynamic_form_modification.html

$builder
    ->get('language_switcher')
    ->addEventListener(
        FormEvents::POST_SUBMIT,
        function () use ($builder, $options) {
            $preparedOptions = $this->prepareOptions($options['data']['productCustomizations']);
            $builder->add('lang_switcher'), ChoiceType::class, $preparedOptions);

        }
    );

现在通过AJAX提交

<script>
    var $button = $('#xyz');

    $button.click(function() {
        var $form = $(this).closest('form');
        $.ajax({
            url: $form.attr('action'),
            type: $form.attr('method'),
            success: function(html) {
                console.log(html);
                $('#xyz').replaceWith($(html).find('#lang_switcher'));
            }
        });
    });
</script>

我收到错误Buttons do not support event listeners.所以我尝试了隐藏的字段。我将隐藏字段添加到表单,将EventListener设置为它,并将此data添加到我的AJAX请求

data[$('#id_of_hidden_field').attr('name')] = 1;

然而,这没有任何作用。 cockbook中的示例是在提交选择字段之后,因此我不知道如何使其适应我的需求。我无法使用SubmitType,因为它会提交表单,对吗?我只是想用一个简单的按钮。

问题是,当我做console.log(html)时,我没有看到新的html元素,所以看起来我没有到达EventListener,这很奇怪,因为如果我在侦听器中转储内容我得到了一些数据。看起来我似乎没有把它放在响应中

2 个答案:

答案 0 :(得分:2)

好的,明白了。问题是我在builder事件中使用了POST_SUBMIT,但我必须使用FormInterface。由于我无法在提交后添加它,我必须购买与Symfony的食谱相同的回调功能

$formModifier = function (FormInterface $form, $preparedOptions) {
    $form->add($this->childIdentifier, ChoiceType::class, $preparedOptions);
};

然后监听器就像这样构建

$builder
    ->get('lang_switcher')
    ->addEventListener(
        FormEvents::POST_SUBMIT,
        function (FormEvent $event) use ($formModifier, $options) {
            $preparedOptions = $this->prepareOptions($options);
            $formModifier($event->getForm()->getParent(), $preparedOptions);
        }
    );

答案 1 :(得分:-1)

    <script type="text/javascript">
    function inputBtn(){
    var input=document.createElement('input');
    input.type="file";
    input.name="img[]";
    input.multiple="multiple";
    //without this next line, you'll get nuthin' on the display
    document.getElementById('target_div').appendChild(input);
}
</script>

<button id="ifile" onclick="inputBtn();">create</button>
<form action="test.php" method="post" enctype="multipart/form-data">
<div id="target_div"></div>
<input type="submit">
</form>