加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 资源网站 > 资源 > 正文

Symfony2表单事件 – 下拉列表

发布时间:2020-12-14 16:41:24 所属栏目:资源 来源:网络整理
导读:在Symfony2网站上,我试图制作一个包含2(或3)个下拉列表的表单,其中包含依赖状态,如Country区域市.那个城市是我正在用表格编辑的元素的一个领域.我们的想法是根据选择填写列表. 我在这里按照教程和表格事件:http://aulatic.16mb.com/wordpress/2011/08/symfo
在Symfony2网站上,我试图制作一个包含2(或3)个下拉列表的表单,其中包含依赖状态,如Country>区域>市.那个城市是我正在用表格编辑的元素的一个领域.我们的想法是根据选择填写列表.

我在这里按照教程和表格事件:http://aulatic.16mb.com/wordpress/2011/08/symfony2-dynamic-forms-an-event-driven-approach/
(基于webb-on-the-web .com /?p = 5)

我遇到的问题:一切正常但是当我使用表单编辑元素时,城市被正确选择(来自数据库),但国家和地区下拉列表被预先填写并留在“选择一个值”.我不知道它是否应该与教程一起工作.

问题是:如何选择这些列表?我正在尝试添加POST_SET_DATA事件,但我找不到在表单字段中选择值的方法.

这是表单类:http://pastebin.com/PpWkHxC3(请注意,而不是城市:字段>主题和主题是表单编辑的课程的字段).

解决方法

我几乎拥有它.如果其他任何人需要这里需要添加的内容,以便在编辑现有项目时使此解决方案完美运行:
class ItemDetailForm extends AbstractType
{
   ...
        $builder->addEventListener(FormEvents::POST_SET_DATA,function (DataEvent $event) use ($refreshTopic) {
            $data = $event->getData();
            $form = $event->getForm();
            if (null === $data) {
                return;
            }

            $form->get('region')->setData($data->getCity()->getRegion());
        });
}

编辑:自symfony 2.1以来,在将子项添加到表单之前调用POST_SET_DATA事件,导致所有get(‘region’)引发异常.
解决方案是在POST_SET_DATA中而不是在buildForm()中创建此字段:

/** @var FormFactory $factory */
        $form->add($factory->createNamed('region','entity',null,array(
            'class'=>'AcmeBundle:Region','property_path'=>false,'empty_value'=>'Choose a value','required'=>true,'label'=>'Region'
        )));

请注意,您需要将$factory添加到处理事件的闭包的’use’:

