Symfony2 - DocumentChoiceList и MongoDB - PullRequest
       4

Symfony2 - DocumentChoiceList и MongoDB

2 голосов
/ 18 декабря 2011

У меня проблема, когда я пытаюсь создать форму с коллекциями.Я объясняю вам, каков мой текущий сценарий.

Я создал два основных объекта: Продукт и Категория .И я также создал для них два типа: ProductType, CategoryType .

У меня есть 3 категории и 1 продукт, и я связал первую пару категорий с продуктом.Итак, с продуктом связаны две категории.

Я хочу создать форму продукта.В этой форме я хочу показать только категории продукта в элементе управления html, чтобы пользователь мог в будущем выполнять операции с этими данными.

Я суммирую вам ключевые моменты.

  1. Мой Продукт класс имеет

    class Product 
    {
        ...
    
        @EmbedMany(targetDocument="Acme\StoreBundle\Document\Category")
        protected $categories;
    
        ...
    
    }
    
  2. В моем ProductType у меня есть:

    public function buildForm(FormBuilder $builder, array $options)
    {
        $builder->add('id')
            ->add('name')
            ->add('price')
            ->add('categories', 'document', array(
                'class' => 'Acme\StoreBundle\Document\Category',
                'choices' => $builder->getData()->getCategories()->toArray(),  
                'multiple' => 'true',
                'property' => 'name'                    
            ))
    ; 
    

    }

Я пробовал все и самое точное половинное решение должен был создать category свойство ProductType как документ и выбрать опции через данные привязки, поступающие из контроллера.

Дело в том, что при таком решении идентификаторы элементов управления параметрами - это spl_object_hash , установленный в UnitOfWork класс , а не идентификаторы оригинала Объект категории .

Мои предыдущие попытки:

  1. У меня нет проблем при использовании документов без предыдущего выбора,но я хочу только те категории, которыми владеет Product.

  2. У меня нет проблем, когда я использую collection для отображения списка категорий (связывая CategoryType ), но я нене знаю, как показать это как элемент управления select.

  3. Я не могу использовать query_builder over Класс категории , потому что я могу 'Запросить только объекты имеют идентификатор продукта X, потому что Объект категории не имеет Ссылка продукта (и это правильно).

У кого-нибудь есть решение этой проблемы или другая идея, чтобы решить эту проблему?

Большое спасибо, Рики.

Ответы [ 2 ]

1 голос
/ 26 января 2012

вы говорите

Я хочу создать форму продукта.В этой форме я хочу показать только категории, которые есть у продукта, в элементе управления html, чтобы пользователь мог в будущем выполнять операции с этими данными.

, но затем вы продолжаете и захватываете все категории,

Почему бы не упростить вещи и не взять ссылочные категории из объекта продукта?

$cats = $product->getCategories();     
if(!is_null($cats) && $cats->count() > 0) {
  $choices = $cats;
} else {
// grab all so you can have the use set them
  $choices = $builder->getData()->getCategories()->toArray()
}
0 голосов
/ 08 февраля 2012

Это не проблема. Проблема в том, что вы работаете со встроенными документами в MongoDB.

Когда вы работаете с документами такого рода, Doctrine предполагает (с правильной логикой), что у вас не будет «ручной» ссылки на этот встроенный документ в другой коллекции.

Да, это выглядит логично, но ... почему у вас не может быть упрощенного документа для встраивания, который ссылается на другую расширенную версию в другой коллекции? На мой взгляд, это ошибка.

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

Еще раз спасибо, Рикки.

...