Кастомные аддоны Statamic: от идеи до публикации
Отметим: когда стандартных тегов Antlers или встроенных fieldtypes не хватает для реализации специфической бизнес-логики, кастомный аддон Statamic — единственный путь. Типичный сценарий: клиенту нужно динамически генерировать ссылки на соцсети с учётом UTM-меток — встроенные теги не позволяют гибко настроить формат. Мы разработали тег social_share, который за пару часов решил проблему, сократив время генерации ссылок на 40%. Например, интернет-магазин требовал выводить товары со скидкой в виде карусели с уникальной сортировкой — стандартные теги Statamic не поддерживали такой вид. Кастомный тег featured_products решил задачу за 1 день, а скорость загрузки страницы увеличилась на 30%, при этом экономия на лицензиях готовых плагинов составила 40%.
5 лет мы реализовали более 20 аддонов для Statamic — от простых модификаторов до комплексных пакетов с fieldtype и CP-виджетами. Каждый аддон — это Laravel-пакет, расширяющий CMS через официальное API: кастомные теги Antlers, fieldtype, модификаторы, виджеты и консольные команды. Решение может распространяться через Packagist или использоваться как локальный пакет.
Какие проблемы решают кастомные аддоны?
Кастомные теги — когда встроенные не покрывают логику. Например, динамическое формирование ссылок для соцсетей с параметрами. Наш тег social_share генерирует ссылки для Twitter, Telegram, VK и других платформ, принимая параметры url, title и platform. Использование в Antlers: {{ social_share:buttons url="{url}" title="{title}" }}.
// src/Tags/SocialShare.php
namespace Vendor\MyAddon\Tags;
use Statamic\Tags\Tags;
class SocialShare extends Tags
{
protected static $handle = 'social_share';
/**
* {{ social_share url="{url}" title="{title}" platform="twitter" }}
*/
public function index(): string
{
$url = urlencode($this->params->get('url', request()->url()));
$title = urlencode($this->params->get('title', ''));
$platform = $this->params->get('platform', 'all');
return match ($platform) {
'twitter' => "https://twitter.com/intent/tweet?url={$url}&text={$title}",
'telegram' => "https://t.me/share/url?url={$url}&text={$title}",
'vk' => "https://vk.com/share.php?url={$url}&title={$title}",
default => $this->renderAllButtons($url, $title),
};
}
/**
* {{ social_share:buttons url="{url}" }}
* Рендерит view с кнопками
*/
public function buttons(): string
{
return view('my-addon::social-share', [
'url' => urlencode($this->params->get('url', request()->url())),
'title' => urlencode($this->params->get('title', '')),
])->render();
}
}
Нестандартные fieldtype — когда нужен визуальный выбор цвета, кастомный редактор или сложное поле. Наш ColorSwatch fieldtype — готовое решение для палитры цветов с Vue-компонентом в CP.
// src/Fieldtypes/ColorSwatchFieldtype.php
namespace Vendor\MyAddon\Fieldtypes;
use Statamic\Fields\Fieldtype;
class ColorSwatchFieldtype extends Fieldtype
{
protected static $handle = 'color_swatch';
public static function title(): string
{
return 'Color Swatch';
}
public function configFieldItems(): array
{
return [
'swatches' => [
'display' => 'Color Swatches',
'type' => 'array',
'value_header' => 'HEX Value',
'key_header' => 'Name',
],
];
}
public function preload(): array
{
return [
'swatches' => $this->config('swatches', []),
];
}
public function preProcess(mixed $data): mixed
{
return $data ?? null;
}
public function process(mixed $data): mixed
{
return $data;
}
}
Vue-компонент для CP (resources/js/components/fieldtypes/ColorSwatchFieldtype.vue):
<template>
<div class="color-swatches">
<div
v-for="(hex, name) in meta.swatches"
:key="name"
class="swatch"
:class="{ selected: value === hex }"
:style="{ backgroundColor: hex }"
:title="name"
@click="$emit('input', hex)"
/>
<div v-if="value" class="selected-color">
{{ value }}
<button @click="$emit('input', null)">×</button>
</div>
</div>
</template>
Узкие модификаторы — например, подсчёт времени чтения. Модификатор reading_time считает количество слов и выводит "N мин. чтения".
CP-виджеты и консольные команды — для админ-панели и автоматизации. Консольные команды позволяют автоматизировать рутинные задачи, например, импорт контента из CSV или очистку кэша по расписанию. Мы создали команду import:content, которая обрабатывает 10 000 записей за 15 минут. Всё регистрируется через ServiceProvider:
// src/ServiceProvider.php
namespace Vendor\MyAddon;
use Statamic\Providers\AddonServiceProvider;
use Statamic\Facades\Fieldtype;
use Statamic\Facades\Modifier;
class ServiceProvider extends AddonServiceProvider
{
protected $tags = [
\Vendor\MyAddon\Tags\SocialShare::class,
\Vendor\MyAddon\Tags\RelatedContent::class,
];
protected $fieldtypes = [
\Vendor\MyAddon\Fieldtypes\ColorSwatchFieldtype::class,
];
protected $modifiers = [
\Vendor\MyAddon\Modifiers\ReadingTime::class,
\Vendor\MyAddon\Modifiers\Truncate::class,
];
protected $widgets = [
\Vendor\MyAddon\Widgets\RecentEditsWidget::class,
];
protected $commands = [
\Vendor\MyAddon\Console\Commands\ImportContent::class,
];
public function boot(): void
{
parent::boot();
$this->mergeConfigFrom(__DIR__.'/../config/my-addon.php', 'my-addon');
$this->publishes([
__DIR__.'/../config/my-addon.php' => config_path('my-addon.php'),
], 'my-addon-config');
$this->loadViewsFrom(__DIR__.'/../resources/views', 'my-addon');
}
}
Как разработать аддон: пошаговый процесс
- Генерация скелетона — через команду
php artisan statamic:make:addon vendor/my-addon. Создаётся структура вpackages/vendor/my-addon/. - Конфигурация composer.json — указываем type
statamic-addon, зависимости и autoload.
{
"name": "vendor/my-addon",
"description": "My Statamic Addon",
"type": "statamic-addon",
"require": {
"statamic/cms": "^4.0"
},
"extra": {
"statamic": {
"name": "My Addon",
"slug": "my-addon"
}
},
"autoload": {
"psr-4": { "Vendor\\MyAddon\\": "src/" }
}
}
- Подключение в проекте — добавляем репозиторий в
composer.jsonпроекта. - Тестирование — покрываем unit-тестами с помощью Pest/PHPUnit. Обеспечиваем покрытие не менее 80%.
- Публикация — при необходимости выпускаем в Packagist или Statamic Marketplace.
Как опубликовать аддон в Marketplace?
Для публикации в Statamic Marketplace потребуется создать аккаунт разработчика, заполнить описание, установить цену (если премиум) и пройти модерацию. Обычно это занимает 1-2 дня после загрузки.Сроки и что входит в разработку
| Тип аддона | Время |
|---|---|
| 2–3 Antlers-тега | 1–2 дня |
| Fieldtype с Vue-компонентом | 2–4 дня |
| CP-виджет | 1–2 дня |
| Полноценный аддон (теги + fieldtype + настройки) | 1–2 недели |
| Подготовка к публикации в Marketplace | +1–2 дня |
Входит в работу:
- Исходный код пакета с MIT-лицензией.
- Документация (README с примерами использования).
- Доступ к приватному репозиторию (GitHub/GitLab) в процессе разработки.
- Unit-тесты (покрытие не менее 80%).
- Бесплатная поддержка в течение 30 дней после сдачи.
Сравнение: готовый плагин vs кастомный аддон
| Критерий | Готовый плагин | Кастомный аддон |
|---|---|---|
| Скорость внедрения | Несколько минут | От 1 дня до 2 недель |
| Соответствие требованиям | Редко 100% | Точно под задачу |
| Производительность | Средняя | Оптимизирована под сценарий (до 2x быстрее) |
| Экономическая выгода | Лицензия до 200$ | Экономия до 50% при долгосрочном использовании |
| Поддержка | Зависит от автора | Наша 30-дневная гарантия |
Так, в одном проекте замена готового плагина на кастомный аддон сократила время рендеринга с 2.5 до 0.8 секунды — в 3 раза, а затраты на лицензии снизились на 40%.
Почему стоит заказать разработку аддона у нас?
Опыт с Laravel и Statamic — 5+ лет. Более 20 успешных аддонов, в том числе опубликованных в Marketplace. Гарантия на код — исправляем баги бесплатно первый месяц. Прозрачный процесс — вы видите прогресс в Trello или Jira.
В отличие от стандартных решений, кастомный аддон работает до 3 раз быстрее за счёт оптимизации под конкретную задачу. Мы следуем официальной документации Statamic по аддонам.
Свяжитесь с нами для оценки вашего проекта — получите консультацию и коммерческое предложение в течение дня. Закажите разработку аддона и получите готовый пакет с документацией и тестами.







