Добавление кастомных полей элемента инфоблока
Артем Житник
Допустим, нужно отдать хитрое поле, содержащее данные других полей по какой-то логике. Для этих целей используем событие модуля OnAddIblockElementCustomFields. Например, в init.php добавляем:
use Bitrix\Main\{Event, EventManager};
use Rbx\GraphQL\Type\{Iblock, Main};
EventManager::getInstance()->addEventHandler(
"rbx.graphql",
"OnAddIblockElementCustomFields",
/**
* @param Event $event
* @return array[][]|void
*/
function (Event $event) {
$params = $event->getParameters();
// Кастомное поле добавляется только для элемента инфоблока Блог
if ($params["QUERY_TYPE_NAME"] != "IblockBlogElement") {
return;
}
return [
"NAME" => "customField", // Имя поля обязательно в camel-case, не должно совпадать с именами стандартных полей
"TYPE" => Main\TypeRegistry::nonNull(Main\TypeRegistry::string()),
"DESCRIPTION" => "Описание моего кастомного поля", // Описание поля для документации, задавать не обязательно
"RESOLVE" => function ($iblockElementId) {
// Отложенная загрузка данных с использованием буфера для сокращения количества запросов к базе данных
return Iblock\IblockElementBuffer::getInstance()->getDeferred(
[$iblockElementId, "ID"],
// В этой функции непосредственно реализуется логика кастомного поля
// В $element содержатся стандартные поля элемента инфоблока: NAME, CODE, ID и т.д.
function ($element) {
return $element["NAME"] . "#" . $element["CODE"] . "#" . $element["ID"];
}
);
}
];
}
);
По комментариям, надеюсь, все должно быть понятно. В результате, мы получаем возможность запросить созданное поле через API:
# Запрос
{
iblock {
blog {
getElement (id: 47){
name
customField
}
}
}
}
# Ответ
{
"data": {
"iblock": {
"blog": {
"getElement": {
"name": "Новый",
"customField": "Новый#novyy#47"
}
}
}
}
}
Битрикс
GraphQL API модуль для Битрикс
GraphQL