ProgramingTip

Symfony2 기본 선택 필드 선택 설정

bestdevel 2020. 11. 6. 18:59
반응형

Symfony2 기본 선택 필드 선택 설정


다음과 같은 방식으로 양식을 작성하고 있습니다.

$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>

Cristian의 솔루션 을 사용하는 경우 FormType 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, $ identifier) ​​메소드를 사용하면 데이터베이스에서 사용하는 모든 것을 사용할 수 있습니다. 이는 예를 들어 식별자가있는 엔터티에 대한 연결을 설정하려는 경우 성능 향상으로 유용합니다.


'data'속성에서 언어를 정의 할 수 있습니다. 이 추상 "필드"유형 ( 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();

이 예에서는 '초안'이 기본 선택 값으로 설정됩니다.


"데이터"옵션을 사용하지만 값은 유형입니다. 즉 :

$em = $this->getDoctrine()->getEntityManager();

->add('sucursal', 'entity', array
(

    'class' => 'TestGeneralBundle:Sucursal',
    'property'=>'descripcion',
    'label' => 'Sucursal',
    'required' => false,
    'data'=>$em->getReference("TestGeneralBundle:Sucursal",3)           

))

$breed->setSpecies($species)예를 들어 다음과 같은 형식으로 사용 하면됩니다.

$m = new Member();
$m->setBirthDate(new \DateTime);
$form = $this->createForm(new MemberType, $m);

내 기본 선택을 현재 날짜로 설정합니다. 외부와 동일한 방식으로 작동해야합니다.


Doctrine 배열을 전달하려는 다음과 같이 시도하십시오 (Symfony 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,
    ]);
}

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
     ]
 );

양식 클래스를 사용하여 양식을 사용할 때 Symfony가 목록에서 올바른 옵션을 선택하는 것을 처리합니다. 여기서 뭘 잘못하고 있는지 잘 모르겠습니다. 다음은 작동하는 내 양식 중 하나의 예입니다.

편집 작업을위한 컨트롤러에서 :

$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';
    }
}

문서에서 :

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

혼합 $ data = null이 기본 옵션입니다. 예를 들어 상태라는 필드가 및 다음과 같이 구현했습니다.

$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();

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                   
        ))

양식은 매핑 선택한 필드에 종-> id 값을 자동으로 선택해야합니다. 예를 들어 'breed_species'조인 테이블에서 Species라는 의미와 OnetoOne 관계가있는 Breed라는 의미가있는 경우 :

class Breed{

    private $species;

    /**
    * @ORM\OneToOne(targetEntity="BreedSpecies", mappedBy="breed")
    */
    private $breedSpecies;

    public function getSpecies(){
       return $breedSpecies->getSpecies();
    }

    private function getBreedSpecies(){
       return $this->$breedSpecies;
    }
}

양식 클래스의 'species'필드는 양식에 전달 된 Breed 클래스의 'species'속성 개체에서 species-> id 값을 선택해야합니다.

또는 SetData ()를 사용하여 종소리를 양식에 명시 적으로 전달하여 값을 명시 적으로 수 있습니다.

    $breedForm = $this->createForm( new BreedForm(), $breed );
    $species   = $breed->getBreedSpecies()->getSpecies();

    $breedForm->get('species')->setData( $species );

    return $this->render( 'AcmeBundle:Computer:edit.html.twig'
                        , array( 'breed'     => $breed
                               , 'breedForm' => $breedForm->createView()
            )
    );

이 양식을 사용하여 편집하려는 모델에 올바른 기본값을 정의하거나 코드가 다음과 같이되도록 empty_data 옵션을 지정할 수 있습니다 .

$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()
;

"preferred_choices"를 사용하고 선택하려는 이름을 목록의 맨 위로 "푸시"할 수 있습니다. 그러면 기본적으로 선택됩니다.

'preferred_choices' => array(1), //1 is item number

엔티티 필드 유형

참고 URL : https://stackoverflow.com/questions/8073236/symfony2-setting-a-default-choice-field-selection

반응형