Jquery 完成Symfony2动态表单修改

Jquery 完成Symfony2动态表单修改,jquery,forms,symfony,doctrine-orm,Jquery,Forms,Symfony,Doctrine Orm,经过几天的努力,我终于找到了烹饪书的主题。。。 我最终几乎得到了第三个示例,可以在我的ProductType.php文件中使用以下代码(见下文) 当我添加一个游戏时,当我点击提交按钮时,会出现一个相应的服务器和类别列表。只有当我通过在其中一个字段中输入无效输入而强制出错时,新字段才会显示 我有两个问题。如果$formModifier变量中没有的所有数据都有效,那么它将提交数据,并且我看不到“服务器”和“类别”选项。如何确保“服务器”和“类别”是必需的,即使在选择游戏之前我不需要它们出现 第二个

经过几天的努力,我终于找到了烹饪书的主题。。。

我最终几乎得到了第三个示例,可以在我的ProductType.php文件中使用以下代码(见下文)

当我添加一个游戏时,当我点击提交按钮时,会出现一个相应的服务器和类别列表。只有当我通过在其中一个字段中输入无效输入而强制出错时,新字段才会显示

我有两个问题。如果$formModifier变量中没有的所有数据都有效,那么它将提交数据,并且我看不到“服务器”和“类别”选项。如何确保“服务器”和“类别”是必需的,即使在选择游戏之前我不需要它们出现

第二个问题是它所说的食谱条目“选择运动项目后,客户端可能仍会更新您的表单,这一点可能仍然缺失。这应该通过对应用程序进行AJAX回调来处理。在该控制器中,您可以提交表单,但不必处理表单,只需使用提交的表单呈现更新的字段即可。”

由于我的事件修改器处于“提交”状态,我如何提交到具有所选游戏(id)的控制器条目,并仅渲染仅在选择游戏后才需要的字段

提前谢谢

斯科特


我认为在获取$game对象时有一些错误,请像这样使用它:

 //** Checks for Games That Are Submitted and Adds Servers and Categories Based on Game Selection **//
    $builder->get('game')->addEventListener(
            FormEvents::POST_SUBMIT, function(FormEvent $event) use ($formModifier) {
                // Get Form Data to Pass Back to Modifier
                $game = $event->getForm()->getData()->getGame();
                // Get Game Id to pass back to Form Modifier
                $game_id = $game->getId();
                $formModifier($event->getForm()->getParent(), $game, $game_id);
            }
    );
 $formModifier = function(FormInterface $form, $game_id) {
    //Adding other widgets here
 }
您不使用$game对象,只在$formModifier中使用$game\u id。因此,您可以如下更改您的函数:

 //** Checks for Games That Are Submitted and Adds Servers and Categories Based on Game Selection **//
    $builder->get('game')->addEventListener(
            FormEvents::POST_SUBMIT, function(FormEvent $event) use ($formModifier) {
                // Get Form Data to Pass Back to Modifier
                $game = $event->getForm()->getData()->getGame();
                // Get Game Id to pass back to Form Modifier
                $game_id = $game->getId();
                $formModifier($event->getForm()->getParent(), $game, $game_id);
            }
    );
 $formModifier = function(FormInterface $form, $game_id) {
    //Adding other widgets here
 }

我认为在获取$game对象时有一些错误,请像这样使用它:

 //** Checks for Games That Are Submitted and Adds Servers and Categories Based on Game Selection **//
    $builder->get('game')->addEventListener(
            FormEvents::POST_SUBMIT, function(FormEvent $event) use ($formModifier) {
                // Get Form Data to Pass Back to Modifier
                $game = $event->getForm()->getData()->getGame();
                // Get Game Id to pass back to Form Modifier
                $game_id = $game->getId();
                $formModifier($event->getForm()->getParent(), $game, $game_id);
            }
    );
 $formModifier = function(FormInterface $form, $game_id) {
    //Adding other widgets here
 }
