Symfony 2 Forms и Doctrine Mongo — Как отображать свойства @Embed и @Hash?

Я полностью застрял в комбинации Symfony Forms и Doctrine MongoDb и нуждаюсь в вашей помощи.

У меня есть класс User с @EmbedMany и @Hash:

/**
 * @MongoDB\Document
 */
class User
{
    /**
     * @MongoDB\EmbedMany(targetDocument="Project", strategy="set")
     */
    protected $projects;

    /**
     * @MongoDB\Hash
     */
    protected $schedule;
}

Класс проекта:

/**
 * @MongoDB\Document
 */
class Project
{
    /**
     * @MongoDB\Id
     */
    protected $id;

    /**
     * @MongoDB\String
     */
    protected $name;
}

После сохранения новой записи с помощью Doctrine Document Manager у меня получилась такая структура:

{
   "_id": "1",
   "projects": [
     {
       "_id": ObjectId("50d1c5116146a13948000000"),
       "name": "Project 1"
     },
     {
       "_id": ObjectId("50d069336146a10244000000"),
       "name": "Project 2"
     }
   ],
   "schedule": ["2012-12-01", "2012-12-04"]
}

Также есть 2 коллекции - Проекты и Графики, заполненные данными.

Когда я пытаюсь отредактировать пользователя, я хочу показать форму с двумя списками флажков, содержащими данные из этих коллекций и выбранные элементы, которые есть у пользователя. Так:

Пример

Вопрос в том, как построить такую ​​форму для свойств @Embed и @Hash?

Я пробовал разные способы:

class UserFormType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('schedule', 'collection', array(
            'type' => 'choice',
            'options'  => array(
                'expanded' => true,
                'multiple' => true,
            ),
        ));
        $builder->add('projects', 'document', array(
            'class' => 'Acme\MyBundle\Document\Project',
            'property' => 'name',
        ));
    }

    public function getDefaultOptions(array $options)
    {
        return array('data_class' => 'Acme\MyBundle\Document\User');
    }
}

or

 $builder->add('schedule', 'choice', array(
        'expanded' => true,
        'multiple' => true,
 ));
 $builder->add('projects', 'collection', array(
        'type' => 'choice',
        'options'  => array(
            'expanded' => true,
            'multiple' => true,
        ),
 ));

Некоторые из них завершились ошибкой: Expected argument of type "array", "string" given. Некоторые из них произвели успешную визуализацию формы, но не выбрали элементы в списке.

Может быть, мне следует использовать собственные преобразователи данных или вручную отображать эти элементы управления...


person marden    schedule 19.12.2012    source источник


Ответы (2)


Чтобы использовать встроенные документы, внедренный документ должен быть аннотирован как EmbeddedDocument, а не как Document. Однако похоже, что вы на самом деле хотите использовать ReferenceMany в аннотациях проектов в пользовательском документе; нет смысла выбирать из списка встроенных документов, если только вы не выбираете, какой из них удалить.

person dylan oliver    schedule 04.02.2013
comment
Это частично верно. Документы могут вести себя как EmbeddedDocuments, но не наоборот. Конкретный вариант использования, в котором мне потребовалось, заключался в сохранении моментального снимка определенного объекта из сгенерированной коллекции, срок действия которого истекает через некоторое время. - person SteveB; 12.01.2016

Я решил проблему @Hash. Учитывая числовой индексированный массив, вместо него следует использовать аннотацию @Collection.

$builder->add('schedule', 'choice', array(
        'choices' => <your choices list here>,
        'expanded' => true,
        'multiple' => true,
));

Проблема @EmbedMany все еще актуальна.

person marden    schedule 22.12.2012