[ alfa-pro @ 05.04.2014. 11:47 ] @
Drustvo, trenutno sam se nasao u corsokaku, nemogu napred mogu samo nazad :/

U pitanju je E-Commerce projekat, prikocilo je kod izlistavanja kategorija. Da pojasnim to malo bolje, prvo da vidite strukturu tabele pa ce vam biti jasnije

tbl_ecommerce_categories

+----+----------+------------------+--------+
| ID | Parent | Name | Status |
+----+----- ----+------------------+--------+
| 1 | | Clothing | 1 |
| 2 | 1 | Women | 1 |
| 3 | 1 | Man | 1 |
| 4 | 1 | Boys | 1 |
| 5 | 1 | Girls | 1 |
| 6 | 2 | Sub of Women | 1 |
| 7 | 2 | Wub of Women | 1 |
+----+----------+------------------+--------+


Kao sto vidite u tabeli glavna root kategorija je Clothing i sadrzi parent vrednost NULL.
Sve ostale podkategorije imaju Parent vrednost neke root kategorije u ovom slucaju:
Women, Man, Boys, Girls pripadaju kategoriji Clothing.

E sada moja zamisao da preskocim self join i da to izlistam u svojoj navigaciji jeste bila da prvo preuzmem sve root kategorije i pomocu Doctrine Array Colection preuzmem pod kategorije.

Evo Entity klase: http://ideone.com/EwOT4P
Evo repository metode:

Code:

    /**
     * Get all root categories
     *
     *
     */
    public function getAllRootCategories()
    {
        return $this->getEntityManager()
            ->createQuery(
                'SELECT c FROM ISLabECommerceBundle:Category c WHERE c.parent IS NULL ORDER BY c.name ASC'
            )
            ->getResult();
    }


Controller metoda:

Code:
   public function categoryListAction()
    {
        $em = $this->container->get('doctrine');
        $categories = $em->getRepository('ISLabECommerceBundle:Category')->getAllRootCategories();

        return $this->container->get('templating')->renderResponse(
          'ISLabECommerceBundle:Category:list.html.twig', array(
                'categories' => $categories
            )
        );
    }


I naravno view twig:

Code:

<ul id="cat_accordion">
     {% for category in categories %}
             <li> <a href="">{{ category.name }}</a>
                      <ul style="display: none;">
                            {% for sub_category in category.children %}
                                <li><a href="">{{ sub_category.name }}</a> </li>
                            {% endfor %}
                        </ul>
             </li>
      {% endfor %}
</ul>


Sa svim ovim ja sam postigao da izlistam sve glavne kategorije koje imaju vrednost NULL i sve kategorije koje njoj pripadaju.



Problem nastaje sta ako ocu da podkategorija Women ima svoje pod kategorije? Ona nema parent vrendost NULL vec id od njene glavne kategorije.
Moram nesto povodom toga uraditi u repository metodi, problem je sto sam ja zadao da on izlistava glavne sa NULL vrednost.

Realno gledano ja sa ovim mogu uzeti dva levela da preuzmem kategorije.

Clothing -- lvl 1
---- Women -- lvl 2
---- Man -- lvl 2
-------- test -- lvl 3
------------- sub test lvl 4


Iskreno nista mi nepada na pamet kako da odradim ovo a da mi izlistava sve glavne i pod kategorije i da te podkategorije imaju svoje pod kategorije.

Ima neko neki predlog?

NOTE: samo molim vas da mi nenudite nested data set (lft, rgt) itd...
[ alfa-pro @ 06.04.2014. 00:06 ] @
Nasao sam resenje:

https://gist.github.com/tentacode/3892186
[ Nikola Poša @ 06.04.2014. 10:17 ] @
Ja bih samo dam komentar za tu tvoju napomenu iz prvog post-a u vezi NestedSet modela. Postoji jako dobra Doctrine 2 ekstenzija za te svrhe: https://github.com/Atlantic18/...nsions/blob/master/doc/tree.md. Takođe, pored te, taj isti DoctrineExtensions projekat nudi i mnoge druge korisne ekstenzije: https://github.com/Atlantic18/DoctrineExtensions.
[ alfa-pro @ 08.04.2014. 13:45 ] @
Da znam to sam koristio pre jedno par meseci, malo je komplikovanije jer moras da instaliras doctrine extension + stfo budnle .... Dok D1 je imao svoj nested set. Mislim da mi ovo brze i jednostavnije bez dodatnih extenzija.
Ok je mada ja sam se odlucio za sonata admin bundle! Prakticnije