2012-05-13 9 views
5

Ich bin ein Formular mit Sf2 Form Builder erstellen.bearbeiten Symfony2 große Entität in Form mit Tabs

Die Entität hat viele Felder und ich möchte sie in jQuery UI Tabs setzen. Aber in Zweig Vorlage würde ich gerne einzigen Befehl verwenden

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

Was ist die beste Lösung?

bearbeiten **

Um mehr conrete: Ich habe 4 Felder: Vorname, Nachname, birth, deathDate. Ich möchte, dass die ersten beiden Felder auf der ersten Registerkarte und die letzten zwei Felder auf der zweiten Registerkarte angezeigt werden. Ich möchte die Form beibehalten, wie bereits erwähnt.

Ich von einer Lösung, um meine eigenen Felder zu erstellen, die nicht mit dem unterlegenden Objekt verbunden sind, das erforderliche HTML-Tags (h3, div, usw.) rendern wird.

Antwort

3

I definiert mein eigenes Feld namens 'Tab' und es hinzuzufügen, wenn neue Registerkarte angezeigt werden soll.

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

} 

?> 

und Zweig

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

und Nutzung in Form Builder:

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

Wenn Sie ein Formular möchten wie ein Formularassistenten handeln Sie am multi-step form bundle bei Blick aussehen könnte

ist es sehr schön, können Sie beispielsweise definieren Schritt ein, wie in der Software-Details füllen und dann auf Schritt 2, füllen Versionsdetails oder was immer du willst.

Eigenschaften

  • Navigation (nächste zurück, von vorn beginnen)
  • Schritt Beschreibungen
  • Skipping spezifizierter Schritte
  • verschiedene Validierungsgruppe für jeden Schritt
  • dynamischen Schritt Navigation

Und here ist eine Live-Demo

+0

Ich brauche sofort alle Formularfelder zu laden. – koral

0

Aber in Zweig Vorlage würde ich einzigen Befehl wie

Möchten Sie die Felder zu machen, bedeutet benutzen?

{{ form_rest(form) }} 

macht alle unrendered Formen

Verwandte Themen