나는이 질문의 날짜를 지켜 보지 않았기 때문에 비슷한 문제가있는 사람들을 위해 약간의 일을 정리할 수있었습니다.
일부 필드가 포함 된 양식이 있고 data_class
없이이 양식을 사용한다고 가정 해 보겠습니다. 컨트롤러의 createForm
기능의 두 번째 인수로 항상 데이터를 사전 설정할 수 있습니다. 예 :
class TestType extends AbstractType {
/**
* @param FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(FormBuilderInterface $builder, array $options) {
// When passing a second argument to createForm you can get the data with $options['data']
dump($options['data']);
$builder
->addEventListener(FormEvents::PRE_SET_DATA, function(FormEvent $event) {
// The $event will contain the preset data
dump($event->getData());
})
->add('name', TextType::class)
->add('email', EmailType::class)
->add('message', TextareaType::class)
->add('send', SubmitType::class);
}
}
는 키 양식 필드를 나타내는 배열이어야 미리 폼을 전달하는 데이터 (예 name
, email
, message
, send
) 분명 값 양식 필드에 설정된 값이다. 예 계속 :
public function formTestAction(Request $request) {
// These values will be preset and are accessible with
// $event->getData() (inside an EventListener) OR
// through $options['data'] inside the buildForm function
$myPreSetData = array(
'name' => 'Peter Griffin',
'email' => '[email protected]',
'message' => 'The fire truck can consume 8 times his body weight.'
);
$form = $this->createForm(TestType::class, $myPreSetData);
$form->handleRequest($request);
if($form->isSubmitted() && $form->isValid()) {
dump('finished');
dump($form->getData());
die();
}
return $this->render('@TestPra/Test/test_form.html.twig', array(
'form' => $form->createView()
));
}
그러나 당신은 또한 형태가 나타내는 데이터와 아무것도 할 일이있는 폼 클래스의 데이터를 가지고 할 수 있습니다 예를 들어, ChoiceType
필드에 대한 선택 사항을 설정하십시오. 이에, 필요에 따라이 전달 된 옵션의 이름을 설정해야하는 TestType
클래스 내부
$fireTruckColorChoices = array(
'red' => 0,
'ultraRed' => 1
);
$form = $this->createForm(TestType::class, $myPreSetData, array(
'fireTruckColorChoices' => $fireTruckColorChoices
));
: 컨트롤러에서
:이 경우는 createForm
함수의 세 번째 인수를 통해 데이터를 전달 경우 fireTruckColorChoices
:
class TestType extends AbstractType {
/**
* @param FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(FormBuilderInterface $builder, array $options) {
$builder
...
->add('fireTruckColor', ChoiceType::class, array(
'choices' => $options['fireTruckColorChoices'],
))
...;
}
/**
* @param OptionsResolver $resolver
*/
public function configureOptions(OptionsResolver $resolver) {
// Must be set
$resolver->setRequired(array(
'fireTruckColorChoices'
));
}
}
당신은 또한 EventListener
(CL)에 옵션으로 전달 된 데이터에 액세스 할 수 있습니다 오 슈레. 이 경우 양식에 개인 변수를 추가하기 만하면됩니다.
class TestType extends AbstractType {
private $name;
public function buildForm(FormBuilderInterface $builder, array $options) {
$this->name = $options['name'];
$builder
->addEventListener(FormEvents::PRE_SET_DATA, function(FormEvent $event) {
dump($this->name);
})
...;
}
/**
* @param OptionsResolver $resolver
*/
public function configureOptions(OptionsResolver $resolver) {
$resolver->setRequired(array(
'name'
));
}
}
양식은 필드 변수에서 개체를 만들려면 기본 데이터 형식을 알아야합니다. 이것은 createForm()의 두 번째 인수에서 추측 할 수도 있고 data_class 옵션을 사용하여 지정할 수도 있습니다. 기본 객체의 클래스를 폼에 전달하지 않으려는 이유에 대한 정보를 줄 수 있습니까? – Matt
@Matt 항목 목록이 있습니다.이 양식을 사용하면 사용자가 항목을 필터링 할 수 있지만 항목은 하나의 etity에서 온 것이 아닙니다. 일반적으로 기본 데이터 형식을 사용하지 않고 event-> getData를 사용할 수있는 방법이 무엇입니까 ?? – mohsenJsh