$builder->addEventListener(FormEvents::POST_SET_DATA,function (DataEvent $event) use ($refreshTopic,$factory) {

这是整个表单类:

<?php
namespace AAACoreBundleForm;

use SymfonyComponentFormAbstractType;
use SymfonyComponentFormFormBuilderInterface;
use SymfonyComponentFormFormFactory;
use SymfonyComponentFormFormEvents;
use SymfonyComponentFormFormEvent;
use SymfonyComponentFormForm;
use SymfonyComponentOptionsResolverOptionsResolverInterface;
use DoctrineORMEntityRepository;
use AAACoreBundleEntityClassYear;
use AAACoreBundleEntityField;
use AAACoreBundleEntityLesson;
use AAACoreBundleFormLessonContentForm;

class LessonDetailForm extends AbstractType
{
    public $country;
    function __construct($country=null) {
        // Get country for classyear dropdown list
        $this->country = $country;
    }
    public function buildForm(FormBuilderInterface $builder,array $options)
    {
        $factory = $builder->getFormFactory();

        $builder->add('name',array('label'=>'Titre de la le?on'));
        $builder->add('description','textarea',array('label'=>'Description (définition conceptuelle) Qu'est-ce que c'est ? Et à quoi ?a sert ? (importance,utilité)'));
        $builder->add('text',array('label'=>'Le?on','required'=>false)); // Can't set 'required' on textareas used by TinyMCE
        $builder->add('reperes',array('label'=>'Repères (détectionel) - Quels sont les éléments qui me permettent de repérer que je dois penser à ce concept ?','required'=>false));
        $builder->add('other_topic',array(
            'required'  =>  false,'mapped'     =>  false
        ));

        $refreshField = function ($form,$classyear) use ($factory) {
            /** @var FormFactory $factory */
            /** @var Form $form */
            $form->add($factory->createNamed('field',array(
                'class'         => 'AAACoreBundleEntityField','mapped'        => false,'label'         => 'Matière','empty_value'   => 'Sélectionne une valeur','empty_data'    => null,'required'      => false,'query_builder' => function (EntityRepository $repository) use ($classyear) {
                    $qb = $repository->createQueryBuilder('field')
                        ->innerJoin('field.classyear','classyear');

                    if($classyear instanceof ClassYear) {
                        $qb = $qb->where('field.classyear = :classyear')
                            ->setParameter('classyear',$classyear);
                    } elseif(is_numeric($classyear)) {
                        $qb = $qb->where('classyear.id = :classyear_id')
                            ->setParameter('classyear_id',$classyear);
                    } else {
                        $qb = $qb->where('0 = 1');
                    }

                    return $qb;
                }
            )));
        };
        $refreshTopic = function ($form,$field) use ($factory) {
            /** @var FormFactory $factory */
            /** @var Form $form */
            $form->add($factory->createNamed('topic',array(
                'class'         => 'AAACoreBundleEntityTopic','property'      => 'name','label'         => 'Sujet','query_builder' => function (EntityRepository $repository) use ($field) {
                    $qb = $repository->createQueryBuilder('topic')
                        ->innerJoin('topic.field','field');

                    if($field instanceof Field) {
                        $qb = $qb->where('topic.field = :field')
                            ->setParameter('field',$field);
                    } elseif(is_numeric($field)) {
                        $qb = $qb->where('field.id = :field_id')
                            ->setParameter('field_id',$field);
                    } else {
                        $qb = $qb->where('0 = 1');
                    }

                    return $qb;
                }
            )));
        };

        // Populate ddl to show form
        $country = $this->country;
        $builder->addEventListener(FormEvents::PRE_SET_DATA,function (FormEvent $event) use ($refreshTopic,$refreshField,$factory,$country) {
            /** @var Lesson $data */
            $data = $event->getData();
            $form = $event->getForm();

            // Test if null because this event is called 2 times,only the second time with the actual Lesson object (which has null values in the creation case)
            if($data != null)
                // In case of creation
                if($data->getId()==null) {
                    // Creates empty fields
                    $refreshTopic($form,null);
                    $refreshField($form,null);
                }
                // In case of edition
                else {
                    if ($data->getTopic() != null) {
                        $refreshTopic($form,$data->getTopic()->getField());
                        if ($data->getTopic()->getField() != null) {
                            $refreshField($form,$data->getTopic()->getField()->getClassYear());
                        }
                    }
                    else {
                        $refreshField($form,null);
                        $refreshTopic($form,null);
                    }
                }

            /** @var FormFactory $factory */
            $form->add($factory->createNamed('classyear',array(
                'class'         => 'AAACoreBundle:ClassYear','property'      => 'name'.$country,'label'         => 'Année','query_builder' => function (EntityRepository $repository) {
                    return $repository->createQueryBuilder('classyear')
                        ->orderBy('classyear.sort');
                }
            )));
        });
        // Populate ddl when form was posted
        $builder->addEventListener(FormEvents::PRE_BIND,$refreshField) {
            $form = $event->getForm();
            $data = $event->getData();

            if(array_key_exists('classyear',$data)) {
                $refreshField($form,$data['classyear']);
            }
            if(array_key_exists('field',$data)) {
                $refreshTopic($form,$data['field']);
            }
        });

        // Select value in ddl when editing
        $builder->addEventListener(FormEvents::POST_SET_DATA,function (FormEvent $event) use ($refreshTopic) {
            /** @var Lesson $data */
            $data = $event->getData();
            $form = $event->getForm();
            if (null === $data || null === $data->getId() ) {
                return;
            }

            if ($data->getTopic() != null) {
                $form->get('field')->setData($data->getTopic()->getField());
                if ($data->getTopic()->getField() != null) {
                    $form->get('classyear')->setData($data->getTopic()->getField()->getClassYear());
                }
            }
        });
    }
    public function getName()
    {
        return 'LessonDetailForm';
    }
    /** @param OptionsResolverInterface $resolver */
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'AAACoreBundleEntityLesson'
        ));
    }
}

?>

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读