2012-05-13 16 views
5

Estoy construyendo formulario utilizando el generador de formularios de Sf2.editar Symfony2 gran entidad en forma con pestañas

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

La Entidad tiene muchos campos y me gustaría ponerlos en las pestañas jQuery UI. Pero en la plantilla twig me gustaría utilizar el comando simple

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

¿Cuál es la mejor solución?

edición **

Para ser más conrete: tengo 4 campos: nombre, apellido, fecha de nacimiento, deathDate. Quiero que los primeros 2 campos estén en la primera pestaña y los últimos 2 campos en la segunda pestaña. Quiero mantener la forma de renderizar el formulario como se mencionó anteriormente.

Pensé en una solución para crear mis propios campos no conectados al objeto subyacente que generará las etiquetas html necesarias (h3, div, etc.).

Respuesta

3

he definido mi propio campo llamado 'Tab' y añadir que, cuando debería aparecer una nueva pestaña.

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

} 

?> 

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

y su uso en el constructor de la forma:

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

Si desea una forma de actuar como un asistente de formulario usted podría mirar a ver el multi-step form bundle

Es bastante agradable, se puede, por ejemplo, definir el paso uno como relleno en los detalles de software y luego en el paso 2, complete detalles de la versión. o lo que quieras

Características

  • de navegación (siguiente, anterior, empezar de nuevo)
  • descripciones paso
  • saltar de pasos especificados
  • grupo de validación diferente para cada paso
  • dinámico paso de navegación

Y here es una demostración en vivo

+0

tengo que cargar todos los campos del formulario a la vez. – koral

0

Pero en la plantilla ramita Me gustaría utilizar solo comando

Qué quiere decir para hacer que los campos?

{{ form_rest(form) }} 

renders todas las formas unrendered

Cuestiones relacionadas