Разработка кастомного плагина October CMS

Наша компания занимается разработкой, поддержкой и обслуживанием сайтов любой сложности. От простых одностраничных сайтов до масштабных кластерных систем построенных на микро сервисах. Опыт разработчиков подтвержден сертификатами от вендоров.

Разработка и обслуживание любых видов сайтов:

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

Это лишь некоторые из технических типов сайтов, с которыми мы работаем, и каждый из них может иметь свои специфические особенности и функциональность, а также быть адаптированным под конкретные потребности и цели клиента

Предлагаемые услуги
Показано 1 из 1 услугВсе 2065 услуг
Разработка кастомного плагина October CMS
Средняя
~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

Разработка кастомного плагина October CMS

Плагины October CMS — это Laravel-пакеты с регистрацией компонентов, моделей, маршрутов, backend-контроллеров. Один плагин может содержать всю бизнес-логику проекта.

Генерация через Builder

php artisan create:plugin MyCompany.MySite

Структура плагина

plugins/mycompany/mysite/
├── Plugin.php              # регистрация всего
├── composer.json
├── models/
│   ├── Review.php
│   └── Review/
│       ├── columns.yaml    # список в backend
│       └── fields.yaml     # форма редактирования
├── components/
│   └── ReviewList.php
├── controllers/
│   └── Reviews.php         # backend-контроллер
├── views/
│   └── reviews/
│       └── index.htm
├── updates/
│   ├── version.yaml
│   └── 1_0_1_create_reviews_table.php
└── lang/
    ├── en/lang.php
    └── ru/lang.php

Plugin.php — точка регистрации

// Plugin.php
namespace MyCompany\MySite;

use Backend;
use System\Classes\PluginBase;

class Plugin extends PluginBase
{
    public function pluginDetails(): array
    {
        return [
            'name'        => 'My Site',
            'description' => 'Site-specific functionality',
            'author'      => 'My Company',
            'icon'        => 'icon-leaf',
        ];
    }

    public function registerComponents(): array
    {
        return [
            \MyCompany\MySite\Components\ReviewList::class => 'reviewList',
            \MyCompany\MySite\Components\ReviewForm::class => 'reviewForm',
        ];
    }

    public function registerNavigation(): array
    {
        return [
            'mysite' => [
                'label'       => 'My Site',
                'url'         => Backend::url('mycompany/mysite/reviews'),
                'icon'        => 'icon-star',
                'permissions' => ['mycompany.mysite.*'],
                'order'       => 500,
                'sideMenu'    => [
                    'reviews' => [
                        'label'       => 'Reviews',
                        'icon'        => 'icon-comments',
                        'url'         => Backend::url('mycompany/mysite/reviews'),
                        'permissions' => ['mycompany.mysite.reviews'],
                    ],
                ],
            ],
        ];
    }

    public function registerSettings(): array
    {
        return [
            'settings' => [
                'label'       => 'My Site Settings',
                'description' => 'Configure My Site plugin',
                'icon'        => 'icon-cog',
                'class'       => \MyCompany\MySite\Models\Settings::class,
                'order'       => 500,
            ],
        ];
    }

    public function boot(): void
    {
        // Подписка на события
        \Event::listen('cms.page.beforeDisplay', function ($controller, $url, $page) {
            // Логика перед рендером страницы
        });
    }
}

Модель с Eloquent

// models/Review.php
namespace MyCompany\MySite\Models;

use Model;

class Review extends Model
{
    use \October\Rain\Database\Traits\Validation;
    use \October\Rain\Database\Traits\SoftDelete;

    public $table = 'mycompany_mysite_reviews';

    public $rules = [
        'author_name' => 'required|string|max:255',
        'email'       => 'required|email',
        'rating'      => 'required|integer|between:1,5',
        'body'        => 'required|string|min:10',
    ];

    protected $fillable = ['author_name', 'email', 'rating', 'body', 'is_approved'];

    protected $casts = [
        'is_approved' => 'boolean',
        'rating'      => 'integer',
    ];

    public $attachOne = [
        'avatar' => \System\Models\File::class,
    ];

    public $belongsTo = [
        'product' => [\MyCompany\MySite\Models\Product::class],
    ];

    public function scopeApproved($query)
    {
        return $query->where('is_approved', true);
    }

    public function scopeByProduct($query, int $productId)
    {
        return $query->where('product_id', $productId);
    }
}

Компонент

// components/ReviewList.php
namespace MyCompany\MySite\Components;

use Cms\Classes\ComponentBase;
use MyCompany\MySite\Models\Review;

class ReviewList extends ComponentBase
{
    public function componentDetails(): array
    {
        return [
            'name'        => 'Review List',
            'description' => 'Displays product reviews',
        ];
    }

    public function defineProperties(): array
    {
        return [
            'productId' => ['title' => 'Product ID', 'type' => 'string'],
            'limit'     => ['title' => 'Limit', 'type' => 'string', 'default' => '10'],
        ];
    }

    public function onRun(): void
    {
        $this->page['reviews'] = Review::approved()
            ->byProduct((int) $this->property('productId'))
            ->with('avatar')
            ->orderBy('created_at', 'desc')
            ->limit((int) $this->property('limit'))
            ->get();

        $this->page['avgRating'] = Review::approved()
            ->byProduct((int) $this->property('productId'))
            ->avg('rating');
    }

    public function onSubmitReview(): array
    {
        $data = post();
        $review = new Review($data);
        $review->product_id = $this->property('productId');

        if (!$review->save()) {
            throw new \ValidationException($review);
        }

        return ['success' => true];
    }
}

Миграция

// updates/1_0_1_create_reviews_table.php
use October\Rain\Database\Schema\Blueprint;
use October\Rain\Database\Updates\Migration;

class CreateReviewsTable extends Migration
{
    public function up(): void
    {
        Schema::create('mycompany_mysite_reviews', function (Blueprint $table) {
            $table->increments('id');
            $table->integer('product_id')->unsigned()->index();
            $table->string('author_name');
            $table->string('email');
            $table->tinyInteger('rating');
            $table->text('body');
            $table->boolean('is_approved')->default(false);
            $table->timestamps();
            $table->softDeletes();
        });
    }

    public function down(): void
    {
        Schema::dropIfExists('mycompany_mysite_reviews');
    }
}

Разработка плагина с 1–2 моделями, компонентами и backend-интерфейсом — 3–7 дней.