Symfony 2 Forms + Doctrine MongoDb

Пишу проект на 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. Это при том, что в монгу данные записываются как положено.

Народ, прошу помощи!
  • Вопрос задан
  • 5584 просмотра
Решения вопроса 1
JekaRu
@JekaRu
@EmbedMany вам тут точно нужен?
Мне кажется более подходит @ReferenceMany, работать должно с ним правильно ваше последнее определение
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
JekaRu
@JekaRu
1. Наверное должно быть так: choices' => array('Финансы'=>'Финансы', ....)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы