все просто

Генерация оглавления страницы

В результате переноса сайта с 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

Комментарии ()