Пишем плагин для October CMS

Пишем плагин для October CMS

1009
ПОДЕЛИТЬСЯ

На Хабре уже была публикация о выходе бета-версии OctoberCMS, на этом все закончилось. Русскоязычных материалов по данной CMS не достаточно , потому я решил внести собственный вклад.

Сейчас мы с вами напишем плагин каталога для веб-сайта.

Скажу только, что CMS базирована на фреймворке Laravel, потому у нас есть инструменты для командной строчки artisan, Eloquent ORM, передвижения, что существенно упрощает разработку. Подробнее о том, что эта CMS из себя представляет можно прочесть на официальном веб-сайте.

Установка October CMS
Склонируйте репозиторий, перейдите в папку с проектом и выполните:

$ composer update
Потом в папке app/config/database.php измените опции подключения к базе данных и выполните команду:

$ php artisan october:up #это запустит передвижения
Сейчас можем запустить интегрированный сервер:

$ php artisan serve

Веб-сайт будет доступен по адресу: http://localhost:8000

Создаем плагин
Сделать плагин можно с помощью командной строчки, запустив:

$ php artisan create:plugin iillexial.catalog #где iillexial.catalog — имя создателя и имя плагина
Для этого перейдите в админку http://localhost:8000/backend и укажите обычный логин и пароль admin:admin. Давайте сейчас найдем его. Итак, вот мы сделали плагин.

Перейдем в раздел Settings -> Updates и увидим там наш плагин:

Базисная структура
Базисная структура плагина последующая:

plugins
iillexial
catalog
updates
Plugin.php

Сейчас по порядку:

Plugin.php — базисный файл нашего плагина, в котором будет хранится в информация о нем, имя создателя, описание. Поддерживаемые способы описаны тут, на всех я останавливаться не буду, только на неких, которые мы будем применять. В нем мы будем создавать навигацию для плагина в админке, определять составляющие.

public function pluginDetails()
{
return [
‘name’ => ‘catalog’, //имя плагина
‘description’ => ‘No description provided yet…’, //описание
‘author’ => ‘iillexial’, //создатель
‘icon’ => ‘icon-leaf’ //иконка плагина
];
}
Перечень иконок доступен тут, они употребляются во всем бэкэнде.

Создаем навигацию плагина:
public function registerNavigation()
{
return [
‘catalog’ => [
‘label’ => ‘Каталог’,
‘url’ => Backend::url(‘iillexial/catalog/products’),
‘icon’ => ‘icon-list-alt’,
‘order’ => 500,
‘sideMenu’ => [
‘products’ => [
‘label’ => ‘Продукты’,
‘icon’ => ‘icon-list-alit’,
‘url’ => Backend::url(‘iillexial/catalog/products’),
],
]

]
];
}

Потом, зайдя в админку, мы увидим последующее: Добавьте этот способ в Plugin.php.

Сделаем их: Возник пункт меню нашего плагина, но ничего работать не будет, поэтому что у нас нет ни контроллеров, ни моделей.

Контроллеры и модели
Чтоб сделать контроллер, необходимо выполнить последующую команду:

$ php artisan create:contoller iillexial.catalog Goods #iillexial.catalog Products "путь" к плагину и имя контроллера
Модель:

$ php artisan create:model iillexial.catalog Goods #iillexial.catalog Product "путь" к плагину и имя модели
Так же возник файл передвижения в updates/create_products_table.php. Мы увидим, что возникли две новейших папки: controllers и models.

Чтоб передвижения работали, добавить их пуск в updates/version.yml:

1.0.1:
— Run table migrations
— create_products_table.php
А потом запустить команду:

$ php artisan plugin:refresh iillexial.catalog

На миграциях я останавливаться не буду, так как они точно такие же, как и в Laravel. Единственное, что рекомендую сделать — это добавить в способ up функцию для удаления таблицы, т.е мы приведем способ к такому виду: Она запустит наши передвижения из файла verison.yaml.

public function up()
{
Schema::create(‘iillexial_catalog_products’, function($table)
{
Schema::dropIfExists(‘iillexial_catalog_products’);
$table->engine = ‘InnoDB’;
$table->increments(‘id’);
$table->timestamps();
});
}
Это чтоб не удалять каждый раз таблицы вручную, опосля того как мы внесли конфигурации в структуру БД.

Опосля того, как мы установили нашу миграцию, сделали контроллер и модель, наше меню в админке будет работать и мы увидем такую страничку:

Думаю, тут все понятно, панель справа — это наше sideMenu, которое мы определили в Plugin.php.
При нажатии на New Product мы увидим страничку с созданием продукта для вставки его в БД, но там будет единственное поле — id. На данный момент расскажу, как это поправить и откуда оно берется.

Для каждой модели создается так же папка, в которой есть два файла:

