nestedSet - родительский / дочерний узлы - PullRequest
0 голосов
/ 13 мая 2011

В настоящее время я работаю над выводом иерархии в терминах навигационного меню из вложенного набора в Doctrine.

У меня есть несколько родителей, у которых тогда есть несколько детей.

В данный моментсо временем есть только 2 уровня: родитель и ребенок (без внуков).

У меня есть следующий код:

//actions:
public function executeShow(sfWebRequest $request)
{
  $this->tree = Doctrine::getTable('Model')->getMenuTree();
}

//lib:
class ModelTable extends Doctrine_Table
{
  /**
   * Gets tree element in one query
   */
  public function getMenuTree()
  {

    $q = $this->createQuery('g')
      ->orderBy('g.root_id')
      ->addOrderBy('g.lft')
      ->where('g.root_id NOT NULL');

    return $q->execute(array(),  Doctrine_Core::HYDRATE_ARRAY_HIERARCHY);
  }
}


//template:
<?php function echoNode($tree, $parent=null) { ?>
  <ul>
  <?php foreach ($tree as $node): ?>
    <li data-id='<?php echo $node['id'] ?>'>
      <?php echo $node['name'] ?>
      <?php if (count($node['__children']) > 0): ?>
        <?php echo echoNode($node['__children'], $node) ?>
      <?php endif; ?>
    </li>
  <?php endforeach; ?>       
  </ul>
<?php } ?>
<?php echo echoNode($tree) ?>

Это выдает:

Parent Node 1
   Child Node 1
   Child Node 2
Parent Node 2
   Child Node 3

Это здорово.

Проблема в том, что я хочу, чтобы мои URL соответствовали отношениям родитель / потомок.

Таким образом, URL для дочернего узла 2 будет /parent-node-1/child-node-2 (это как slug поля).

Таким образом, любой дочерний элемент родителя также должен иметь слаг-маршрут родительского узла.

Надеюсь, это имеет смысл?

Спасибо

1 Ответ

1 голос
/ 14 мая 2011

Что ж, одним из способов решения этой проблемы является использование Doctrine_Core::HYDRATE_RECORD_HIERARCHY увлажнения, которое позволяет вам вызывать методы на ваших узлах.

Теперь вы можете создать собственный метод для узла:

class Model extends BaseModel
{
  public function __toString()
  {
    return $this->getSlug();
  }
  public function getUrl()
  {
    //getPath uses __toString method to render a node
    $url = $this->getNode()->getPath('/', true);
    return $url;
  }
}

И назовите это в шаблоне так:

<a href="<?php echo $node->getUrl() ?>"><?php echo $node['name'] ?></a>
...