UMI CMS: двухкольцевая перелинковка

Двухкольцевая перелинковка

Лень — двигатель прогресса, для того, чтобы не создавать перелинковку вручную, предварительно делать таблицы соответствия, потом размещать это всё на страницах сайта, я решил написать функцию, которая бы создавала перелинковку между разделами на одном уровне автоматически.

Двухкольцевая перелинковка

Двухкольцевая перелинковка — это две независимые замкнутые цепочки ссылок. В данном случае первое кольцо — это ссылки на предыдущий раздел, второе — на следующий раздел (категорию\товар\новость и т.д.). Все ссылки будут вести на страницы внутри одного уровня вложенности конкретного родительского элемента (раздела).

Считаем, что внутри одного раздела находятся категории\товары близкие по смыслу (логике), поэтому перелинковка приобретает не только seo-значение, но и пользовательское. Такие ссылки действительно могут быть интересными и полезными посетителям сайта, а значит кликабильными и естественными.

Преимущества

  • удобно для больших сайтов со множество страниц
  • исключает «человеческий» фактор: ошибки размещения нужных ссылок на нужных страницах
  • создаётся автоматически, поэтому при добавлении или удалении новых страниц обновляется на всём сайте без участия вебмастера
  • легко трансформируется: можно увеличить количество ссылок, выводимых на всём сайте, показывать с картинкой или без и т.д., переписав код функции в одном месте

Недостаток

  • анкор ссылки универсальный и одинаковый на всех страницах (в данном случае равен h1 страниц). Можно исправить, выделив отдельное поле (поля) для анкоров перелинковки

Описание функции navigate()

  • имеет один параметр — id страницы (раздела)
  • по id определяем «родителя» данной страницы
  • записываем в массив site_tree всех «детей» нашего «родительского элемента»
  • в цикле заполняем три массива (id, заголовки и названия картинок)
  • находим «ребенка», которым является текущая страница
  • выводим ближайших соседних «детей»: «следующего ребёнка» и «предыдущего ребёнка»

Используемые значения:

  • Анкор — h1
  • Фотография — publish_pic («Картинка для публикации»), можно, например, использовать — menu_pic_a («Изображение активного раздела»).

menu_pic_a (Изображение активного раздела)

Текст функции navigate()

Текст функции нужно поместить в class custom в файле custom.php (/classes/modules/).

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
public function navigate($pageId){
 
	$hierarchy = umiHierarchy::getInstance();							
	$parentId = $hierarchy->getParent($pageId);
	$curLink = $hierarchy->getPathById($pageId);
 
	$page = $hierarchy->getElement($pageId);
	$site_tree = $hierarchy->getChilds($parentId, false, true, 1);
 
	if(is_array($site_tree)){
		$k=1;
		$numberSiteTree = count($site_tree);
 
		foreach($site_tree as $elementId => $childs) {
			$element = $hierarchy->getElement($elementId);
 
			if($element){
				$link[$k] = $hierarchy->getPathById($elementId);
				$name[$k] = $element->getValue('h1');
				$img[$k] = $element->getValue('publish_pic');
				if($link[$k] == $curLink){
					$curIndexPage = $k;
				}
				$k++;
			}
		}
 
		// если в каталоге больше 1, то есть предыдущий раздел
		if ($numberSiteTree > 1) 
			if(($curIndexPage-1) == 0){
				$newCurIndexPagePrev = $numberSiteTree;
			}else{
				$newCurIndexPagePrev = $curIndexPage-1;
			}
 
		// если больше 2, то есть и следующий (иначе они совпадут)
		if ($numberSiteTree > 2) 
			if(($curIndexPage+1) > $numberSiteTree){
				$newCurIndexPageNext = 1;
			}else{
				$newCurIndexPageNext = $curIndexPage+1;
			}
 
		$linkNext = $link[$newCurIndexPageNext];
		$linkPrev = $link[$newCurIndexPagePrev];
		$namePrev = str_replace('"', '', $name[$newCurIndexPagePrev]);
		$nameNext = str_replace('"', '', $name[$newCurIndexPageNext]);
		$imgPrev = $img[$newCurIndexPagePrev];
		$imgNext = $img[$newCurIndexPageNext];
 
		($linkPrev)? $itemPrev = "<div class='preview_block_likes'><img src='$imgPrev' alt='$namePrev' /><br /><a class='title' href='".$linkPrev."'>".$namePrev."</a></div>" : '';
 
		($linkNext)? $itemNext = "<div class='preview_block_likes'><img src='$imgNext' alt='$nameNext' /><br /><a class='title' href='".$linkNext."'>".$nameNext."</a></div>" : '';
 
		// если есть хотя бы один
		if ($numberSiteTree > 1) 
			$output = "<div class='like_item_block'><p class='h2'>Похожие предложения</p>$itemPrev $itemNext</div>";
	}
	return $output;			
}	
</code>

Подключаем в tpl-шаблон

Вызываем нашу функцию в любом нужном месте tpl-шаблона, скорее всего это будет внизу сразу после вывода основной части контента:

1
2
3
<h1>%header%</h1>
%content%
%custom navigate(%id%)%

Добавим стили

Добавить в любой css файл, подключенный к сайту.

1
.preview_block_likes{width: 200px; float: left; margin: 10px 0 20px;}

Должно получиться примерно так:

Пример перелинковки на UMI-CMS

Вопросы и комментарии?

Я со своей командой готов сделать это за вас! Заказать!

* – поля, обязательные для заполнения

  • Lera Starikova

    все предельно ясно)
    было бы круто еще сущность шаблона добавить, чтобы не в скрипте разметку делать, но не знаю, способна ли юми на это)

    • Если честно, то не пробовал, можно так сделать или нет, но спасибо за мнение))