Плагин товара для miniShop2 MODx Revo

22.01.2018
3171

Доброго времени суток, дорогие друзья! Сегодня мы с вами будем расширять дефолтную модель товара miniShop2 с помощью плагинов. Данный функционал бывает просто необходим, если стандартных полей товара нам не хватает. Чаще всего мы добавляем параметр “Наличие” со значениями да или нет, в данном же мануале мы добавим с вами два поля:

  • Наличие (Да/Нет)
  • Цена в евро

Что ж приступаем! Наверняка, вы знаете, что для того, чтобы расширить стандартную модель товара miniShop2 или изменить ее необходимо написать плагин (плагин имеется ввиду в контексте miniShop2, а не в контексте MODx). Итак, для начала нам необходимо создать 3 файла:

  • core/components/minishop2/plugins/myplugin/index.php
  • core/components/minishop2/plugins/myplugin/msproductdata.map.inc.php
  • assets/components/minishop2/plugins/myplugin/msproductdata.js

Что значит тот или иной файл мы расскажем вам ниже подробнее. Здесь myplugin – это название нашего плагина, вы можете поменять его на свое.

Также нам необходимо создать столбцы в базе данных в таблице [prefix]ms2_products. Сделать вы это можете либо с помощью SQL запросов, либо с помощью phpMyAdmin. Итак, создадим 2 столбца:

  • avaible
  • europrice

Вот так это получилось у меня (скриншот из phpMyAdmin):

MODX Revo - плагин товара miniShop2

index.php

Это основной файл конфигурации нашего плагина. В нем мы прописываем пути до наших остальных двух файлов (обязательно проверьте, чтобы они были верные).


<?php
return array(
    'map' => array(
        'msProductData' => require_once 'msproductdata.map.inc.php',
    ),
    'manager' => array(
        'msProductData' => MODX_ASSETS_URL . 'components/minishop2/plugins/myplugin/msproductdata.js',
    ),
);

Массив ‘map’ – это указатель на файл с картой наших полей, а ‘manager’ – это указатель на JS файл для рендеринга полей в панели администратора.

msproductdata.map.inc.php

Это файл с нашей картой. Она у меня получилась следующая:


<?php
return array(
    'fields' => array (
		'avaible' => 1,
		'europrice' => 0.0
	  ),
    'fieldMeta' => array (
		'avaible' => 
		array (
		  'dbtype' => 'varchar',
		  'precision' => '50',
		  'phptype' => 'integer',
		  'null' => true,
		),
		'europrice' => 
		array (
		  'dbtype' => 'decimal',
		  'precision' => '12,2',
		  'phptype' => 'float',
		  'null' => true,
		  'default' => 0.0,
		),
    )
    ,'indexes' => array(
        'avaible' => 
		array (
		  'alias' => 'avaible',
		  'primary' => false,
		  'unique' => false,
		  'type' => 'BTREE',
		  'columns' => 
		  array (
			'avaible' => 
			array (
			  'length' => '',
			  'collation' => 'A',
			  'null' => false,
			),
		  ),
		),
		'europrice' => 
		array (
		  'alias' => 'europrice',
		  'primary' => false,
		  'unique' => false,
		  'type' => 'BTREE',
		  'columns' => 
		  array (
			'europrice' => 
			array (
			  'length' => '',
			  'collation' => 'A',
			  'null' => false,
			),
		  ),
		),
    )
);

Здесь мы описываем базовые настройки наших новых полей. При составлении данного файла можно ориентироваться на стандартный файл miniShop2 с настройками полей core/components/minishop2/model/minishop2/mysql/msproductdata.map.inc.php. Здесь:

  • fields — значение по-умолчанию для поля
  • fieldMeta — Meta-описание поля. Будьте внимательны.
  • indexes — Индексы. Если поле не является индексным, то здесь его можно не указывать.

msproductdata.js

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

Параметр xtype у полей отвечает за тип отображения (их вы можете посмотреть здесь), поэтому вам нужно просто выбрать тот или иной xtype.

Файл у нас получился следующий:


miniShop2.plugin.pluginname = { //pluginname не изменяем.
    getFields: function(config) {
        return {
			avaible: {
                xtype: 'combo-avaible'
				,name: 'avaible'
				,hiddenName: 'avaible'
                ,description: '<b>[[+avaible]]</b><br />' + _('ms2_product_avaible_help')
            },
            europrice: {
                xtype: 'numberfield',
                decimalPrecision: 2,
                description: '<b>[[+europrice]]</b><br />' + _('ms2_product_europrice_help')
            },
        }
    }
    ,getColumns: function() {
        return {
            avaible: {width:50, sortable:false, editor: {xtype:'combo-avaible', renderer: 'true'}},
            europrice: {width:50, sortable:false, editor: {xtype: 'numberfield'}},        }
    }
};

Если вы внимательно посмотрите на доступные xtype, то нигде не найдете выпадающего списка, его нам нужно будет определить самостоятельно. Внимательный читатель заметит, что в xtype у поля avaible стоит значение 'combo-avaible' – это как раз тот выпадающий список, который нам необходимо определить. Для того, чтобы это сделать, необходимо дописать в конец файла следующий код:


