2012-05-13 21 views
5

मैं एसएफ 2 के फॉर्म बिल्डर का उपयोग कर फॉर्म बना रहा हूं।टैब के साथ फॉर्म में सिम्फनी 2 बड़ी इकाई संपादित करें

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

एंटिटी में बहुत सारे फ़ील्ड हैं और मैं उन्हें jQuery UI टैब में रखना चाहता हूं। लेकिन टवीग टेम्पलेट में मैं सिंगल कमांड

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

का उपयोग करना चाहूंगा सबसे अच्छा समाधान क्या है?

संपादित **

अधिक conrete होने के लिए: firstName, lastName, जन्मतिथि, deathDate: मैं 4 क्षेत्रों की है। मैं पहले टैब पर पहले 2 फ़ील्ड और अंतिम 2 फ़ील्ड दूसरे टैब पर होना चाहता हूं। जैसा कि पहले उल्लेख किया गया है, मैं फॉर्म को प्रस्तुत करने का तरीका रखना चाहता हूं।

मैं अपने खुद के खेतों को बनाने के लिए एक समाधान के बावजूद ऑब्जेक्टिंग अंडरलेइंग ऑब्जेक्ट से जुड़ा हुआ नहीं है जो आवश्यक HTML टैग (एच 3, div, आदि) प्रस्तुत करेगा।

उत्तर

3

मैं 'टैब' नामक अपने ही क्षेत्र में परिभाषित किया गया है और इसे जोड़ने जब नया टैब दिखाई देनी चाहिए।

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

} 

?> 

और टहनी

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

और फार्म बिल्डर में उपयोग:

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

आप एक रूप एक रूप विज़ार्ड आपको multi-step form bundle

पर नज़र देख सकता यह बहुत अच्छा है, तो आप कर सकते हैं उदाहरण के लिए, कदम एक सॉफ्टवेयर विवरण में और उसके बाद चरण 2 पर भरने के रूप में परिभाषित है की तरह काम करना चाहते हैं, को भरने बाहर संस्करण विवरण। या जो भी आप चाहते हैं।

सुविधाएँ

  • नेविगेशन (अगले, पीठ, से शुरू)
  • कदम विवरण
  • निर्दिष्ट चरणों हर कदम
  • गतिशील कदम नेविगेशन के लिए
  • अलग मान्यता समूह के लंघन

और here एक लाइव डेमो

+0

मैं एक बार में सभी प्रपत्र फ़ील्ड्स लोड करने के लिए की जरूरत है। – koral

0

है लेकिन टहनी टेम्पलेट में मैं एकल आदेश

आप खेतों रेंडर करने के लिए इसका मतलब क्या उपयोग करना चाहते हैं?

{{ form_rest(form) }} 

renders सब unrendered रूपों