При внедрении Directus в корпоративную инфраструктуру часто возникает необходимость интеграции с учётными системами: 1С, CRM, складскими базами. Стандартные REST и GraphQL API не всегда покрывают специфику бизнес-логики — нужны нестандартные обработчики событий, кастомные эндпоинты или сложная валидация. Именно здесь помогают кастомные расширения Directus: они позволяют расширить функционал без модификации ядра. Типичный пример: при создании заказа нужно отправить данные в CRM, сгенерировать PDF-счёт и занести запись в лог. Hook-расширение справится с этим за несколько строк TypeScript, а Operation в Flows запустит цепочку действий.
Мы разрабатываем кастомные расширения Directus уже 5+ лет и реализовали 30+ решений для синхронизации с 1С, генерации PDF-отчётов, интеграции с Telegram-ботами. Все расширения пишутся на TypeScript с использованием официального SDK.
Кастомные расширения Directus: типы и примеры кода
Типы расширений
| Тип расширения | Назначение | Пример использования |
|---|---|---|
| Hook | Реагирует на события (создание, обновление) | Синхронизация заказов с CRM |
| Endpoint | Добавляет кастомные API-маршруты | Генерация отчётов в CSV |
| Operation | Шаг для Flows (автоматизация) | Отправка SMS через провайдера |
| Interface | Кастомное поле в админке | Color picker |
| Display | Отображение данных в списке | Карточка с превью |
Сравнение кастомных расширений и готовых плагинов
| Параметр | Кастомное расширение | Готовый плагин |
|---|---|---|
| Адаптация | Под любую бизнес-логику | Ограничен настройками |
| Скорость разработки | 2–5 дней | Мгновенно |
| Совместимость с обновлениями | Полная (через SDK) | Зависит от автора |
| Избыточность | Ненужного кода нет | Часто избыточен |
Как Hook-расширения синхронизируют данные в реальном времени?
Hook-расширения подписываются на события action (после изменения) или filter (до сохранения). В типичном кейсе — при создании заказа отправляем данные в CRM. Код обработчика выглядит так:
// extensions/hooks/lifecycle-events/index.ts
import type { HookExtensionContext } from '@directus/types'
export default ({ action, filter, schedule, init }: HookExtensionContext) => {
action('items.create', async ({ collection, item, accountability }) => {
if (collection === 'orders') {
await fetch(process.env.CRM_WEBHOOK!, {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
event: 'order_created',
orderId: item.id,
total: item.total
})
})
}
})
}Этот код можно дополнить обработкой ошибок и повторной отправкой при сбоях — мы включаем такие сценарии в разработку.
Что такое Endpoint-расширение и как его создать?
Endpoint-расширения позволяют добавить свои маршруты Express. Например, для построения отчёта по продажам с фильтрацией по датам:
// extensions/endpoints/reports/index.ts
import type { EndpointExtensionContext } from '@directus/types'
import { Router } from 'express'
export default (router: Router, { services, getSchema }: EndpointExtensionContext) => {
router.get('/sales', async (req, res) => {
const schema = await getSchema()
const { ItemsService } = services
const ordersService = new ItemsService('orders', { schema, accountability: req.accountability })
const orders = await ordersService.readByQuery({
filter: { status: { _eq: 'completed' } },
fields: ['id', 'total', 'date_created']
})
const totalRevenue = orders.reduce((sum, o) => sum + (o.total || 0), 0)
res.json({ totalOrders: orders.length, totalRevenue })
})
}Мы часто добавляем пагинацию, сортировку и кэширование. Наши эндпоинты проходят нагрузочное тестирование.
Как Operation-расширения автоматизируют бизнес-процессы?
Operation-расширения используются в Flows. Они состоят из двух файлов: серверная логика и UI для построителя Flows.
// extensions/operations/send-sms/index.ts (сервер)
export default {
id: 'send-sms',
handler: async ({ phone, message }, context) => {
const response = await fetch('https://api.sms-provider.com/send', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.SMS_API_KEY}`
},
body: JSON.stringify({ to: phone, text: message })
})
if (!response.ok) throw new Error('SMS failed')
return { sent: true }
}
} // extensions/operations/send-sms/app.ts (UI)
export default {
id: 'send-sms',
name: 'Send SMS',
icon: 'sms',
description: 'Отправить SMS через провайдера',
options: [
{
field: 'phone',
type: 'string',
meta: {
interface: 'input',
required: true
}
},
{
field: 'message',
type: 'text',
meta: {
interface: 'input-multiline',
required: true
}
}
]
} Почему кастомные расширения лучше готовых плагинов?
Готовые плагины часто не соответствуют специфике бизнеса: они либо избыточны, либо не хватает функции. Кастомное расширение пишется точно под задачу. Например, Hook может не только отправить данные в CRM, но и проверить дубликаты, а Endpoint — сгенерировать сложный отчёт с фильтрацией. Вы получаете именно то, что нужно, без лишнего кода.
Наши проекты показывают, что кастомное решение сокращает время на интеграцию в среднем на 40% по сравнению с доработкой готовых плагинов. При этом вероятность сбоев при обновлении снижается на 60%. Для типовых сценариев у нас есть готовые шаблоны — свяжитесь с нами, чтобы получить их.
Этапы разработки расширения под ключ
- Анализ требований (1 день) — интервью с заказчиком, выявление точек интеграции и форматов данных.
- Прототип (1 день) — создание заготовки Hook и тестового эндпоинта, согласование API.
- Разработка (1–3 дня) — написание кода, модульные тесты, интеграция с внешними сервисами.
- Staging (1 день) — развёртывание в тестовом окружении, проверка с реальными данными.
- Документация (0.5 дня) — подробный README, инструкция по установке и конфигурации.
Пример структуры директорий
extensions/
├── hooks/sync-to-crm/
│ ├── index.ts
│ └── package.json
├── endpoints/reports/
│ ├── index.ts
│ └── package.json
Что входит в разработку кастомных расширений
- Исходный код в вашем репозитории (TypeScript, с комментариями).
- Документация по установке, настройке и использованию.
- Тестирование в staging-окружении.
- Гарантия исправления ошибок в течение месяца.
- Консультации по интеграции и дальнейшей поддержке.
Сроки и ориентировочная стоимость
Разработка одного расширения (Hook или Endpoint) занимает от 2 до 4 дней. Комплексный набор из трёх расширений (Hook + Endpoint + Operation) — 3–5 дней. Стоимость рассчитывается индивидуально в зависимости от сложности. Свяжитесь с нами для точной оценки.
Закажите разработку кастомного расширения — получите готовое решение с документацией и гарантией.







