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

22.01.2018
19806

Доброго времени суток, дорогие друзья! Сегодня мы с вами будем расширять дефолтную модель товара 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) и вы увидите только сделанные поля.

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

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

0 Число голосов: 18
4
5
1
18

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

  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. Но все равно ошибка как у вас вылезает. Подключил рекомендуемым способом.
                2. Павел 31 октября 2018, 14:24(Комментарий был изменён) # 0
                  А как сделать чтобы над новыми полями был текст?Ну названия полей.
                  1. Павел 31 октября 2018, 14:54 # 0
                    И еще любопытно как сделать просто поле для текста?
                    1. Павел 31 октября 2018, 17:10 # 0
                      всё нашел)))
                      1. malishbob 04 февраля 2019, 12:49 # 0
                        Доброго времени суток!Сделал все как описано. Но после обновления страницы товара в админке слетают все поля на значение по умолчанию. Не пойму из-за чего
                        1. malishbob 04 февраля 2019, 12:57 # 0
                          Ответ нашел. Название поля в базе не совпадало с полем прописанным в файлах плагина.
                        2. Ирина 09 февраля 2019, 16:40 # 0
                          Есть ли возможность добавления поля с загрузкой файла от покупателя?
                          1. Роман 15 апреля 2019, 16:01 # 0
                            А возможно ли сделать просто кнопку?
                            1. Тодор 23 октября 2019, 13:31(Комментарий был изменён) # 0
                              Посто оставлю здесь: Файл со всеми полями miniShop2-а и типы этих полей assets/components/minishop2/js/mgr/product/product.common.js. Файл со всеми комбобоксамы miniShop2-a — assets/components/minishop2/js/mgr/misc/ms2.combo.js
                              1. Михаил 29 января 2020, 11:18 # 0
                                К сожалению как бы я не пытался сделать по этому мануалу. Ни чего так и не заработало… Более простого способа нету???
                                1. frommax 22 февраля 2020, 13:51 # 0
                                  Круто, все работает. Автору спасибо за статью. Только один момент, если вывести плагин avaible в категории товаров в админке, для просты смены статуса товара. То почему то статус товара выводится цифрами (значениями), а не в наличии или нет в наличии.
                                  1. Juler 27 июня 2020, 13:32(Комментарий был изменён) # 0
                                    а возможно ли перекрутить, это поле к msOptionsPrice2, при смене размера менялась не только цена но и это поле месте с ним?
                                    1. Игорь Ч 24 ноября 2020, 16:59 # 0
                                      Для европрайс сделал так:
                                      europrice: {
                                                      xtype: 'minishop2-combo-options',
                                      				name: 'europrice',
                                                      description: '<b>[[+europrice]]</b><br />' + _('ms2_product_europrice_help')
                                                  },
                                      оно в базу несохраняет
                                      1. Игорь Ч 24 ноября 2020, 17:20 # 0
                                        Сделал чтоб писало в БД — но неправиль новсеравно:пишет только одно значчение, а надо чтоб сразу несколько типа так [41,42]
                                      2. Алексей 30 октября 2021, 21:20 # 0
                                        А зачем все так усложнять — смысл создавать плагин, таблички в базе и т.д.? Не проще сделать TV поле к примеру availability (тип чекбокс), Возможные значения: под заказ. а далее уже вывести где нужно например так:
                                        Наличие: {if $_modx->resource.availability}под заказ{else}в наличии{/if}
                                        . Стоит чекбокс на против «под заказ», выводиться в карточке «под заказ», не стоит значит выводиться «в наличии».Либо создать опцию с типом Выпадающий список или Список с авто дополнением, в бить в нее значения, а потом ее вывести:
                                        {'msProductOptions' | snippet : [
                                              'tpl' => 'чанк оформления вывода',
                                              'onlyOptions' => 'name_options'
                                        ]}
                                        Или я что-то не догоняю)
                                        1. Константин Александрович Баранов 10 августа 2022, 17:38 # 0
                                          Алексей приветствую, а как сделать опцию наличие и у всех новых товаров что бы эта опция была «в наличии»?
                                          1. Алексей 21 октября 2023, 23:29 # 0
                                            Значение по умолчанию = 1
                                        2. Олег 01 февраля 2022, 11:43(Комментарий был изменён) # 0
                                          Кто-нибудь реализовывал поля с поведением как, например, размеры или цвета, когда вбиваешь список опций в админке и выводишь их для выбора пользователем? Поле я сделал по вот этотму гайду. В общем то проблема в том, что данные, которые я вбиваю в поле в админке либо не сохраняются, либо рандомно обрезается слово. Данные, которые я вбил в БД отлично выводятся, но не буду же я это делать для каждого товара. Значит данные из админки коряво передаются в БД, либо не передаются вообще. Буду благодарен за любые наводки. Спасибо.
                                          1. Петропавловский Артем 01 февраля 2022, 15:42 # 0
                                            Можете приложить код плагина и показать как поле выглядит в БД?
                                          2. Данил 09 февраля 2024, 08:11 # 0
                                            При обновлении minishop2 будет ли перезаписана база данных? Не затрет ли установка эти данные в базе?

                                            Наши клиенты

                                            Многие компании уже доверяют нам. Будьте в их числе!

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

                                            Контакты

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


                                            Пермь, ул. Крупской 34, офис 510