2014-01-04 2 views
0

Я хочу список выбора (выпадающий список), сгруппированный по родительским категориям (не выбираемый). Возможно ли это?Symfony formbuilder self-reference entity grouped

Example: 
- Vehiculs (not selectable) 
-- Car (selectable) 
-- Boat (selectable) 
- Computers (not selectable) 

Entity Категория

/** 
    * @ORM\OneToMany(targetEntity="Category", mappedBy="parent") 
    **/ 
    private $children; 

    /** 
    * @ORM\ManyToOne(targetEntity="Category", inversedBy="children") 
    * @ORM\JoinColumn(name="parent_id", referencedColumnName="id", nullable=true, onDelete="SET NULL") 
    **/ 
    private $parent; 

Форма:

public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->add('title', 'text', 
       [ 
        'attr' => ['placeholder' => 'Titel', 'class' => 'form-control', 'autocomplete' => 'off'], 
        'label' => false 
       ] 
      ) 
      ... 
      ->add('category', 'entity', 
       [ 
        'property' => 'name', 
        'class' => '***ArticleBundle:Category', 
       ] 
      ) 
     ; 
    } 

С кодом выше я только получить родителей и они выбираются. Я хотел бы сгруппировать детей этих родителей (1 глубина) и сделать только дети по выбору.

ответ

0

Вы не можете напрямую сообщить symfony, что бы создать дерево в форме.

Во-первых, вы должны здесь проверить; http://symfony.com/doc/current/reference/forms/types/entity.html

Вы можете использовать построитель запросов в своем поле объекта, чтобы получить отношение родитель-ребенок, но родители также будут доступны.

Таким образом, вы должны искать другие решения, как это: How to disable specific item in form choice type?

1

Просто отправляю это, потому что это, кажется, первый Google хит этой проблемы, и я должен был решить.

Фактически вы можете напрямую сообщить symfony о создании дерева в FormBuilder с небольшим обходным путем, которое полностью чист.

Тот факт, что «Сущность» является ребенком «Выбор», помогает там много. Решение состоит из трех частей: контроллер, FormType и Entity Repository Давайте начнем с контроллером

$em = $this->getDoctrine()->getManager();  
$form = $this->createForm(new AcmeType(array(
      'repository' => $em->getRepository('AcmeBundle:Category'), 
     )), $data, array(
      'action' => *add your route here* 
      'method' => 'POST' 
     )); 

прямой генерации формы, за исключением ADITION хранилища в качестве параметра для вашего FormType (что нам нужно там)

Ваш FormType включает в себя следующие

/** @var CategoryRepository */ 
    protected $repository; 

    public function __construct($options = array()){ 
     $this->repository = $options['repository']; 
    } 

    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      *add your other stuff here* 
      ->add('category', 'entity', array(
       'empty_value' => 'Please Select...', 
       'required' => true, 
       'choices' => $this->repository->getCategoryData(), 
       'class' => 'Acme\AcmeBundle\Entity\Category' 
      )) 
     ; 
    } 

Мы создаем объектный тип поля и добавить «выбор» и заполнить его с ответом от «getCategoryData».

В вашем хранилище вашего Entity Data (в этом случае категории Entity) создать следующую функцию

public function getCategoryOptions() 
{ 
    $data = array(); 
    $categories = $this 
     ->createQueryBuilder('c') 
     ->select('c') 
     ->getQuery() 
     ->getResult(); 

    foreach($categories as $category){ 
     /** @var Category $category */ 
     if(!$category->getParent()){ 
      continue; 
     } 
     if(!array_key_exists($category->getParent()->getName(), $data)){ 
      $data[$category->getParent()->getName()] = array(); 
     } 
     $data[$category->getParent()->getName()][$category->getId()] = $category; 
    } 
    return $data; 
} 

Эта простая функция делает простой запрос к базе данных, чтобы выбрать категории, а затем запускает Еогеасп через их и строит массив. Как видно из вышеприведенного FormType, он анализирует этот массив непосредственно на параметр «choice» вашего типа поля Entity. Form Renderer of symfony достаточно умен, чтобы добавлять метки с ярлыками.

Et voila, у вас есть сгруппированный выпадающий список с неизменными «родителями».

Смежные вопросы