Работаем с seo-шаблонами в 1С-Битрикс

Уже достаточно давно, еще с 14-й версии модуля "Информационные блоки" в 1С-Битрикс появилась возможность задавать шаблоны автоматической генерации мета-данных. Но не все до сих пор умеют пользоваться данным инструментом. В данном посте собраны основные моменты по созданию шаблонов мета-данных.

Механизм автоматических шаблонов мета-данных позволяет задать description, title,keywords для элементов и разделов, а также для элементов доступны шаблоны для установки alt, title и шаблона имени файла детального и анонсового изображений.

В шаблоне может быть несколько вариантов данных.

Во-первых, это, конечно-же, может быть любой произвольный текст. Этот текст будет выведен автоматически у заданного объекта (и всех потомков, если это раздел, так что не забывайте у потомков написать свой уникальный текст).

В системе создан набор специальных конструкций, прописанных в фигурных скобках и работающих по принципу отложенных функций. Указывается такая конструкция достаточно просто, например, чтобы вывести название текущего объекта, нужно задать конструкцию вида:

{=this.Name}

Вот список зарезервированных слов:

  • this - означает текущий объект;
  • parent - родительский объект. Пример: {=parent.PreviewText} - анонсовый текст родительского раздела;
  • sections - родительские секции начиная с верхнего уровня. пример: {=this.sections.name} - названия родительских разделов;
  • iblock - инфоблок текущего объекта. Пример: {=iblock.PreviewText} - описание инфоблока;
  • property - свойство текущего объекта. Пример: {=this.property.CML_ARTICLE} - выведет значение свойства с артикулом. Для того чтобы у элемента показать пользовательское свойство, заданное для раздела, можно воспользоваться шаблоном: {=this.parent.property.name} - выдаст значение свойства UF_NAME;
  • Для редакций, имеющих модуль Торговый каталог, можно также получить свойство торгового предложения: {=this.catalog.sku.property.COLOR} - выдаст значение свойства "Цвет" торгового предложения. Чтобы получить значения данного свойства у торговых предложений, но без повторяющихся значений, можно воспользоваться функцией: {=distinct this.catalog.sku.property.COLOR};
  • Чтобы получить цены торговых предложений, необходимо указать тип цены, которая должна быть выведена:{=this.catalog.sku.price.BASE;} - выдаст все цены, либо так: {=min this.catalog.sku.price.BASE} можно получить минимальную цену;
  • Для получения габаритов товара, необходимо обратиться к соответствующим данным: {=this.catalog.weight} - вес товара, {=this.catalog.measure} - единица измерения, {=concat catalog.store ", "} - склады, перечисленные через запятую

Набор готовых конструкций достаточно большой и решает большую часть задач описания мета-данных. Дополнением к данным конструкциям служат предопределенные функции:

  • lower - приведет значение к нижнему регистру. Пример: {=lower this.Name};
  • upper - приведет значение к верхнему регистру. Пример: {=upper this.Name};
  • limit - ограничить элементы по разделителю. Пример: {=limit {=this.PreviewText} "." 2} - оставит текст до 2 точки, начиная с начала;
  • concat - задаётся разделитель и несколько строк объединяются через разделитель. Пример: {=concat this.sections.name " / "} - все названия родительских разделов будут соединены с помощью слэша;
  • min - находит минимальный элемент. Пример: {=min this.catalog.sku.price.BASE};
  • max - находит максимальный элемент. Пример: {=max this.catalog.sku.price.BASE};
  • distinct - оставит только значения без повторения(уникальные).;
  • translit - транслитерация значения. Пример: {=translit this.Name};

Конечно же список функций можно расширять до бесконечности. Для этого, нужно воспользоваться обработчиком события OnTemplateGetFunctionClass модуля "Информационные блоки".

В качестве примера рассмотрим создание функции, выводящей значение свойства только тогда, когда свойство заполнено. В init.php создаем обработчик события:

if (\Bitrix\Main\Loader::includeModule('iblock'))
{
	\Bitrix\Main\EventManager::getInstance()->addEventHandler(
		"iblock",
		"OnTemplateGetFunctionClass",
		"seoTemplatesHandler"
	);

	function seoTemplatesHandler(Bitrix\Main\Event $event) {
		$arParam = $event->getParameters();
		$functionClass = $arParam[0];
		if(is_string($functionClass) && class_exists($functionClass)){
			switch ($functionClass){
				case 'iffilled': // вывод свойства только если оно заполнено
					$result = new Bitrix\Main\EventResult(1,$functionClass);
					break;
				case 'take_first': // вывод первого из заполненных значений
					$result = new Bitrix\Main\EventResult(1,$functionClass);
			}
		}

		return $result;
	}

	//подключаем файл с определением класса FunctionBase
	//это пока требуется т.к. класс не описан в правилах автозагрузки
	include_once($_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/iblock/lib/template/functions/fabric.php");

	class iffilled extends \Bitrix\Iblock\Template\Functions\FunctionBase
	{
		public function onPrepareParameters(\Bitrix\Iblock\Template\Entity\Base $entity, $parameters)
		{
			$arguments = array();
			/** @var \Bitrix\Iblock\Template\NodeBase $parameter */
			foreach ($parameters as $parameter)
			{
				$arguments[] = $parameter->process($entity);
			}
			return $arguments;
		}

		public function calculate(array $parameters)
		{
			if(isset($parameters[0]) && $parameters[0] && isset($parameters[1])) {
                              return sprintf($parameters[1],$parameters[0]);
                        }
                        return "";
		}
	}

	class take_first extends \Bitrix\Iblock\Template\Functions\FunctionBase
	{
		public function calculate($parameters)
		{
			$arParams = $this->parametersToArray($parameters);
			return $arParams[0];
		}
	}
}

Чтобы воспользоваться данным шаблоном, нужно прописать данный шаблон в виде:

{=iffilled this.property.CML_ARTICLE "Артикул: %s"} - {=this.Name}

Update 2018-04-16

Добавил для примера класс, позволяющий вывести одно из значений - будет выведено первое непустое значение. Чтобы воспользоваться данным шаблоном, нужно указать:

Купить {=take_first this.property.HEADER this.Name}. Цена {=this.catalog.price.BASE} в интернет-магазине ...

В результате, если в свойстве HEADER контент-менеджер ввел какое-то значение - будет выведено оно, если же нет - будет выведено название товара.

Кількість показів: 11235
12.03.2018

Повернення до списку

Если вам была полезна статья можете отблагодарить автора: