我面临一个问题,我可以总结如下: 我有一个像这样的 TWIG 模板页面(reg.html.twig):
{% extends "::base.html.twig" %}
{% block body %}
<ul class="tabs">
<li class="left"><a href="#tab1">tab1</a></li>
<li class="left"><a href="#tab2">tab2</a></li>
<li class="left"><a href="#tab3">tab3</a></li>
<li class="right"><a href="#tab4">tab4</a></li>
</ul>
<div class="tabs_container">
<div id="tab1" class="blocco-tab">
<form action="{{ path('AAA') }}" method="post" {{ form_enctype(form) }}>
<div id="name_field">
{{ form_row(form.name) }}
</div><!-- /name_field -->
<div id="address">
{{ form_row(form.addresses[0].road) }}
</div><!-- /address_field -->
</form>
</div>
<div id="tab2" class="blocco-tab">
<form action="{{ path('BBB') }}" method="post" {{ form_enctype(form) }}>
<div id="surname_field">
{{ form_row(form.surname) }}
</div><!-- /surname_field -->
</form>
</div>
</div> <!-- contenitore_tabs -->
{% endblock %}
字段 name、surname 和 addresses 属于示例 Symfony2 实体 Person。 addresses是地址集合的第一个也是唯一的元素(出于其他原因我需要它作为集合)
工作的 JS 文件是:
jQuery(document).ready(function() {
$(".blocco-tab").hide();
$("ul.tabs li:first").addClass("active").show();
$(".blocco-tab:first").show();
$("ul.tabs li").click(function() {
$("ul.tabs li").removeClass("active");
$(this).addClass("active");
$(".blocco-tab").hide();
var activeTab = $(this).find("a").attr("href");
$(activeTab).fadeIn();
return false;
});
});
实体文件:
class Person {
protected $name;
protected $surname;
protected $addresses;
public function __construct(){
$this->addresses = new ArrayCollection();
}
}
在默认控制器中:
public function tab1Action(Request $request){
$person = new Person();
$address = new Address();
$addr_coll = new ArrayCollection();
$addr_coll->add($address);
$tab1_type = new Tab1Type();
$person->setAddresses($addr_coll);
$form = $this->createForm($tab1_type, $person);
if ($request->getMethod() == 'POST')
{
$form->bindRequest($request);
if ($form->isValid())
/*ecc ecc ecc*/
}
public function tab2Action(Request $request){
$person = new Person();
$tab2_type = new Tab2Type();
$form = $this->createForm($tab2_type, $person);
if ($request->getMethod() == 'POST')
{
$form->bindRequest($request);
if ($form->isValid())
/*ecc ecc ecc*/
}
实际上,我采取的方法是让每个 FormType 都具有我不需要渲染的所有字段,但将 'hidden' 和 'property_path' => false,因为我不能只渲染我想要的字段,因为其他字段会导致错误在运行时(它们为空),但我在以联合方式处理这两种情况时仍然遇到问题。
将每个表单放在不同的页面(==不同的路由),使用不同的控制器,一切正常,所以这不是与 symfony 基本使用相关的问题,而是将 N 个表单与 JQuery UI 集成在单个页面中,使得我哭了。
修复了我必须使用此选项卡的问题,我该如何解决?
预先感谢,我希望我已经清楚地解释了我的问题。
您只是将相同的变量用于不同的形式
<div id="tab1" class="blocco-tab">
<form action="{{ path('AAA') }}" method="post" {{ form_enctype(**form1**) }}>
<div id="name_field">
{{ form_row(**form1**.name) }}
</div><!-- /name_field -->
<div id="address">
{{ form_row(**form1**.addresses[0].road) }}
</div><!-- /address_field -->
</form>
</div>
<div id="tab2" class="blocco-tab">
<form action="{{ path('BBB') }}" method="post" {{ form_enctype(**form2**) }}>
<div id="surname_field">
{{ form_row(**form2**.surname) }}
</div><!-- /surname_field -->
</form>
</div>
尝试使用单一表格
{% extends "::base.html.twig" %}
{% block body %}
<form action="{{ path('AAA') }}" method="post" {{ form_enctype(form) }}>
<ul class="tabs">
<li class="left"><a href="#tab1">tab1</a></li>
<li class="left"><a href="#tab2">tab2</a></li>
<li class="left"><a href="#tab3">tab3</a></li>
<li class="right"><a href="#tab4">tab4</a></li>
</ul>
<div class="tabs_container">
<div id="tab1" class="blocco-tab">
<div id="name_field">
{{ form_row(form.name) }}
</div><!-- /name_field -->
<div id="address">
{{ form_row(form.addresses[0].road) }}
</div><!-- /address_field -->
</div>
<div id="tab2" class="blocco-tab">
<div id="surname_field">
{{ form_row(form.surname) }}
</div><!-- /surname_field -->
</div>
</div> <!-- contenitore_tabs -->
</form>
{% endblock %}
然后你就有了ocontroller
aaaAction()
public function aaaAction(Request $request){
$person = new Person();
$address = new Address();
$addr_coll = new ArrayCollection();
$addr_coll->add($address);
$person->setAddresses($addr_coll);
$form = $this->createForm(new PersonType(), $person);
if ($request->getMethod() == 'POST')
{
$form->bindRequest($request);
if ($form->isValid())
/*ecc ecc ecc*/
}
以及表单生成器的类
class PersonType extends AbstractType {
public function buildForm(FormBuilder $builder, array $options)
{
$builder
->add('name', null, array())
->add('surname', null, array())
->add('addresses', null, array())
;
}
public function getName()
{
return 'person';
}
public function getDefaultOptions(array $options)
{
return array(
'data_class' => 'Acme\YourBundle\Entity\Person',
);
}
}
正如我之前提到的,我解决了将所有选项卡包装在一个表单中的问题。您的两个解决方案都可以,谢谢您的宝贵时间。
Linuxatico
如果其他人遇到这个问题,你可以像这样解决它(我不确定这是否是最优雅的解决方案,但我认为它比为所有内容制作一个大表格更好)。此示例混合了配置文件和changePassword FOSUserBundle 形式:
在您的主展示模板中(在我的例子中为 Profile:show.html.twig):
{% if profileForm is defined %}
{% include 'MyBundle:Profile:edit.html.twig' with {'form':profileForm} %}
{% else %}
{% render 'MyBundle:Profile:edit' %}
{% endif %}
重复更改密码:
{% if passwdForm is defined %}
{% include 'MyBundle:ChangePassword:changePassword.html.twig' with {'form':passwdForm} %}
{% else %}
{% render 'FOSUserBundle:ChangePassword:changePassword' %}
{% endif %}
在您的控制器中(添加其他):
if ($form->isValid()) {
.....
else {
return $this->container->get('templating')->renderResponse('FOSUserBundle:Profile:show.html.'.$this->container->getParameter('fos_user.template.engine'),
array('user' => $user, 'profileForm' => $form->createView()));
}
相应地添加 profileForm 和 passwdForm。就我而言,修改后的控制器是 ProfileController 和 ChangePasswordControllers(FOSUserBundle 覆盖)。
对于您的选项卡,如果发现任何错误,您可以添加 javascript(或 twig)来打开选项卡。
希望这有帮助:)
我就是这样做的:
<div class="form-tabs">
<ul class="nav nav-tabs" role="tablist">
<li class="nav-item">
<a class="nav-link active" id="basic-tab" data-toggle="tab" href="#basic" role="tab">Basic</a>
</li>
<li class="nav-item">
<a class="nav-link" id="advanced-tab" data-toggle="tab" href="#advanced" role="tab">Advanced</a>
</li>
</ul>
<div class="tab-content">
<div class="tab-pane fade show active" id="basic" role="tabpanel">
{{ form_start(formsimple, {'attr': {'novalidate': 'novalidate'}}) }}
{{ form_widget(formsimple) }}
{{ form_end(formsimple) }}
</div>
<div class="tab-pane fade" id="advanced" role="tabpanel">
{{ form_start(form, {'attr': {'novalidate': 'novalidate'}}) }}
{{ form_widget(form) }}
{{ form_end(form) }}
</div>
</div>
在控制器中:
$formTypesimple = EventTypeMultiSimple::class;
$formType = EventTypeMulti::class;
$form = $this->createForm($formType, $event, [
'validation_groups' => ['create', 'Default'],
'user_choices' => $eventChoices,
]);
$formsimple = $this->createForm($formTypesimple, $event, [
'validation_groups' => ['create', 'Default'],
'user_choices' => $eventChoices,
]);
return $this->render('Dashboard/Shared/Event/add-edit.html.twig', [
"event" => $event,
"form" => $form->createView(),
"formsimple" => $formsimple->createView(),
]);