Jquery 完成Symfony2动态表单修改
经过几天的努力,我终于找到了烹饪书的主题。。。 我最终几乎得到了第三个示例,可以在我的ProductType.php文件中使用以下代码(见下文) 当我添加一个游戏时,当我点击提交按钮时,会出现一个相应的服务器和类别列表。只有当我通过在其中一个字段中输入无效输入而强制出错时,新字段才会显示 我有两个问题。如果$formModifier变量中没有的所有数据都有效,那么它将提交数据,并且我看不到“服务器”和“类别”选项。如何确保“服务器”和“类别”是必需的,即使在选择游戏之前我不需要它们出现 第二个问题是它所说的食谱条目“选择运动项目后,客户端可能仍会更新您的表单,这一点可能仍然缺失。这应该通过对应用程序进行AJAX回调来处理。在该控制器中,您可以提交表单,但不必处理表单,只需使用提交的表单呈现更新的字段即可。” 由于我的事件修改器处于“提交”状态,我如何提交到具有所选游戏(id)的控制器条目,并仅渲染仅在选择游戏后才需要的字段 提前谢谢 斯科特Jquery 完成Symfony2动态表单修改,jquery,forms,symfony,doctrine-orm,Jquery,Forms,Symfony,Doctrine Orm,经过几天的努力,我终于找到了烹饪书的主题。。。 我最终几乎得到了第三个示例,可以在我的ProductType.php文件中使用以下代码(见下文) 当我添加一个游戏时,当我点击提交按钮时,会出现一个相应的服务器和类别列表。只有当我通过在其中一个字段中输入无效输入而强制出错时,新字段才会显示 我有两个问题。如果$formModifier变量中没有的所有数据都有效,那么它将提交数据,并且我看不到“服务器”和“类别”选项。如何确保“服务器”和“类别”是必需的,即使在选择游戏之前我不需要它们出现 第二个
我认为在获取$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呈现新字段。