Причина - мы больше не используем Битрикс в своих проектах. Если вам интересен этот проект и вы хотите заняться его поддержкой - форкните его и создайте Issue в данном репозитории чтобы мы поместили здесь ссылку на форк.
composer require arrilot/bitrix-hermitage
Данный пакет предоставляет простоё и удобное API для работы с сущностями Битрикса через эрмитаж (режим правки)
Поддерживает:
- Добавление, изменение, удаление элементов инфоблоков (есть в коробке Битрикса, но встроенное АПИ слишком перенагружено)
- Добавление, изменение, удаление разделов инфоблоков (есть в коробке Битрикса, но встроенное АПИ слишком перенагружено)
- Изменение, удаление элементов хайлоад блоков (нет в коробке Битрикса)
// Без пакета
foreach($arResult["ARTICLES"] as $article) {
$arButtons = CIBlock::GetPanelButtons(
$article["IBLOCK_ID"],
$article["ID"],
0,
array("SECTION_BUTTONS" => false, "SESSID" => false)
);
$article["EDIT_LINK"] = $arButtons["edit"]["edit_element"]["ACTION_URL"];
$article["DELETE_LINK"] = $arButtons["edit"]["delete_element"]["ACTION_URL"];
$areaId = 'iblock_element_' . $advice['ID'];
$this->AddEditAction($areaId, $article['EDIT_LINK'], CIBlock::GetArrayByID($element["IBLOCK_ID"], "ELEMENT_EDIT"));
$this->AddDeleteAction($areaId, $article['DELETE_LINK'], CIBlock::GetArrayByID($element["IBLOCK_ID"], "ELEMENT_DELETE"), array("CONFIRM" => 'Вы уверены, что хотите удалить элемент?'));
?><div id="<?=$this->GetEditAreaID($areaId)?>"><?= $article['NAME'] ?></div><?
}
// с пакетом
use Arrilot\BitrixHermitage\Action;
foreach($arResult["ARTICLES"] as $article) {
?><div id="<?= Action::editAndDeleteIBlockElement($this, $article) ?>"><?= $article['NAME'] ?></div><?
}
Аналогично с разделами инфоблоков и элементами highload блоков.
Action::editAndDeleteIBlockElement($template, $element);
Action::editIBlockElement($template, $element);
Action::deleteIBlockElement($template, $element, $confirm = 'Вы уверены, что хотите удалить элемент?');
Action::editAndDeleteIBlockSection($template, $section);
Action::editIBlockSection($template, $section);
Action::deleteIBlockSection($template, $section, $confirm = 'Вы уверены, что хотите удалить раздел?');
Action::editAndDeleteHLBlockElement($template, $element);
Action::editHLBlockElement($template, $element);
Action::deleteHLBlockElement($template, $element, $confirm = 'Вы уверены, что хотите удалить элемент?');
Все эти методы возвращают строку которую надо вставить в id нужного html тэга.
Кнопки добавления в эрмитаже реализуются по-другому. Им не нужно указывать конкретный html блок, вместо этого они цепляются ко всему компоненту сразу.
// Без пакета
if($APPLICATION->GetShowIncludeAreas()) {
$arButtons = CIBlock::GetPanelButtons($iblockId, 0, 0, [...]);
$this->addIncludeAreaIcons(CIBlock::GetComponentMenu($APPLICATION->GetPublicShowMode(), $arButtons));
}
// С пакетом
\Arrilot\BitrixHermitage\Action::addForIBlock($this, $iblockId, [...]);
// В отличии от варианта выше, данный метод можно вызывать как в компоненте, так и в шаблоне. Он понимает и то, и другое в качестве первого параметра.
Массив опций [...]
полностью соответствует массиву $arOptions
метода CIBlock::GetPanelButtons
Например, передав в него 'SECTION_BUTTONS' => false
можно отключить показ кнопки добавления раздела, а передав 'CATALOG'=>true
включить работу с модулем каталога.
В простейшем случае этот параметр можно и вовсе опустить.
$element
и $section
это массивы (либо объекты реализующие интерфейс ArrayAccess
)
Для инфоблоков они должны содержать ID
и IBLOCK_ID
.
Для хайлоадблокрв они должны содержать ID
и HLBLOCK_ID
/HLBLOCK_TABLE_NAME
.
Также для инфоблоков в качестве $element
и $section
можно передать просто ID элемента или раздела инфоблока. В этом случае будут доп запросы в БД, но выполнены они будут только в режиме правки.
Замечание Если вы для хайлоадблоков используете
eloquent
изarrilot/bitrix-models
, то стоит добавить следующий метод в модель:
public function getHlblockIdAttribute()
{
return 1; // поменять на нужный идентификатор
}