Разработка модуля доставки

Здравствуйте. Я разрабатываю модуль доставки и возникло несколько вопросов.
1. Реально ли в рамках модуля доставки разработать функционал при котором создаются заказы одновременно и в админке Вебасиста и в админке стороннего сервиса?
2. Как подключить вьюху или шаблон к своему способу доставки? Т.е. чтобы при выборе своего способа доставки в форме с полями адреса также можно было добавить карту с пунктами на странице списка способов доставки в корзине SS.

Для вышеперечисленных целей следует разрабатывать модуль доставки или просто модуль?

Спасибо.

23 ответа

  • 1
    Леонид Вакуленко Webasyst 29 октября 2013 02:42 #
    1. А в чём преимущество использовать для этого плагин доставки? А недостаток я вижу очень существенный: системный плагин не может подписаться на события Магазина. Если это и реально, вы всё равно немерено усложните себе жизнь по сравнению с написанием отдельного плагина для Магазина.

    Ещё рассмотрите вариант создания кастомного приложения, а не плагина. Приложения могут подписываться на события всех приложений, а не только своего собственного, как плагины. И настраиваются более гибко, и вообще приложения кругом молодцы. Отдельное приложение очень удобно, когда надо сильно кастомизировать установку и хочется держать код в одном месте, а не раскидывать по разным плагинам.

    Но модуль доставки всё равно придётся писать, если он нужен. Другой вопрос, что кастомный модуль может подключать своё кастомное приложение и просто дёргать его классы по необходимости...

    2. Пример использования шаблонов есть, например, в плагине доставки Почта России: russianpostShipping->displayPrintForm113()
    • 0
      Vlad Vlad Vlad Vlad 29 октября 2013 02:58 #
      Правильно ли я понимаю:
      Для синхронизации SS и стороннего сервиса, при которой создание заказа будет попадать в сторонний сервис сразу после создания в админке Вебасиста, мне необходимо писать Приложение+модуль доставки? Могут ли они в таком случае устанавливаться вместе или необходимо будет отдельная установка каждого? Принцип планируемого приложения таков, что выбрав в корзине доставку из моего модуля расчитанную по результатам апи стороннего сервиса и, создавая заказ, данные попадают и в админку и в сторонний сервис.
      • 0
        Леонид Вакуленко Леонид Вакуленко Webasyst 29 октября 2013 04:00 #
        Если речь идёт про кастомизацию единственного сайта, то установка одноразовая и проблема такая вообще не стоит. Можно сделать модуль доставки + приложение, или модуль доставки + плагин магазина.

        Если вы планируете выпустить такую штуку в магазин вебасиста, то придётся, конечно, действовать аккуратнее. Я могу описать метод с использованием костылей и велосипедов, будет многабукаф. Это возможно, но не фонтан. И самое неприятное, похоже, что придётся со временем переписывать.

        Ваш вопрос вызвал обсуждение среди разработчиков. Мы будем улучшать интерфейс системных модулей доставки, и в перспективе весь функционал, который вы описываете, сможет быть реализован в одном модуле доставки. Но это выйдет не раньше 5.2 (примерно месяц).

        Если вам срочно, не пугают костыли, велосипеды и необходимость через два месяца всё переделать - напишите, я расскажу.

        Альтернатива: использовать в разработке черновую девелоперскую версию фреймворка+магазина и тестить свой плагин уже на новом коде. Которого пока нет, и не знаю, когда появится, а когда появится - будет много багов и потенциально меняющиеся интерфейсы. Короче, много минусов. Но зато потом не придётся переписывать.
    • 0
      Vlad Vlad Vlad Vlad 29 октября 2013 11:22 #
      Леонид, по поводу вывода шаблона. У почты России вывод печатных форм происходит в админке, а если мне необходимо вывести шаблон именно на страницу доставки shop/checkout/shipping, чтобы при выборе моего способа я мог вывести не только поля адреса и т.д., но и к примеру карту с пунктами. Или допустим загрузить скрипт свой на данную страницу.
      • 0
        Леонид Вакуленко Леонид Вакуленко Webasyst 30 октября 2013 01:37 #
        Мда, там честный View подцепить так просто не удастся...

        Есть интерфейсная функция waShipping->customFields(waOrder $order)
        Она возвращает список полей в формате waHtmlControl. Пример можно посмотреть в плагине оплаты invoicejur.

        Код, который вызывает customFields(), живёт в shop/lib/classes/checkout/shopCheckoutShipping.class.php

        waHtmlControl - это wa-system/util/waHtmlControl.class.php
        Документации к нему, кроме комментов в коде, насколько я знаю, нет.
        Я с ним не работал и помочь поэтому не смогу. Знаю только, что там, кроме стандартных полей, есть тип CUSTOM, который позволяет вернуть произвольный HTML. Но, вообще говоря, и стандартные много чего умеют.

        Альтернатива - цепляться к событиям на этой странице и менять DOM уже в браузере, JSом. Но это как-то уж совсем злобно. Да и событий подходящих я сходу не могу вспомнить.
        • 0
          Vlad Vlad Vlad Vlad 1 ноября 2013 02:22 #
          Еще такой вопрос, Леонид: по поводу доступности метода getAddress(); метод, насколько я понял, доступен только в методе calculate()? пытаюсь выводить данные по адресу из других методов, но получаю пустой массив. Есть ли возможность получить весь массив с данными, которые вводятся в форму "Контактная информация"?, но не через getAddress()?
          • 0
            Да, getAddress() возвращает что-то полезное только в методе calculate().

            Если там, где вам нужно получить адрес, доступен waOrder, можно вытащить адрес из него: $wa_order['shipping_address']
            Если waOrder там нету, тогда расскажите, что это за место и зачем там нужен адрес.
            • 0
              Vlad Vlad Vlad Vlad 1 ноября 2013 03:02 #
              Спасибо! Сейчас гляну. А можно воспользоваться waContactDataModel() ? в методе getAll() есть то что мне нужно.
              • 0
                Данные контакта - это не то же самое, что данные заказа. Они часто одинаковые, это правда, но это чудесное совпадение и только.

                В любом случае, напрямую из модели получать данные контакта не нужно, и вдвойне неправильно дёргать getAll().

                Если нужны именно данные контакта, можно получить контакт из заказа:

                $wa_contact = $wa_order->getContact(); // вернёт waContact

                К waContact'у можно обращаться как к массиву:

                $wa_contact['address'] // все адреса
                $wa_contact['address.shipping'] // все адреса типа shipping

                Для дебаггинга можно посмотреть, что вообще есть в контакте: $wa_contact->load() вернёт массив со всеми данными.

                Но это, ещё раз повторяю, НЕ то же самое, что адрес заказа в waOrder. Юзер, например, с тех пор мог пойти и поменять себе адрес в личном кабинете.
                • 0
                  Да, ещё тонкий момент: $wa_order->getContact() может вернуть null. Бывают заказы без создания контакта.
                  • 0
                    Vlad Vlad Vlad Vlad 1 ноября 2013 05:14 #
                    Насколько я понял waOrder доступен только на странице заказа в админке, а на странице /shop/checkout/shipping/ - всегда пуст.
            • 0
              Vlad Vlad Vlad Vlad 6 ноября 2013 01:20 #
              В методе-хуке order_action.process или order_action.ship не доступен waOrder. Как мне получить данные с которыми был создан заказ: адрес, данные клиента, данные оплаты, сумма, товары, id заказа?
              • 0
                Там должен быть как минимум order_id. Посмотрите, что выведет wa_dump($params)

                Поскольку дело происходит в плагине Магазина, уже не работают ограничения, связанные с плагином оплаты. Плагин точно знает, что работает с приложением Магазин и можно использовать все его методы. Как-то так:

                $om = new shopOrderModel();
                $order = $om->getOrder($order_id, true, true);

                // там есть всё, кроме, пожалуй, адреса в нормальном формате
                //wa_dump($order);

                // Адрес можно получить так:
                $address = shopHelper::getOrderAddress($order['params'], 'shipping');

                //wa_dump($address);
                • 0
                  Vlad Vlad Vlad Vlad 6 ноября 2013 02:07 #
                  Спасибо! А можно пример получения именно order_id? Или где пример посмотреть? Допустим я подключил хук и создаю метод orderProcess(), которому не передается никаких параметров. Именно в этом методе как раз мне и приходит пустой waOrder.
                  • 0
                    Параметры в обработчик события передаются (т.е. как минимум должны). Добавьте в этом методе дебаг-вывод, чтобы посмотреть, что именно передаётся:

                    $args = func_get_args();
                    wa_dump($args);

                    Могу предположить, что id будет в $p['order_id'], где $p - это первый параметр метода. Но могу ошибаться, так что лучше посмотреть.
  • 0
    Vlad Vlad 29 октября 2013 04:33 #
    Огромное спасибо, Леонид, за оперативные ответы. Данное решение планируется для магазина приложений. Для нас, в общем, проблема установки 2-х отдельных приложений не стоит (на данный момент рассматривается полноценное приложение, чтобы привязаться к созданию заказа Магазина и модуль доставки, если Вы говорите, что плагин для ShopScript даст возможность цепляться к созданию заказа, тогда это будет плагин ShopScript и модуль доставки), мы своим клиентам сможем объяснить, что необходимо установить два модуля, НО если у вас существует политика, что нельзя размещать неполноценное приложение, тогда метод с использованием костылей и велосипедов нам необходим(т.к. по сути у нас будет два приложения, которые не смогут работать друг без друга) и мы будет очень признательны за помощь. Думаю нам будет проще потом переписать, т.к. с фреймворком уже будем более знакомы и принципы будут понятны, когда будет обновление у вас, при котором будет возможность все вышеописанное сделать в одном модуле доставки, мы выпустим обновление для модуля доставки, оставив только его, а приложение удалим.
    • 0
      Леонид Вакуленко Леонид Вакуленко Webasyst 29 октября 2013 05:39 #
      Если приложения и плагины приватные, только для ваших клиентов и не для продажи через вебасистовский магазин, то не должно быть совершенно никаких проблем. Делайте отдельные.
      • 0
        Леонид Вакуленко Леонид Вакуленко Webasyst 29 октября 2013 05:58 #
        Я не знаю, какая у нас политика, это первый случай :)
        Но не вижу ни технических, ни политических проблем.

        Вот ещё что я не сказал. При установке и обновлении через инсталлер есть возможность указать зависимости. Можно сделать, чтобы плагин нельзя было установить/обновить без предварительной установки/обновления приложения. Думаю, в вашем случае это подойдёт. Сделать зависимость одного плагина от другого пока нельзя, но со временем мы прикрутим это тоже.

        http://www.webasyst.ru/developers/docs/basics/system-requirements/
    • 0
      Леонид Вакуленко Леонид Вакуленко Webasyst 29 октября 2013 05:58 #
      Я не знаю, какая у нас политика, это первый случай :)
      Но не вижу ни технических, ни политических проблем.

      Вот ещё что я не сказал. При установке и обновлении через инсталлер есть возможность указать зависимости. Можно сделать, чтобы плагин нельзя было установить/обновить без предварительной установки/обновления приложения. Думаю, в вашем случае это подойдёт. Сделать зависимость одного плагина от другого пока нельзя, но со временем мы прикрутим это тоже.

      http://www.webasyst.ru/developers/docs/basics/system-requirements/
      • 0
        Леонид Вакуленко Леонид Вакуленко Webasyst 29 октября 2013 06:43 #
        Как оказалось, всё-таки есть причины не пускать в магазин двумя кусками. Политическое решение такого: для своих клиентов кастомизируйте как удобно, а для общего магазина - придётся ждать, пока появятся интерфейсы в системных плагинах доставки.
  • 0
    Vlad Vlad 20 ноября 2013 03:26 #
    Подскажите, пожалуйста, по поводу waHtmlControl::FILE. А именно как указать путь куда сохранять файл который загружается? Спасибо

Добавить ответ

Чтобы добавить комментарий, зарегистрируйтесь или войдите