forms - सिम्फनी 2 डिफ़ॉल्ट विकल्प फ़ील्ड चयन सेट करना




symfony default (8)

मैं निम्नलिखित तरीके से एक फॉर्म बना रहा हूं:

$form = $this->createFormBuilder($breed)
             ->add('species', 'entity', array(
                  'class' => 'BFPEduBundle:Item',
                  'property' => 'name',
                  'query_builder' => function(ItemRepository $er){
                      return $er->createQueryBuilder('i')
                                ->where("i.type = 'species'")
                                ->orderBy('i.name', 'ASC');
                  }))
             ->add('breed', 'text', array('required'=>true))
             ->add('size', 'textarea', array('required' => false))
             ->getForm()

मैं प्रजाति सूची बॉक्स के लिए डिफ़ॉल्ट मान कैसे सेट कर सकता हूं?

आपकी प्रतिक्रिया के लिए धन्यवाद, मैं क्षमा चाहता हूं, मुझे लगता है कि मुझे अपने प्रश्न को दोबारा बदलना चाहिए। एक बार मेरे पास एक मान है जो मैं मॉडल से पुनर्प्राप्त करता हूं, तो मैं उस मूल्य को प्रजातियों की पसंद सूची में इसी मूल्य के लिए SELECTED = "yes" के रूप में कैसे सेट करूं?

तो, TWIG व्यू से विकल्प विकल्प का चयन इस प्रकार दिखाई देगा:

<option value="174" selected="yes">Dog</option>

Symfony2 रेडियो बटन के लिए डिफ़ॉल्ट पसंद सेट करना

            $builder->add('range_options', 'choice', array(
                'choices' => array('day'=>'Day', 'week'=>'Week', 'month'=>'Month'),
                'data'=>'day', //set default value 
                'required'=>true,
                'empty_data'=>null,
                'multiple'=>false,
                'expanded'=> true                   
        ))

