Shopaholic - создать доп поля Winter CMS и October CMS
Блог

Дополнительные поля для товаров. Плагин Shopaholic

Как написать написать небольшой плагин, при помощи которого можно добавить добавить произвольные поля в Shopaholic? Рассмотрим в этой статье.

Данная статья — это перевод документации по добавлению дополнительных полей в Shopaholic с некоторыми моими приписками. Если вам нужно получить больше информации о том, как добавить новые поля для товаров в Shopaholic, то переходите по этой ссылке.

Создание плагина Winter CMS

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

Чтобы создать плагин дополнительных полей для Shopaholic, нам необходимо выполнить команду

php artisan create:plugin Lovata.Basecode

С помощью данной команды, мы создадим шаблон пустого плагина. После выполнения команды, artisan должен сообщить вам об успешном создании плагина и в папке plugins/lovata вашего проекта должна появиться новая папка с названием «Basecode». Внутри basecode вы увидите папки: lang, updates и файл Plugin.php.

Добавляем новые поля в БД

Теперь нам необходимо добавить в папку updates файл update_table_products_1.php, при помощи которого мы будем добавлять новые поля в БД. В этой статье я покажу как добавлять поля сразу трех типов: текстовое, булиновое (чекбокс) и загрузчик изображений.

Скрипт файла update_table_products_1.php:

<?php namespace Lovata\BaseCode\Updates;

use Schema;
use Illuminate\Database\Schema\Blueprint;
use October\Rain\Database\Updates\Migration;

/**
 * Class UpdateTableProducts1
 * @package Lovata\BaseCode\Updates
 */
class UpdateTableProducts1 extends Migration
{
    const TABLE_NAME = 'lovata_shopaholic_products';
    
    public function up()
    {
        Schema::table(self::TABLE_NAME, function (Blueprint $obTable)
        {
            if (!Schema::hasColumn(self::TABLE_NAME, 'my_field_txt')) {
                $obTable->string('my_field_txt')->nullable();
            }

            if (!Schema::hasColumn(self::TABLE_NAME, 'my_field_checkbox')) {
                $obTable->boolean('my_field_checkbox')->default(0);
            }

            if (!Schema::hasColumn(self::TABLE_NAME, 'my_field_image')) {
                $obTable->string('my_field_image')->nullable();
            }
        });
    }

    public function down()
    {
        Schema::table(self::TABLE_NAME, function (Blueprint $obTable)
        {
            if (Schema::hasColumn(self::TABLE_NAME, 'my_field_txt')) {
                $obTable->dropColumn(['my_field_txt']);
            }

            if (Schema::hasColumn(self::TABLE_NAME, 'my_field_checkbox')) {
                $obTable->dropColumn(['my_field_checkbox']);
            }

            if (Schema::hasColumn(self::TABLE_NAME, 'my_field_image')) {
                $obTable->dropColumn(['my_field_image']);
            }
        });
    }
}

Как видите, в скрипте я проверяю есть ли уже определенный столбец в БД, например, my_field_txt со значением string, и если его нет, то добавляю данный столбец. Также в скрипте я задал имена новым столбцам: my_field_txt, my_field_checkbox и my_field_image. При желании, вы можете изменить их на свои.

После того, как мы добавили скрипт в файл update_table_products_1.php добавляем в файл version.yaml информацию о первых изменениях плагина:

1.0.0:
    - 'Initialize plugin.'
    - update_table_products_1.php

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

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

php artisan plugin:refresh Lovata.BaseCode

Данная команда перезапустит плагин BaseCode, обновит миграции в БД и в таблице lovata_shopaholic_products появятся новые столбцы.

Добавляем поля в админку

Прежде чем добавить новые поля в админку, нам необходимо создать папки classes/event/product/ и поместить в последнюю файл под названием ExtendProductFieldsHandler.php. Скрипт, который добавит поля:

<?php namespace Lovata\BaseCode\Classes\Event\Product;

use Lovata\Toolbox\Classes\Event\AbstractBackendFieldHandler;

use Lovata\Shopaholic\Models\Product;
use Lovata\Shopaholic\Controllers\Products;

/**
 * Class ExtendProductFieldsHandler
 * @package Lovata\BaseCode\Classes\Event\Product
 */
