Розробка кастомного пакета 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 — інструмент для збірки та публікації.







