2014-08-28 3 views
0

Мне нужно создать древовидную структуру для списка параметров моей категории в форме. Моя форма тип кода для списка опций:Структура раскрывающегося списка

->add('discipline', 'entity', array('label' => 'Parent Discipline', 
    'empty_value' => 'Parent Discipline...', 
    'required'  => true, 
    'empty_data' => null, 
    'class'   => 'RFQ\IronilBundle\Entity\ProductionType', 
    'query_builder' => function(ProductionTypeRFQRepository $er) {return $er->createQueryBuilder('w')->where('w.parent IS NULL')->addOrderBy('w.name', 'ASC');}, 
    'attr'   => array('class'=>'form-control login-input'))) 

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

<?php 

namespace RFQ\IronilBundle\Entity; 

use Doctrine\ORM\EntityRepository; 

class ProductionTypeRFQRepository extends EntityRepository 
{ 
    public function findAllParents() 
    { 
     return $this->getEntityManager() 
      ->createQuery('SELECT p FROM RFQIronilBundle:ProductionType p WHERE p.parent IS NULL ORDER BY p.name ASC') 
      ->getResult(); 
    } 

    public function findAll() 
    { 
     return $this->findBy(array(), array('name' => 'ASC')); 
    } 
} 

Этот репозиторий получает только родителей, но не детей из базы данных.

Сообщите нам, когда это требуется.

EDIT:

Для запроса, это моя сущность по категориям:

<?php 

namespace RFQ\IronilBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 

/** 
* ProductionType 
* 
* @ORM\Table(name="production_type") 
* @ORM\Entity(repositoryClass="RFQ\IronilBundle\Entity\ProductionTypeRepository") 
* @ORM\Entity(repositoryClass="RFQ\IronilBundle\Entity\ProductionTypeRFQRepository") 
*/ 
class ProductionType 
{ 
    /** 
    * @var integer 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * @ORM\Column(type="string") 
    * @ORM\OneToMany(targetEntity="RFQ", mappedBy="discipline") 
    */ 
    protected $name; 

    /** 
    * @ORM\OneToMany(targetEntity="ProductionType", mappedBy="parent") 
    * @ORM\OrderBy({"name" = "ASC"}) 
    **/ 
    protected $children; 

    /** 
    * @ORM\ManyToOne(targetEntity="ProductionType", inversedBy="children") 
    **/ 
    protected $parent; 

    /** 
    * Get id 
    * 
    * @return integer 
    */ 
    public function getId() 
    { 
     return $this->id; 
    } 
    /** 
    * Constructor 
    */ 
    public function __construct() 
    { 
     $this->children = new \Doctrine\Common\Collections\ArrayCollection(); 
    } 

    /** 
    * Set name 
    * 
    * @param string $name 
    * @return ProductionType 
    */ 
    public function setName($name) 
    { 
     $this->name = $name; 

     return $this; 
    } 

    /** 
    * Get name 
    * 
    * @return string 
    */ 
    public function getName() 
    { 
     return $this->name; 
    } 

    /** 
    * Add children 
    * 
    * @param \RFQ\IronilBundle\Entity\ProductionType $children 
    * @return ProductionType 
    */ 
    public function addChild(\RFQ\IronilBundle\Entity\ProductionType $children) 
    { 
     $this->children[] = $children; 

     return $this; 
    } 

    /** 
    * Remove children 
    * 
    * @param \RFQ\IronilBundle\Entity\ProductionType $children 
    */ 
    public function removeChild(\RFQ\IronilBundle\Entity\ProductionType $children) 
    { 
     $this->children->removeElement($children); 
    } 

    /** 
    * Get children 
    * 
    * @return \Doctrine\Common\Collections\Collection 
    */ 
    public function getChildren() 
    { 
     return $this->children; 
    } 

    /** 
    * Set parent 
    * 
    * @param \RFQ\IronilBundle\Entity\ProductionType $parent 
    * @return ProductionType 
    */ 
    public function setParent(\RFQ\IronilBundle\Entity\ProductionType $parent = null) 
    { 
     $this->parent = $parent; 

     return $this; 
    } 

    /** 
    * Get parent 
    * 
    * @return \RFQ\IronilBundle\Entity\ProductionType 
    */ 
    public function getParent() 
    { 
     return $this->parent; 
    } 

    public function __toString() 
    { 
     return $this->name; 
    } 
} 

