Розробка кастомного аддону Statamic

Наша компанія займається розробкою, підтримкою та обслуговуванням сайтів будь-якої складності. Від простих односторінкових сайтів до масштабних кластерних систем, побудованих на мікро сервісах. Досвід розробників підтверджено сертифікатами від вендорів.

Розробка та обслуговування будь-яких видів сайтів:

Інформаційні сайти або веб-програми
Сайти візитки, landing page, корпоративні сайти, онлайн каталоги, квіз, промо-сайти, блоги, ресурси новин, інформаційні портали, форуми, агрегатори
Сайти або веб-програми електронної комерції
Інтернет-магазини, B2B-портали, маркетплейси, онлайн-обмінники, кешбек-сайти, біржі, дропшиппінг-платформи, парсери товарів
Веб-програми для управління бізнес-процесами
CRM-системи, ERP-системи, корпоративні портали, системи управління виробництвом, парсери інформації
Сайти або веб-програми електронних послуг
Дошки оголошень, онлайн-школи, онлайн-кінотеатри, конструктори сайтів, портали надання електронних послуг, відеохостинги, тематичні портали

Це лише деякі з технічних типів сайтів, з якими ми працюємо, і кожен із них може мати свої специфічні особливості та функціональність, а також бути адаптованим під конкретні потреби та цілі клієнта.

Пропоновані послуги
Показано 1 з 1 послугУсі 2065 послуг
Розробка кастомного аддону Statamic
Складна
~3-5 робочих днів
Часті питання

Наші компетенції:

Етапи розробки
Останні роботи
  • image_website-b2b-advance_0.png
    Розробка сайту компанії B2B ADVANCE
    1262
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1171
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    874
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1094
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    831
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Розробка веб-сайту для компанії ФІКСПЕР
    851

Розробка кастомного додатку Statamic

Додатки Statamic — Laravel-пакети, які розширюють CMS через офіційний API: кастомні теги Antlers, fieldtype-поля, модифікатори, CP-віджети, команди. Розповсюджуються через Packagist або використовуються як локальні пакети.

Створення додатку

php artisan statamic:make:addon vendor/my-addon
# Створює skeleton у packages/vendor/my-addon/
// packages/vendor/my-addon/composer.json
{
  "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 проекту — підключення локального пакету
"repositories": [
  { "type": "path", "url": "packages/vendor/my-addon" }
],

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');
    }
}

Кастомний тег Antlers

// 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}" }}
     * Рендерить вьюшку з кнопками
     */
    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();
    }
}

Використання в Antlers:

{{ social_share:buttons url="{url}" title="{title}" }}

Кастомний Fieldtype

// 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>

Модифікатор Antlers

// src/Modifiers/ReadingTime.php
namespace Vendor\MyAddon\Modifiers;

use Statamic\Modifiers\Modifier;

class ReadingTime extends Modifier
{
    protected static $handle = 'reading_time';

    public function index(string $value, array $params): string
    {
        $wordsPerMinute = (int) ($params[0] ?? 200);
        $wordCount = str_word_count(strip_tags($value));
        $minutes = (int) ceil($wordCount / $wordsPerMinute);

        return $minutes . ' хв читання';
    }
}
{{ content | reading_time:200 }}

Тестування додатку

// tests/Unit/Tags/SocialShareTest.php
use Vendor\MyAddon\Tests\TestCase;

class SocialShareTest extends TestCase
{
    /** @test */
    public function it_generates_twitter_share_url()
    {
        $result = $this->tag('social_share')
            ->params(['url' => 'https://example.com', 'platform' => 'twitter'])
            ->fetch();

        $this->assertStringContainsString('twitter.com/intent/tweet', $result);
        $this->assertStringContainsString(urlencode('https://example.com'), $result);
    }
}

Сроки розробки

Тип додатку Час
2–3 Antlers-тага 1–2 дні
Fieldtype з Vue-компонентом 2–4 дні
CP-віджет 1–2 дні
Повнофункціональний додаток (теги + fieldtype + налаштування) 1–2 тижні
Підготовка до публікації в Marketplace +1–2 дні