2012-05-13 6 views
5

Sto creando un modulo utilizzando il generatore di forme di Sf2.modifica la grande entità di Symfony2 in un modulo con le schede

public function buildForm(FormBuilder $builder, array $options) 
{ 
    $builder->add('firstName') 
      ->add('lastName')... 

L'entità ha molti campi e mi piacerebbe inserirli nelle schede dell'interfaccia utente jQuery. Ma nel modello di ramoscello vorrei usare il comando singolo

<form action="#" method="post" {{ form_enctype(form) }}> 
    {{ form_widget(form) }} 
    <input type="submit" value="Save"/> 
</form> 

Qual è la soluzione migliore?

modificare **

Per essere più conrete: ho 4 campi: Nome, Cognome, data di nascita, deathDate. Voglio che i primi 2 campi siano nella prima scheda e gli ultimi 2 campi nella seconda scheda. Voglio mantenere il modo di rendere il modulo come accennato in precedenza.

Ho pensato a una soluzione per creare i miei campi non collegati all'oggetto sottostante che renderà i tag html richiesti (h3, div, ecc.).

risposta

3

ho definito il mio campo chiamato 'Tab' e aggiungi quando dovrebbe comparire nuova scheda.

<?php 
//\src\Alden\xyzBundle\Form\Type\TabsType.php 

namespace Alden\BonBundle\Form\Type; 

use Symfony\Component\Form\AbstractType; 
use Symfony\Component\Form\FormBuilder; 
use Symfony\Component\Form\FormView; 
use Symfony\Component\Form\FormInterface; 
use Symfony\Component\Form\FormError; 
use Symfony\Component\Form\CallbackValidator; 
use Symfony\Component\Form\FormValidatorInterface; 
use Symfony\Component\Form\Form; 

class TabsType extends AbstractType { 

    public function buildForm(FormBuilder $builder, array $options) 
    { 
     $builder->setAttribute('starting', $options['starting']); 
     $builder->setAttribute('ending', $options['ending']); 
     $builder->setAttribute('header', $options['header']); 
    } 

    public function buildView(FormView $view, FormInterface $form) 
    { 
     $parent = $form->getParent(); 
     if (is_null($parent->getParent())) 
     { 
      $tabs = $this->findTabs($parent); 
     } 
     else 
     { 
      $tabs = array(); 
     } 
     $view->set('starting', $form->getAttribute('starting')); 
     $view->set('ending', $form->getAttribute('ending')); 
     $view->set('header', $form->getAttribute('header')); 
     $view->set('tabs', $tabs); 
    } 

    public function getDefaultOptions(array $options) 
    { 
     return array(
      'property_path' => false, 
      'starting' => true, 
      'ending' => true, 
      'header' => false, 
     ); 
    } 

    public function getName() 
    { 
     return 'tabs'; 
    } 

    public function getParent(array $options) 
    { 
     return 'field'; 
    } 

    private function findTabs(Form $form) 
    { 
     $prefix = $form->getName(); 
     $tabs = array(); 
     foreach ($form->getChildren() as $child) 
     { 
      foreach ($child->getTypes() as $type) 
      /* @var $child \Symfony\Component\Form\Form */ 
      { 
       if (get_class($type) == __NAMESPACE__ . '\TabsType') 
       { 
        if ($child->getAttribute('starting')) 
        { 
         $tabs[$prefix . '_' . $child->getName()] = $child->getAttribute('label'); 
        } 
       } 
      } 
     } 
     return $tabs; 
    } 

} 

?> 

e Twig

{# \src\Alden\xyzBundle\Resources\views\Form\fields.html.twig #} 
{% block tabs_row %} 
{% if header %} 
<ul> 
    {% for tid, t in tabs %} 
     <li> 
      <a href="#{{ tid }}">{{ t }}</a> 
     </li> 
    {% endfor %} 
</ul> 
{% endif %} 
{% if ending %} 
</div> 
{% endif %} 
{% if starting %} 
<div id="{{ id }}"> 
{% endif %} 
{% endblock %} 

e il loro utilizzo in forma costruttore:

public function buildForm(FormBuilder $builder, array $options) 
{ 
    $builder 
      ->add('tabs_head', new TabsType(), array(
       'ending' => false, 
       'starting' => false, 
       'header' => true 
      )) 
      ->add('tab_1', new TabsType(), array(
       'ending' => false, 
       'label' => 'Podstawowe' 
      )) 
      ->add('firstName', null, array(
       'label' => 'Imię' 
      )) 
      ->add('lastName', null, array(
       'label' => 'Nazwisko' 
      )) 
      ->add('tab_contact', new TabsType(), array(
       'label' => 'Kontakt' 
      )) 
      ->add('address', new AddressType(), array(
       'label' => 'Adres zameldowania' 
      )) 
      ->add('tabs_end', new TabsType(), array(
       'starting' => false 
      )) 
    ; 
} 
1

Se si desidera una forma di agire come un mago modulo si poteva guardare sguardo al multi-step form bundle

è abbastanza bello, è possibile ad esempio, definire passo uno compilando inoltre in ogni dettagli del software e poi su STEP2, riempire dettagli della versione. o qualunque cosa tu voglia.

Caratteristiche

  • navigazione (Avanti, Indietro, ricominciare da capo)
  • descrizioni passo
  • salto di passaggi specificati
  • diverso gruppo di convalida per ogni passo
  • fase dinamica di navigazione

E here è una demo live

+0

ho bisogno di caricare tutti i campi del modulo in una sola volta. – koral

0

Ma nel modello ramoscello mi piacerebbe utilizzare singolo comando

cosa si intende per rendere i campi?

{{ form_rest(form) }} 

rende tutte le forme unrendered