आप 'डेटा' विशेषता से डिफ़ॉल्ट मान को परिभाषित कर सकते हैं। यह सार "फ़ील्ड" प्रकार का हिस्सा है ( http://symfony.com/doc/2.0/reference/forms/types/field.html )

$form = $this->createFormBuilder()
            ->add('status', 'choice', array(
                'choices' => array(
                    0 => 'Published',
                    1 => 'Draft'
                ),
                'data' => 1
            ))
            ->getForm();

इस उदाहरण में, 'ड्राफ्ट' को डिफ़ॉल्ट चयनित मान के रूप में सेट किया जाएगा।


आप या तो उस मॉडल में सही डिफ़ॉल्ट मान को परिभाषित कर सकते हैं जिसे आप इस फ़ॉर्म के साथ संपादित करना चाहते हैं या आप एक खाली_डेटा विकल्प निर्दिष्ट कर सकते हैं ताकि आपका कोड बन जाए:

$form = $this
    ->createFormBuilder($breed)
    ->add(
        'species',
        'entity',
        array(
            'class'         => 'BFPEduBundle:Item',
            'property'      => 'name',
            'empty_data'    => 123,
            'query_builder' => function(ItemRepository $er) {
                return $er
                    ->createQueryBuilder('i')
                    ->where("i.type = 'species'")
                    ->orderBy('i.name', 'ASC')
                ;
            }
        )
    )
    ->add('breed', 'text', array('required'=>true))
    ->add('size', 'textarea', array('required' => false))
    ->getForm()
;

दस्तावेज़ों से:

public Form createNamed(string|FormTypeInterface $type, string $name, mixed $data = null, array $options = array())

मिश्रित $ डेटा = शून्य डिफ़ॉल्ट विकल्प है। तो उदाहरण के लिए मेरे पास एक क्षेत्र कहा जाता है और मैंने इसे लागू किया है:

$default = array('Status' => 'pending');

$filter_form = $this->get('form.factory')->createNamedBuilder('filter', 'form', $default)
        ->add('Status', 'choice', array(
            'choices' => array(
                '' => 'Please Select...',
                'rejected' => 'Rejected',
                'incomplete' => 'Incomplete',
                'pending' => 'Pending',
                'approved' => 'Approved',
                'validated' => 'Validated',
                'processed' => 'Processed'
            )
        ))->getForm();

मुझे नहीं लगता कि आपको data विकल्प का उपयोग करना चाहिए, क्योंकि यह केवल डिफ़ॉल्ट मान सेट करने से अधिक है। आप सृजन के दौरान फॉर्म में पारित होने वाले किसी भी डेटा को ओवरराइड कर रहे हैं। तो मूल रूप से, आप उस सुविधा के लिए समर्थन तोड़ रहे हैं। - जब आप उपयोगकर्ता को डेटा बनाने के लिए दे रहे हैं, तो इससे कोई फर्क नहीं पड़ता, लेकिन जब आप डेटा अपडेट करने के लिए फॉर्म (किसी दिन) फॉर्म का उपयोग करते हैं तो इससे कोई फर्क नहीं पड़ता।

http://symfony.com/doc/current/reference/forms/types/choice.html#data देखें

मेरा मानना ​​है कि फॉर्म निर्माण के दौरान किसी भी डिफ़ॉल्ट डेटा को पार करना बेहतर होगा। नियंत्रक में।

उदाहरण के लिए, आप कक्षा में पास कर सकते हैं और अपनी कक्षा में डिफ़ॉल्ट मान को परिभाषित कर सकते हैं। (डिफ़ॉल्ट Symfony\Bundle\FrameworkBundle\Controller\Controller का उपयोग करते समय)

$form = $this->createForm(AnimalType::class, [
    'species' => 174 // this id might be substituted by an entity
]);

या वस्तुओं का उपयोग करते समय:

$dog = new Dog();
$dog->setSpecies(174); // this id might be substituted by an entity

$form = $this->createForm(AnimalType::class, $dog);

कारखाने का उपयोग करते समय भी बेहतर: (जहां कुत्ता शायद जानवर से फैलता है)

$form = $this->createForm(AnimalType::class, DogFactory::create());

इससे आप एक दूसरे से फॉर्म संरचना और सामग्री को अलग कर सकते हैं और अधिक परिस्थितियों में अपना फॉर्म पुन: प्रयोज्य बना सकते हैं।

या, preferred_choices विकल्प का उपयोग करें, लेकिन इसका डिफ़ॉल्ट विकल्प आपके फॉर्म के शीर्ष पर ले जाने का दुष्प्रभाव है।

देखें: http://symfony.com/doc/current/reference/forms/types/choice.html#preferred-choices

$builder->add(
    'species', 
    'entity', 
    [
        'class' => 'BFPEduBundle:Item',
        'property' => 'name',
        'query_builder' => ...,
        'preferred_choices' => [174] // this id might be substituted by an entity
     ]
 );

मुझे यकीन नहीं है कि आप यहां क्या गलत कर रहे हैं, जब मैं फॉर्म क्लास का उपयोग करके एक फॉर्म बनाता हूं सिम्फनी सूची में सही विकल्प चुनने का ख्याल रखता है। यहां मेरे रूपों में से एक का उदाहरण है जो काम करता है।

संपादन कार्रवाई के लिए नियंत्रक में:

$entity = $em->getRepository('FooBarBundle:CampaignEntity')->find($id);

if (!$entity) {
throw $this->createNotFoundException('Unable to find CampaignEntity entity.');
}


$editForm = $this->createForm(new CampaignEntityType(), $entity);
$deleteForm = $this->createDeleteForm($id);

return $this->render('FooBarBundle:CampaignEntity:edit.html.twig', array(
        'entity'      => $entity,
        'edit_form'   => $editForm->createView(),
        'delete_form' => $deleteForm->createView(),
    ));

अभियान इकाई प्रकार वर्ग (src: Foo \ BarBundle \ Form \ CampaignEntityType.php):

namespace Foo\BarBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilder;
use Doctrine\ORM\EntityRepository;

class CampaignEntityType extends AbstractType
{
    public function buildForm(FormBuilder $builder, array $options)
    {
        $builder
        ->add('store', 'entity', array('class'=>'FooBarBundle:Store', 'property'=>'name', 'em'=>'my_non_default_em','required'  => true, 'query_builder' => function(EntityRepository $er) {return $er->createQueryBuilder('s')->orderBy('s.name', 'ASC');}))
        ->add('reward');
    }
    public function getName()
    {
        return 'foo_barbundle_campaignentitytype';
    }
}

यदि आप Cristian's समाधान Cristian's उपयोग करते हैं, तो आपको EntityManager को अपनी फॉर्मटाइप क्लास में इंजेक्ट करने की आवश्यकता होगी। यहां एक सरल उदाहरण दिया गया है:

class EntityType extends AbstractType{
    public function __construct($em) {
        $this->em = $em;
    }

    public function buildForm(FormBuilderInterface $builder, array $options){
         $builder
             ->add('MyEntity', 'entity', array(
                     'class' => 'AcmeDemoBundle:Entity',
                     'property' => 'name',
                     'query_builder' => function(EntityRepository $er) {
                         return $er->createQueryBuilder('e')
                             ->orderBy('e.name', 'ASC');
                     },
                     'data' => $this->em->getReference("AcmeDemoBundle:Entity", 3)
        ));
    }
}

और आपका नियंत्रक:

 // ...    

 $form = $this->createForm(new EntityType($this->getDoctrine()->getManager()), $entity);

// ...

सिद्धांत डॉक्स से :

विधि EntityManager # getReference ($ entityName, $ पहचानकर्ता) आपको उस इकाई को संदर्भ प्राप्त करने देता है जिसके लिए पहचानकर्ता ज्ञात है, डेटाबेस से उस इकाई को लोड किए बिना। यह उपयोगी है, उदाहरण के लिए, एक प्रदर्शन वृद्धि के रूप में, जब आप किसी इकाई को एक एसोसिएशन स्थापित करना चाहते हैं जिसके लिए आपके पास पहचानकर्ता है।


यदि आप सिद्धांत संस्थाओं की एक सरणी में गुजरना चाहते हैं, तो इस तरह कुछ कोशिश करें (सिम्फनी 3.0+):

protected $entities;
protected $selectedEntities;

public function __construct($entities = null, $selectedEntities = null)
{
    $this->entities = $entities;
    $this->selectedEntities = $selectedEntities;
}

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder->add('entities', 'entity', [
        'class' => 'MyBundle:MyEntity',
        'choices' => $this->entities,
        'property' => 'id',
        'multiple' => true,
        'expanded' => true,
        'data' => $this->selectedEntities,
    ]);
}






symfony-forms