Каждый PHP-разработчик, работающий с экосистемой Bitrix Framework, должен глубоко понимать работу её ключевых компонентов. В этой статье мы проведем подробный аудит темы «Добавить виджет на Главную страницу: наш вайб landing.repowidget.register», проанализируем лучшие практики и покажем, как правильно использовать landing.repowidget.register в реальных задачах.
Добавить виджет на Главную страницу: наш вайб landing.repowidget.register
> Scope: landing
>
> Кто может выполнять метод: любой пользователь
Метод landing.repowidget.register добавляет виджет для Главной страницы: наш вайб. Возвращает ошибку или идентификатор ID добавленного виджета.
При добавлении выполняется проверка. Если виджет с кодом code уже зарегистрирован ранее, то происходит обновление его контента. Виджеты, уже размещенные на Вайбах, в случае обновления контента обновляются автоматически.
Параметры метода
Названиетип | Описание |
|---|---|
codestring | Уникальный код виджета. Настоятельно рекомендуется использовать какой-либо уникальный префикс для своих виджетов, чтобы избежать риск совпадения кодов с виджетами других разработчиков |
fieldsobject | Значения полей для создания виджета |
Параметр fields {#anchor-fields}
Названиетип | Описание |
|---|---|
NAMEstring | Название виджета |
PREVIEWstring | URL картинки-обложки виджета для слайдера выбора виджетов |
DESCRIPTIONstring | Описание виджета |
CONTENTstring | Верстка виджета с использованием конструкций Vue |
SECTIONSstring | Код раздела, в который будет добавлен виджет. Список доступных разделов: — |
WIDGET_PARAMSobject | Параметры для vue-шаблонизатора. Если их нет, то блок останется обычным html-кодом с {{}} |
ACTIVEchar | Активность виджета. Принимает значения: — |
SITE_TEMPLATE_IDstring | Привязка виджета к определенному шаблону сайта. Только для коробочного Битрикс24! |
Параметр WIDGET_PARAMS {#anchor-widget-params}
Названиетип | Описание |
|---|---|
rootNodestring | Селектор корневого элемента в верстке, который будет превращен во vue-component. Корневой элемент должен быть единственным элементом в передаваемом шаблоне, вся остальная разметка будет очищена |
langstring | Массив языковых фраз, использующихся в конструкциях {{$Bitrix.Loc.getMessage('W_EMPTY')}} |
handlerstring | Адрес внешнего обработчика, к которому будут выполняться запросы. Важно: Обработчик должен быть доступен из внешней сети! Проверяйте доступность обработчика специальными сервисами |
stylestring | Адрес стилей для виджета. Стили также могут быть заданы инлайново в разметке через привязку :style="{borderBottom: '1px solid red'}" |
demoData*object | Демо-данные для виджета, которые будут использованы для демонстрации виджета в шаблонах Вайба в Битрикс24 Маркетплейс. Если вы разрабатываете виджет для конкретного Битрикс24 и не планируете публиковать его в Маркет, то можете указать в качестве значения параметра произвольный массив, он все равно не будет использован. Однако, если вы готовите тиражное решение с виджетом, уделите демонстрационным данным максимальное внимание — именно они будут отображаться в слайдере предварительного просмотра шаблона Вайба! Очевидно, что структура демо-данных должна соответствовать той, которую вернул бы ваш обработчик |
Примеры кода
- JS
try
{
const response = await $b24.callMethod(
'landing.repowidget.register',
data
);
const result = response.getData().result;
if (result.error())
{
console.error(result.error());
return;
}
console.info(result);
}
catch( error )
{
console.error('Error:', error);
}- PHP
try {
$response = $b24Service
->core
->call(
'landing.repowidget.register',
[
'code' => 'my_widget',
'fields' => [
'NAME' => 'My widget',
'PREVIEW' => 'https://my-app.com/vibe_preview.jpg',
'CONTENT' => $content,
'SECTIONS' => 'widgets_company_life',
'WIDGET_PARAMS' => [
'rootNode' => '.my-app-w-container',
'lang' => [
'ru' => [
'W_TITLE' => 'Люди и их возраст',
'W_EMPTY' => 'Нет людей',
],
'en' => [
'W_TITLE' => 'People and their ages',
'W_EMPTY' => 'Empty',
],
],
'handler' => 'https://my-app.com/vibe.php',
'style' => 'https://my-app.com/vibe.css',
'demoData' => [
'desc' => 'Just a test widget',
'count' => 420,
'persons' => [
['name' => 'Person 1', 'age' => 21],
['name' => 'Person 2', 'age' => 42],
['name' => 'Person 3', 'age' => 123],
],
],
],
],
]
);
$result = $response
->getResponseData()
->getResult();
echo 'Success: ' . print_r($result, true);
// Нужная вам логика обработки данных
processData($result);
} catch (Throwable $e) {
error_log($e->getMessage());
echo 'Error registering repowidget: ' . $e->getMessage();
}- BX24.js
const content = `
<div class="my-app-w-container">
<h2 class="w-title" :style="{borderBottom: '1px solid red'}">
{{$Bitrix.Loc.getMessage('W_TITLE')}}
</h2>
<h3>Description: not_var{{desc}}</h3>
<div v-for="(value) in persons">
<p>
<span class="w-name">not_var{{value.name}}</span>:
<span class="w-age">not_var{{value.age}}</span>
</p>
</div>
<div v-if="persons == null">
{{$Bitrix.Loc.getMessage('W_EMPTY')}}
</div>
<h4>Just a number not_var{{count}}</h4>
<div class="w-buttons">
<button @click="fetch">Получить данные (без параметров)</button>
<button @click="fetch({param: 'a'})">Данные для параметра 'a'</button>
<button @click="fetch({param: 'b'})">Данные для параметра 'b'</button>
<button @click="openApplication({param1: '1', param2: 'false'})">Открыть приложение</button>
<button @click="openPath('/crm')">Открыть локальный адрес в слайдере</button>
</div>
</div>
`;
const data = {
code: 'my_widget',
fields: {
NAME: 'My widget',
PREVIEW: 'https://my-app.com/vibe_preview.jpg',
CONTENT: content,
SECTIONS: 'widgets_company_life',
WIDGET_PARAMS: {
rootNode: '.my-app-w-container',
lang: {
ru: {
W_TITLE: 'Люди и их возраст',
W_EMPTY: 'Нет людей',
},
en: {
W_TITLE: 'People and their ages',
W_EMPTY: 'Empty',
},
},
handler: 'https://my-app.com/vibe.php',
style: 'https://my-app.com/vibe.css',
demoData: {
desc: 'Just a test widget',
count: 420,
persons: [
{'name': 'Person 1', 'age': 21},
{'name': 'Person 2', 'age': 42},
{'name': 'Person 3', 'age': 123},
],
},
},
},
};
BX24.callMethod(
'landing.repowidget.register',
data,
(result) =>
{
if (result.error())
{
console.error(result.error());
return;
}
console.info(result.data());
},
);- PHP CRest
require_once('crest.php');
$content = <<<'HTML'
<div class="my-app-w-container">
<h2 class="w-title" :style="{borderBottom: '1px solid red'}">
{{$Bitrix.Loc.getMessage('W_TITLE')}}
</h2>
<h3>Description: not_var{{desc}}</h3>
<div v-for="(value) in persons">
<p>
<span class="w-name">not_var{{value.name}}</span>:
<span class="w-age">not_var{{value.age}}</span>
</p>
</div>
<div v-if="persons == null">
{{$Bitrix.Loc.getMessage('W_EMPTY')}}
</div>
<h4>Just a number not_var{{count}}</h4>
<div class="w-buttons">
<button @click="fetch">Получить данные (без параметров)</button>
<button @click="fetch({param: 'a'})">Данные для параметра 'a'</button>
<button @click="fetch({param: 'b'})">Данные для параметра 'b'</button>
<button @click="openApplication({param1: '1', param2: 'false'})">Открыть приложение</button>
<button @click="openPath('/crm')">Открыть локальный адрес в слайдере</button>
</div>
</div>
HTML;
$data = [
'code' => 'my_widget',
'fields' => [
'NAME' => 'My widget',
'PREVIEW' => 'https://my-app.com/vibe_preview.jpg',
'CONTENT' => $content, // Vue-разметка вынесена в отдельную переменную для удобства
'SECTIONS' => 'widgets_company_life',
'WIDGET_PARAMS' => [
'rootNode' => '.my-app-w-container',
'lang' => [
'ru' => [
'W_TITLE' => 'Люди и их возраст',
'W_EMPTY' => 'Нет людей',
],
'en' => [
'W_TITLE' => 'People and their ages',
'W_EMPTY' => 'Empty!',
],
],
'handler' => 'https://my-app.com/vibe.php',
'style' => 'https://my-app.com/vibe.css',
'demoData' => [
'desc' => 'Just a test widget',
'count' => 420,
'persons' => [
[
'name' => 'Person 1',
'age' => 21,
],
[
'name' => 'Person 2',
'age' => 42,
],
[
'name' => 'Person 3',
'age' => 123,
],
],
],
],
],
];
$result = CRest::call(
'landing.repowidget.register',
$data
);
echo '<PRE>';
print_r($result);
echo '</PRE>';Обработка ответа
HTTP-статус: 200
{
"result": 10,
"time": {
"start": 1713949410.036288,
"finish": 1713949411.632775,
"duration": 1.596487045288086,
"processing": 0.6458539962768555,
"date_start": "2024-04-24T11:03:30+02:00",
"date_finish": "2024-04-24T11:03:31+02:00",
"operating": 0
}
}Возвращаемые данные
Названиетип | Описание |
|---|---|
resultinteger | Идентификатор добавленного виджета |
timetime | Информация о времени выполнения запроса |
Обработка ошибок
- [](./landing-repowidget-unregister)
- [](./landing-repowidget-get-list)
- [](./landing-repowidget-debug)
💡 Экспертное мнение и рекомендации
Советы эксперта по интеграции:
- Всегда используйте кэширование при частых запросах к landing.repowidget.register, чтобы разгрузить базу данных.
- Соблюдайте стандарты PSR при написании обработчиков для «Добавить виджет на Главную страницу: наш вайб landing.repowidget.register».
- Регулярно проводите аудит производительности системы с помощью встроенного монитора 1С-Битрикс.
Похожая задача в бизнесе?
Помогу автоматизировать процессы и внедрить ИИ
Меня зовут Андрей Горошко. Я Full-stack разработчик и эксперт по 1С-Битрикс. Настраиваю CRM Битрикс24, разрабатываю защищенные API и создаю умных ИИ-агентов для автоматизации рутины.
или на почту: gorandvas@yandex.ru