Настройка GraphQL API Craft CMS

Наша компания занимается разработкой, поддержкой и обслуживанием сайтов любой сложности. От простых одностраничных сайтов до масштабных кластерных систем построенных на микро сервисах. Опыт разработчиков подтвержден сертификатами от вендоров.
Разработка и обслуживание любых видов сайтов:
Информационные сайты или веб-приложения
Сайты визитки, landing page, корпоративные сайты, онлайн каталоги, квиз, промо-сайты, блоги, новостные ресурсы, информационные порталы, форумы, агрегаторы
Сайты или веб-приложения электронной коммерции
Интернет-магазины, B2B-порталы, маркетплейсы, онлайн-обменники, кэшбэк-сайты, биржи, дропшиппинг-платформы, парсеры товаров
Веб-приложения для управления бизнес-процессами
CRM-системы, ERP-системы, корпоративные порталы, системы управления производством, парсеры информации
Сайты или веб-приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, конструкторы сайтов, порталы предоставления электронных услуг, видеохостинги, тематические порталы

Это лишь некоторые из технических типов сайтов, с которыми мы работаем, и каждый из них может иметь свои специфические особенности и функциональность, а также быть адаптированным под конкретные потребности и цели клиента

Предлагаемые услуги
Показано 1 из 1 услугВсе 2065 услуг
Настройка GraphQL API Craft CMS
Средняя
~2-3 рабочих дня
Часто задаваемые вопросы
Наши компетенции:
Этапы разработки
Последние работы
  • image_website-b2b-advance_0.png
    Разработка сайта компании B2B ADVANCE
    1214
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1161
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    852
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1041
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    823
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Разработка веб-сайта для компании ФИКСПЕР
    815

Настройка GraphQL API Craft CMS

Craft CMS 3.3+ включает встроенный GraphQL API. Доступен по умолчанию на /api или кастомному endpoint. Поддерживает запросы элементов (Entry, Asset, Category, Tag, User), но не мутации (изменение данных через GraphQL не поддерживается нативно).

Включение и настройка

// config/general.php
'enableGraphqlApi' => true,
'maxGraphqlComplexity' => 500,    // ограничение сложности запроса
'maxGraphqlDepth' => 10,          // максимальная глубина вложенности
'maxGraphqlResults' => 100,       // максимальное количество результатов

Токены доступа

В CP → GraphQL → Schemas создаём схему с нужными правами:

  • Public Schema — без авторизации, только публичный контент
  • Private Schema — с токеном, может включать черновики
// Запрос с токеном
fetch('/api', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'Authorization': `Bearer ${process.env.CRAFT_GRAPHQL_TOKEN}`,
  },
  body: JSON.stringify({ query, variables }),
});

Типичные запросы

# Список постов блога
query BlogPosts($limit: Int, $offset: Int) {
  entries(
    section: "blog"
    orderBy: "postDate DESC"
    limit: $limit
    offset: $offset
    status: "live"
  ) {
    id
    title
    slug
    postDate @formatDateTime(format: "d.m.Y")
    url
    ... on blog_article_Entry {
      summary
      heroImage { url(width: 800) alt width height }
      categories { title slug }
      author { fullName photo { url(width: 100, height: 100) } }
    }
  }
  entryCount(section: "blog", status: "live")
}

# Один пост по slug
query BlogPost($slug: String!) {
  entry(section: "blog", slug: [$slug]) {
    ... on blog_article_Entry {
      title
      postDate @formatDateTime(format: "d MMMM Y", locale: "ru")
      pageBody {
        ... on pageBody_richText_BlockType {
          typeHandle
          content
        }
        ... on pageBody_image_BlockType {
          typeHandle
          image { url(width: 1200) alt width height }
          caption
          alignment
        }
        ... on pageBody_codeBlock_BlockType {
          typeHandle
          language
          code
        }
      }
    }
  }
}

Next.js клиент с кэшированием

// lib/craftGraphql.ts
const CRAFT_ENDPOINT = process.env.CRAFT_GRAPHQL_URL!;
const CRAFT_TOKEN = process.env.CRAFT_GRAPHQL_TOKEN!;

async function craftQuery<T>(
  query: string,
  variables?: Record<string, unknown>,
  options?: { revalidate?: number }
): Promise<T> {
  const res = await fetch(CRAFT_ENDPOINT, {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      'Authorization': `Bearer ${CRAFT_TOKEN}`,
    },
    body: JSON.stringify({ query, variables }),
    next: { revalidate: options?.revalidate ?? 3600 },
  });

  const { data, errors } = await res.json();
  if (errors?.length) throw new Error(errors[0].message);
  return data;
}

Inline Fragments для Entry Types

Каждый Entry Type доступен как отдельный тип в GraphQL через паттерн {sectionHandle}_{typeHandle}_Entry:

entries(section: ["blog", "news"]) {
  __typename
  id
  title
  ... on blog_article_Entry {
    summary
    readingTime
  }
  ... on blog_podcast_Entry {
    audioFile { url }
    duration
  }
  ... on news_pressRelease_Entry {
    pdfFile { url }
    companyName
  }
}

Кастомные GraphQL-запросы через плагин/модуль

Встроенный GraphQL только читает данные. Для мутаций используем кастомный REST endpoint:

// modules/sitecustom/controllers/ApiController.php
public function actionSubmitForm(): Response
{
    \Craft::$app->response->headers->add('Content-Type', 'application/json');

    $data = \Craft::$app->request->post();
    // Валидация, создание элемента через Craft API
    $entry = new Entry();
    $entry->sectionId = \Craft::$app->sections->getSectionByHandle('submissions')->id;
    $entry->setFieldValues(['name' => $data['name'], 'email' => $data['email']]);

    if (\Craft::$app->elements->saveElement($entry)) {
        return $this->asJson(['success' => true]);
    }

    return $this->asJson(['errors' => $entry->errors], 422);
}

Настройка GraphQL API с токенами и интеграцией с Next.js — 1–2 дня.