2012-05-25 9 views
5

jestem w obliczu problemu, że mogę podsumować jak następuje: Mam stronę gałązka szablonu tak (reg.html.twig):Symfony2 wiele form w różnych zakładkach jQuery UI, ale jednej stronie

{% 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 %} 

Pola nazwa, nazwisko i adresy należą do podmiotu próbka Symfony2 osoby. adresy jest pierwszym i jedynym elementem zbioru adresów (muszę to jak zbieranie innych powodów)

Plik JS pracy wynosi:

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; 
    }); 
}); 

Plik Podmiot:

class Person { 
    protected $name; 
    protected $surname; 
    protected $addresses; 

    public function __construct(){ 
     $this->addresses = new ArrayCollection(); 
    } 
} 

A w defaultController:

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*/ 
} 

Właściwie to przyjąłem, że każdy typ FormType ma wszystkie pola, których nie potrzebuję renderować, ale wstawiam "hidden" i "property_path" => false, ponieważ nie mogę renderować tylko moich pożądanych pól, ponieważ inne będą powodują błędy w czasie wykonywania (są zerowe), ale nadal mam problemy z obsługą obu przypadków w sposób złączony.

Umieszczenie każdego formularza na innej stronie (== inna trasa), z różnymi kontrolerami, wszystko działa dobrze, więc nie jest to problem związany z podstawowym użyciem symfony, to integracja formularzy N na pojedynczej stronie z JQuery Interfejs użytkownika, który sprawia, że ​​płaczę.

Naprawiono, że muszę używać tych kart, jak mogę rozwiązać?

  1. Czy muszę wykonać jedną czynność obsługującą wszystko?
  2. Czy muszę wykonać jedną formę?
  3. Czy coś mi brakuje?

Z góry dziękuję. Mam nadzieję, że wyjaśniłem mój problem.

+0

Nie potrzebuję już tych informacji, umieszczam wszystkie zakładki w jednym tagu formularza – linuxatico

Odpowiedz

0

jak już wspomniałem wcześniej rozwiązałem owijanie wszystkich kart w jednym formularzu. Oba rozwiązania są w porządku, dziękuję za poświęcony czas.

Linuxatico

0

Wystarczy stosować tę samą zmienną dla różnych form

<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> 
0

Spróbuj z jednego formularza

{% 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 %} 

wtedy masz w 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*/ 
} 

i klasy dla formularza budowniczego jak

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', 
     ); 
    } 
} 
0

W przypadku ktokolwiek inny ma ten problem, można go rozwiązać w ten sposób (nie jestem pewien, czy jest to najbardziej eleganckie rozwiązanie, ale myślę, że lepiej niż co jedną wielką formę na wszystko). Ten przykład mieszanki profilu i changepassword FOSUserBundle formy:

wewnątrz głównego pokazu szablonu (profil: show.html.twig w moim przypadku):

 {% if profileForm is defined %} 
      {% include 'MyBundle:Profile:edit.html.twig' with {'form':profileForm} %} 
     {% else %} 
      {% render 'MyBundle:Profile:edit' %} 
     {% endif %} 

powtórz dla changepassword:

 {% if passwdForm is defined %} 
      {% include 'MyBundle:ChangePassword:changePassword.html.twig' with {'form':passwdForm} %} 
     {% else %} 
      {% render 'FOSUserBundle:ChangePassword:changePassword' %} 
     {% endif %} 

W kontrolerach (dodaj jeszcze):

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())); 
     } 

Dodaj profilForm i passwdForm odpowiednio. W moim przypadku zmodyfikowanymi kontrolerami były ProfileController i ChangePasswordControllers (przesłonięcia FOSUserBundle).

Jeśli chodzi o zakładki, możesz dodać javascript (lub gałązkę), aby otworzyć zakładkę, jeśli jakiś błąd zostanie znaleziony.

Mam nadzieję, że to pomoże :)

Powiązane problemy