Подготавливаем ЛК для "ГдеПосылка"

Это продолжение статей по работе с заказами MS2, в последней статье я обещал, что расскажу как интегрировать сервис «ГдеПосылка» в Minishop2, а пока я жду пока очухается администрация «ГдеПосылка» чтобы дать мне доступ к API подготовим почву для интеграции, что мы будем делать:
- Добавим новое поле в заказы minishop2
- Сделаем вывод для пользователей их историю заказов без extJS и каких либо дополнений, на чистом pdoTools
- Научимся делать leftJoin и select на pdoTools и pdoFetch
- Бонусом идут сразу готовые стили для всего этого добра и написанный JS
За объяснением кода — под кат, за кодом на GitHub
Требования к фронту сайта:
- Jquery
- FontAwesome (не обязательно)
- FancyBox 3

А теперь перейдем собственно к разработке:
Первое и самое важное — это добавляем новое поле к заказам MS2. Для этого воспользуемся разделом о плагинах товаров MS2 в официальной доке там написано как расширить свойства товара, но способ работает для любой модели MS2, это нам необходимо для того, чтобы MODX и MS2 увидел и мог работать с кастомными столбцами в БД.
Первым делом нам надо прописать новую карту объекта, для этого создадим index.php и msOrder.inc.php в index.php мы указываем карту какого объекта MS2 мы расширяем, а в msOrder.inc.php мы указываем какие поля добовляем, объяснять не вижу смысла, просто покажу файлы тут, если будут вопросы по ним — задавайте в комментариях
core/components/orderCustomField/index.php
<?php
return array(
'map' => array(
'msOrder' => require_once 'msOrder.inc.php',
),
);core/components/orderCustomField/msOrder.inc.php<?php
return array(
'fields' => array (
'track' => NULL,
),
'fieldMeta' => array(
'track' => array (
'dbtype' => 'varchar',
'precision' => '100',
'phptype' => 'string',
'null' => true,
),
),
);Также нам нужно добавить поле track в таблицу modx_ms2_orders, для этого в консоле выполним код:$table = $modx->getTableName('msOrder');
$sql = 'ALTER TABLE ' . $table . ' ADD `track` VARCHAR(255) NULL;';
$modx->exec($sql);Для того, чтобы minishop2 подхватил наш плагин — нам нужно выполнить код в консоле:if ($miniShop2 = $modx->getService('miniShop2')) {
$miniShop2->addPlugin('orderCustomField', '{core_path}components/orderCustomField/index.php');
}На данном этапе MS2 уже полностью видит наше поле, вы можете с ним полноценно работать, добавлять его в письма к клиентам или обрабатывать на фронте, везде, где доступны данные заказов, но нам нужно само поле в админку, для этого создадим новый плагин на событие msOnManagerCustomCssJs с вот таким содержимым:<?php
switch ($modx->event->name) {
case 'msOnManagerCustomCssJs':
//проверяем на какой странице мы находимся, если это страница orders, то добавляем наш html
if ($page != 'orders') return;
$modx->controller->addHtml("
<script type='text/javascript'>
Ext.ComponentMgr.onAvailable('minishop2-window-order-update', function(){
this.fields.items[0].items[3].items[0].items.push(
{xtype: 'textfield', name: 'track', fieldLabel: 'Трек - номер', anchor: '100%'}
);
});
</script>");
break;
}Тут код не вижу смысла объяснять, он прост как три рубля, мы просто добавляем в массив extJS наш объект, скажу лишь только то, что если вы хотите добавить в какое-то другое место, то дебажте расположение элементов вот так: console.log(this.fields)А там уже по дереву объектов смотрите где находятся нужные вам поля и пуште в нужный массив ваш объект.На этом добавление поля закончилось, перейдем к более интересному — выводу заказов пользователя!
Для вывода заказов мы будем использовать только pdoTools и pdoFetch, подразумевается, что у ваших пользователей уже есть ЛК и страница отведенная под историю заказов
На странице отведенную под историю заказов копируем содержимое файла:
/assets/components/MyCustomOrders/chunk/chunk.tpl.html
html и css я не вижу смысла рассматривать, а вот вызов pdoTools думаю будет многим интересен:
[[!pdoResources?
&class=`msOrder`
&sortby=`createdon`
&leftJoin=`{
"msDelivery":{"class":"msDelivery", "on":"msDelivery.id = msOrder.delivery"},
"msPayment":{"class":"msPayment", "on":"msPayment.id = msOrder.payment"},
"msOrderStatus":{"class":"msOrderStatus", "on":"msOrderStatus.id = msOrder.status"},
"msOrderAddress":{"class":"msOrderAddress", "on":"msOrderAddress.id = msOrder.address"}
}`
&select=`{
"msOrder": "*",
"msDelivery": "msDelivery.name as deliveryName",
"msPayment": "msPayment.name as paymentName",
"msOrderStatus": "msOrderStatus.name as statusName, msOrderStatus.color",
"msOrderAddress": "*"
}`
&where=`{"msOrder.user_id":[[+modx.user.id]]}`
&showLog=`0`
&limit=`9999`
&tpl=`order_row`
]]И так, что же мы делаем в этом вызове?Первым делом мы обращаемся к модели msOrder и достаем из нее только те записи, которые соответствуют id текущего пользователя, за это отвечает параметр where
&where=`{"msOrder.user_id":[[+modx.user.id]]}`Далее мы подключаем таблицы msDelivery, msPayment, msOrderStatus и msOrderAddress через leftJoin msDelivery нам нужен для того, чтобы узнать название метода доставки, msPayment для названия метода оплаты, а msOrderStatus нам нужен для названия статуса и для выбранного цвета текущего статуса (все эти пункты в msOrder лежат как id и по id текущего заказа мы достаем массив статуса, доставки и оплаты). В msOrderAddress лежат все поля введенные пользователем на моменте оформления заказа.
Теперь перейдем к select. В селекте мы указываем то, какие поля нам нужны от каждой таблицы, пойдем по порядку:
msOrder — выбираем все поля
msDelivery — нужно только название, его и выбираем и даем ему псевдоним deliveryName
msPayment — аналогично с msDelivery
msOrderStatus — выбираем имя, даем псевдоним и выбираем цвет
msOrderAddress — выбираем все
Чанк order_row лежит тут
Вот в принципе и все, копируем разметку, не забываем подключить JS и стили, единственное что можно рассмотреть отдельно, это то, как в модалке мы получаем данные, для этого у нас в js есть ajax запрос на контроллер, который через pdoFetch запускает выборку с аналогичными параметрами, что и pdoTools ну и еще одну выборку по msProductData, чтобы подтянуть позиции заказа.
Как то слишком сумбурный туториал получился, потому что я не особо понимаю что нужно разжевывать, а что и так очевидно, если возникли вопросы — задавайте в комментариях, главная цель, с которой писалась эта статья, это НАУЧИТЬ НОВИЧИКОВ, по этому непонятные вам вещи можем разобрать в комментариях.
P.s. кто ждет статьи про интеграцию «где посылка» советую сразу оставить заявку на доступ к их API, потому что думают они очень долго и только пару дней назад дали доступ, хотя оставил я заявку 2 недели назад
Комментарии: 46
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
—
Выкладывай уже свой первый доп к нам ;)
По поводу бутстрапа промолчу, я считаю хенжество тянуть такие вещи как бутстрп, в проект, когда есть flexbox
Решил код глянуть и в первой же строчке проблема есть…
В общем, начиная с 3 версии в jQuery иначе реализовано многое и я сталкивался со случаями, когда не работает:
Если я не ошибаюсь, то все из-за того, что раньше ready был event, а сейчас это Promise. Лично я пишу так:
Вот пример:
codepen.io/pavel_one/pen/RLdbEG
Проверяйте пожалуйста, прежде чем написать что-то
Короче, тупо убери document и просто click оставь и будет счастье
Я, правда, многое вырезаю, но основной функционал оставляю.
Вот пример, дабы не быть голословным.
mSearch2 с jQuery v3.2.1 — это да, некорректная работа
Код скопирован с продакшена и прямо сейчас работает на одном сайте, можете сделать в консоле выборку через pdoFetch и убедиться что вы неправы
Вот, пожалуйста…
Ты фортовый, что тут еще скажешь :-) Видимо ошибка не всплыла, т.к. во всех заказах по одному товару и поэтому ID в таблицах шли вровень :-)
На гите косяк у связи
для pdoResources
Ну и последнее… Напиши правильно для кого адресована статья :-) Что за Новчики? :-)
Снова ссылка на github… Обрати внимание чей он ;-)
Так что не только по-моему ;-)
github.com/pavel-one/Modx-Custom-Orders-MS2/blob/7f37b69d4bcf1515a5dde3e191dd812e8c6aeedb/assets/components/MyCustomOrders/action/getOrder.php#L32
А Еще
github.com/pavel-one/Modx-Custom-Orders-MS2/blob/7f37b69d4bcf1515a5dde3e191dd812e8c6aeedb/assets/components/MyCustomOrders/action/getOrder.php#L43
и
github.com/pavel-one/Modx-Custom-Orders-MS2/blob/7f37b69d4bcf1515a5dde3e191dd812e8c6aeedb/assets/components/MyCustomOrders/action/getOrder.php#L9
Не продуман момент для случаев, когда контекст не web
в getOrder.php ты вначале:
define('MODX_API_MODE', true);
Далее во-первых нет проверки на пустой id в POST
Ну а во-вторых ты sendRedirect делаешь, если не AJAX.
Что интересно: MODX_API_MODE не даст запустить handleRequest… Не понятен redirect. Нужно сразу exit хотя бы или т.п.
ТЫК
$manager = $modx->getManager();
и уже им таблицу изменять
Фиксанул вот таким образом:
joxi.ru/n2Yb80aCZOzkaA
Еще вопрос, можно ли как то вывести поле с треком на страницу заказа?