Я использую форму Symfony, которая предварительно заполнена некоторыми данными (если я могу найти пользователя, я предварительно заполняю его данные).
Я получаю эту ошибку:
Unable to transform value for property path "[terms]": Expected a Boolean.
IЯ использую поле terms
типа checkbox
.Версия Symfony 2.8.28.
Мой код для контроллера:
class SignupController extends ResourceController {
public function newSignupAction(Request $request)
{
$resource = new Signup();
$form = $this->createForm($this->createNewFormType(), $resource, array(
'action' => $url,
'method' => 'POST',
));
$form->add('submit', 'submit', array('label' => 'Create'));
if ($participant = $this->getUser()->getParticipant()) {
$participation = new Participation();
$participation->setParticipant($participant);
$signup->addParticipation($participation);
$form->setData($signup);
}
}
}
Класс регистрации выглядит следующим образом:
class Signup extends ExtraFieldEntity
{
public function addParticipation(Participation $participation)
{
$participation->setSignup($this);
$this->participations[] = $participation;
return $this;
}
}
class ParticipantBasicType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('firstName')
->add('lastName')
->add('extraFields', 'extra_field_collection', array(
'group' => 'participant',
));
$builder->addEventListener(
FormEvents::POST_SET_DATA,
function (FormEvent $event) use ($builder) {
$form = $event->getForm();
if (!$data = $event->getData()) {
return;
}
/** @var PersistentCollection $extraFields */
$extraFields = $data->getExtraFields();
if ($extraFields->isEmpty()) {
return;
}
foreach ($extraFields->getValues() as $extraField) {
/** @var Value $extraField */
if ($form->get('extraFields')->has($extraField->getDefinition()->getIdentifier())) {
$form->get('extraFields')
->get($extraField->getDefinition()->getIdentifier())
->setData($extraField);
}
}
}
);
}
}
Дополнительные поля должны отображаться наформа.Создание дополнительных полей выглядит следующим образом:
class ExtraFieldCollectionType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
.....
$builder->add(
$builder->create(
$identifier,
$type,
$parameters
)->addModelTransformer(
new ScalarToExtraFieldValueTransformer($identifier, $definition, $type)
)
);
}
}
Он вызывает преобразователь пользовательской модели:
class ScalarToExtraFieldValueTransformer implements DataTransformerInterface
{
private $identifier;
private $definition;
private $type;
public function __construct($identifier, $definition, $type)
{
$this->identifier = $identifier;
$this->definition = $definition;
$this->type = $type;
}
public function transform($value)
{
$result = '';
if (is_null($value)) {
return $result;
}
if (is_object($value)) {
/* @var Value $value */
$result = $value->getValue();
} elseif (is_string($value)) {
if ($this->resolveType($this->type) == 'integer') {
$result = explode(',', $value);
}
}
settype($result, $this->resolveType($this->type));
return $result;
}
public function reverseTransform($value)
{
return new Value(
$value,
$this->definition
);
}
private function resolveType($type)
{
switch ($type) {
case 'choice':
return 'string';
case 'checkbox':
return 'boolean';
break;
default:
return 'string';
break;
}
}
}
Как я мог отследить проблему, она ломается здесь только для типа checkbox
:
vendor/symfony/symfony/src/Symfony/Component/Form/Form.php
в этом методе:
private function normToView($value)
{
// Scalar values should be converted to strings to
// facilitate differentiation between empty ("") and zero (0).
// Only do this for simple forms, as the resulting value in
// compound forms is passed to the data mapper and thus should
// not be converted to a string before.
if (!$this->config->getViewTransformers() && !$this->config->getCompound()) {
return null === $value || is_scalar($value) ? (string) $value : $value;
}
try {
foreach ($this->config->getViewTransformers() as $transformer) {
$value = $transformer->transform($value);
}
} catch (TransformationFailedException $exception) {
throw new TransformationFailedException(
'Unable to transform value for property path "'.$this->getPropertyPath().'": '.$exception->getMessage(),
$exception->getCode(),
$exception
);
}
return $value;
}
Который звонит vendor/symfony/symfony/src/Symfony/Component/Form/Extension/Core/DataTransformer/BooleanToStringTransformer.php
Любой совет, что я делаю не так?Спасибо!
Добавление (определение объекта участника)
class Participant extends ExtraFieldEntity
{
/**
* @ORM\ManyToMany(targetEntity="\Entity\ExtraField\Value", cascade={"persist", "remove"})
*/
protected $extraFields;
public function __construct()
{
parent::__construct();
$this->participations = new ArrayCollection();
}
public function addParticipation(Participation $participations)
{
$this->participations[] = $participations;
return $this;
}
}