Concrete5 Autonav 块获取后代数

Concrete5 Autonav Block Get Number of Descendants

我正在为 Concrete5 自动导航块制作自定义模板,想知道是否有办法获取每个特定导航项的后代(子代、孙代等)的总数?例如,获取顶级导航的后代以显示每个页面下的后代页面总数:

Tutorials (33)
Freebies (25)
Lesson Plans (10)

A​​utonav 块提供了一个平面对象数组(代表每个页面),每个对象都有一个父对象 ID,但我无法绕过循环并为多级导航构建数组。

Concrete5 是否为此提供了一种方法,或者我是否需要弄清楚如何构建一个提取此信息的循环?

我基本上是在寻找这个thread的功能(不幸的是他们没有回答这个问题)

重要!

别忘了从

复制内容

/concrete/blocks/autonav/

进入

/application/blocks/autonav/(如有必要,创建文件夹 blocksautonav

并在那里进行这些更改。否则他们将在下次系统更新时消失!


作为 $navItem 具有以下 属性:

$navItem->cID : collection id of the page this nav item represents

向控制器添加一个方法(虽然这是一个快速的过程):

public function getChildPagesFromID($cID)
{
    $db = Database::connection();
    $r = $db->query(
            "select cID from Pages where cParentID = ? order by cDisplayOrder asc",
            array($cID));
    $pages = array();
    while ($row = $r->fetchRow()) {
        $pages[] = Page::getByID($row['cID'], 'ACTIVE');
    }

    return sizeof($pages);
}

然后你可以在 view.php:

// Existing code:
if (count($navItems) > 0) {
    echo '<ul class="nav">'; //opens the top-level menu

    foreach ($navItems as $ni) {
        echo '<li class="' . $ni->classes . '">';

将此添加到 <li> 标签内的某处:

echo $controller->getChildPagesFromID($ni->cID);

论坛中建议的 $ni->cObj->getNumChildren(); 也会获取系统页面。我不认为这是你想要的。


至于您的评论 "seems to bring in System pages too" 这取决于您是否决定在自动导航块中显示它们: