Как добавить дополнительное поле к заказу в miniShop2

Как добавить дополнительное поле к заказу в miniShop2

В этой статье мы добавим для интернет-магазина на minishop2 дополнительные поля на странице “Оформление заказа”. Мы будем добавлять поле Время доставки (orderTime).

Для начала разберём, что для этого необходимо сделать:

  1. Добавить параметр в системных настройках
  2. Добавить в словарь запись для параметра
  3. Добавляем наше поле в карту базы данных
  4. Добавляем в сниппете msOrder дополнительное поле для вывода поля на странице
  5. Добавляем в чанк сниппета msOrder вывод нашего поля.
  6. Добавляем столбец в базе данных
  7. Добавляем запись в скрипте для вывода нашего поля в админке

Перейдём к реализации описанных пунктов:

1) Переходим в Системные настройки, выбираем minishop2 -> Заказы. Корректируем нужный параметр. В нашем случае это параметр “Поля адреса доставки” (ms2_order_address_fields). Добавляем наше поле.

2) Для добавления записи в словарь, переходим в “Управление словарями”. Выбираем пространство имён — “minishop2”, тему – “default”, язык – “ru”. Создаём запись, имя которой должно состоять из префикса “ms2_frontend_” и название нашего поля (в нашем случае: ms2_frontend_orderTime), значение – текст, который будет отображаться на странице.

3) Для добавления в карту базы данных нашего поля, открываем файл core/components/minishop2/model/minishop2/mysql/msorderaddress.map.inc.php и изменяем его:

    а) Добавляем поле в массив

'fields' => 
  array (
    'user_id' => NULL,
    'createdon' => NULL,
    'updatedon' => NULL,
    'receiver' => NULL,
    'phone' => NULL,
    'country' => NULL,
    'index' => NULL,
    'region' => NULL,
    'city' => NULL,
    'metro' => NULL,
    'street' => NULL,
    'building' => NULL,
    'room' => NULL,
    'comment' => NULL,
    'properties' => NULL,
	'orderTime' => NULL,
  )	
    б) Описываем это поле

'comment' => 
    array (
      'dbtype' => 'text',
      'phptype' => 'string',
      'null' => true,
    ),
    'properties' => 
    array (
      'dbtype' => 'text',
      'phptype' => 'json',
      'null' => true,
    ),
	'orderTime' => 
    array (
      'dbtype' => 'varchar',
      'precision' => '255',
      'phptype' => 'string',
      'null' => true,
    ),	

4) Добавляем в сниппете msOrder дополнительное поле


$fields = array(
    'receiver' => 'fullname',
    'phone' => 'phone',
    'email' => 'email',
    'comment' => 'extended[comment]',
    'index' => 'zip',
    'country' => 'country',
    'region' => 'state',
    'city' => 'city',
    'street' => 'address',
    'building' => 'extended[building]',
    'room' => 'extended[room]',
    'orderTime' => 'orderTime',
);

5) Опишем два способа вывести наше поле на странице “Оформление заказа”. Эти изменения производятся в чанке msOrder:

    а) Вставка кода с нашим плейсхолдером


    <div class="form-group input-parent">
		<label class="col-md-4 control-label" for="[[+orderTpl]]">
		  <span class="required-star">*</span> [[%ms2_frontend_orderTime? &topic=`default` &namespace=`minishop2`]]
		</label>
		<div class="col-sm-6">
		  <input type="text" id="[[+orderTime]]" placeholder="[[%ms2_frontend_orderTime? &topic=`default` &namespace=`minishop2`]]"
		  name="[[+orderTime]]"
		  class="le-input">
		</div>
	</div>

    б) Вывод при помощи шаблонизатора


    {foreach ['index','region','city','orderTime'] as $field}
	  <div class="form-group input-parent">
		<label class="col-md-4 control-label" for="{$field}">
		  <span class="required-star">*</span> {('ms2_frontend_' ~ $field) | lexicon}
		</label>
		<div class="col-sm-6">
		  <input type="text" id="{$field}" placeholder="{('ms2_frontend_' ~ $field) | lexicon}"
		  name="{$field}" value="{$form[$field]}"
		  class="le-input{($field in list $errors) ? ' error' : ''}">
		</div>
	  </div>
	{/foreach}

6) Ищем в базе данных modx таблицу modx_ms2_order_addresses (префикс таблицы (“modx”) может быть другим). Добавляем столбец с именем нашего поля.

    SQL запрос для СУБД MySQL:


	ALTER TABLE `modx_ms2_order_addresses` ADD `orderTime` VARCHAR(255) 
		CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL AFTER `orderTime`;

    Или в phpMyAdmin вручную:

7) Редактируем скрипт для вывода поля в админке.

Путь до скрипта: assets/components/minishop2/js/mgr/orders/orders.window.js

Добавляем поле в нужном месте (в нашем случае это поля адреса):


getAddressFields: function (config) {
        var all = {
            receiver: {},
            phone: {},
            index: {},
            country: {},
            region: {},
            metro: {},
            building: {},
            city: {},
            street: {},
            room: {},
            orderTime: {}
        };
…
}

Смотрим что у нас получилось. На странице Оформить заказ:

В админке:

Радуемся.

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

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

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

  1. Николай 28 апреля 2017, 03:10 # 0
    Отличная статья, все подробно и развернуто. Revo всем хороша, но с доками какая то беда, как новый функционал добавляешь, так приходится все с азов изучать из-за пары дополнительных полей.
    1. Петропавловский Артем 28 апреля 2017, 09:03 # 0
      На самом деле достаточно хорошая у него документация. Конечно, если владеете английским языком. Документация к MODx Revolution
    2. Сергей 01 июня 2017, 21:13 # 0
      Очень нужная информация, спасибо! Всё сделал, как написано в статье, значения поля передаются в админку. Единственно, что это поле в админке не подписано почему-то. Не подскажете, в какую сторону смотреть, где ошибку искать?
      1. Сергей 02 июня 2017, 15:30 # 0
        Разобрался. Может, кому-то пригодится. На 2 шаге запись в словарь добавляем (для данного примера) ms2_orderTime (без _frontend). Такова логика работы скрипта assets/components/minishop2/js/mgr/orders/orders.window.js 178 строка, к ms2_ пристыковывается только имя поля, без _frontend.И на 6 шаге указывал для инпута аттрибут name=«orderTime», то есть просто имя поля, (вместо [[+orderTime]]), так работает.
        1. Максим 08 октября 2017, 14:58 # 0
          У меня, проблема в том, что не добавляет в БД
          1. Stan 15 октября 2017, 22:07 # 0
            После первого обновления miniShop2 всё слетит. Так не делают дополнительные поля к заказу, есть правильный путь.