Symfony2, дерево расширений Doctrine: создание раскрывающегося списка в виде дерева Выберите список - PullRequest
6 голосов
/ 16 февраля 2012

У меня есть таблица категорий, построенная на основе древовидной архитектуры с использованием Doctrine Tree Extension. и это выглядит примерно так

id  parent_id   title   lft lvl rgt root
864 (NULL)  Movies  1   0   18  864
865 864 Packs   2   1   3   864
866 864 Dubbed  4   1   5   864

и визуально вот так:

Movies
|
|
|->Packs
|->Dubbed

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

public function buildForm(FormBuilder $builder, array $options)
{

    $builder->add('name');
    $builder->add('file');
    $builder->add('cover');
    $builder->add('category','entity',           array('class'=>'Tracker\MembersBundle\Entity\Category', 'property'=>'title', ));           
}

, который генерирует нормальное выпадающее меню, подобное этому:

enter image description here

как я могу настроить параметры моего меню, чтобы оно генерировало Tree-Like-dropdown, выберите как это?

enter image description here

1 Ответ

14 голосов
/ 14 марта 2012

Я не уверен, что это хорошая идея: пользователи не смогут ввести свой выбор.

Не тестировали это решение, но оно должно работать:

Сначала вы можете отсортировать три по корню и значению lft, чтобы отобразить их правильно, поэтому добавьте построитель запросов:

'query_builder' => function($er) {
    return $er->createQueryBuilder('c')
        ->orderBy('c.root', 'ASC')
        ->addOrderBy('c.lft', 'ASC');
},

Затем вам нужно добавить метод getIndentedTitle к вашей сущности:

public function getIndentedTitle() {
    return str_repeat("--", $this->lvl).$this->title;
}

Наконец, добавьте параметр свойства в ваши параметры при создании формы, чтобы отобразить виртуальное свойство indentedTitle вместо заголовка:

'property' => 'indentedTitle'

См .: http://symfony.com/doc/current/reference/forms/types/entity.html

...