FormEvents에 약간의 문제가 있습니다. 3 개의 필드가 동적으로 채워지 길 원합니다. 프로젝트 3 박스 : 프로젝트> 박스> 셀, 사용자가 프로젝트를 선택하고, 박스리스트가 업데이트되고, 박스를 선택하고, 셀리스트가 업데이트됩니다. 이 개 필드 ... 실제로 사용자에 대한양식 이벤트로 제출 된 양식의 동적 생성
을 위해, 나는 문서처럼 FormEvent를 사용
말을하지만 동적으로 업데이트 한 필드에,이, 일의, 문제했습니다하지만 프로젝트를 선택할 수 있으며 그가 할 때, 상자 필드가 업데이트됩니다. 하지만, 상자를 선택하면 셀 필드가 업데이트되지 않았습니다 ...하지만 작동하도록 허용 한 무언가를 찾았습니다. -> add()와 inversed - > add(). 하지만 나는 그것을 원하지 않는다. 나는 그것을 변경할 때
$builder
->add('project', EntityType::class, array(
'class' => 'AppBundle\Entity\Project',
'choice_label' => 'name',
'placeholder' => '-- select a project --',
'mapped' => false,
))
->add('box', EntityType::class, array(
'class' => 'AppBundle\Entity\Box',
'choice_label' => 'name',
'placeholder' => '-- select a box --',
'choices' => [],
))
->add('cell', ChoiceType::class, array(
'placeholder' => '-- select a cell --',
))
;
그리고 :
내 코드는
builder
->add('box', EntityType::class, array(
'class' => 'AppBundle\Entity\Box',
'choice_label' => 'name',
'placeholder' => '-- select a box --',
// 'choices' => [],
))
->add('project', EntityType::class, array(
'class' => 'AppBundle\Entity\Project',
'choice_label' => 'name',
'placeholder' => '-- select a project --',
'mapped' => false,
))
->add('cell', ChoiceType::class, array(
'placeholder' => '-- select a cell --',
))
;
그것은 일입니다 ...하지만 시작에 상자 빈 목록을 원하고, 내가 프로젝트를 원하는 상자 앞에 ...
약간의 정밀도가이 양식은 CollectionType으로 다른 형식으로 포함됩니다. 이 유형의
모든 코드 :
<?php
namespace AppBundle\Form;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
class TubeType extends AbstractType
{
/**
* @param FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('project', EntityType::class, array(
'class' => 'AppBundle\Entity\Project',
'choice_label' => 'name',
'placeholder' => '-- select a project --',
'mapped' => false,
))
->add('box', EntityType::class, array(
'class' => 'AppBundle\Entity\Box',
'choice_label' => 'name',
'placeholder' => '-- select a box --',
'choices' => [],
))
->add('cell', ChoiceType::class, array(
'placeholder' => '-- select a cell --',
))
;
// MODIFIER
$boxModifier = function (FormInterface $form, $project) {
$boxes = (null === $project) ? [] : $project->getBoxes();
$form->add('box', EntityType::class, array(
'class' => 'AppBundle\Entity\Box',
'choice_label' => 'name',
'placeholder' => '-- select a box --',
'choices' => $boxes,
));
};
$cellModifier = function(FormInterface $form, $box) {
$cells = (null === $box) ? [] : $box->getEmptyCells();
$form->add('cell', ChoiceType::class, array(
'placeholder' => '-- select a cell --',
'choices' => $cells,
));
};
// FORM EVENT LISTENER
$builder->get('project')->addEventListener(
FormEvents::POST_SUBMIT,
function(FormEvent $event) use ($boxModifier) {
$project = $event->getForm()->getData();
$boxModifier($event->getForm()->getParent(), $project);
}
);
$builder->get('box')->addEventListener(
FormEvents::POST_SUBMIT,
function(FormEvent $event) use ($cellModifier) {
$box = $event->getForm()->getData();
$cellModifier($event->getForm()->getParent(), $box);
}
);
}
/**
* @param OptionsResolver $resolver
*/
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'AppBundle\Entity\Tube'
));
}
}
감사합니다 당신의 도움에 많이 :)
감사합니다. 다만, EventListener에서 필드를 생성 할 때,이 질문에 리스너를 어떻게 추가합니까? PRE_SET_DATA에 필드를 추가 할 때 "$ builder-> get ('project') -> addEventListener ("필드가 아직 존재하지 않기 때문입니다. :/ – mpiot
그리고 시도하면 '$ event-> getData(); 할 때 데이터가 아님'builder-> addEventListener (FormEvents :: POST_SUBMIT, function (FormEvent $ event) {', – mpiot
) 링크를 클릭하십시오. 여전히 도움이 필요하면 의견을 말하십시오. 나중에 코드 조각을 추가 할 수 있습니다. – Jeet