Bitrix: GetProperty не работает в header.php

У битрикса есть небольшая беда, его же $APPLICATION->GetProperty не работает в header.php, и все пользовательские свойства страницы считываются или в контенте или в footer.php, что не всегда устраивает.

Например нужно создать кастомный h1, который обычно живет себе спокойно в header.php и мы его получаем через $APPLICATION->GetTitle(). Тогда на помощь придёт совет с предыдущей статьи. Мы просто в контенте сделаем замену и поисковик ничего не узнает о изначальном заголовке. Алгоритм такой же как и в статье «Кросс-линкинг на весь сайт»

А вот и код:
AddEventHandler("main", "OnEndBufferContent", "ChangeMyContent");
function ChangeMyContent($content){
	GLOBAL $APPLICATION;
	$h1 = $APPLICATION->GetProperty("h1");
	if (!empty($h1))
		$content = str_replace("<h1>".$APPLICATION->GetTitle(),"<h1>".$h1,$content);
}
  • 0
  • 26 марта 2011, 13:49
  • admin

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… Но код все же нужно сделать через толковый регексп, и исключить тайтлы/альты других тегов!



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

Универсальный print_r() для битрикса

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


if (!function_exists('printr')) {
	function printr($array) {
		GLOBAL $USER;
		if (!$USER->IsAdmin()) return false;
		$args = func_get_args();
		if (count($args) > 1) {
			foreach ($args as $values)
				printr($values);
		} else {
			if (is_array($array) || is_object($array)) {
				echo "<pre>";
				print_r($array);
				echo "</pre>";
			} else {
	  			echo $array;
			}
		}
		return true;
	}
}
printr($arr1,$arr2, $str, "string");

Вставлять соответ. в афтер_коннект.пхп
  • 0
  • 03 марта 2011, 16:32
  • admin

Логотип компании в админке Bitrix, без изменения ядра

Когда вы работаете в админке, главный модуль проверяет на наличие в папке php_interface файла this_site_logo.php. Если он задан, он помещает содержимое, под древовидное меню левой колонки.

Вот так вот всё просто. Туда можно разместить контакты, или полезные ссылки.

Но есть ещё одно применение.

Читать дальше

Переопределение функции отправки почты

По умолчанию, за отправку почты в битрикс отвечает функция bxmail. Сама она находится в
bitrix\modules\main\tools.php

В ней проверяется один параметр, а вернее наличие функции custom_mail. Если она определена, то отправка писем происходит с её помощью.

Функцию можно задать в файле php_interface\dbconn.php (или init.php)
custom_mail($to, $subject, $message, $additional_headers, $additional_parameters);