1. Из директории cms скопировать папки в соответствующие директории вашей CMS. 2. В шаблон, в теге <head></head>, прописать вызов скриптов(например: /templates/template1/template.htm): <script src="/modules/ddelivery/html/js/ddelivery.js"></script> <script type="text/javascript" src="/hostcmsfiles/jquery/ddelivery/ddelivery.js"></script> 2.1 В файл /modules/skin/default.php, в __construct(), объявить вызов скриптов: // for DDelivery $this ->addJs('/modules/ddelivery/html/js/ddelivery.js') ->addJs('/hostcmsfiles/jquery/ddelivery/ddelivery.js'); 3. В класс Shop_Order_Controller_Apply, функции execute прописать функционал: $ddelivery = new DDelivery_Integrate_Cms(); // for DDelivery $ddelivery->cmsChangeStatus( $this->_object, $oBefore ); unset( $ddelivery ); В результате, у вас код может выглядеть следующим образом: public function execute($operation = NULL) { $oBefore = clone $this->_object; parent::execute($operation); if ($this->_object->shop_payment_system_id) { $oShop_Payment_System_Handler = Shop_Payment_System_Handler::factory( Core_Entity::factory('Shop_Payment_System', $this->_object>shop_payment_system_id) ); if ($oShop_Payment_System_Handler) { $oShop_Payment_System_Handler->shopOrder($this->_object) ->shopOrderBeforeAction($oBefore) ->changedOrder('apply'); $ddelivery = new DDelivery_Integrate_Cms(); // for DDelivery $ddelivery->cmsChangeStatus( $this->_object, $oBefore ); unset( $ddelivery ); } } return $this; } 4. В класс Shop_Order_Controller_Edit, функции _applyObjectProperty, после вызова метода parent::_applyObjectProperty() прописать функционал: $ddelivery = new DDelivery_Integrate_Cms(); // for DDelivery $ddelivery->cmsChangeStatus( $this->_object ); unset( $ddelivery ); В результате, у вас код может выглядеть следующим образом: parent::_applyObjectProperty(); $ddelivery = new DDelivery_Integrate_Cms(); // for DDelivery $ddelivery->cmsChangeStatus( $this->_object ); unset( $ddelivery ); // ---- Дополнительные свойства $oProperty_Controller_Tab = new Property_Controller_Tab($this->_Admin_Form_Controller); $oProperty_Controller_Tab ->setObject($this->_object) ->linkedObject(Core_Entity::factory('Shop_Order_Property_List', $this->_object->Shop>id)) ->applyObjectProperty() ; // ---В функцию setObject, после объявления полей доставки, ставить код: // for DDelivery // Номер ордера в DDelivery $oMainTab->getField('ddelivery_id')->style("width: 100px"); $oMainTab->moveBefore( $this->getField('ddelivery_id'), $oShopDeliveryConditionsTypeSelect ); $oMainTab->getField('ddelivery_local_id')->divAttr(array('style' => 'display: none')); // Комментарий доставки $oMainTab->getField('ddelivery_comment')->style("width: 600px"); $oMainTab->moveAfter( $this->getField('ddelivery_comment'), $this->getField('ddelivery_id') ); В результате, у вас код может выглядеть следующим образом: $oShopDeliveryConditionsTypeSelect ->caption(Core::_('Shop_Order.shop_delivery_condition_id')) ->id('shop_delivery_condition_id') ->style("width: 300px") ->options( $iShop_Delivery_Conditions <= 250 ? $this->_fillDeliveryConditions($oShopDelivery->id) : array($this->_object->shop_delivery_condition_id => $this->_object>Shop_Delivery_Condition->name) ) ->name('shop_delivery_condition_id') ->value($this->_object->shop_delivery_condition_id); $oMainTab->addAfter( $oShopDeliveryConditionsTypeSelect, $oShopDeliveryTypeSelect ); // for DDelivery // Номер ордера в DDelivery $oMainTab->getField('ddelivery_id')->style("width: 100px"); $oMainTab->moveBefore( $this->getField('ddelivery_id'), $oShopDeliveryConditionsTypeSelect ); $oMainTab->getField('ddelivery_local_id')->divAttr(array('style' => 'display: none')); // Комментарий доставки $oMainTab->getField('ddelivery_comment')->style("width: 600px"); $oMainTab->moveAfter( $this->getField('ddelivery_comment'), $this>getField('ddelivery_id') ); В функции setObject описании кнопки «Перерасчет стоимости доставки», заменить на следующий код: // for DDelivery // Список доставок $ddelivery = new DDelivery_Integrate_Cms(); $deliveries = array( 0 => 0 ); $ddeliveryConditions = $ddelivery->getConditionIdAsDDelivery(); foreach( $ddeliveryConditions as $ddeliveryCondition ) { $deliveries[$ddeliveryCondition['shop_delivery_id']] = $ddeliveryCondition['id']; } $oSelect_Shop = Admin_Form_Entity::factory('Select') ->name('ddelivery_condition') ->options( $deliveries ) ->divAttr(array('style' => 'display:none')) ->controller($this->_Admin_Form_Controller); $oMainTab->add($oSelect_Shop); if( empty( $this->_object->ddelivery_id ) ) // DDelivery { $_SESSION['DDeliveryJS'] = true; $oRecalcDeliveryPriceLink = Admin_Form_Entity::factory('Link'); $oRecalcDeliveryPriceLink ->a ->href($this->_Admin_Form_Controller->getAdminActionLoadHref ( $sOrderPath, 'recalcDelivery', NULL, 0, $iOrderId ) ) ->onclick( $this->_Admin_Form_Controller->getAdminActionLoadAjax ( $sOrderPath, 'recalcDelivery', NULL, 0, $iOrderId ) . ';DDeliveryIntegration.openPopupAdmin();return false;' // for DDelivery ) ->value(Core::_('Shop_Order.recalc_order_delivery_sum')); $oRecalcDeliveryPriceLink ->img ->src('/admin/images/coins.gif'); unset($_SESSION['DDeliveryJS']); $oRecalcDeliveryPriceLink->div->style("width: 350px"); $oMainTab->addAfter($oRecalcDeliveryPriceLink, $oShopDeliveryConditionsTypeSelect); } 5. В класс Shop_Payment_System_Handler, перед возвращением результата функции createOrder, добавить функционал: $ddelivery = new DDelivery_Integrate_Cms(); // for DDelivery $ddelivery->cmsOrderFinish( $this->_shopOrder ); В результате, у вас код может выглядеть следующим образом: // Номер акта !$bAcceptance_report && $this->_shopOrder->acceptance_report($this->_shopOrder->id)>save(); $ddelivery = new DDelivery_Integrate_Cms(); // for DDelivery $ddelivery->cmsOrderFinish( $this->_shopOrder ); return $this; 6. Добавить языковую расшифровку: 'ddelivery_comment' => 'Комментарий к доставке', // for DDelivery 'ddelivery_id' => 'Номер заказа в DDelivery', 'ddelivery_local_id' => 'Local number DDelivery', по адресам: /modules/shop/order/i18n/ru.php /modules/shop/order/i18n/en.php 7. Для работы модуля при оформлении заказа, нужно отредактировать файл, находящийся по адресу /hostcmsfiles/lib/lib_7/lib_7.php Перед началом обработки шагов оформления заказа, нужно добавить код: // for DDelivery $isDdelivery = false; if( Core_Array::getPost('shop_delivery_condition_id', 0) ) { $DDelivery = new Ddelivery_Integrate_Shop(); $ddeliveries = $DDelivery->getDDeliveryByConditionID( intval( Core_Array::getPost('shop_delivery_condition_id', 0 ) ) ); if( null !== $ddeliveries ) $isDdelivery = true; } if( Core_Array::getPost('step') == 3 && $isDdelivery && ( empty( $_SESSION['hostcmsOrder']['deliveries'][intval( Core_Array::getPost('shop_delivery_condition_id', 0) )] ) || empty( $_SESSION['DDeliveryID'] ))) { foreach( $_SESSION['hostcmsOrder'] as $key => $val ) { $_POST[$key] = $val; } $_POST['step'] = 2; } В результате, у вас код может выглядеть следующим образом: // Проверяем наличие товара в корзины $Shop_Cart_Controller = Shop_Cart_Controller::instance(); $aShop_Cart = $Shop_Cart_Controller->getAll($oShop); // for DDelivery $isDdelivery = false; if( Core_Array::getPost('shop_delivery_condition_id', 0) ) { $DDelivery = new Ddelivery_Integrate_Shop(); $ddeliveries = $DDelivery->getDDeliveryByConditionID( intval( Core_Array::getPost('shop_delivery_condition_id', 0 ) ) ); if( null !== $ddeliveries ) $isDdelivery = true; } if( Core_Array::getPost('step') == 3 && $isDdelivery && ( empty( $_SESSION['hostcmsOrder']['deliveries'][intval( Core_Array::getPost('shop_delivery_condition_id', 0) )] ) || empty( $_SESSION['DDeliveryID'] ))) { foreach( $_SESSION['hostcmsOrder'] as $key => $val ) { $_POST[$key] = $val; } $_POST['step'] = 2; } switch (Core_Array::getPost('recount') || !count($aShop_Cart) ? 0 : Core_Array::getPost('step')) На втором шаге, способа доставки, где идет заполнение сессии данными заказа, добавить следующий код: // for DDelivery $_SESSION['hostcmsOrder']['shop_id'] = $oShop->id; unset( $_SESSION['hostcmsOrder']['deliveries'] ); На третьем шаге, формы оплаты приведите код в следующий вид: if (is_numeric($shop_delivery_condition_id)) { $_SESSION['hostcmsOrder']['shop_delivery_condition_id'] = intval($shop_delivery_condition_id); // for DDelivery unset( $_SESSION['hostcmsOrder']['deliveries'], $_SESSION['hostcmsOrder']['shop_delivery_id'], $_SESSION['hostcmsOrder']['shop_delivery_price'], $_SESSION['hostcmsOrder']['shop_delivery_rate'], $_SESSION['hostcmsOrder']['shop_delivery_name'] ); } else 8. Установите по умолчанию значение вашего интернет магазина в константу Ddelivery_Integrate_Config::DEFAULT_SHOP_ID. Константа находится по адресу /modules/ddelivery/integrate/config.php:24 9. В файле /modules/admin/form/controller.php, в функции getAdminLoadAjax замените код return "$.adminLoad({" . implode(',', $aData) . "}); return false"; на следующий: if( !empty($_SESSION['DDeliveryJS']) && $_SESSION['DDeliveryJS'] == true ) // for DDelivery return "$.adminLoad({" . implode(',', $aData) . "});"; return "$.adminLoad({" . implode(',', $aData) . "}); return false"; 10. Настройка модуля: После того, как вы проделали вышеописанное, зайдите в панели администрирования в раздел «Модули». Создайте новый модуль. Пропишите поля, как показано на рисунке ниже Перезагрузите страницу, после чего появится модуль «Сервис доставки Ddelivery». В модуле «Сервис доставки Ddelivery» создайте новую запись и заполните поля. После сохранения записи, вам нужно включить новый способ доставки. Для этого зайдите в модуль «Интернет-магазины» и выберете магазин, в который вы добавили новую доставку. В пункте меню «Доставка» → «Типы доставки», включите ваш тип доставки. Там же включите платежные системы. Для отключения, проделайте тоже самое в обратном порядке. 11. Для синхронизации статусов заказа между CMS и сервером DDelivery нужно запустить планировщик задач cron. Пример запуска скрипта приведен ниже: # Пример запуска скрипта в 5 утра каждый день: /5 * * * * /usr/bin/php -q /home/www/cron/status.php