Документация для разработчиков
Темная тема

Класс блока

Описание

Внимание! Мы настоятельно рекомендуем ознакомиться сначала с REST-документацией модуля Сайты, чтобы понять как модуль функционирует (тем более REST доступен и в коробочной версии). Данную документацию рассматривайте как подспорье при работе в коробке, когда вам действительно мало функционала REST, или вы хотите детальнее разобраться в API.

Если размещать компоненты в блоках как есть, то проблем не будет. Но часто бывает, что требуется модифицировать ряд не настраиваемых параметров компонента, прежде чем они будут переданы в вызов компонента. Например, ссылка на корзину зависит от того, есть ли вообще в составе сайта страница корзины. Размещать такие условия в теле block.php технически возможно, но стилистически выглядит неряшливо.

Для этих целей (и пока только для этих) был введен так называемый класс блока. Это файл class.php, который размещается рядом с block.php и содержит внутри себя класс, отнаследованный от \Bitrix\Landing\LandingBlock. Класс может быть с любым названием, которое не пересекается с системными и является валидным именем класса.


Внимание! Помимо самого class.php в манифесте блока необходимо явно прописать его namespace (название директории, где располагается блок):

return array(
	'block' =>
		array(
			.....
			'namespace' => 'bitrix'
		),

Внутри класса вы можете переопределить три метода:

  • init(array $params = [])
    Вызывается раз на страницу, независимо от количества блоков данного класса. Следует применять для определения общих параметров любых блоков класса данной страницы.

    На вход поступает массив параметров:
    site_id – идентификатор сайта страницы блока
    landing_id – идентификатор страницы блока.

  • beforeView(\Bitrix\Landing\Block $block)
    Вызывается каждый раз перед вызовом на странице блока данного класса. Следует применять метод только при необходимости влиять на конкретный блок. На вход принимает объект текущего блока.
  • beforeAdd(\Bitrix\Landing\Block $block)

    Вызывается единожды, при создании блока на странице. Не имеет значения, добавляется ли блок в редакторе, при создании шаблона или через REST. Позволяет дополнительно обработать контент конкретного блока перед вставкой. На вход принимает объект текущего блока.

Внутри одного из методов выше вам необходимо повлиять на внутренний массив $this->params, тогда к этим параметрам вы сможете обратиться непосредственно внутри содержимого блока.

Пример

Давайте рассмотрим на примере. Ниже полноценный класс одного из блоков. В методе init мы получаем массив системных страниц сайта, и на основании существования страницы перс.раздела решаем, инициировать ли нам параметр SHOW_PERSONAL_LINK в Y или N. Метод beforeView приведен для примера и логирует идентификатор текущего блока.

<?php
if (!defined('B_PROLOG_INCLUDED') || B_PROLOG_INCLUDED !== true)
{
	die();
}

use \Bitrix\Landing\Manager;

class CatalogListBlock extends \Bitrix\Landing\LandingBlock
{
	public function init(array $params = [])
	{
		$syspages = \Bitrix\Landing\Syspage::get(
			$params['site_id'],
			true
		);

		if (isset($syspages['personal']) && Manager::getUserId())
		{
			$this->params['SHOW_PERSONAL_LINK'] = 'Y';
		}
		else
		{
			$this->params['SHOW_PERSONAL_LINK'] = 'N';
		}
	}

	public function beforeView(\Bitrix\Landing\Block $block)
	{
		addMessage2Log('call block#' . $block->getId());
	}
}>

Тогда непосредственно внутри block.php при вызове компонент мы можем пользоваться уже непосредственно вызовом метода экземпляра данного класса:

$classBlock->get('SHOW_PERSONAL_LINK')

Или сразу весь block.php

<?php
if (!defined('B_PROLOG_INCLUDED') || B_PROLOG_INCLUDED !== true)
{
	die();
}
?>

<?$APPLICATION->IncludeComponent(
	'bitrix:sale.basket.basket.line',
	'.default',
	array(
		'PATH_TO_BASKET' => '#system_cart',
		'PATH_TO_PERSONAL' => '#system_personal',
		'SHOW_PERSONAL_LINK' => 'N',
		'SHOW_NUM_PRODUCTS' => 'Y',
		'SHOW_TOTAL_PRICE' => 'Y',
		'SHOW_PRODUCTS' => 'N',
		'POSITION_FIXED' => 'Y',
		'SHOW_AUTHOR' => $classBlock->get('SHOW_PERSONAL_LINK'),
		'SHOW_REGISTRATION' => 'N',
		'PATH_TO_REGISTER' => ''
	),
	false
);?>


© «Битрикс», 2001-2024, «1С-Битрикс», 2024