Собственные типы нод
Внимание! Мы настоятельно рекомендуем ознакомиться сначала с REST-документацией модуля Сайты, чтобы понять как модуль функционирует (тем более REST доступен и в коробочной версии). Данную документацию рассматривайте как подспорье при работе в коробке, когда вам действительно мало функционала REST, или вы хотите детальнее разобраться в API.
Как вы уже знаете, в системе есть ряд предустановленных типов нод (и +1 коробочный тип component). Данные типы охватывают максимально допустимый для редактирования контент и предполагают, что 99% задач могут быть ими решены.
Если же вы уверены, что для вашей задачи просто необходим собственный тип ноды, вам нужно сделать следующее:
- Создать класс-наследник от абстрактного класса
Bitrix\Landing\Node
. Если вы хотите всего лишь изменить поведение стандартных типов, то можете отнаследоваться от подходящего вам класса в пространствеBitrix\Landing\Node
. - В наследуемом классе необходимо реализовать следующие методы:
- getHandlerJS, возвращающий строку, название JS-класса обработчика типа для редактора (об этом еще ниже),
- saveNode, обработчик сохранения контента вашего типа (его задача изменить по передаваемому селектору и позиции контент согласно вашей логике),
- getNode, обработчик получения контента вашего типа (его задача по переданному селектору вернуть массив данных этого типа; в данный момент метод применяется для экспорта сайта),
- при желании вы можете реализовать еще метод prepareManifest, который позволит вам изменять манифест блока до того как он будет отдан редактору.
- Этот класс должен быть доступен в момент вызова обработчика на регистрацию вашего типа.
$eventManager = \Bitrix\Main\EventManager::getInstance(); $eventManager->addEventHandler('landing', 'onGetNodeClass', function(\Bitrix\Main\Event $event) { $result = new \Bitrix\Main\Entity\EventResult; $type = $event->getParameter('type'); if ($type == 'my_type') { $result->modifyFields(array( 'class' => 'MyTypeNode' )); } return $result; } );
Именно данный обработчик свяжет ваш класс MyTypeNode с новым типом my_type.
В заключении о JS-обработчике, упомянутом выше. Если серверная часть отвечает за сохранение данных определенного типа, то на клиентской части остаются интерфейсы взаимодействия данного типа с пользователем. Как они будут выглядеть и как взаимодействовать, это уже решать разработчику такого типа. За примерами вы можете обратить к одному из существующих JS-типов по пути /bitrix/js/landing/node
.
Одним из самых простых для интуитивного понимания по коду является тип icon. Детальное описание создание собственных типов выходит за рамки данной статьи.