Doctrine: behaviour NestedSet – jak to siÄ? je krok po kroku

Przy zarzÄ?dzaniu listÄ? kategori lub stron/podstron przydaje siÄ? bardzo relacja zagnie??d??ona. Doctrine 1.2 pozwala na wykorzystanie zagnie??d??onego zbioru(NestedSet), dostÄ?pnego jako behaviour.

Umo??liwia nam wybranie dowolnego drzewa (wielo bÄ?d?? jedno korzeniowego), bÄ?d?? jego poddrzewa od konkretnego wierzcho??a.

Krok #1: Schemat Danych

schema.yml

Categories:
  actAs:
    NestedSet:
      hasManyRoots: true
      rootColumnName: root_id
  columns:
    cat_name:
      type: string(255)

Krok #2:Pobieranie danych drzewa w komponencie:

components.class.php

$this->categories = Doctrine::getTable('Categories')->getTree();
$q = Doctrine_core::getTable('Categories')->createQuery('q');
$q->leftJoin('q.Translation qt')->addOrderBy('sort ASC')->addOrderBy('qt.cat_name ASC');
$this->categories->setBaseQuery($q);

Krok #3: Wy??wietlanie Struktury drzewa:

<div>
  <h3>Kategorie:</h3>
  <ul>
  <?php foreach ($categories->fetchRoots() as $root): ?>
    <li>
    <?php $options = array(
      'root_id' => $root->getCategoryId()
    ); ?>
    <?php echo link_to($root->getCatName(), '@category?slug='.$root->getSlug()) ?>
    <?php if($categories->fetchTree($options)): ?>
      <ul>
      <?php foreach($categories->fetchTree($options) as $node): ?>
        <li><?php echo link_to($node->getCatName(), '@category?slug='.$node->getSlug()) ?></li>
      <?php endforeach; ?>
    </ul>
  <?php endif; ?>
  </li>
<?php endforeach; ?>
</ul>
</div>

Dalsza lektura

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

Możesz użyć następujących tagów oraz atrybutów HTML-a: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>