Кнопки правки на витрине - режим правки, иконки области, меню элемента
Даём редактору править контент прямо со страницы сайта: режим правки, иконки тулбара компонента и меню элемента с формой в окне.
Что нужно знать заранее
Кнопки правки живут только в режиме правки, который редактор включает на административной панели. В обычном просмотре их не видно ни администратору, ни посетителю, и это правильное поведение.
Механизм состоит из двух разных вещей с похожим видом. Иконки тулбара относятся ко всему блоку компонента, а меню элемента - к конкретной строке списка или карточке товара на странице.
Меню элемента собирается из трёх согласованных вызовов. Идентификатор области в разметке, привязка иконок в эпилоге компонента и сами пункты меню должны использовать одну и ту же строку.
Шаги
- Проверить, что редактор видит режим правки и имеет права на изменение данных.
- Добавить иконки тулбара в файле самого компонента, а не в его шаблоне.
- Пометить область правки идентификатором в разметке шаблона компонента.
- Привязать иконки к этой области в эпилоге компонента одним вызовом.
- Описать пункты правки и удаления с окном формы и подтверждением.
Решение
Добавляем иконки тулбара компонента:
// component.php своего компонента, метод самого компонентаif ($APPLICATION->GetShowIncludeAreas()) { $this->AddIncludeAreaIcons([[ 'ID' => 'vendor_promo_edit', 'TITLE' => 'Настроить блок акций', 'URL' => '/bitrix/admin/vendor_promo.php', // либо вызов javascript: 'ICON' => 'menu-edit', ]]);}Проверка режима правки обязательна: без неё иконки пытаются рисоваться и в обычном просмотре страницы. Метод принадлежит компоненту, поэтому вызывают его в файле компонента, а не в шаблоне.
Помечаем область правки в разметке шаблона:
<div id="<?= $this->GetEditAreaID('promo_' . $item['ID']) ?>"> <?= $item['NAME'] ?> <!-- содержимое карточки, доступной для правки --></div><!-- у каждой карточки страницы своя область со своим идентификатором -->Идентификатор области связывает разметку с будущим меню. Строку составляют из понятного имени и идентификатора элемента, чтобы у каждой карточки на странице получилась собственная область правки.
Привязываем меню к области в эпилоге компонента:
// component_epilog.php - привязка выполняется именно здесь$APPLICATION->SetEditArea($areaId, $icons);// идентификатор области обязан совпасть со строкой из разметки шаблонаЭпилог выполняется и при отдаче страницы из кэша, а сам шаблон - нет. Поэтому привязку делают в нём: иначе меню появляется только на первой сборке страницы и пропадает на всех следующих.
Описываем пункты правки и удаления:
$this->AddEditAction($areaId, $editUrl, 'Изменить акцию', ['WINDOW' => ['width' => 780, 'height' => 500], 'ICON' => 'bx-context-toolbar-edit-icon']);$this->AddDeleteAction($areaId, $deleteUrl, 'Удалить акцию', ['CONFIRM' => 'Удалить акцию со страницы?']); // диалог подтвержденияФорма правки открывается окном заданного размера поверх страницы. Подтверждение удаления ставят всегда: случайное нажатие на витрине стоит дороже, чем лишний вопрос редактору.
Берём название кнопки из системной фразы:
$name = \CIBlock::GetArrayByID($iblockId, 'ELEMENT_EDIT'); // название из настроек инфоблока$this->AddEditAction($areaId, $editUrl, $name);// так подпись совпадает с той, что редактор видит в административном разделе// для разделов инфоблока подпись берут той же выборкой, но по другому ключуТипичные проблемы
Меню у элемента не появляется совсем.
Идентификатор области в разметке и в привязке различается хотя бы одним символом. Все три вызова обязаны использовать одну и ту же строку идентификатора.
Иконки видны посетителю в обычном просмотре.
Добавление иконок не обёрнуто проверкой режима правки страницы. Проверку ставят вокруг вызова, а не внутри шаблона компонента.
Меню пропадает после первого показа страницы.
Привязка сделана в шаблоне, который не выполняется при отдаче из кэша. Привязку переносят в эпилог компонента, работающий на каждом запросе.
Форма правки открывается страницей вместо окна.
В описании пункта не задан размер окна для всплывающей формы. Размер указывают явно, иначе редактор уходит со страницы и теряет её место.
Подписи кнопок не совпадают с админкой.
Названия написаны в коде вручную, а не взяты из настроек инфоблока. Системная фраза возвращает ту же подпись, что видит редактор в разделе контента.
Частые вопросы
Почему кнопок правки не видно администратору?
Режим правки выключен на административной панели или у страницы нет областей правки. Сначала проверяют переключатель режима, потом код компонента.
Чем иконки тулбара отличаются от меню элемента?
Тулбар относится ко всему блоку компонента, меню - к конкретной карточке или строке. На одной странице обычно используют оба механизма сразу.
Работают ли эти кнопки в чужом компоненте?
Да, штатные компоненты каталога и новостей объявляют такие области сами. Свой шаблон должен вывести идентификатор области, иначе меню не к чему привязать.
Можно ли открыть свою форму, а не штатную?
Да, адрес формы задают произвольный, включая свою страницу административной части. Размер окна указывают там же, в описании пункта меню.
Видит ли эти кнопки менеджер без прав администратора?
Он видит их при праве на изменение данных и доступе в режим правки. Права проверяет платформа, а не ваш код компонента.
Смежное
- Шаблон сайта - оглавление подтемы
- Включаемые области: текст и код в шаблоне без правки файлов - соседний механизм правки с витрины
- Шаблон чужого компонента: копия вместо правки исходника - куда добавляют разметку области
- Правки шаблона компонента не видны: разбор причин - если изменения не появились
- Своя страница в админке: список, форма, пункт меню - куда ведёт кнопка правки
- Компоненты и шаблоны - устройство компонентов целиком
- Административный интерфейс - устройство интерфейса правки
- Своя кнопка на панели управления - кнопка на верхней панели, а не в области