Розробка спеціальних Contentful Apps (розширень)
Contentful Apps — це механізм розширення інтерфейсу редактора через iframe-застосунки, які монтуються у поля, бічні панелі або цілі екрани. Це не просто UI-віджети: через Contentful App SDK застосунок отримує доступ до Entry API, Space API та може запускати App Actions — серверні функції, виконувані в контексті Contentful.
Архітектура Contentful App
Кожен застосунок складається з двох частин: фронтенду (React/Vue/Vanilla JS, розміщений будь-де) та опціонального App Backend (AWS Lambda або будь-який HTTP-endpoint для App Actions та Events). Обидві реєструються в App Definition через Contentful Management API або Web App.
App Definition
├── Locations: field, sidebar, entry-editor, page, home
├── Parameters: instance params (per-field) + installation params (per-space)
└── App Actions: serverless functions callable from UI or API
Типові сценарії:
- Спеціальний field editor — наприклад, колірний пікер, пов'язаний з дизайн-токенами з Figma
- Sidebar extension — панель SEO-аналізу, яка читає поля Entry у реальному часі
- Page location — повноекранний Asset Manager з інтеграцією Cloudinary
- App Actions — генерування AI-описань через OpenAI при збереженні Entry
Розробка Field Extension
Ініціалізація SDK:
import { init, FieldExtensionSDK } from '@contentful/app-sdk';
init((sdk: FieldExtensionSDK) => {
// Читаємо поточне значення поля
const value = sdk.field.getValue();
// Підписуємося на зміни з зовнішніх джерел
sdk.field.onValueChanged((newValue) => {
setFieldValue(newValue);
});
// Оновлюємо значення
sdk.field.setValue({ color: '#ff5500', token: 'brand-primary' });
// Авторесайз iframe під контент
sdk.window.startAutoResizer();
});
Для React-застосунків зручніше @contentful/react-apps-toolkit:
import { useSDK, useFieldValue } from '@contentful/react-apps-toolkit';
const ColorPickerField = () => {
const sdk = useSDK<FieldExtensionSDK>();
const [value, setValue] = useFieldValue<string>();
return (
<ColorPicker
value={value}
onChange={(color) => setValue(color.hex)}
tokens={sdk.parameters.installation.designTokens}
/>
);
};
App Actions (серверна логіка)
App Actions дозволяють запускати серверний код з інтерфейсу Contentful без спеціального бекенду — Contentful проксирує виклик до зареєстрованого endpoint:
// Реєстрація App Action в App Definition (через CMA)
// callType: "request" | "event"
// url: https://your-backend.com/actions/generate-seo
// Виклик з фронтенд-застосунку
const result = await sdk.cma.appAction.callById({
spaceId: sdk.ids.space,
environmentId: sdk.ids.environment,
appDefinitionId: sdk.ids.app,
appActionId: 'generate-seo',
parameters: {
entryId: sdk.ids.entry,
locale: sdk.locales.default,
},
});
На стороні сервера (Node.js/Express):
app.post('/actions/generate-seo', async (req, res) => {
// Верифікуємо підпис Contentful
verifySignature(req.headers['x-contentful-signature'], req.body);
const { entryId, locale } = req.body.parameters;
const entry = await cma.entry.get({ entryId });
const seoData = await openai.chat.completions.create({
model: 'gpt-4o',
messages: [{ role: 'user', content: buildSeoPrompt(entry, locale) }],
});
res.json({ result: { seoTitle: seoData.choices[0].message.content } });
});
Параметри установки та конфігурація
Параметри установки задаються один раз при інсталяції застосунку в Space. Через них передаються API-ключі, токени, конфіги — без hardcode у коді застосунку:
// Екран налаштувань застосунку
const ConfigScreen = () => {
const sdk = useSDK<AppExtensionSDK>();
const [params, setParams] = useState(sdk.parameters.installation);
sdk.app.onConfigure(() => ({
parameters: params,
targetState: {
EditorInterface: {
// Автоматично підключити до полів типу Symbol
controls: [{ fieldId: 'seoTitle', widgetId: sdk.ids.app }],
},
},
}));
};
Збірка та розгортання
Contentful надає CLI для локальної розробки та розгортання:
# Створення нового застосунку за шаблоном
npx create-contentful-app@latest my-app --template typescript
# Локальна розробка з туннелем
npm run start # запускає на localhost:3000
contentful-app-scripts activate # тимчасово реєструє localhost в App Definition
# Розгортання на Contentful-хостинг (безплатно для Apps)
npm run build
contentful-app-scripts upload # загружує dist/ до Contentful CDN
Терміни та обсяг
| Тип розширення | Складність | Час розробки |
|---|---|---|
| Простий field editor (пікер, слайдер) | Низька | 1–2 дні |
| Sidebar з зовнішнім API | Середня | 3–5 днів |
| Page location (повний екран) | Висока | 1–2 тижні |
| App Actions + серверний бекенд | Висока | 1–2 тижні |
| Повнофункціональний застосунок з конфіг-екраном | Висока | 2–3 тижні |
Під час розробки обов'язково покриваємо тестами з @contentful/app-sdk mock-об'єктами та налаштовуємо CI для автоматичного розгортання через contentful-app-scripts upload.







