Forms 在表单字段上使用EventListener时,无法为选项字段设置默认数据

Forms 在表单字段上使用EventListener时,无法为选项字段设置默认数据,forms,symfony,Forms,Symfony,我有一个带有动态选择字段语言的表单。不同类别的语言可能不同。我希望它们在默认情况下都被选中,所以我使用“数据”选项。但它只有在我不使用事件的情况下才有效。如果我尝试在$formModifier函数中使用它来动态添加语言,它将不起作用,并且所有语言都被取消选中。。。知道怎么修吗 下面是ProjectType类中的buildForm函数 public function buildForm(FormBuilderInterface $builder, array $options) { (...)

我有一个带有动态选择字段语言的表单。不同类别的语言可能不同。我希望它们在默认情况下都被选中,所以我使用“数据”选项。但它只有在我不使用事件的情况下才有效。如果我尝试在$formModifier函数中使用它来动态添加语言,它将不起作用,并且所有语言都被取消选中。。。知道怎么修吗

下面是ProjectType类中的buildForm函数

public function buildForm(FormBuilderInterface $builder, array $options)
{

 (...)

$builder
  ->add('category', 'choice', array(
    'choices'   => Category::$NAMES,
    'multiple'  => false,
    'placeholder' => '',
  ))
  ->add('name', 'text')
  ->add('description', 'textarea', array(
     'attr' => array('rows' => '10', 'class' => 'tinymce'),
  ))
  ->add('save', 'submit', array('label' => 'form.save'));

  $formModifier = function (FormInterface $form, User $user, $category = null) {
    $languages = null === $category ? array() : $this->userReputation->getAllowedLanguages($user, $category);

    $form->add('languages', 'choice', array(
      'multiple'  => true,
      'expanded' => true,
      'choices'   => $languages,
      'data' => array_keys($languages),
    ));
  };

  $builder->addEventListener(
    FormEvents::PRE_SET_DATA,
    function (FormEvent $event) use ($formModifier, $user) {
      $project = $event->getData();

      $formModifier($event->getForm(), $user, $project->getCategory());
    }
  );

  $builder->get('category')->addEventListener(
    FormEvents::POST_SUBMIT,
    function (FormEvent $event) use ($formModifier, $user) {
      $category = $event->getForm()->getData();

      $formModifier($event->getForm()->getParent(), $user, $category);
    }
  );
}

我使用此脚本在用户更改类别时进行ajax调用:

<script>
function requireReadyFunction() {
  var $category = $('#project_category');

  // When category gets selected ...
  $category.change(function() {
    // ... retrieve the corresponding form.
    var $form = $(this).closest('form');
    // Simulate form data, but only include the selected category value.
    var data = {};
    data[$category.attr('name')] = $category.val();

    // Submit data via AJAX to the form's action path.
    $.ajax({
      url : $form.attr('action'),
      type: $form.attr('method'),
      data : data,
      success: function(html) {
        // Replace current languages field ...
        $('#project_languages').replaceWith(
          $(html).find('#project_languages')
        );

      }
    });
  });
}
</script>

在脚本中使用$category时,是指PHP变量还是创建脚本变量?如果是最后一个,不要使用$符号。这是脚本变量;我的代码是基于还有$。。。事实上,无论是否使用$-符号,这都没有区别,对于JS来说,它只是变量名的一部分。。。顺便说一句,我试过不用$2也能用同样的方法工作……我的错,我把它当作PHP代码来读。