2013-02-01 17 views
10

मैं इकाइयों के फ़िल्टर किए गए संग्रह के लिए एक HTML तालिका प्रदर्शित कर रहा हूं और मैं प्रत्येक पंक्ति में एक चेकबॉक्स को एक फॉर्म के हिस्से के रूप में प्रदर्शित करना चाहता हूं जो चयनित इकाइयों को जोड़ देगा एक सत्र var के लिए।एक सिद्धांत संग्रह में प्रत्येक इकाई के लिए चेकबॉक्स रखने वाला एक फॉर्म बनाएं

मुझे लगता है कि प्रत्येक चेकबॉक्स में इकाई आईडी के मूल्य के रूप में होना चाहिए और मुझे फॉर्म फ़ील्ड डेटा से आईडी की सरणी मिल जाएगी (ठीक है, इसलिए मान इकाई के लिए अप्रत्यक्ष रेफरी होना चाहिए, लेकिन सादगी के लिए)।

मैंने एक इकाई प्रकार के क्षेत्र के साथ एक फॉर्म प्रकार बनाने की कोशिश की है, इकाई की आईडी प्रॉपर्टी पर मैप किया गया है और किसी अन्य रूप में एम्बेड किया गया है जिसमें संग्रह प्रकार फ़ील्ड है।

class FooEntitySelectByIdentityType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder->add('foo_id', 'entity', array(
      'required' => false, 
      'class' => 'MeMyBundle:FooEntity', 
      'property' => 'id', 
      'multiple' => true, 
      'expanded' => true 
     )); 
    } 

# ... 

और

class FooEntitySelectionType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder->add('identity', 'collection', array(
      'type' => new FooEntitySelectByIdentityType, 
      'options' => array(
       'required' => false, 
       'multiple' => true, 
       'expanded' => true, 
       'attr'  => array('class' => 'foo') 
      ), 
     )); 
    } 

# ... 

और एक नियंत्रक में प्रपत्र प्रारंभिक डेटा के रूप में संस्थाओं का एक संग्रह के साथ बनाई गई है

$form = $this 
    ->createForm(
     new \Me\MyBundle\Form\Type\FooEntitySelectionType, 
     $collection_of_foo 
    ) 
    ->createView() 
; 

जब प्रपत्र प्रदान की गई है के लिए एक एकल लेबल है पहचान क्षेत्र, लेकिन कोई विजेट नहीं।

क्या इस विशेष तरीके से इकाई और संग्रह प्रकार फ़ील्ड का उपयोग करना भी संभव है? यदि हां, तो मैं गलत क्या कर सकता हूं?

उत्तर

8

मुझे लगता है कि यह आपके प्रश्न का उत्तर देगा।

FooEntitySelectionType भूल जाएं। FooEntitySelectByIdentityType करने के लिए एक property_path क्षेत्र विकल्प जोड़ें और सेट data_class विकल्प null रहे हैं:

class FooEntitySelectByIdentityType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder->add('foo_id', 'entity', array(
      'required'  => false, 
      'class'   => 'MeMyBundle:FooEntity', 
      'property'  => 'id', 
      'property_path' => '[id]', # in square brackets! 
      'multiple'  => true, 
      'expanded'  => true 
     )); 
    } 

    public function setDefaultOptions(OptionsResolverInterface $resolver) 
    { 
     $resolver->setDefaults(array(
      'data_class'  => null, 
      'csrf_protection' => false 
     )); 
    } 

# ... 

और अपने नियंत्रक में, निर्माण FooEntitySelectByIdentityType:

$form = $this 
    ->createForm(
     new \Me\MyBundle\Form\Type\FooEntitySelectByIdentityType, 
     $collection_of_foo 
    ) 
    ->createView() 
; 

और फिर नियंत्रक कार्रवाई जो पोस्टेड डेटा प्राप्त में:

$form = $this 
    ->createForm(new \Me\MyBundle\Form\Type\FooEntitySelectByIdentityType) 
; 
$form->bind($request); 
if ($form->isValid()) { 
    $data = $form->getData(); 
    $ids = array(); 
    foreach ($data['foo_id'] as $entity) { 
     $ids[] = $entity->getId(); 
    } 
    $request->getSession()->set('admin/foo_list/batch', $ids); 
} 

और अंत में, आपके जुड़वां टेम्पलेट में:

{# ... #} 
{% for entity in foo_entity_collection %} 
    {# ... #} 

    {{ form_widget(form.foo_id[entity.id]) }} 

    {# ... #} 
+0

जो काम करता है! इस पूरी विधि का नकारात्मक पक्ष यह है कि '$ form-> getData() 'सादे पूर्णांक आईडी के बजाय इकाइयों का संग्रह युक्त एक सरणी देता है, लेकिन मुझे लगता है कि उल्टा यह है कि सत्र में सहेजी गई कोई अवैध आईडी नहीं हो सकती है। धन्यवाद @ जेह! – jah

+1

ध्यान रखें कि यह दृष्टिकोण काम नहीं करता है, अगर आप तारों को पहचानकर्ता के रूप में उपयोग करने का प्रयास करते हैं।'EntityChoiceList' तब बच्चों के लिए पूर्णांक आधारित सूचकांक बनाएगा और 'form_widget' कॉल अपवाद फेंक देगा। :( – althaus

+0

मैं भी इस परेशानी में भाग रहा हूं। क्या इस साधारण समस्या को हल करने का कोई आसान तरीका है? –

3

किसी Symfony> = 2.3

आप इस बदलना होगा के लिए समाधान की तलाश में है, तो: एक के लिए symfony bundle

$data = $form['foo_id']->getData(); 
    $ids = array(); 
    foreach ($data as $entity) { 
     $ids[] = $entity->getId(); 
    } 
2

मैं बनाने के लिए:

$data = $form->getData(); 
    $ids = array(); 
    foreach ($data['foo_id'] as $entity) { 
     $ids[] = $entity->getId(); 
    } 
इस के लिए

कॉन्फ़िगर करने योग्य तरीके से चेकबॉक्स तालिका के रूप में इकाइयों का संग्रह प्रस्तुत करें। हालांकि यह सवाल थोड़ी देर के बाद से पूछा गया था, मुझे उम्मीद है कि यह दूसरों को इस तरह की समस्या से मदद कर सकता है।

+0

मैं इस बंडल का उपयोग कर रहा हूं और मुझे कहना है कि यह बहुत अच्छा है! धन्यवाद! – Muc

+0

एक बार में 1000 रिकॉर्ड प्रदर्शित करने की कोशिश के साथ आपके बंडल का प्रदर्शन कैसा है? मैं डेटाटेबल्स का उपयोग करने की योजना बना रहा हूं प्रत्येक पक्ष लोड पर कितने रिकॉर्ड दिखाए जाते हैं, यह सीमित करने के लिए सर्वर साइड प्रसंस्करण, हालांकि ऐसा लगता है कि जब मैं उपर्युक्त अन्य उत्तरों का उपयोग करता हूं तो मुझे अपने संभावित प्रकार के विकल्पों के साथ अपनी इकाई प्रकार बनाने की आवश्यकता होती है, न केवल प्रारंभिक पृष्ठ तक सीमित रिकॉर्ड के। मुझे इस से संबंधित प्रदर्शन मुद्दे हैं। – snoop168