Strict Standards: Declaration of PluginAceadminpanel_ModuleLang::Get() should be compatible with ModuleLang::Get($sName, $aReplace = Array, $bDelete = true) in /home/deer/pages.org.ua/blog/plugins/aceadminpanel/classes/modules/lang/Lang.class.php on line 21 Strict Standards: Declaration of PluginAceadminpanel_ModuleViewer::_SortBlocks() should be compatible with ModuleViewer::_SortBlocks($a, $b) in /home/deer/pages.org.ua/blog/plugins/aceadminpanel/classes/modules/viewer/Viewer.class.php on line 24 cross-linking / Поиск по тегам / BPOU - Bitrix blog

Bitrix: Кросс-линкинг на весь сайт

Кросс-линкиг — сквозные ссылки через весь сайт, образно говоря ссылки, которые сидят в контенте и ведут в нужные разделы :)

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

AddEventHandler("main", "OnEndBufferContent", "ChangeMyContent");
function ChangeMyContent($content){
	
	$linksfile = $_SERVER["DOCUMENT_ROOT"]."/.crosslink.menu.php";
	if(file_exists($linksfile)) {
		include_once($linksfile);
		
		$array_what = $array_by = "";
		foreach ($aMenuLinks as $rpls) {
			$array_what[] = $rpls[0];
			$array_by[] = "<a href=".$rpls[1]." title='".htmlspecialchars($rpls[0], ENT_QUOTES)."' target='_blank'>".$rpls[0]."</a>";
		}
		
		$ujos = explode("<a ", $content);
		$content = "";
					
		foreach ($ujos as $key => $ololo)  {
			$miniujos = explode("/a>", $ololo);
			if (count($miniujos) == 2) 
				$content .= "<a ".$miniujos[0]."/a>".str_ireplace($array_what, $array_by, $miniujos[1]);
			else 
				$content .= str_ireplace($array_what, $array_by, $miniujos[0]);
		}
		
	}

} 

Что же тут происходит:

  1. Создадим функцию для обработки контента и будем её запускать через AddEventHandler.

  2. Нужные ссылки мы просто размещаем в файле меню crosslink, в корне сайта (с файлом работать намного быстрее чем с БД, и он уже в известной нам форме, и без каких либо преобразований, мы сразу с ним работаем).

  3. Если файл найден, мы его считываем и формируем масив замен.

  4. Дальше идёт ужасный код(но он быстрее работает чем регексп, и оказался более «стрессоустойчив»).

  5. Мы екплодим по началу тега ссылки весь текст, что бы не вставлять ссылки в ссылки.

  6. Дальше обрабатываем полученный массив, ещё раз делая екплод на закрытие тега ссылки

  7. Если получили массив, первую часть пропускаем(содержание ссылки, тайтлы, тексты, возможно альты картинок), а замены делаем во второй, которая вне ссылки

  8. Если не получили, просто делаем замены.

  9. Запихиваем все в bitrix/php_interface/init.php

  10. Profit… Но код все же нужно сделать через толковый регексп, и исключить тайтлы/альты других тегов!



зы: все написанное здесь вы используете на свой страх и риск ;)