nestedSet - 父/子节点

时间:2011-05-13 16:05:18

标签: symfony1 symfony-1.4 doctrine-1.2

我目前正致力于从Doctrine中的嵌套集输出导航菜单中的层次结构。

我有一些父母,然后有几个孩子。

目前,只有两个级别:父母和孩子(没有孙子)。

我有以下代码:

//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

哪个好。

问题是,我希望我的网址与父/子关系相匹配。

因此,子节点2的URL将为/parent-node-1/child-node-2(这些为slug字段)。

因此父母的任何孩子都需要拥有父节点的路径slug。

我希望有意义吗?

由于

1 个答案:

答案 0 :(得分:1)

好吧,一种方法是使用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>