У меня есть сущность, которая находится на обратной стороне трех однозначных сопоставлений. Entity FittingStep отображается с помощью FittingStepsingleValue и т. Д. FittingStep имеет поле FieldTeptype , который определяет, какая из трех объектов, которые должен искать FittingStep . Я хочу внедрить этот объект в форму FittingStep < /code> редактировать.
services:
ihear.form.fitting_step_single_value:
class: Ihear\FittingBundle\Form\FittingStepSingleValueType
arguments: [@security.context]
tags:
-
name: form.type
alias: ihear_fittingbundle_fittingstepsinglevaluetype
ihear.form.fitting_step_double_value:
class: Ihear\FittingBundle\Form\FittingStepDoubleValueType
arguments: [@security.context]
tags:
-
name: form.type
alias: ihear_fittingbundle_fittingstepdoublevaluetype
ihear.form.fitting_step_option:
class: Ihear\FittingBundle\Form\FittingStepOptionType
arguments: [@security.context]
tags:
-
name: form.type
alias: ihear_fittingbundle_fittingstepoptiontype
< /code>
Эти классы службы выглядят при этом (довольно базовые) < /p>
class FittingStepSingleValueType extends AbstractType
{
private $securityContext;
public function __construct(SecurityContext $securityContext)
{
$this->securityContext = $securityContext;
}
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('max1')
->add('description1')
->add('fittingStep', 'hidden')
;
}
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'Ihear\FittingBundle\Entity\FittingStepSingleValue'
));
}
public function getName()
{
return 'ihear_fittingbundle_fittingstepsinglevaluetype';
}
}
< /code>
Моя форма использует eventlistener на pre_set_data, чтобы добавить соответствующее поле встроенной формы: < /p>
class FittingStepType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('name')
->add('abbreviation')
->add('description')
->add('fittingStepType',
'choice',
['choices' => ['SingleValue' => 'SingleValue',
'DoubleValue' => 'DoubleValue',
'Option' => 'Option'],
'empty_value' => 'select one please'])
;
$formModifier = function(FormInterface $form, $fittingStepType) {
switch ($fittingStepType) {
case 'SingleValue':
$form->add('fittingStepSingleValue',
'ihear_fittingbundle_fittingstepsinglevaluetype');
if ($form->has('fittingStepDoubleValue'))
$form->remove('fittingStepDoubleValue');
if ($form->has('fittingStepOption'))
$form->remove('fittingStepOption');
break;
case 'DoubleValue':
$form->add('fittingStepDoubleValue',
'ihear_fittingbundle_fittingstepdoublevaluetype');
if ($form->has('fittingStepSingleValue'))
$form->remove('fittingStepSingleValue');
if ($form->has('fittingStepOption'))
$form->remove('fittingStepOption');
break;
case 'Option':
$form->add('fittingStepOption',
'ihear_fittingbundle_fittingstepoptiontype');
if ($form->has('fittingStepSingleValue'))
$form->remove('fittingStepSingleValue');
if ($form->has('fittingStepDoubleValue'))
$form->remove('fittingStepDoubleValue');
break;
}
};
$builder->addEventListener(
FormEvents::PRE_SET_DATA,
function(FormEvent $event) use ($formModifier) {
$form = $event->getForm();
// this is the FittingStep
$data = $event->getData();
// this is the Entity that contains the value(s)
// i.e. FittingStepSingleValue
$fittingStepType = $data->getFittingStepType();
switch ($fittingStepType) {
case 'SingleValue':
$formModifier($form, $fittingStepType);
break;
case 'DoubleValue':
$formModifier($form, $fittingStepType);
break;
case 'Option':
$formModifier($form, $fittingStepType);
break;
}
}
);
}
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'Ihear\FittingBundle\Entity\FittingStep'
));
}
public function getName()
{
return 'ihear_fittingbundle_fittingsteptype';
}
}
< /code>
Мой контроллер для действия редактирования: < /p>
/**
* Displays a form to edit an existing FittingStep entity.
*
* @Route("/{id}/edit", name="admin_fittingstep_edit")
* @Method("GET")
* @Template()
*/
public function editAction($id)
{
$em = $this->getDoctrine()->getManager();
$entity = $em->getRepository('IhearFittingBundle:FittingStep')->find($id);
if (!$entity) {
throw $this->createNotFoundException(
'Unable to find FittingStep entity.');
}
$editForm = $this->createForm(new FittingStepType(), $entity);
$deleteForm = $this->createDeleteForm($id);
return array(
'entity' => $entity,
'edit_form' => $editForm->createView(),
'delete_form' => $deleteForm->createView(),
);
}
< /code>
Когда я пытаюсь загрузить форму, я получаю исключение: < /p>
Данные представления формы, как ожидается, будут иметь тип скалярного, массива или экземпляра
\ arrayaccess, но это экземпляр Class
iHear \ FittingBuntle \ stittipe \ stittipe \ stittipe. Вы можете избежать этой ошибки,
установил опцию «data_class» на
"ihear \ fittingbundle \ entity \ fittingstep" или добавив View
Transformer, который преобразует экземпляр класса
iHear \ FittingBundle \ Entity \ FittingStep в скаляр, массив или экземпляр
\ arraycscess. /> < /blockquote>
Что я делаю не так? Кажется, что существует некоторое разрыв между отображением объектов между сущностями и отображением в форме. В качестве примечания, я успешно использую $ formmodifier
закрытие в моей форме создания, поэтому он отлично работает при создании новой сущности с встроенной формой.
У меня есть сущность, которая находится на обратной стороне трех однозначных сопоставлений. Entity FittingStep отображается с помощью FittingStepsingleValue и т. Д. FittingStep имеет поле FieldTeptype , который определяет, какая из трех объектов, которые должен искать FittingStep . Я хочу внедрить этот объект в форму FittingStep < /code> редактировать.[code]services: ihear.form.fitting_step_single_value: class: Ihear\FittingBundle\Form\FittingStepSingleValueType arguments: [@security.context] tags: - name: form.type alias: ihear_fittingbundle_fittingstepsinglevaluetype ihear.form.fitting_step_double_value: class: Ihear\FittingBundle\Form\FittingStepDoubleValueType arguments: [@security.context] tags: - name: form.type alias: ihear_fittingbundle_fittingstepdoublevaluetype ihear.form.fitting_step_option: class: Ihear\FittingBundle\Form\FittingStepOptionType arguments: [@security.context] tags: - name: form.type alias: ihear_fittingbundle_fittingstepoptiontype < /code>
Эти классы службы выглядят при этом (довольно базовые) < /p>
class FittingStepSingleValueType extends AbstractType { private $securityContext;
public function __construct(SecurityContext $securityContext) { $this->securityContext = $securityContext; }
public function buildForm(FormBuilderInterface $builder, array $options) { $builder ->add('max1') ->add('description1') ->add('fittingStep', 'hidden') ; }
public function setDefaultOptions(OptionsResolverInterface $resolver) { $resolver->setDefaults(array( 'data_class' => 'Ihear\FittingBundle\Entity\FittingStepSingleValue' )); }
public function getName() { return 'ihear_fittingbundle_fittingstepsinglevaluetype'; } } < /code>
Моя форма использует eventlistener на pre_set_data, чтобы добавить соответствующее поле встроенной формы: < /p>
class FittingStepType extends AbstractType { public function buildForm(FormBuilderInterface $builder, array $options) { $builder ->add('name') ->add('abbreviation') ->add('description') ->add('fittingStepType', 'choice', ['choices' => ['SingleValue' => 'SingleValue', 'DoubleValue' => 'DoubleValue', 'Option' => 'Option'], 'empty_value' => 'select one please']) ;
$formModifier = function(FormInterface $form, $fittingStepType) { switch ($fittingStepType) { case 'SingleValue': $form->add('fittingStepSingleValue', 'ihear_fittingbundle_fittingstepsinglevaluetype'); if ($form->has('fittingStepDoubleValue')) $form->remove('fittingStepDoubleValue'); if ($form->has('fittingStepOption')) $form->remove('fittingStepOption'); break; case 'DoubleValue': $form->add('fittingStepDoubleValue', 'ihear_fittingbundle_fittingstepdoublevaluetype'); if ($form->has('fittingStepSingleValue')) $form->remove('fittingStepSingleValue'); if ($form->has('fittingStepOption')) $form->remove('fittingStepOption'); break; case 'Option': $form->add('fittingStepOption', 'ihear_fittingbundle_fittingstepoptiontype'); if ($form->has('fittingStepSingleValue')) $form->remove('fittingStepSingleValue'); if ($form->has('fittingStepDoubleValue')) $form->remove('fittingStepDoubleValue'); break; } };
$builder->addEventListener( FormEvents::PRE_SET_DATA, function(FormEvent $event) use ($formModifier) { $form = $event->getForm(); // this is the FittingStep $data = $event->getData(); // this is the Entity that contains the value(s) // i.e. FittingStepSingleValue $fittingStepType = $data->getFittingStepType(); switch ($fittingStepType) { case 'SingleValue': $formModifier($form, $fittingStepType); break; case 'DoubleValue': $formModifier($form, $fittingStepType); break; case 'Option': $formModifier($form, $fittingStepType); break; } } ); } public function setDefaultOptions(OptionsResolverInterface $resolver) { $resolver->setDefaults(array( 'data_class' => 'Ihear\FittingBundle\Entity\FittingStep' )); }
public function getName() { return 'ihear_fittingbundle_fittingsteptype'; } } < /code>
Мой контроллер для действия редактирования: < /p>
/** * Displays a form to edit an existing FittingStep entity. * * @Route("/{id}/edit", name="admin_fittingstep_edit") * @Method("GET") * @Template() */ public function editAction($id) { $em = $this->getDoctrine()->getManager();
Когда я пытаюсь загрузить форму, я получаю исключение: < /p>
Данные представления формы, как ожидается, будут иметь тип скалярного, массива или экземпляра \ arrayaccess, но это экземпляр Class iHear \ FittingBuntle \ stittipe \ stittipe \ stittipe. Вы можете избежать этой ошибки, установил опцию «data_class» на "ihear \ fittingbundle \ entity \ fittingstep" или добавив View Transformer, который преобразует экземпляр класса iHear \ FittingBundle \ Entity \ FittingStep в скаляр, массив или экземпляр \ arraycscess. /> < /blockquote>
Что я делаю не так? Кажется, что существует некоторое разрыв между отображением объектов между сущностями и отображением в форме. В качестве примечания, я успешно использую $ formmodifier [/code] закрытие в моей форме создания, поэтому он отлично работает при создании новой сущности с встроенной формой.