Генерация оглавления страницы
В результате переноса сайта с Wordpress на MODX возникла необходимость в автоматической генерации Оглавления для статей.
На сайте - modx.pro есть решение, предложенное Василием Наумкиным.
После применения и переделывания под тег ol, замечено, что генерится не совсем корректная верстка, а именно получилось, что второй уровень не вкладывается в теги li:
<ol>
<li>Раздел 1</li>
<li>Раздел 2</li>
<li>Раздел 3</li>
<ol>
<li>Подраздел 1</li>
<li>Подраздел 2</li>
<li>Подраздел 3</li>
</ol>
<li>Раздел 4</li>
</ol>
Внес необходимые изменения, внедрив некоторые предложения по улучшению, написанные в комментариях, получился необходимый скрипт автоматической генерации Оглавления.
Привожу код измененного цикла.
<?php
foreach ($headers[2] as $i => $header) {
$header = preg_replace('#\s+#', ' ', trim(rtrim($header, ':!.?;')));
$anchor = str_replace(' ', '-', $header);
$anchor = preg_replace( '/[^a-zа-яё \-]/iu' , '' , $anchor);
$anchor = $modx->translit->translate($anchor, $translit);
$header = "<a href=\"{$base}#{$anchor}\">{$header}</a>";
$hh = $headers[1][$i+1]?:1; //получаем уровень меню следующего пункта, если пункт меню последний, то - 1
$contents .= '<li>'. $header; //начало пункто меню, оно одинаковое для всех
if ($depth > 0) {
if ($hh > $depth) { // открываем подменю, если следующий пункт будет вложенным
while ($hh > $depth) {
$contents .= '<ol>';
$depth ++;
}
}elseif ($hh < $depth) { //закрываем все открытые подменю, если следующий пункт на уровень выше
while ($hh < $depth) {
$contents .= '</li></ol>';
$depth --;
}
if ($depth > 1){// закрываем открытые пункты меню
$contents .= '</li>';
}
}else{
$contents .= '</li>';
}
}else{
$contents .= '</li>';
}
$depth = $headers[1][$i+1]?:1; //запоминаем уровень меню следующего пункта
if ($start === null) {
$start = $depth;
}
//$contents .= '<li>' . $header . '</li>';
$from[$i] = $headers[0][$i];
$to[$i] = '<a name="' . $anchor . '" class="page-contents-link"></a>' . $headers[0][$i];
}
Теперь подразделы корректно оборачиваются тегами
<ol>
<li>Раздел 1</li>
<li>Раздел 2</li>
<li>Раздел 3
<ol>
<li>Подраздел 1</li>
<li>Подраздел 2</li>
<li>Подраздел 3</li>
</ol>
</li>
<li>Раздел 4</li>
</ol>
Источник: https://modx.pro/help/4373
Комментарии ()