Генерация оглавления страницы
В результате переноса сайта с 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
Комментарии ()