В этой статье мы добавим для интернет-магазина на 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: {} }; … }
Смотрим что у нас получилось. На странице Оформить заказ:
В админке:
Радуемся.