И Entity для моих предложений, в которых мне нужна эта структура дерева категорий (я удалил все элементы, которые doens't потребность проблемы):

<?php 

namespace RFQ\IronilBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 

/** 
* RFQ 
* 
* @ORM\Table(name="rfq") 
* @ORM\Entity 
*/ 
class RFQ 
{ 
    //RFQ overall 
    /** 
    * @var integer 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * @ORM\ManyToOne(targetEntity="ProductionType",inversedBy="name") 
    * @ORM\JoinColumn(referencedColumnName="id") 
    **/ 
    protected $discipline; 

    /** 
    * Get id 
    * 
    * @return integer 
    */ 
    public function getId() 
    { 
     return $this->id; 
    } 

    /** 
    * Set discipline 
    * 
    * @param \RFQ\IronilBundle\Entity\ProductionType $discipline 
    * @return RFQ 
    */ 
    public function setDiscipline(\RFQ\IronilBundle\Entity\ProductionType $discipline = null) 
    { 
     $this->discipline = $discipline; 

     return $this; 
    } 

    /** 
    * Get discipline 
    * 
    * @return \RFQ\IronilBundle\Entity\ProductionType 
    */ 
    public function getDiscipline() 
    { 
     return $this->discipline; 
    } 
} 
+0

Можете ли вы вставить объект? –

ответ

0

с некоторыми литров кофе и энергетических напитков мне удалось, как решить мою р РОБЛЕМА. Я напишу что-то вроде учебника здесь, чтобы помочь всем, кто получил эту проблему, потому что было очень сложно найти хороший учебник, как это сделать.

  1. Добавьте эти пучки к вашим composen.json и запустить composer update.

    "yavin/symfony-form-tree": "dev-master", 
    "gedmo/doctrine-extensions": "dev-master", 
    "stof/doctrine-extensions-bundle": "1.1.*@dev" 
    

    ссылки на пакеты: symfony-form-tree; DoctrineExtensions; StofDoctrineExtensionsBundle

  2. После добавления пучков необходимо зарегистрировать StofDoctrineExtensionBundle в AppKernel.php

    new Stof\DoctrineExtensionsBundle\StofDoctrineExtensionsBundle()

  3. Теперь вам нужно добавить правильные аннотации Gedmo к категории лица (моя категория называет ProductionType.php)

    <?php 
    
    namespace RFQ\IronilBundle\Entity; 
    
    use Doctrine\ORM\Mapping as ORM; 
    use Gedmo\Mapping\Annotation as Gedmo; 
    
    /** 
    * @ORM\Entity 
    * @ORM\Table(name="production_type") 
    * @Gedmo\Tree(type="nested") 
    * @ORM\Entity(repositoryClass="Gedmo\Tree\Entity\Repository\NestedTreeRepository") 
    */ 
    class ProductionType 
    { 
        /** 
        * @var integer 
        * 
        * @ORM\Column(name="id", type="integer") 
        * @ORM\Id 
        * @ORM\GeneratedValue(strategy="AUTO") 
        */ 
        private $id; 
    
        /** 
        * @ORM\Column(type="string") 
        * @ORM\OneToMany(targetEntity="RFQ", mappedBy="discipline") 
        */ 
        protected $name; 
    
        /** 
        * @ORM\OneToMany(targetEntity="ProductionType", mappedBy="parent") 
        * @ORM\OrderBy({"name" = "ASC"}) 
        **/ 
        protected $children; 
    
        /** 
        * @ORM\ManyToOne(targetEntity="ProductionType", inversedBy="children") 
        * @Gedmo\TreeParent 
        **/ 
        protected $parent; 
    
        /** 
        * @var integer 
        * 
        * @Gedmo\TreeLeft 
        * @ORM\Column(type="integer") 
        */ 
        private $treeLeft; 
    
        /** 
        * @var integer 
        * 
        * @Gedmo\TreeLevel 
        * @ORM\Column(type="integer") 
        */ 
        private $treeLevel; 
        /** 
        * @var integer 
        * 
        * @Gedmo\TreeRight 
        * @ORM\Column(type="integer") 
        */ 
        private $treeRight; 
        /** 
        * @var integer 
        * 
        * @Gedmo\TreeRoot 
        * @ORM\Column(type="integer", nullable=true) 
        */ 
        private $treeRoot; 
    
        // Generated setters and getters 
    
  4. Добавьте расширения к вашему картографированию и активируйте необходимое расширение (в моем случае Дерево)

    stof_doctrine_extensions: 
        orm: 
         default: 
          tree: true 
    
  5. Теперь вам нужно работать с symfony-form-tree. первый добавить услуги Resources/config/services.xml

    <service id="symfony.form.type.tree" class="Yavin\Symfony\Form\Type\TreeType"> 
        <argument type="service" id="property_accessor"/> 
        <tag name="form.type" alias="y_tree"/> 
    </service> 
    
    <service id="symfony.form.type_guesser.tree" class="Yavin\Symfony\Form\Type\TreeTypeGuesser"> 
        <argument type="service" id="doctrine"/> 
        <tag name="form.type_guesser"/> 
    </service> 
    
  6. наконец вам нужно создать форму строитель для symfony-form-tree, чтобы создать иерархический список опций выпадающие:

    ->add('discipline', 'y_tree', array(
        'class' => 'RFQ\IronilBundle\Entity\ProductionType', // tree class 
        'levelPrefix' => '--', 
        'orderFields' => array('treeRoot', 'treeLeft'), 
        'prefixAttributeName' => 'data-level-prefix', 
        'treeLevelField' => 'treeLevel', 
    )) 
    

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

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