Как продублировать ссылку на страницу родителя в подменю pdoMenu?

Чтобы продублировать ссылку на страницу родителя в подменю в MODX, вам потребуется внести некоторые изменения в код pdoMenu.

Первым шагом я предлагаю открывать файл pdoMenu.class.php, который находится в корне вашего MODX проекта. Убедитесь, что у вас установлен соответствующий пакет pdoTools или DocLister.

Далее найдите функцию buildLevel внутри файла pdoMenu.class.php. По умолчанию, она выглядит примерно так:

    private function buildLevel($parent, $level = 0, $row) {
        $this->currentLevel = $level;
        $this->output .= '<ul class="' . $this->levelClass . '">' . $this->eol;
        foreach ($this->matrix as $key => $matrixRow) {
            if ($parent == $matrixRow[$this->parentField]) {
                $parent = $matrixRow[$this->idField];
                $this->output .= $this->getMarkup($matrixRow);
                $this->buildLevel($parent, $level + 1, $row);
                $parent = $matrixRow[$this->parentField];
            }
        }
        $this->output .= '</ul>' . $this->eol;
    }

В этой функции нам понадобится добавить несколько строк кода. Внутри цикла foreach перед строчкой $this->output .= $this->getMarkup($matrixRow); вставьте следующий код:

if ($row[$this->parentField] == $matrixRow[$this->parentField] && $key !== 0 && !empty($this->originalRow)) {
    $this->output .= $this->getMarkup($this->originalRow);
    $this->originalRow = [];
}

Этот код проверяет, если родители текущего элемента и элемента, который будет отображаться следующим, совпадают, и если текущий элемент не первый, тогда добавляется ссылка на страницу родителя.

Теперь можно использовать pdoMenu с дублированием ссылки на страницу родителя. Вот пример использования pdoMenu:

$menu = $modx->runSnippet('pdoMenu', [
    'parents' => '0',
    'level' => '3',
    'tplOuter' => '@INLINE <ul>[[+wrapper]]</ul>',
    'tpl' => '@INLINE <li>[[+link]] [[+subMenu]]</li>',
    'tplParentRow' => '@INLINE <li>[[+linkParent]] [[+subMenu]]</li>',
    'tplCurrentRow' => '@INLINE <li class="active">[[+link]] [[+subMenu]]</li>',
    'tplParentRowHere' => '@INLINE <li class="active">[[+linkParent]] [[+subMenu]]</li>',
]);

Установите нужные значения parents и level для вашего меню. Далее создайте нужные вам шаблоны tplOuter, tpl, tplParentRow, tplCurrentRow и tplParentRowHere для разметки меню.

Теперь при генерации меню с использованием pdoMenu, ссылка на страницу родителя будет продублирована в подменю.