Пишу проект на Symfony 2.1 в связке Doctrine MongoDb. Возникла проблема с формами.
Есть класс Consultant:
/**
* @MongoDB\Document
*/
class Consultant
{
/**
* @MongoDB\Id(strategy="NONE")
*/
protected $id;
/**
* @MongoDB\EmbedMany(targetDocument="Specialization", strategy="set")
*/
protected $specs;
/**
* @MongoDB\Hash
*/
protected $schedule;
// далее идут getters/setters
}
Класс Specialization:
/**
* @MongoDB\Document
*/
class Specialization
{
/**
* @MongoDB\Id
*/
protected $id;
/**
* @MongoDB\String
*/
protected $name;
public function __toString()
{
return $this->name;
}
// далее идут getters/setters
}
Сохранив объект через доктриновский DocumentManager, получил в монге вот такую структуру консультанта:
{
"_id": "1",
"specs": [
{
"_id": ObjectId("50d1c5116146a13948000000"),
"name": "Юрист"
},
{
"_id": ObjectId("50d069336146a10244000000"),
"name": "Экономист"
}
],
"themes": ["Финансы", "Здоровье", "Семья", "Бизнес", "Недвижимость"]
}
Также в монге есть 2 коллекции всех специализаций (specs) и тематик (themes), которые отдельным образом создаются и редактируются.
Задача — показать форму, в которой будут 2 списка с чекбоксами, наполненных данными из соответствующих коллекций и отмеченных флажками те пункты, которые имеет выбранный консультант. При сохранении формы в свойство themes должны попасть отмеченные названия тематик, а в specs — отмеченные специализации с учетом ее структуры, указанной выше.
Пример формы:
Проблема №1: поле themes (
@
Hash
аннотация в доктрине).
Испробованные варианты форм:
class ConsultantFormType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('themes', 'collection', array(
'type' => 'choice',
'options' => array(
'expanded' => true,
'multiple' => true,
),
));
}
}
Выдает исключение
Expected argument of type "array", "string" given
в файле ChoicesToBooleanArrayTransformer.php.
$builder->add('themes', 'choice', array(
'choices' => array('Финансы', 'Здоровье', 'Семья', 'Бизнес'), // чисто для эксперимента
'expanded' => true,
'multiple' => true,
));
Форма отобразилась, но нет выбранных пунктов в списке, и в качестве value в инпутах оказались индексы (ключи), а не значения.
Проблема №2: поле specs (
@EmbedMany
).
Читал
документацию.
Первое — назначение data_class в опциях формы:
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'Acme\ConsultantBundle\Document\Consultant',
));
}
Второе — создаю поле с типом document (аналог entity, но для монги).
$builder->add('specs', 'document', array(
'class' => 'AcmeConsultantBundle:Specialization',
'property' => 'name',
'expanded' => true,
'multiple' => true,
));
В форме выводится список чекбоксов, но опять же ни одного отмеченного. В роли value для инпутов в этот раз выступает id объектов из коллекция specs. Это при том, что в монгу данные записываются как положено.
Народ, прошу помощи!