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

Редактирование динамического контента

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

Если внутри блока выводится компонент, то логично чтобы к элементам контента компонента применялись общие правила редактирования Сайтов24.

Если вы это сделаете на основании уже полученных знаний, то увидите, что элементы действительно поддаются редактированию, но сохранения не происходит (после обновления страницы). Дело в том, что серверу необходимо передать информацию какой именно динамический элемент и его часть вы меняете, так как он ничего не знает о выводимом контенте, а оперирует только вызовом компонента. Модуль Сайты24 дает такую возможность.

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

  1. Прежде всего необходимо внести изменения в шаблон компонента, добавив класс и связующий идентификатор
    <span class="news-text" data-id="<?= $arItem['ID'];?>"><?echo $arItem["PREVIEW_TEXT"];?></span>
    Класс news-text ниже мы пропишем в манифесте блока уже как текстовый тип, а в data-id мы передаем идентификатор новости. При желании вы тут можете указать еще ряд атрибутов, которые вам нужны будут на сервере, но лучше конечно их количество минимизировать. Если вам на данный момент еще ничего не понятно, ничего страшного :).
  2. В манифесте блока в секции nodes указываем, что данный класс обладает возможностью редактирования как текст:
    '.news-text' =>
    	array(
    		'name' => 'Описание новости',
    		'type' => 'text_component',
    		'extend' => array(
    			'attrs' => array(
    				'data-id'
    			)
    		)
    	),
    Внимательный читатель заметит, что здесь мы указываем не type = text, а некий text_component. Об этом ниже. В extend мы передаем тот самый атрибут, который прописали в шаблоне – data-id. Это сообщит системе, что данный атрибут необходимо передать на сервер в момент сохранения (иначе мы не узнаем какую именно новость редактируем в данный момент).
  3. Теперь нам необходимо зарегистрировать собственный тип ноды text_component. Разумеется название типа может быть иным, на ваше усмотрение.
  4. Так как нас полностью устраивает поведение типа text, давайте отнаследуемся от него. В итоге у нас получится такой класс-наследник:
    \Bitrix\Main\Loader::includeModule('landing');
    
    class MyTextNode extends \Bitrix\Landing\Node\Text
    {
    public static function saveNode(\Bitrix\Landing\Block &$block, $selector, array $data, $additional = array())
    	{
    		if (!\Bitrix\Main\Loader::includeModule('iblock'))
    		{
    			return;
    		}
    		$iblockEl = new \CIBlockElement;
    
    		foreach ($data as $pos => $value)
    		{
    			if (isset($additional[$selector . '@' . $pos]))
    			{
    				$data = $additional[$selector . '@' . $pos];
    				$id = $data['data-id'];
    				$iblockEl->update(
    					$id,
    					array(
    						'PREVIEW_TEXT' => $value,
    						'PREVIEW_TEXT_TYPE' => 'html'
    					)
    				);
    			}
    		}
    	}
    }
    Где нужно переопределить только один метод saveNode. И вот тут картинка должна сложиться окончательно. Мы получаем сохраняемые данные в $data (в данном примере это текст изменяемой новости), получаем идентификатор новости из прилетевшего атрибута, и изменяем соответствующую новость посредством API модуля Инфоблоков.
  5. Не забудьте зарегистрировать новый тип обработчиком
    $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 == 'text_component')
    		{
    			$result->modifyFields(array(
    				'class' => '\MyTextNode'
    			));
    		}
    		return $result;
    	}
    );

В этой статье дан упрощенный пример редактирования контента. Вы можете усложнять схемы, давая на редактирование не только описания и названия, но и различные свойства. Тут вам и могут потребоваться дополнительные атрибуты для передачи на сервер. Как, например, символьный код редактируемого свойства.



Полезные ссылки

Сайты24 и собственный домен в коробке



Пользовательские комментарии

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

Для этого нужно всего лишь авторизоваться на сайте

Но помните, что Пользовательские комментарии, несмотря на модерацию, не являются официальной документацией. Ответственность за их использование несет сам пользователь.

Также Пользовательские комментарии не являются местом для обсуждения функционала. По подобным вопросам обращайтесь на форумы.
© «Битрикс», 2001-2024, «1С-Битрикс», 2024
Наверх