2012-08-01 4 views
6

में एक बटन के साथ एक ही प्रकार के कई रूपों प्रस्तुत करने के लिए मैं todolist जहां मैं काम प्रकारकैसे symfony2

$task1 = new Task(); 
$form1 = $this->createForm(new MyForm('f1'), $task1); 

$task2 = new Task('fo'); 
$form2 = $this->createForm(new MyForm('f2'), $task2); 

$task3 = new Task(); 
$form3 = $this->createForm(new MyForm('f3'), $task3); 

के तीन रूपों को प्रदर्शित अब समस्या मैं एक है केवल सबमिट बटन है। मैं इन तीन कार्यों को एक नियंत्रक के भीतर कैसे बना सकता हूं। और उपयोगकर्ता गतिशील रूप से और रूपों को भी जोड़ सकते हैं। TaskList की तरह - - कि Task रों का एक संग्रह रखती

तो क्या हल करने के लिए जिस तरह से इस

+0

आप jQuery का उपयोग कर 'बारे में सोचना चाहिए:

public function buildForm(FormBuilderInterface $builder, array $options) { $builder ->add( 'stocks', 'collection', array( 'type' => new StockType(), ) ) ->add('submit', 'submit') ; } 

इसी को हम हमारे टहनी ध्यान में रखते हुए का उपयोग कर समाप्त हो गया है ऐसे कार्यों के लिए। यह आपको सभी रूपों को जमा करने की अनुमति देता है। –

+0

खरीदें और सिद्धांत के साथ क्या करने के लिए jquery है। क्या आप मुझे कुछ लिंक दे सकते हैं ताकि मैं देख सकूं कि आपका क्या मतलब है – user825904

उत्तर

5

एक Form Model वर्ग बनाएँ। फिर TaskListType बनाएं जिसमें TaskType एस collection है। इस तरह आपके पास जितना चाहें उतने कार्यों के साथ एक फॉर्म होगा।

5

पूर्णता के लिए पूर्ण उदाहरण के नीचे खोजें।

आपको वांछित रूप का प्रतिनिधित्व करने वाला एक नया मॉडल बनाना चाहिए। मुद्दा यह है कि आप शायद सिद्धांत को प्रभावित नहीं करना चाहते हैं (उदाहरण के लिए। सिद्धांत देखें: स्कीमा: अद्यतन आदेश)। यह ऐसी इकाई के लिए एक टेबल बनाने का प्रयास कर सकता है जो वास्तव में अस्तित्व में नहीं है। इससे बचने के लिए, बस मॉडल मॉडल (\ src \ Acme \ Bundle \ DemoBundle \ Model \ TaskList.php) के तहत अपनी मॉडल श्रेणी डालें।

मान लें कि निम्नलिखित आपके TaskType प्रपत्र वर्ग है:

<?php 

namespace Acme\Bundle\DemoBundle\Form; 

use Symfony\Component\Form\AbstractType; 
use Symfony\Component\Form\FormBuilderInterface; 
use Symfony\Component\OptionsResolver\OptionsResolverInterface; 

class TaskType extends AbstractType 
{ 
    /** 
    * @param FormBuilderInterface $builder 
    * @param array $options 
    */ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->add('id', null, array('read_only' => true)) 
      ->add('name'); 
    } 

    /** 
    * @param OptionsResolverInterface $resolver 
    */ 
    public function setDefaultOptions(OptionsResolverInterface $resolver) 
    { 
     $resolver->setDefaults(
      array(
       'data_class' => 'Acme\Bundle\DemoBundle\Entity\Task' 
      ) 
     ); 
    } 

    /** 
    * @return string 
    */ 
    public function getName() 
    { 
     return 'acme_demo_task'; 
    } 
} 

यह आपके कार्यसूची मॉडल वर्ग होना चाहिए:

<?php 

namespace Acme\Bundle\DemoBundle\Model; 

use Doctrine\ORM\Mapping as ORM; 
use Doctrine\Common\Collections\ArrayCollection; 

/** 
* Class TaskList 
* @package Acme\Bundle\DemoBundle\Model 
* 
* @ORM\Entity() 
*/ 
class TaskList 
{ 
    /** 
    * @var \Doctrine\Common\Collections\ArrayCollection 
    * @ORM\ManyToMany(targetEntity="\Acme\Bundle\DemoBundle\Entity\Task") 
    */ 
    private $tasks; 

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

    /** 
    * @param \Acme\Bundle\DemoBundle\Entity\Task $task 
    * @return $this 
    */ 
    public function addTask(\Acme\Bundle\DemoBundle\Entity\Task $task) 
    { 
     $this->tasks[] = $task; 

     return $this; 
    } 

    /** 
    * @param \Acme\Bundle\DemoBundle\Entity\Task $task 
    * @return $this 
    */ 
    public function removeTask(\Acme\Bundle\DemoBundle\Entity\Task $task) 
    { 
     $this->tasks->remove($task); 

     return $this; 
    } 

    /** 
    * @return ArrayCollection 
    */ 
    public function getTasks() 
    { 
     return $this->tasks; 
    } 

    /** 
    * @param \Doctrine\Common\Collections\Collection $tasks 
    * @return $this 
    */ 
    public function setTasks(\Doctrine\Common\Collections\Collection $tasks) 
    { 
     $this->tasks = $tasks; 

     return $this; 
    } 

    /** 
    * @param \Knp\Component\Pager\Pagination\PaginationInterface $pagination 
    * @return $this 
    */ 
    public function setFromPagination(\Knp\Component\Pager\Pagination\PaginationInterface $pagination) 
    { 
     foreach ($pagination as $task) { 
      $this->addTask($task); 
     } 

     return $this; 
    } 
} 

और TaskListType वर्ग नीचे खोजने के लिए:

<?php 

namespace Acme\Bundle\DemoBundle\Form; 

use Symfony\Component\Form\AbstractType; 
use Symfony\Component\Form\FormBuilderInterface; 
use Symfony\Component\OptionsResolver\OptionsResolverInterface; 

class TaskListType extends AbstractType 
{ 
    /** 
    * @param FormBuilderInterface $builder 
    * @param array $options 
    */ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->add(
       'tasks', 
       'collection', 
       array(
        'type' => new \Acme\Bundle\DemoBundle\Form\TaskType(), 
       ) 
      ) 
      ->add('save', 'submit'); 
    } 

    /** 
    * @param OptionsResolverInterface $resolver 
    */ 
    public function setDefaultOptions(OptionsResolverInterface $resolver) 
    { 
     $resolver->setDefaults(
      array(
       'data_class' => 'Acme\Bundle\DemoBundle\Model\TaskList' 
      ) 
     ); 
    } 

    /** 
    * @return string 
    */ 
    public function getName() 
    { 
     return 'acme_demo_task_list'; 
    } 
} 

और आपकी सेवाएं.एमएलएल (वैकल्पिक):

services: 
    acme.demo.form.type.task_list: 
     class: Acme\Bundle\DemoBundle\Form\TaskListType 
     tags: 
      - { name: form.type, alias: acme_demo_task_list } 

और एक नमूना नियंत्रक:

public function indexAction($page) 
{ 
    ini_set('xdebug.max_nesting_level', 300); // this might be useful with deeply nested forms 

    $search = $this->getRequest()->get(
     'search', 
     array(
      'name' => '', 
      'date' => '', 
      'lang' => $this->container->getParameter('acme_core.default_lang') 
     ) 
    ); 

    /** 
    * @var \Doctrine\ORM\EntityManager $em 
    */ 
    $em = $this->getDoctrine()->getManager(); 

    $paginator = $this->get('knp_paginator'); 
    $pagination = $paginator->paginate(
     $em->getRepository('AcmeDemoBundle:Task')->getQueryFilteringByLangNameAndDate(
      $search['lang'], 
      $search['name'], 
      $search['date'] != '' ? new \DateTime($search['date']) : null 
     ), 
     $page, 
     $this->getRequest()->get('elementsPerPage', 10) 
    ); 

    $taskList = new TaskList(); 
    $taskList->setFromPagination($pagination); 

    $form = $this->createForm('acme_demo_task_list', $taskList); // "acme_demo_task_list" has been defined in the services.yml file 
    $form->handleRequest($this->getRequest()); 

    if ($form->isValid()) { 
     foreach ($form->getData() as $task) { 
      $em->merge($task); 
     } 
     $em->flush(); 
    } 

    return $this->render(
     'AcmeDemoBundle:Task:index.html.twig', 
     array(
      'search' => $search, 
      'pagination' => $pagination, 
      'form' => $form->createView() 
     ) 
    ); 
} 

मुझे आशा है कि इस मदद करता है!

4

हमने 'फ्रांसेस्को कैसाला' द्वारा दिखाए गए अपवाद का पालन किया और यह पूरी तरह से काम किया।

orur प्रयोजनों हम पृष्ठांकन जरूरत नहीं थी के लिए, तो यह है कि हम कैसे हमारे संग्रह भरा (controller में) है:

$entities = $em->getRepository('AcmeBundle:Stock')->findAll(); 

$stockList = new StockList(); // This is our model, what Francesco called 'TaskList' 

foreach ($entities as $entity) { 
    $stockList->addStock($entity); 
} 

// StockListType() is what Francesco called TaskListType 
$form = $this->createForm(new StockListType(), $stockList, array(
    'action' => $this->generateUrl('stock_take_update'), 
    'method' => 'POST', 
    'attr' => array('class' => 'form-horizontal'), 
)); 

जो लोग प्रपत्र संग्रह का उत्पादन अनुकूलित करने के लिए की जरूरत है के लिए, हम कामयाब {% for form in forms.children.stocks %} पर पुनरावृत्ति द्वारा सबफॉर्म तक पहुंचने के लिए। 'स्टॉक्स' हमारा फ़ॉर्म बिल्डर में फ़ील्ड का नाम किया जा रहा है (StockListType में):

{{ form_start(forms) }} 
    <table class="table table-stripped table-hover"> 
     <thead> 
      <th>#</th> 
      <th>Name</th> 
      <th>Code</th> 
      <th>Location</th> 
      <th>Total</th> 
      <th>Updated Toal</th> 
     </thead> 
     <tbody> 
      {% set counter = 1 %} 
      {% for form in forms.children.stocks %} 
       <tr> 
        <div class="hidden"> 
         {{ form_widget(form.name) }} 
         {{ form_widget(form.code) }} 
         {{ form_widget(form.location) }} 
         {{ form_widget(form.available) }} 
         {{ form_widget(form.assigned) }} 
         {{ form_widget(form.minLevel) }} 
         {{ form_widget(form.type) }} 
         {{ form_widget(form.colourCode) }} 
        </div> 
        <td>{{ counter }}</td> 
        <td> 
         {% if form.vars.data.name is defined %} 
          {{ form.vars.data.name }} 
         {% endif %} 
        </td> 
        <td> 
         {% if form.vars.data.code is defined %} 
          {{ form.vars.data.code }} 
         {% endif %} 
        </td> 
        <td> 
         {% if form.vars.data.location is defined %} 
          {{ form.vars.data.location }} 
         {% endif %} 
        </td> 
        <td> 
         {% if form.vars.data.total is defined %} 
          {{ form.vars.data.total }} 
         {% endif %} 
        </td> 
        <td>{{ form_widget(form.total) }}</td> 
       </tr> 
       {% set counter = counter + 1 %} 
      {% endfor %} 
     </tbody> 
    </table> 
    {{ form_widget(forms.submit) }} 
{{ form_end(forms) }}