miniShop2.combo.avaible = function(config) {
    config = config || {};
    Ext.applyIf(config,{
        store: new Ext.data.ArrayStore({
            id: 0
            ,fields: ['avaible','display']
            ,data: [
                ['1','В наличии']
                ,['2','Под заказ']
                ,['99','Нет в наличии']
            ]
        })
        ,mode: 'local'
        ,displayField: 'display'
        ,valueField: 'avaible'
    });
    miniShop2.combo.avaible.superclass.constructor.call(this,config);
};
Ext.extend(miniShop2.combo.avaible,MODx.combo.ComboBox);
Ext.reg('combo-avaible',miniShop2.combo.avaible);

Видите, все достаточно просто. Про определение своего выпадающего списка можно почитать в официальной документации к MODx.

Подведем промежуточные итоги:

  1. Мы создали столбцы в БД.
  2. Создали 3 файла, необходимые для работы.

Но поля у нас так и не отображаются! Для того, чтобы они появились необходимо сделать еще 2 шага.

Перевод в словарях.

Для создания переводов перейдем в Управление словарями -> minishop2 -> ru и создадим 2 ключа по шаблону ms2_product_FIELDNAME и 2 ключа по шаблону ms2_product_FIELDNAME_help. Первые 2 это заголовки полей, а другие строки описания.

Вывод полей в товаре

Последний шаг, для которого все это затевалось, это вывести поля в карточке товара. Сделать это можно перейдя в Настройки системы -> minisop2 -> Товар -> Дополнительные поля товара (ms2_product_extra_fields) и добавив в конец через запятую имена наших полей. После этого вы можете открыть карточку товара (возможно, потребуется сброс кеша ctrl+F5) и вы увидите только сделанные поля.

Надеемся данный мануал поможет всем начинающим, спасибо за внимание!

Оцените статью:

Проголосовало: 54

Комментарии (10)

  1. Sergey 15 февраля 2018, 15:44(Комментарий был изменён) # 0
    Как вывести это поле?
    {$avaible}
    выводит значение «1», а нужно название, name не помогает
    1. Петропавловский Артем 15 февраля 2018, 16:02 # 0
      Как-то так:
      {if $avaible==1?}
      	В наличии
      {/if}
      {if $avaible==2?}
      	Под заказ
      {/if}
      {if $avaible==99?}
      	Нет в наличии
      {/if}
      
      1. Sergey 15 февраля 2018, 16:31 # 0
        так не интересно :)))
    2. Алексей 19 мая 2018, 00:21 # 0
      Создал поле в свойствах товара с типом «textfield». Вводишь значение сохраняешь, все хорошо, но после перезагрузки страницы в этом поле появляется запись [object Object] и значение на сайте не выводится.
      1. Андрей 25 июня 2018, 16:54 # 0
        Касательно как раз таки минишопа и тегов товара. Получил сайт в «наследство» на modx revo 2.4.2. Не могу найти теги вообще где прописаны. Нужно изменить банально текст текст с одного на другой а не могу.нашёл чанк Product.tags, а там как поменять то их, не подскажите?
        1. Данил 24 июля 2018, 00:25 # 0
          Добрый день!Весьма странно, т.к. ни у вас на сайте не увидел этих полей в карточке товара, ни сам по данному мануалу не смог добавить себе. Видимо что то упущено.Просьба обратить на это внимание и внести изменения, т.к. тема очень актуальная, а Ваши уроки довольно неплохо дают вохможность стартонуть на данном движкеСпасибо
          1. Test 08 августа 2018, 14:32(Комментарий был изменён) # 0
            Это в php
            'avaible' => array (
            	'dbtype' => 'varchar',
            	'precision' => '255',
            	'phptype' => 'string',
            	'null' => true,
            ),
            
            Это в js
            data: [
            	['<span class="plus">Товар в наличии</span>','Товар в наличии'],
            	['<span class="plus-mini">Осталось мало на складе</span>','Осталось мало на складе'],
            	['<span class="minus">Под заказ</span>','Под заказ']
            ]
            и тогда выводить так
            {$avaible}
            1. Ник 26 августа 2018, 11:51 # 0
              Все сделал как в статье, однако при размещении файлов плагинов в директории minishop2, лог выдает постоянную ошибку:
              (ERROR @ .../core/model/modx/modx.class.php : 1611) [OnMODXInit]
              
              Это при том, что поля в админке появляются и прекрасно работают.При удалении файлов плагинов ошибка исчезает.MODX Revolution 2.6.5-pl
              1. Ник 27 августа 2018, 19:07 # 0
                Сделал только поле наличие (евроцена мне не нужна), подключил плагин более рекомендуемым способом в документации minishop.Еще у вас не хватает запятых в msproductdata.js и msproductdata.map.inc.php. Не знаю насколько это критично.Исправил, все заработало и ошибки нет.
                1. Ник2 13 сентября 2018, 17:48 # 0
                  Не подскажете, где конкретно не хватает запятых? Нашел только одну в файле msproductdata.map.inc.php. Но все равно ошибка как у вас вылезает. Подключил рекомендуемым способом.

                Написать комментарий

                Хотите реализовать проект?

                Контакты

                Напишите нам - мы расскажем вам много интересного!


                614060, Россия, г. Пермь,
                ул. Крупской, д. 34, офис 510.
                +7 (342) 277-43-93