models
product
fields.yaml
columns.yaml
fields.yaml — опции полей, которые мы будем видить при разработке, редактировании записи.
columns.yaml — опции колонок, которые мы будем созидать в админке, в перечне наших записей.

Добавим в нашу миграцию пару полей:

public function up()
{
Schema::create(‘iillexial_catalog_products’, function($table)
{
Schema::dropIfExists(‘iillexial_catalog_products’);
$table->engine = ‘InnoDB’;
$table->increments(‘id’);
$table->string(‘title’);
$table->text(‘description’);
$table->timestamps();
});
}

И опять её запустим:

$ php artisan plugin:refresh iillexial.catalog
Дальше перейдем в models/product/fields.yaml и изменим его:

fields:
title:
label: Заголовок
description:
label: Описание
type: richeditor #обычный wysiwyg редактор

Параметр type — тип нашего поля. Про их можно прочесть тут. Как видите, каждый блок — это новое поле, его имя совпадает с колонкой в базе данных.

Сейчас зайдем в админку в наш плагин, нажмем «New product» и увидим совершенно иную страничку:

Тут тоже все просто, у OctoberCMS есть интегрированный загрузчик файлов, о котором я на данный момент и расскажу. Но что за каталог продуктов без картинок?

Нам же нужна всего одна связь: Но подробнее о всех их в последующей статье. Для того, чтоб применять вложения в нашем плагине, нам необходимо сделать связь в модели. Откроем models/Product.php и найдем массивы, в которых делаются разные связи.

public $attachOne = [];
Либо раз мы желаем прикреплять много файлов, то:

public $attachMany = [];
Возьмем вторую и создадим в ней связь с системной моделью SystemModelsFile:

public $attachMany = [‘attachments’ => [‘SystemModelsFile’]];
Всё, структуру таблицы поменять не нужно. Но нужно добавить возможность прикреплять файлы в fields.yaml:

fields:
title:
label: Заголовок
description:
label: Описание
type: richeditor
attachments:
label: Файлы
type: fileupload

Сохраним файл и обновим страничку сотворения продукта в админке, увидим последующее:

Вот и возникло наша форма с загрузкой файлов.

На этом закончим с админкой, разве что изменим незначительно columns.yaml, чтоб привести в порядок страничку со перечнем наших колонок. Вот и всё. Мудрить там нечего, просто добавим:

columns:
id:
label: ID
searchable: true
title:
label: Заголовок
created_at:
label: Дата сотворения

Сделайте тестовую запись, попытайтесь её отредкатировать, поглядите как это смотрится.

Составляющие
Для этого и есть составляющие. Сейчас нам необходимо научится выводить все это в шаблон на страничках веб-сайта.

Чтоб сделать компонент, необходимо выполнить:

$ php artisan create:component iillexial.catalog Products
В папке с нашим плагином покажется новенькая папка:

plugins/
iillexial/
catalog/
components/
products/ <=== Component partials directory
default.htm <=== Component default markup (optional)
Products.php <=== Component class file
Для начала определим место имен для нашей модели: Создадим способ для получения наших записей из БД. Перейдем в components/Products.php и увидим структуру, слегка родственную с Plugin.php.

use IillexialCatalogModelsProduct;
Потом напишем сам способ:

public function getProducts()
{
return Product::orderBy(‘id’, ‘desc’)->get();
}
Тут всё понятно, с помощью нашей модели мы получаем перечень записей, отсортированных по id.

Всё, на этом создание компонента закончилось, сейчас его необходимо зарегистрировать в Plugin.php.

Для этого сделаем способ и создадим в нем алиас для нашего компонента:

public function registerComponents()
{
return [‘IillexialCatalogComponentsProducts’ => ‘catalog’];
}
На этом закончим разработку бэкэнда для нашего плагина и научимся выводить все это дело на страничках веб-сайта.

Внедрение компонентов
И вставим туда последующий код: Для начала сделаем новейшую страничку веб-сайта в папке /pages/catalog.htm.

url = "/catalog" #url по которому будет доступна наша страничка
[catalog] #говорим что необходимо применять наш компонент
==
{% for product in catalog.getProducts %} <!—Вызывем способ getPosts в нашем компоненте и проходимся циклом по полученынм запиям!—>
<h4>{{ product.title }}</h4> <!—Выводим заголовок!—>
<p>{{ product.description|raw }}</p> <!—Выводим описание!—>
<img src="{{ product.attachments.0.path }}"> <!—Выводим первую картину из наших вложений!—>
{% endfor %}
Дальше перейдем на страничку с каталогом — http://localhost:8000/catalog — и увидим там наши записи.

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

Задавайте вопросцы, предлагайте о чем поведать в последующей статье

Ссылки
Ссылка на репозиторий с плагином
Группа OctoberCMS ВКонтакте
Веб-сайт OctoberCMS habrahabr.ru

НЕТ КОММЕНТАРИЕВ

ОСТАВЬТЕ ОТВЕТ

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.