2012-04-23 16 views
8

मैं symfony2 में 3 प्रपत्र प्रकार हैSymfony2 प्रपत्र प्रकार में संग्रह के भीतर कैसे गतिशील रूप से जोड़ने के लिए के संग्रह

FaultType जो सभी अगले संग्रह में से माता-पिता है

<?php 

namespace My\FaultBundle\Form; 

use Symfony\Component\Form\AbstractType; 
use Symfony\Component\Form\FormBuilder; 

class FaultType extends AbstractType 
{ 

    public function buildForm(FormBuilder $builder, array $options) 
    { 
     $builder 
       ->add('title') 
       ->add('steps', 'collection', array(
        'type' => new StepType(), 
        'allow_add' => true, 
        'prototype' => true, 
        'by_reference' => false, 
       )) 
       ->add('created') 
       ->add('updated') 
     ; 
    } 

    public function getDefaultOptions() 
    { 
     return array(
      'data_class' => 'My\FaultBundle\Entity\Fault' 
     ); 
    } 

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

} 

StepType:

<?php 

namespace My\FaultBundle\Form; 

use Symfony\Component\Form\AbstractType; 
use Symfony\Component\Form\FormBuilder; 

class StepType extends AbstractType 
{ 
    public function buildForm(FormBuilder $builder, array $options) 
    { 
     $builder 
      ->add('body') 
      ->add('photos', 'collection', array(
       'type' => new PhotoType(), 
       'allow_add' => true, 
       'allow_delete' => true, 
       'prototype' => true, 
       'by_reference' => false, 
      )) 
     ; 
    } 

    public function getDefaultOptions() 
    { 
     return array(
      'data_class' => 'My\FaultBundle\Entity\Step' 
     ); 
    } 

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

और अंतिम फोटोटाइप:

<?php 

namespace My\FaultBundle\Form; 

use Symfony\Component\Form\AbstractType; 
use Symfony\Component\Form\FormBuilder; 

class PhotoType extends AbstractType 
{ 
    public function buildForm(FormBuilder $builder, array $options) 
    { 
     $builder 
      ->add('name') 
      ->add('description') 
      ->add('filename') 
     ; 
    } 

    public function getDefaultOptions() 
    { 
     return array(
      'data_class' => 'My\FaultBundle\Entity\Photo' 
     ); 
    } 

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

मुझे प्रोटोटाइप के बारे में उत्कृष्ट लेख link मिला, और एक नेस्टेड फॉर्म प्रकार के साथ बहुत अच्छा है, लेकिन मुझे एक समस्या है जब इसे तीसरे घोंसले के साथ काम करने के लिए प्राप्त करना चाहते हैं फोटोटाइप ... तस्वीरें चरण के संग्रह में हैं, जो है फॉल्ट का संग्रह ..., मैं इस उदाहरण के साथ चरणों के लिए गतिशील रूप से फ़ोटो को जोड़/हटा सकता हूं ...?

उत्तर

3

मैंने एक जेएस स्निपेट बनाया जो यहां मदद की जा सकती है। आपको बस दो बटन जोड़ना होगा [नया जोड़ें, अंतिम हटाएं]। https://gist.github.com/juanmf/10483041

यह रिकर्सिव/नेस्टेड प्रोटोटाइप को संभाल सकता है। यह मध्यस्थ (सिम्फनी इवेंट डिस्पैचर के समान) के साथ मिलकर है जो आपको घटनाओं पर जेनरेट किए गए नियंत्रण को बाध्य करने की अनुमति देता है। यदि आपको मध्यस्थों की आवश्यकता नहीं है तो इन पंक्तियों को हटाएं:

docdigital.mediatorInstance.send(
    docdigital.constants.mediator.messages.clonePrototype_prototypeAdded, 
    $clone 
); 
+0

कृपया अपने उत्तर में जुड़ी प्रासंगिक सामग्री को जोड़ने पर विचार करें। देखें: [** लिंक के लिए संदर्भ प्रदान करें **] (http://stackoverflow.com/help/how-to-answer) –

0

आपको अपना प्रोटोटाइप बनाना होगा।

  1. regex के साथ एक property_path के सभी अंकों क्षेत्रों का पता लगाएं, और शीर्ष संग्रह माता-पिता का पता लगाने और से मैन्युअल रूप से पथ निर्माण करने के लिए प्लेसहोल्डर के साथ उन्हें बदलने के

    $segments_found = preg_match('/\[(\d+)\]/', $prototype, $matches); 
    
  2. उपयोग प्रत्यावर्तन:

    2 समाधान कर रहे हैं क्या आप वहां मौजूद हैं।

क्या आपने रीडरिंग आइटम का प्रयास किया था? यह कुल आपदा है;)

संबंधित मुद्दे