您不使用$game对象,只在$formModifier中使用$game\u id。因此,您可以如下更改您的函数:

 //** Checks for Games That Are Submitted and Adds Servers and Categories Based on Game Selection **//
    $builder->get('game')->addEventListener(
            FormEvents::POST_SUBMIT, function(FormEvent $event) use ($formModifier) {
                // Get Form Data to Pass Back to Modifier
                $game = $event->getForm()->getData()->getGame();
                // Get Game Id to pass back to Form Modifier
                $game_id = $game->getId();
                $formModifier($event->getForm()->getParent(), $game, $game_id);
            }
    );
 $formModifier = function(FormInterface $form, $game_id) {
    //Adding other widgets here
 }

我已经找到了这个SO条目的ajax部分的答案

这是我的实现

javascript

$(document).ready(function () {
    $('#acme_mainbundle_products_game').change(function(){
       if($(this).val()){
           $.ajax({
        type: "POST",
        url: "{{ url('productsCreateSubmit') }}",
        data: $(this).serialize(),
        success: function(data) {
            $('#dynamic_fields').html(data);
        }
    });

    return false; 
        }
    });
});
twig in/new.html.twig

{%extends':base.html.twig%}

{%块体-%}

    <h1>Products creation</h1>
    {{ form_start(form) }}
    <hr />
        {{ form_label(form.name) }}
        {{ form_errors(form.name) }}
        {{ form_widget(form.name) }}
    <hr />
        {{ form_label(form.price) }}
        {{ form_errors(form.price) }}
        {{ form_widget(form.price) }}
    <hr />
        {{ form_label(form.description) }}
        {{ form_errors(form.description) }}
        {{ form_widget(form.description) }}
    <hr />
        {{ form_label(form.game) }}
        {{ form_errors(form.game) }}
        {{ form_widget(form.game) }}
    <hr />
    <div id="dynamic_fields">Stuff Will Go Here</div>
{{ form_end(form) }}

我仍然需要完成验证,但这就是我使用ajax仅呈现所需字段的方式。这似乎是正确的,而且它可以工作,但是如果有人对如何更好地进行验证有任何反馈,我希望听到反馈。

我已经找到了这个SO条目的ajax部分的答案

这是我的实现

javascript

$(document).ready(function () {
    $('#acme_mainbundle_products_game').change(function(){
       if($(this).val()){
           $.ajax({
        type: "POST",
        url: "{{ url('productsCreateSubmit') }}",
        data: $(this).serialize(),
        success: function(data) {
            $('#dynamic_fields').html(data);
        }
    });

    return false; 
        }
    });
});
twig in/new.html.twig

{%extends':base.html.twig%}

{%块体-%}

    <h1>Products creation</h1>
    {{ form_start(form) }}
    <hr />
        {{ form_label(form.name) }}
        {{ form_errors(form.name) }}
        {{ form_widget(form.name) }}
    <hr />
        {{ form_label(form.price) }}
        {{ form_errors(form.price) }}
        {{ form_widget(form.price) }}
    <hr />
        {{ form_label(form.description) }}
        {{ form_errors(form.description) }}
        {{ form_widget(form.description) }}
    <hr />
        {{ form_label(form.game) }}
        {{ form_errors(form.game) }}
        {{ form_widget(form.game) }}
    <hr />
    <div id="dynamic_fields">Stuff Will Go Here</div>
{{ form_end(form) }}

我仍然需要完成验证,但这就是我使用ajax仅呈现所需字段的方式。这似乎是正确的,而且很有效,但如果有人对如何更好地进行验证有任何反馈,我希望听到反馈。

谢谢,我做了更改,您是正确的,但这不是真正的问题。问题是当字段s最初不显示,以及如何仅在提交时根据游戏id呈现新字段。谢谢,我做了更改,您是正确的,但这不是真正的问题。问题是字段最初不显示时的验证,以及如何仅在提交时基于游戏id呈现新字段。