У меня есть поле выбора, созданное с помощью formbuilder:
<select id = "form_type" name = "form[type]" class = "form-control select2 select2-hidden-accessible" tabindex = "-1" aria-hidden = "true">
<option value = "1">text</option>
<option value = "2">hidden</option>
<option value = "3">password</option>
<option value = "4" selected = "selected">icon</option>
<option value = "5">select</option>
</select>
Вот как он создается в моем контроллере:
$formBuilder->add('type', EntityType::class, array(
'attr' => array('class' => 'form-control select2'), 'label' => 'Type',
'class' => FieldTypes::class,
'choice_label' => function ($fieldTypes) {
return $fieldTypes->getName();
}
));
$formBuilder->add('cancel', ButtonType::class, array('label' => 'cancel','attr' => array('class' => 'cancel form-btn btn btn-default pull-right close_sidebar')))
->add('save', SubmitType::class, array('label' => 'Save','attr' => array('id' => 'submit-my-beautiful-form','class' => 'form-btn btn btn-info pull-right','style' => 'margin-right:5px')));
$form = $formBuilder->getForm();
$form->handleRequest($request);
Но когда я хочу сохранить выделение, я получаю сообщение об ошибке:
Argument 1 passed to App\Entity\Fields::setType() must be an instance of App\Entity\FieldTypes or null, string given, called in /Users/work/project/src/Controller/PagesController.php on line 242
В моей сущности:
public function setType(?FieldTypes $type): self
{
$this->type = $type;
return $this;
}
Вот как он хранился:
$entity = $this->getDoctrine()->getRepository($EntityName)->find($data['form[id]']);
$em = $this->getDoctrine()->getManager();
foreach ($fields as $field) {
$em = $this->getDoctrine()->getManager();
$func = 'set'.$field['fieldName'];
$args = $data['form['.$field['fieldName'].']'];
$entity->$func($args);
}
$em->flush();




Воспользуйтесь методом $form->handleRequest($request). Он заполнит вашу форму, используя свою конфигурацию (он создаст экземпляр FieldType, используя опубликованный идентификатор).
Здесь вы вручную добавляете «сырое» значение вашего выбора, которое представляет собой строку, содержащую идентификатор вашего FieldType.
изменить: см. документы
Я предполагал, что вы использовали класс формы и создали его с помощью метода $this->createForm(Form::class, $type), извините. В этом случае переменная $ type автоматически заполняется опубликованным значением формы в соответствии с конфигурацией формы. Это наиболее правильный способ использования формы, вы должны взглянуть на это;)
Согласно вашему коду, его немного сложно понять, но если $ field представляет собой строку.
foreach ($fields as $field) {
$obj = $this->getDoctrine()->getRepository($fieldEntity)->find(field);
$entiy->setType($obj);
}
Спасибо! Я не был уверен, что такое field, это имя связанного столбца? Вот как связаны сущности: /** * @ORM\ManyToOne(targetEntity = "FieldTypes") * @ORM\JoinColumn(name = "type", referencedColumnName = "id") */ private $type;
Он проверил ваш код следующим образом: $fieldEntity = new FieldTypes(); $obj = $this->getDoctrine()->getRepository($fieldEntity)->find(id); $entiy->setType($obj);
Ошибка теперь: Warning: Illegal offset type in isset or empty
Попробуйте после блока отправки формы
$entity->setType($form->get('type'));
$ form-> get ('type') вернется как класс FieldTypes.
также, если вы используете $ field вместо $ field ['fieldName'], будет возражать вернуть. Например,
$func = 'set'.$field;
$func = 'set'.$field; выдает ошибку Notice: Array to string conversion
У меня уже есть `$ form-> handleRequest ($ request);` просто не разместил его здесь, должно быть, другая проблема (я обновлю свой вопрос