В этой статье мы добавим для интернет-магазина на minishop2 дополнительные поля на странице “Оформление заказа”. Мы будем добавлять поле Время доставки (orderTime).
Для начала разберём, что для этого необходимо сделать:
- Добавить параметр в системных настройках
- Добавить в словарь запись для параметра
- Добавляем наше поле в карту базы данных
- Добавляем в сниппете msOrder дополнительное поле для вывода поля на странице
- Добавляем в чанк сниппета msOrder вывод нашего поля.
- Добавляем столбец в базе данных
- Добавляем запись в скрипте для вывода нашего поля в админке
Перейдём к реализации описанных пунктов:
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: {}
};
…
}
Смотрим что у нас получилось. На странице Оформить заказ:

В админке:

Радуемся.
{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}