gpt4 book ai didi

Symfony2 表单事件 - 下拉列表

转载 作者:行者123 更新时间:2023-12-01 22:25:34 25 4
gpt4 key购买 nike

在 Symfony2 网站中,我尝试制作一个包含 2 个(或 3 个)下拉列表的表单,其依赖关系为国家 > 地区 > 城市。该城市是我正在使用表单编辑的元素的字段。这个想法是根据选择来填充列表。

我已经按照此处的表单事件教程进行操作: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)的字段)。

最佳答案

我差点就拥有了。如果其他人需要此功能,请添加以下内容以使此解决方案在编辑现有项目时完美运行:

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 AAA\CoreBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormFactory;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\Form;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
use Doctrine\ORM\EntityRepository;
use AAA\CoreBundle\Entity\ClassYear;
use AAA\CoreBundle\Entity\Field;
use AAA\CoreBundle\Entity\Lesson;
use AAA\CoreBundle\Form\LessonContentForm;

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', null, 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', 'textarea', array('label'=>'Leçon', 'required'=>false)); // Can't set 'required' on textareas used by TinyMCE
$builder->add('reperes', 'textarea', 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', null, array(
'required' => false,
'mapped' => false
));

$refreshField = function ($form, $classyear) use ($factory) {
/** @var FormFactory $factory */
/** @var Form $form */
$form->add($factory->createNamed('field','entity',null, array(
'class' => 'AAA\CoreBundle\Entity\Field',
'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','entity',null, array(
'class' => 'AAA\CoreBundle\Entity\Topic',
'property' => 'name',
'label' => 'Sujet',
'empty_value' => 'Sélectionne une valeur',
'empty_data' => null,
'required' => false,
'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', 'entity', null, array(
'class' => 'AAACoreBundle:ClassYear',
'property' => 'name'.$country,
'mapped' => false,
'label' => 'Année',
'empty_value' => 'Sélectionne une valeur',
'empty_data' => null,
'required' => false,
'query_builder' => function (EntityRepository $repository) {
return $repository->createQueryBuilder('classyear')
->orderBy('classyear.sort');
}
)));
});
// Populate ddl when form was posted
$builder->addEventListener(FormEvents::PRE_BIND, function (FormEvent $event) use ($refreshTopic, $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' => 'AAA\CoreBundle\Entity\Lesson'
));
}
}

?>

关于Symfony2 表单事件 - 下拉列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11107821/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com