Bundle для категоризации любой вложенности для Symfony2?

Привет!


Коллеги, кто-нибудь встречал Bundle для категоризации любой вложенности для Symfony2 или просто хорошее готовое решение на PHP, с?


Т.е. допустим, я хочу иметь 4 корневых категории, у каждой из них могут быть суб-категории, у которых, в свою очередь, еще суб-категории.


Обувь

— Спортивная

— — Бренд1

— — Бренд2

— Повседневная

Одежда

— Куртки




роутинг /categories/shoes/brand1 и т.д.


Относительно небольшая задачка, но не хочется изобретать колесо. Может, кто-то встречал в сети что-то похожее.
  • Вопрос задан
  • 6528 просмотров
Решения вопроса 1
svscorp
@svscorp Автор вопроса
Кстати, собственно реализация решения… вдруг пригодиться:

1) Создаем Entity:

<?php
// src/Acme/DemoBundle/Entity/Category.php
namespace Acme\DemoBundle\Entity;

use Gedmo\Mapping\Annotation as Gedmo;
use Doctrine\ORM\Mapping as ORM;

/**
 * @Gedmo\Tree(type="nested")
 * @ORM\Table(name="categories")
 * use repository for handy tree functions
 * @ORM\Entity(repositoryClass="Gedmo\Tree\Entity\Repository\NestedTreeRepository")
 */
class Category
{
    /**
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue
     */
    private $id;

    /**
     * @Gedmo\Translatable
     * @ORM\Column(name="title", type="string", length=64)
     */
    private $title;

    /**
     * @Gedmo\TreeLeft
     * @ORM\Column(name="lft", type="integer")
     */
    private $lft;

    /**
     * @Gedmo\TreeLevel
     * @ORM\Column(name="lvl", type="integer")
     */
    private $lvl;

    /**
     * @Gedmo\TreeRight
     * @ORM\Column(name="rgt", type="integer")
     */
    private $rgt;

    /**
     * @Gedmo\TreeRoot
     * @ORM\Column(name="root", type="integer", nullable=true)
     */
    private $root;

    /**
     * @Gedmo\TreeParent
     * @ORM\ManyToOne(targetEntity="Category", inversedBy="children")
     * @ORM\JoinColumn(name="parent_id", referencedColumnName="id", onDelete="CASCADE")
     */
    private $parent;

    /**
     * @ORM\OneToMany(targetEntity="Category", mappedBy="parent")
     * @ORM\OrderBy({"lft" = "ASC"})
     */
    private $children;

    /**
     *

     * @Gedmo\Translatable

     * @Gedmo\Slug(fields={"title"})

     * @ORM\Column(name="slug", type="string", length=128)

     */

    private $slug;

    public function getId()
    {
        return $this->id;
    }

    public function getSlug()

    {

        return $this->slug;

    }

    public function setTitle($title)
    {
        $this->title = $title;
    }

    public function getTitle()
    {
        return $this->title;
    }

    public function setParent(Category $parent = null)
    {
        $this->parent = $parent;
    }

    public function getParent()
    {
        return $this->parent;
    }
}


2. В контроллере реализуем добавление категорий:

            use Acme\DemoBundle\Entity\Category as CategoryEntity;

            // ... your code before
            $em = $this->getDoctrine()->getManager();
            $cat1= new CategoryEntity();
            $cat1->setTitle('Фрукты');
            
            $subcat = new CategoryEntity();
            $subcat->setTitle('Экзотические');
            $subcat->setParent($cat1);
     
            $cat2 = new CategoryEntity();
            $cat2->setTitle('Овощи');

            $em->persist($cat1);
            $em->persist($cat2);
            $em->persist($subcat);
            $em->flush();
     


Вы получите меню вида:
— Фрукты
— — Экзотические
— Овощи

3) Получаем список категорий (в виде массива):

// ...
$categoryEntity = $this->em->getRepository('Acme\DemoBundle\Entity\Category');
$categories = $categoryEntity->childrenHierarchy();
// ...


Успехов!
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
hell0w0rd
@hell0w0rd
Просто разработчик
Я встречался с такой задачей буквально недавно. По бандлам не зняю — есть для доктрины расширение github.com/l3pp4rd/DoctrineExtensions/blob/master/doc/tree.md
Ответ написан
@skochwm
Попробовал реализовать по вашему примеру, все скопировал 1 в 1. Но получил ошибку:

An exception occurred while executing 'INSERT INTO prod_category (title, lft, lvl, rgt, root, slug, parent_id) VALUES (?, ?, ?, ?, ?, ?, ?)' with params ["\u0424\u0440\u0443\u043a\u0442\u044b", null, null, null, null, null, null]:

SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'lft' cannot be null
500 Internal Server Error - DBALException
1 linked Exception:
• PDOException »
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы