Ditto пагинация с разрывами

Старичок Ditto все еще применяется на многих сайтах. У него есть много минусов, но он проще в освоении, чем более кошерный DocLister.

Один из минусов Ditto - ненастраиваемый вывод пагинации. В том смысле, что Ditto покажет все страницы из пагинации, и ему все равно, сколько этих страниц, 5 или 500. А нам совсем не все равно, потому что простыня из 500 ссылок на страницы пагинации - это не совсем то, что нам хотелось бы увидеть.

Есть несколько вариантов борьбы с этой проблемой. Например, сниппет SplitPagination. У меня он почему-то не заработал корректно, дедлайн был близок, времени разбираться особо не было, и тут на помощь пришел костыль, которым делюсь в этой статье.

Если честно, костыли не есть хорошо и более правильным выходом было бы перейти на DocLister, но иногда наличие готового костыля лучше, чем его отсутствие, поэтому вот:

необходимо заменить в assets/snippets/ditto/classes/ditto.class.inc.php в районе 1145 строки

    

for ($x = 0; $x <= $totalpages - 1; $x++) {
    $inc = $x * $summarize;
    $display = $x + 1;

    if (($x < $min_x) || ($x > $max_x)) continue;

    if ($inc != $start) {
        $pages. = $this - > template - > replace(array('url' => $this - > buildURL("start=$inc"), 'page' => $display), 
        $tplPaginatePage);
    } else {
        $modx - > setPlaceholder($dittoID.
            "currentPage", $display);
        $pages. = $this - > template - > replace(array('page' => $display), $tplPaginateCurrentPage);
    }
}
    
на
    
for ($x = 0; $x <= $totalpages - 1; $x++)
	{
	$max_paginate = 5;
	$max_previous = 2;
	$cur_x = floor($start / $summarize);
	$min_x = $cur_x - $max_previous;
	if ($min_x < 0)
		{
		$min_x = 0;
		}

	$max_x = $min_x + $max_paginate - 1;
	if ($max_x > $totalpages - 1)
		{
		$max_x = $totalpages - 1;
		$min_x = $max_x - $max_paginate + 1;
		}

	if (($x == 1 && $min_x > 0) || ($x == ($totalpages - 1) && $max_x < ($totalpages - 1)))
		{
		$pages . = '...';
		}

	$inc = $x * $summarize;
	$display = $x + 1;
	if ($inc != $start)
		{
		if ($x < $min_x && $x != 0)
			{
			continue;
			}

		if ($x > $max_x && $x != $totalpages - 1)
			{
			continue;
			}

		$pages.= $this->template->replace(array(
			'url' => $this->buildURL("start=$inc") ,
			'page' => $display
		) , $tplPaginatePage);
		}
	  else
		{
		$modx->setPlaceholder($dittoID . "currentPage", $display);
		$pages.= $this->template->replace(array(
			'page' => $display
		) , $tplPaginateCurrentPage);
		}
	}

    

В результате этой замены вместо вывода всех страниц в пагинации появятся разрывы, что-то типа такого:

Еще раз, способ не самый правильный, хотя бы потому что при обновлении Ditto эти изменения нужно будет заново вносить в файл.


Теги: Ditto, Evolution, сниппет, костыли

Сообщение отправлено

Закрыть