Разработка SEO оптимизированных высокопроизводительных фронтенд приложений на базе 1С-Битрикс.

Добавление кастомных полей элемента инфоблока

Артем Житник

Артем Житник

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

©2022 ReactiveBx работает на «1С-Битрикс: Управление сайтом» и Next.js