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

25.04.2017
23107
Теги: MODx RevominiShop2

В этой статье мы добавим для интернет-магазина на 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: {}
        };
…
}

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

В админке:

Радуемся.

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

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

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

  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 всё слетит. Так не делают дополнительные поля к заказу, есть правильный путь.
            1. Александр 25 декабря 2017, 16:01 # 0
              Какой? Поделитесь ссылкой.
              1. максим 02 марта 2018, 10:47 # 0
                Если еще актуально https://modx.pro/solutions/10040/
            2. Татьяна 07 июля 2018, 11:31(Комментарий был изменён) # 0
              Здравствуйте, очень нужен ваш совет. Сделала все в соответствии с вашей инструкцией, мое поле в базе заполняется, все норм. Но я не могу его вывести в админке.Никак не получается. Подскажите пожалуйста в чем может быть проблема?PS. поле без _frontend в словарях создала — не помогает.
              1. Петропавловский Артем 07 июля 2018, 11:41 # 0
                Возможно, вы пропустили 7 пункт.
              2. Николай 23 августа 2019, 09:49 # 0
                Сделал все по инструкции, все работает, но не совсем понятно как вместо input вывести textarea, ибо поля выводятся, но данные не передаются, + не совсем понятно как правильно вывести их в админке. Вот пример того, как я вывожу нужные мне поля в самом CartOrder.
                   {foreach ['email','receiver','phone','unp','ur_rec','plat_rec'] as $field}
                      <div class="form-group">
                          <div class="col-sm-12 col-md-12">
                              {if $field =='ur_rec'}
                                 <textarea name="{$field}" id="{$field}" placeholder="{('ms2_frontend_' ~ $field)  | lexicon}"
                class="form-control{($field in list $errors) ? ' error' : ''}">{$field}</textarea>
                               {elseif $field =='plat_rec'}
                                  <textarea name="plat_rec" id="{$field}" placeholder="{('ms2_frontend_' ~ $field) | lexicon}"
                class="form-control{($field in list $errors) ? ' error' : ''}">{$field}</textarea>
                               {else}  
                                 <input type="text" id="{$field}" placeholder="{('ms2_frontend_' ~ $field) | lexicon}"
                name="{$field}" value="{$form[$field]}"
                class="form-control{($field in list $errors) ? ' error' : ''}">
                                   {/if}
                                      <label>
                                   {if $field == 'phone'}
                                       <input type="checkbox"> {('ms2_frontend_help_' ~ $field) | lexicon}
                                   {else}
                                     {('ms2_frontend_help_' ~ $field) | lexicon}
                                   {/if}
                                     </label>
                                       </div>
                                     </div>   
                                   {/foreach}
                
                1. Альгис 19 июня 2020, 16:21 # 0
                  А админке ничего не выводится, все сделал по мануалу, несколько раз перепроверил. В базе при этом инфа добавляется. Мануал актуален?
                  1. Петропавловский Артем 22 июня 2020, 12:21 # 0
                    Мануал актуален, вы что-то упустили.
                  2. Вадим 08 сентября 2020, 22:26 # 0
                    По итогу, чтобы появился label к полю в админке и на странице оформления заказа. В управлении словарями добавил 2 записи:- ms2_orderTime (админка);- ms2_frontend_orderTime (оформление заказа). Перед тестами всегда удалял core/cache. Все работает.
                    1. Сергей 29 марта 2023, 01:11 # 0
                      Большое спасибо за отличную статью, все работает, но мегу вывести в письме менеджеру новые поля, подскажите как?
                      1. Дэн 15 августа 2023, 08:11 # 0
                        При обновлении minishop2 все это затрется. Поэтому лучше не править ядро компонента, а описывать поля плагинами modx, либо плагинами minishop2

                        Наши клиенты

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

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

                        Контакты

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


                        Пермь, шоссе Космонавтов 252, офис 218