class ExtendProductFieldsHandler extends AbstractBackendFieldHandler
{
    /**
     * Extend field
     * @param \Backend\Widgets\Form $obWidget
     */
    protected function extendFields($obWidget)
    {
        $arAdditionFields = [
            'my_field_txt' => [
                'label'   => 'Текстовое поле',
                'tab'     => 'lovata.toolbox::lang.tab.settings',
                'type'    => 'text',
            ],
            'my_field_checkbox' => [
                'label'   => 'Чекбокс',
                'tab'     => 'lovata.toolbox::lang.tab.settings',
                'type'    => 'checkbox',
            ],
            'my_field_image' => [
                'label' => 'Фото',
                'tab'     => 'lovata.toolbox::lang.tab.settings',
                'type' => 'mediafinder',
                'mode' => 'image',
                'useCaption' => true,
            ],
        ];

        $obWidget->addTabFields($arAdditionFields);
    }

    /**
     * Get model class name
     * @return string
     */
    protected function getModelClass() : string
    {
        return Product::class;
    }

    /**
     * Get controller class name
     * @return string
     */
    protected function getControllerClass() : string
    {
        return Products::class;
    }
}

В label мы указываем, как вы уже поняли, название поля в админке, в type — тип поля (text, checkbox или image). А в tab указываем в какой из трех табов нужно поместить новое поле: в таб «настройки», «описание» или «изображения». В данном примере я поместил все три поля в таб настроек.

lovata.toolbox::lang.tab.settings

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

Поместить поле в таб «описание»

lovata.toolbox::lang.tab.description

Поместить поле в таб «изображения»

lovata.toolbox::lang.tab.images

Теперь нам осталось внести некоторые изменения в файл Plugin.php и наши доп поля появятся в админке. Добавляем слушатель событий:

<?php namespace Lovata\BaseCode;

use Event;
use Lovata\BaseCode\Classes\Event\Product\ExtendProductFieldsHandler;


public function boot()
{
    Event::subscribe(ExtendProductFieldsHandler::class);
}

После внесенных изменений ваш Plugin.php должен выглядеть следующим образом:

<?php namespace Lovata\Basecode;

use Backend;
use Backend\Models\UserRole;
use System\Classes\PluginBase;

use Event;
use Lovata\BaseCode\Classes\Event\Product\ExtendProductFieldsHandler;

/**
 * Basecode Plugin Information File
 */
class Plugin extends PluginBase
{
    /**
     * Returns information about this plugin.
     */
    public function pluginDetails(): array
    {
        return [
            'name'        => 'lovata.basecode::lang.plugin.name',
            'description' => 'lovata.basecode::lang.plugin.description',
            'author'      => 'Lovata',
            'icon'        => 'icon-leaf'
        ];
    }

    /**
     * Register method, called when the plugin is first registered.
     */
    public function register(): void
    {

    }

    /**
     * Boot method, called right before the request route.
     */
    public function boot(): void
    {
        Event::subscribe(ExtendProductFieldsHandler::class);
    }

    /**
     * Registers any frontend components implemented in this plugin.
     */
    public function registerComponents(): array
    {
        return []; // Remove this line to activate

        return [
            'Lovata\Basecode\Components\MyComponent' => 'myComponent',
        ];
    }

    /**
     * Registers any backend permissions used by this plugin.
     */
    public function registerPermissions(): array
    {
        return []; // Remove this line to activate

        return [
            'lovata.basecode.some_permission' => [
                'tab' => 'lovata.basecode::lang.plugin.name',
                'label' => 'lovata.basecode::lang.permissions.some_permission',
                'roles' => [UserRole::CODE_DEVELOPER, UserRole::CODE_PUBLISHER],
            ],
        ];
    }

    /**
     * Registers backend navigation items for this plugin.
     */
    public function registerNavigation(): array
    {
        return []; // Remove this line to activate

        return [
            'basecode' => [
                'label'       => 'lovata.basecode::lang.plugin.name',
                'url'         => Backend::url('lovata/basecode/mycontroller'),
                'icon'        => 'icon-leaf',
                'permissions' => ['lovata.basecode.*'],
                'order'       => 500,
            ],
        ];
    }
}

На этом все. После того, как вы проделаете все вышеописанное, в админке у вас должны появиться дополнительные поля у товаров. Также вы можете настроить кеширование полей, фильтры и проч. Как это сделать описано у автора плагина Shopaholic в документации.

Другие статьи
Ссылка скопирована


Спасибо, ваша заявка отправлена!
В ближайшее время с вами свяжусь.