Добавление кастомных полей элемента инфоблока
Артем Житник
Допустим, нужно отдать хитрое поле, содержащее данные других полей по какой-то логике. Для этих целей используем событие модуля 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