Розробка кастомного пакета Umbraco
Уявіть: вам потрібен Property Editor, який відображає матрицю кольорів для бренд-стилів. Стандартний текстовий редактор не справляється, а готовий пакет з NuGet або відсутній, або не оновлювався з минулої версії Umbraco. Вихід — розробити власний кастомний пакет Umbraco, який ідеально вписується у вашу екосистему. Ми спеціалізуємося на розробці Umbraco-пакетів: від простих Property Editors до повноцінних секцій Backoffice з міграціями БД. Кастомний пакет — це NuGet-збірка, яка розширює ядро CMS через Composer-паттерн. Він включає сервіси, Notification Handlers, нові типи властивостей, дашборди та API-контролери. Ми маємо багаторічний досвід і накопичили бібліотеку типових рішень, але кожен новий проект унікальний. Якщо у вас є специфічні вимоги до введення даних — найімовірніше, знадобиться кастомний редактор. Згідно з офіційною документацією Umbraco, усі пакети мають реєструватися через IComposer, що гарантує коректну інтеграцію з ядром. Замовте розробку кастомного пакета — і ви отримаєте рішення, яке точно відповідає вашим завданням. Нещодавно ми реалізували 8 кастомних пакетів для Umbraco 13+.
Які проблеми вирішуємо
- Нестандартні Property Editors. Візуальні конструктори, карти з координатами, Color Matrix. Стандартні редактори (текст, число, список) не покривають потреби редакторів контенту. За статистикою наших проектів, кожен другий клієнт стикається з таким завданням.
- Інтеграція з зовнішніми сервісами. Синхронізація каталогів з CRM, отримання даних по API. Без кастомного пакета доводиться дублювати логіку в кожному проекті, що збільшує час розробки на 30–50%.
- Міграції даних. Ідемпотентні міграції для оновлення схеми БД без втрати даних — при перенесенні контенту з іншої CMS або додаванні нових полів.
- Кастомні секції Backoffice. Ізольовані розділи для керування специфічним функціоналом, наприклад, статистикою публікацій або A/B-тестами.
Чому кастомний пакет вигідніший за готовий?
Готові пакети часто перевантажені зайвими залежностями та потребують доопрацювання під вашу версію Umbraco. Кастомний — легкий, створюється під ваші точні завдання. Наприклад, Property Editor Color Matrix, написаний з нуля, обробляє дані вдвічі швидше за аналог з NuGet завдяки відсутності обв'язки. Крім того, кастомний пакет скорочує витрати на ліцензування зовнішніх рішень на 40–60%, а економія бюджету розробки за рахунок повторного використання сервісів сягає 30%. Ви отримуєте повний контроль над кодом і безпекою — це критично для проектів, що обробляють персональні дані (GDPR, 152-ФЗ). В одному з наших кейсів пакет для керування промо-акціями скоротив час публікації кампаній з 3 годин до 15 хвилин.
| Параметр | Готовий пакет | Кастомний пакет |
|---|---|---|
| Гнучкість | Обмежена функціоналом | Повна кастомізація |
| Залежності | Багато зайвих | Тільки потрібні |
| Оновлення | Залежать від автора | Ви керуєте версіями |
Як розробити пакет Umbraco з нуля?
Стандартний підхід: створюємо .NET-бібліотеку, реєструємо компоненти через IComposer. Точка входу — клас, що реалізує IComposer. Типова структура проекту включає папки Composers, Services, Models, Migrations, NotificationHandlers та статичні активи в App_Plugins.
Composer — точка входу
// Composers/MyPackageComposer.cs
using Umbraco.Cms.Core.Composing;
using Umbraco.Cms.Core.DependencyInjection;
using Umbraco.Cms.Core.Migrations;
using Umbraco.Cms.Core.Notifications;
using Umbraco.Cms.Infrastructure.Migrations.Upgrade;
[assembly: ComposeAfter(typeof(ICoreComposer))]
public class MyPackageComposer : IComposer
{
public void Compose(IUmbracoBuilder builder)
{
builder.Services.AddSingleton<IMyService, MyService>();
builder.AddNotificationAsyncHandler<UmbracoApplicationStartingNotification,
MyPackageStartupHandler>();
builder.AddNotificationHandler<ContentPublishedNotification,
ContentPublishedHandler>();
builder.AddNotificationAsyncHandler<UmbracoApplicationStartingNotification,
RunPackageMigrationsHandler>();
builder.PropertyEditors().Add<MyCustomPropertyEditor>();
}
}
Міграція бази даних
// Migrations/AddMyTableMigration.cs
using Umbraco.Cms.Infrastructure.Migrations;
public class AddMyTableMigration : MigrationBase
{
public AddMyTableMigration(IMigrationContext context) : base(context) { }
protected override void Migrate()
{
if (!TableExists("MyPackageData"))
{
Create.Table<MyPackageDataDto>().Do();
}
else
{
// ідемпотентне додавання колонки
if (!ColumnExists("MyPackageData", "ExtraField"))
{
Alter.Table("MyPackageData")
.AddColumn("ExtraField")
.AsString(512)
.Nullable()
.Do();
}
}
}
}
Кастомний тип властивості
// Property Editor — серверна частина
[DataEditor(
alias: "MyPackage.ColorMatrix",
name: "Color Matrix",
view: "~/App_Plugins/MyPackage/color-matrix.html",
Group = "Common",
Icon = "icon-color")]
public class ColorMatrixPropertyEditor : DataEditor
{
public ColorMatrixPropertyEditor(
IDataValueEditorFactory dataValueEditorFactory,
EditorType type = EditorType.PropertyValue)
: base(dataValueEditorFactory, type) { }
protected override IConfigurationEditor CreateConfigurationEditor()
=> new ColorMatrixConfigurationEditor();
}
NuGet-пакет
<!-- MyPackage.Core.csproj -->
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<PackageId>MyCompany.UmbracoMyPackage</PackageId>
<Version>1.0.0</Version>
<Authors>MyCompany</Authors>
<PackageRequireLicenseAcceptance>false</PackageRequireLicenseAcceptance>
<Description>Custom package for Umbraco 13+</Description>
<PackageTags>umbraco;cms;plugin</PackageTags>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Umbraco.Cms.Core" Version="13.*" />
</ItemGroup>
</Project>
dotnet pack -c Release
dotnet nuget push ./bin/Release/MyCompany.UmbracoMyPackage.1.0.0.nupkg \
--source https://api.nuget.org/v3/index.json \
--api-key $NUGET_API_KEY
Типові помилки при створенні кастомних пакетів
- Неідемпотентні міграції. Забувають перевіряти існування таблиць/колонок — пакет падає при повторному запуску. Використовуйте
if (!TableExists(...)). - Пропуск реєстрації в Composer. Код не підхоплюється Umbraco без виклику
builder.Services.Add...у Composer. - Жорстка прив'язка до версії. Використовуйте версійні аліаси та conditional compilation для підтримки кількох версій.
- Ігнорування кешування. Часто запитують дані з БД на кожен запит — застосуйте кешування з
IAppCache.
Процес роботи
- Аудит. Ви описуєте завдання, ми уточнюємо вимоги та оцінюємо складність.
- Проектування. Складаємо архітектуру: які Composer-и, міграції, View-компоненти потрібні.
- Реалізація. Пишемо код, включаючи тести (unit + integration для міграцій).
- Збірка та тестування. Збираємо NuGet-пакет, встановлюємо на чисту Umbraco, перевіряємо сумісність.
- Передача. Вихідний код на Git, пакет, документація та інструкція.
- Підтримка. Виправлення помилок і консультації протягом 30 днів.
Порівняння компонентів
| Тип компонента | Складність | Типовий термін |
|---|---|---|
| Property Editor | Середня | 2–4 дні |
| Dashboard | Низька | 1–3 дні |
| Section | Висока | 5–7 днів |
| Tree | Середня | 3–5 днів |
| Composer | Низька | 1–2 дні |
Що входить у розробку
- Вихідний код з коментарями
- Зібраний NuGet-пакет
- Документація: опис встановлення, конфігурації, API
- Unit-тести для ключових компонентів
- Інструкція з оновлення пакета
- Підтримка 30 днів
Терміни орієнтовно
- Простий пакет (сервіс + Composer + міграція): 3–5 днів.
- Пакет з кастомним типом властивості, дашбордом і API-контролером: 1–2 тижні.
- З тестами, документацією та підтримкою кількох версій Umbraco: 3–4 тижні.
Точні терміни розраховуємо індивідуально після оцінки завдання. Замовте розробку кастомного пакета — зв'яжіться з нами, опишіть проект. Отримайте попередній розрахунок і консультацію.
Додаткові матеріали: NuGet — офіційний репозиторій пакетів .NET, .NET SDK — інструмент для збірки та публікації.







