【问题标题】:nestedSet - parent/child nodesnestedSet - 父/子节点
【发布时间】:2011-05-13 16:05:18
【问题描述】:

我目前正在根据 Doctrine 中的嵌套集的导航菜单输出层次结构。

我有很多父母,然后有几个孩子。

目前只有 2 个级别:Parent 和 Child(没有孙子)。

我有以下代码:

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

我希望这是有道理的?

谢谢

【问题讨论】:

    标签: symfony1 symfony-1.4 doctrine-1.2


    【解决方案1】:

    好吧,解决这个问题的一种方法是使用Doctrine_Core::HYDRATE_RECORD_HIERARCHY hydration,它允许您在节点上调用方法。

    现在您可以为节点创建自定义方法:

    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>
    

    【讨论】:

    • 效果很好!认为我现在正在理解 nestSet 的行为!
    • 这里需要注意的一点是性能。每次调用 getPath() 都会导致对 db 的单独查询。这是一个查询的替代解决方案:stackoverflow.com/questions/6009163/…(见我的回答)
    • 是的,上面的解决方案似乎创建了一些查询。一个会好很多!我会看看你的例子
    • 太棒了!这将我的查询从 12 个减少到 4 个,只有 1 个用于渲染树!非常感谢!
    • 好的,所以我在显示实际子节点时遇到了问题。我可以显示/parent/parent/child 会抛出错误:Action "parent/child" does not exist.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-16
    相关资源
    最近更新 更多