2016-09-20 135 views
0

我有一个简单的按钮$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它,并添加这个dataAJAX要求

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

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

问题是,当我做一个console.log(html)我看不到新的html元素,所以看起来好像我没有去EventListener这很奇怪,因为如果我在监听器I内部转储内容正在获取一些数据。它只是好像我没有得到它的回应

+0

有关事件侦听器安装到什么(父)形式呢?这实际上触发了这个事件。 – Rvanlaak

回答

2

好吧,明白了。问题在于我在POST_SUBMIT事件中使用了builder,但我必须使用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); 
     } 
    ); 
-2
<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> 
+0

JavaScript不是问题。当我将ajax请求的输出记录到控制台时,新的表单元素不存在。这是symfony中的东西。 – Musterknabe