# Введение

art studio Morozov\&Pimnev

<div align="center"><img src="/files/-Mj-pcWj3djKfmly5Q3p" alt=""></div>

####


# Покупка модуля

#### Шаг 1

В центре администрирования (далее ЦА) сайта переходим в раздел **«Магазин приложений»** (1) и в поле поиска вводим название модуля (2), нажимаем искать (3) или "Enter", на нужном модуле кликаем на кнопку **«Купить»** (4)

<div data-full-width="true"><img src="/files/-MjdrshQZw_gAg1x2Ybd" alt=""></div>

#### Шаг 2

{% hint style="info" %}

#### Если модуль уже куплен, то пропускаем данный шаг

{% endhint %}

После вас перенаправит на страницу модуля на сайт [hostcms.ru](https://www.hostcms.ru/shop/market/) для завершения оформления покупки, выбираем дополнительные опции (2) если нужны и кликаем **«Купить для XXXXXX-X за 4 700 ₽»** (1)

{% hint style="danger" %}
— **XXXXXX-X !!очень важно чтобы номер лицензии совпадал с вашей лицензий сайта для которой покупаете**
{% endhint %}

У Вас должен быть зарегистрирован личный кабинет (далее ЛК) на сайте hostcms.ru и Вы должны быть в нем авторизованы. После покупки можно приступать к установке модуля (установка модуля описана в отдельном разделе для каждого модуля)

<div data-full-width="true"><img src="/files/-Mjdw3h32o6F0JVDeCbV" alt=""></div>


# Версия модуля

Версию модуля можно узнать в ЦА в разделе "Система" (1) → "Модули" (2), наберите в строке "Название" или "Путь к модулю" (3) ключ для поиска, нажмите Enter и вы увидите его версию (4)

<div data-full-width="true"><img src="/files/PFJvI75zXhQaTghoMuns" alt=""></div>


# Обновление модуля

Загрузка и установка обновлений производится автоматически через центр администрирования.

Список обновлений доступен в разделе **Обслуживание** — **Обновления**. Обновить список обновлений можно кнопкой «Проверить обновления».

<div data-full-width="true"><img src="/files/GHLQhvbChyWMRIJQNKIQ" alt=""></div>

### Установка обновления

Установка обновлений осуществляет от более ранних к более поздним, для установки нажмите кнопку **☑**, расположенную справа от описания обновления. При установке обновления модулей, новые версии модулей будут последовательно устанавливаться, пока не будет установлена последняя доступная версия модуля.


# Переустановить модуль

Чтобы переустановить модуль, нужно откатить версию модуля следующим образом.

Через FTP, [файловый менеджер](https://www.hostcms.ru/documentation/modules/filemanager/) или если редакция ниже Бизнеса, то через ссылку *`<название_сайта>`*`/admin/wysiwyg/filemanager/index.php,` найдите файл `module.php` в папке нужного модуля

<div data-full-width="true"><figure><img src="/files/eFpaTuLlUhZqgAdxqSjy" alt=""><figcaption><p>файловый менеджер</p></figcaption></figure></div>

в файле замените `$version` на нужную

<div data-full-width="true"><figure><img src="/files/HR0RM9JthLMfeLew5Mp7" alt=""><figcaption></figcaption></figure></div>

Теперь через модуль ["Обновления"](/megapost/obnovlenie-modulya) вы можете поставить следующую доступную версию


# Оставить отзыв

asmp.su/bg

Мы будем благодарны за любой отзыв оставленный по нашим модулям/шаблонам, даже отрицательный, они помогают нам видеть, что модули полезены, их стоит развивать дальше или доработать

#### Как оставить отзыв?

1. Авторизуйтесь на сайте <https://www.hostcms.ru/users/>
2. Перейдите на нужный модуль, все наши модули можно посмотреть 👉 [тут](https://asmp.su/bg)
3. В самом конце старницы будет раздел **"Комментарии"**

<div data-full-width="true"><figure><img src="/files/qHhALuNpTXOhxTVrxx8F" alt=""><figcaption></figcaption></figure></div>

4. в самом конце комментариев нажмите на кнопку **"Добавить комментарий"**

<div data-full-width="true"><figure><img src="/files/NNdm9PfOLjHT1IhlDQOg" alt=""><figcaption></figcaption></figure></div>

5. Заполните форму и нажмите **"Опубликовать"**

<div data-full-width="true"><figure><img src="/files/JXkKYkKhkEMdKjkBnc92" alt=""><figcaption></figcaption></figure></div>


# Продление периода технической поддержки

## Что такое период технической поддержки

В платной версии HostCMS после покупки лицензии период технической поддержки составляет **1 год**. По истечении этого срока его можно продлить.

## Стоимость продления технической поддержки

Стоимость зависит от редакции и периода с момента окончания лицензии.

{% hint style="success" %}
Действуют следующие тарифы:

* **в течение 14 дней до окончания периода** — льготный период: 20 % от стоимости лицензии;
* **в течение 30 дней после окончания периода** — 40 % от стоимости лицензии;
* **в любое другое время** — 60 % от стоимости лицензии.

**Пример** (для лицензии «Малый бизнес», стоимость — 16 900 руб.):

* период 14 дней — сумма продления 3 380 руб.;
* период 30 дней — сумма продления 6 760 руб.;
* в остальных случаях — сумма продления 10 140 руб.
  {% endhint %}

## Что дает продление технической поддержки HostCMS

1. Техническую поддержку и консультации по работе с системой в течение года.
2. Бесплатное обновление до новых версий системы в течение года.

## Для чего продлевать поддержку HostCMS

Продление поддержки обеспечивает:

* **экономию** — при заблаговременном продлении действует скидка 80 %;
* **защиту** от потенциальных новых уязвимостей;
* **актуальный функционал** — систему обновляют в соответствии с современными техническими требованиями (например, к хостингу или интегрированным сервисам);
* **совместимость** с новыми модулями и их версиями;
* **упрощение поиска исполнителей** — не все специалисты работают со старыми версиями системы;
* **снижение затрат на решение задач** — многие функции уже реализованы в новых обновлениях;
* **работу с современным функционалом** — система не устаревает и при необходимости модифицируется.

## Можно ли не продлевать поддержку

Да, можно. Однако мы не рекомендуем этого делать.

Ваш сайт продолжит работать в том состоянии, в котором он находился на момент окончания периода технической поддержки — при условии, что хостинг поддерживает текущую версию.

## **Примеры из практики**

1. **Клиент использовал старую версию «Бизнес» и дополнительный модуль.**

   * Модуль перестал работать — потребовалось обновление.
   * Обновление совместимо только с последней версией, а их вышло уже 10.
   * Постепенная установка обновлений (по одному) позволяет легче отслеживать изменения и решать вопросы с технической поддержкой.
   * Установка сразу 10 обновлений — значительный объём работ, так как изменения за месяцы или годы могут оказаться несовместимыми с одним из обновлений.

   **Выгода при продлении в льготный период:** 20 % от стоимости — 4 980 руб.\
   **Фактические затраты:** 14 940 руб. + 10 000 руб. (работа специалиста по установке обновлений и проверке совместимости).
2. **Клиент использовал старую версию «Корпорация».**

   * В новой версии появился нужный клиенту функционал.

   **Выгода при продлении в льготный период:** 20 % от стоимости — 7 180 руб.\
   **Фактические затраты:** 21 540 руб. + 5 000 руб. (работа специалиста по установке обновлений и проверке совместимости).
3. **Клиент решил перейти на PHP 8 на хостинге.**
   * Старая версия системы не поддерживала PHP 8.
   * Возникли проблемы в работе сайта.


# Вопросы, поддержка и предложения

**Вопросы (перед покупкой), предложения и поддержка/консультация (после покупки, нужно - версия модуля и HostCMS, адрес сайта, ключ модуля при покупке или номер лицензии HostCMS, дата приобретения модуля):**

* **Telegram:** [@morozovpimnev](https://t.me/morozovpimnev) *(высокое время ответа при поддержке)*
* **Whatsapp:** [+79122442150](https://wa.me/79122442150) *(среднее время ответа при поддержке)*
* **Онлайн чат:** [jivo.chat](https://jivo.chat/3IuhZocuYV) *(низкое время ответа при поддержке)*

**Вопросы (перед покупкой) и предложения:**

* **Email:** <info@morozovpimnev.ru> *(поддержка не осуществляется)*
* **Телефон:** +7 (343) 288-299-8 *(поддержка не осуществляется)*

Подписаться на наш канал: [**t.me/morozovpimnev\_n**](https://asmp.su/channel)


# AmoCRM

инструкция для v5.5 и HostCMS v7.1.4

Купить модуль 👉 <https://asmp.su/amocrm>

<div align="left"><img src="/files/ypN7dL9Ae2tDLivwcql4" alt=""></div>


# Создание ключа интеграции

В аккаунте **AmoCRM** перейдите в раздел **«amo МАРКЕТ»** и в меню нажмите **«+ Создать интеграцию»** -> **«Внешняя интеграция + Создать»**

<div data-full-width="true"><figure><img src="/files/VSzDfqI2p9S7JIlAILoC" alt=""><figcaption></figcaption></figure></div>

&#x20;Заполняете все необходие поля и нажмите сохранить

<div data-full-width="true"><img src="/files/wopATM62jg3CwI3Yorzs" alt=""></div>

* ***Ссылка для перенаправления** - http(s)://АДРЕС\_ВАШЕГО\_САЙТА/amocrm/api/*&#x20;
* ***Предоставить доступ** - Выбрать “Доступ к данным аккаунта”*
* ***Название интеграции** - любое (например: Мой сайт)*
* ***Описание** - любое (например: интеграция с HostCMS)*

После сохранения перейдите во вкладку **«Ключи и доступы»,** сгенерируйте "Долгосрочный токен" на максимальный срок, **Долгосрочный токен** Вам понадобятся для ввода в настройки модуля.

<div data-full-width="true"><figure><img src="/files/nuQBmFzc3zQZ8bsbhmQ8" alt=""><figcaption></figcaption></figure></div>


# Установка модуля

*Перед установкой купите модуль (*[*инструкция*](/#pokupka-modulya)*)*

#### Шаг 1

В центре администрирования (далее ЦА) сайта переходим в раздел **«Магазин приложений»** (1) и в поле поиска вводим название модуля (2), нажимаем искать (3) или "Enter", на нужном модуле кликаем на кнопку **«Установить»** (4)

<div data-full-width="true"><img src="/files/LXskTBK9pypJY9hKoPJJ" alt="Магазин приложений"></div>

#### Шаг 2

В параметрах установки модуля вводим параметры и кликаем на **«Установить»**

<div data-full-width="true"><figure><img src="/files/pplbZwqD4G935tGCiLNv" alt=""><figcaption></figcaption></figure></div>

* ***Адрес своего аккаунта в AmoCRM субдомен** - если ссылка на личный кабинет в AmoCRM у вас <https://demo.amocrm.ru/>, то субдомен будет и нужно ввести в настройки - «demo» (без .amocrm.ru)*
* ***Ссылка для перенаправления** - http(s)://АДРЕС\_ВАШЕГО\_САЙТА/amocrm/api/*
* ***ID интеграции, Секретный ключ, Код авторизации*** ***(старый вариант) -** не заполняем*
* ***Долгосрочный токен (Рекомендуем)** - его можно получить в AmoCRM в разделе «Настройки» → «Интеграции» (см.* [Создание ключа интеграции](/amocrm/sozdanie-klyucha-integracii)*)*


# Добавление сета настроек

#### Шаг 1

В ЦА сайта переходим в раздел **Экспорт/Импорт** → **AmoCRM** → **Добавить** (добавляем сет настроек интеграции)

<div data-full-width="true"><figure><img src="/files/sAcxAUah0YXjf8bAk3x0" alt=""><figcaption></figcaption></figure></div>

#### Шаг 2

В созданном сете заполните поля нужными данными

### Вкладка «Основные»

<div data-full-width="true"><img src="/files/2zdQMuTgl9uaBC77J3sM" alt="Вкладка «Основные»"></div>

* ***Наименование** - название сета настроек*
* ***Название сделки** - название которое будет передаваться сделке в AmoCRM*
* ***Активность** - активность настроек для передачи в AmoCRM*
* ***Обновление данных** - при обновлении объекта данных в HostCMS, обновленные данные будут передаваться в AmoCRM*

### Вкладка «Данные»

<div align="center" data-full-width="true"><img src="/files/Q4aLinpTr49iodo49KeN" alt=""></div>


# Пользователи сайта

{% code fullWidth="true" %}

```php
// перед отправкой письма пользователю о регистрации вставить след код, например в ТДС
Core::moduleIsActive('amocrm') && AmoCRM_Controller::siteuser($oSiteuser);
```

{% endcode %}


# События (хуки)

https\://www\.hostcms.ru/documentation/modules/core/events/

Для добавление в отправляемые данные своих данных можно использовать следующие хуки ([подробнее](https://www.hostcms.ru/documentation/modules/core/events/))

<pre class="language-php" data-line-numbers data-full-width="true"><code class="lang-php"><strong>// добавление данных в произвольные поля
</strong><strong>class My_AmoCRM
</strong>{
    static public function onBeforeLeadAdd($controller, $args)
    {
        $oEntity = $args[0]; // Shop_Order, Form_Fill или Siteuser
        $oAmoCRM = $args[1]; // сет настроек
        $id = $args[2]; // FALSE (add) или int (update)
        
        /** $args[3] - параметры,
         * добавление параметров в custom_fields_values
         */
        $args[3]['custom_fields_values'][] = array(
            'field_id' => 123456, // ID произвольного поля
            'values' => array(
                array(
                    'value' => '789', // значение
                    //'enum_code' => 'fax' // если есть
                )
            )
        );
    }
}

Core_Event::attach('AmoCRM_Controller.onBeforeShopLeadAdd', array('My_AmoCRM', 'onBeforeLeadAdd'));
Core_Event::attach('AmoCRM_Controller.onBeforeFormLeadAdd', array('My_AmoCRM', 'onBeforeLeadAdd'));
Core_Event::attach('AmoCRM_Controller.onBeforeSiteuserLeadAdd', array('My_AmoCRM', 'onBeforeLeadAdd'));
</code></pre>

## События отправки

{% code lineNumbers="true" fullWidth="true" %}

```php
/**
 * Создание заказа Shop_Payment_System_Handler::_processOrder()
 * @hostcms-event Shop_Payment_System_Handler.onAfterProcessOrder
 * Запустить самостоятельно в своей логике
 */
$oShop_Order = Core_Entity::factory('Shop_Order', 123);
$Shop_Payment_System_Handler = Shop_Payment_System_Handler::factory($oShop_Order->Shop_Payment_System);
$Shop_Payment_System_Handler->shopOrder($oShop_Order);
AmoCRM_Controller::onAfterProcessOrder($Shop_Payment_System_Handler);

/**
 * Создание формы Form_Controller_Show::process()
 * @hostcms-event Form_Controller_Show.onAfterProcess
 * Запустить самостоятельно в своей логике
 */
$oForm_Fill = Core_Entity::factory('Form_Fill', 123);
$oForm = $oForm_Fill->Form;
$Form_Controller_Show = new Form_Controller_Show($oForm);
AmoCRM_Controller::onAfterProcess($Form_Controller_Show, array($oForm_Fill));

/**
 * нет своего хука, перед отправкой письма пользователю о регистрации вставить след код, например в ТДС
 */
$oSiteuser = Core_Entity::factory('Siteuser', 123);
AmoCRM_Controller::siteuser($oSiteuser);
```

{% endcode %}


# Настройки

<div data-full-width="true"><figure><img src="/files/d4QFlvM0RWkgi1iMrWWH" alt=""><figcaption></figcaption></figure></div>

Внесенные при установке и дополнительные настройки можно изменить в ЦА сайта, переходим в раздел **Экспорт/Импорт** → **AmoCRM** → **Настройки**

<div data-full-width="true"><figure><img src="/files/dt6pEyGm4o4BXA4lJhfB" alt=""><figcaption></figcaption></figure></div>

* ***Адрес своего аккаунта в AmoCRM субдомен -** Адрес своего аккаунта в AmoCRM субдомен (без .amocrm.ru)*
* ***Ссылка для перенаправления** - http(s)://АДРЕС\_ВАШЕГО\_САЙТА/amocrm/api/*
* ***ID интеграции, Секретный ключ, Код авторизации (старый вариант) -** не заполняем*
* ***Долгосрочный токен (Рекомендуем)** - его можно получить в AmoCRM в разделе «Настройки» → «Интеграции» (см.* [Создание ключа интеграции](/amocrm/sozdanie-klyucha-integracii)*)*
* ***Тип выгрузки:***
  * *При создании элемента - как только происходит процесс создания элемента в системе, элемент сразу выгуржается в CRM (может тормозить корзину)*
  * *По расписанию - через модуль* [*"Планировщик задач"*](/amocrm/planirovshik-zadach) *(выгрузка элементов происхдит по расписанию, рекомендуемый вариант)*
* ***Дата начала выгрузки по расписанию** - установите дату с которой вы хотите выгружать элементы по расписанию (т.е. после установки у вас может быть очень большая база с самого начала запуска сайта, дата позволяет выгрузить не все, а только с нужного времени)*


# Передача \_ga, gclid, \_ym\_uid, yclid

#### \_ym\_uid

\_ym\_uid (уникальный идентификатор пользователя, Yandex Client ID)

#### \_ga

\_ga (уникальный идентификатор пользователя, Google Analytics 4)

#### **Метка yclid**

**yclid (Yandex Click Identifier, Yandex Click ID)** - специальная метка с уникальным номером клика в Яндекс.Директе, которая добавляется в конец ссылки рекламного объявления и позволяет связывать визиты в Метрике с кликами по объявлению.

#### **Метка gclid**

**gclid (Google Click Identifier, Google Click ID)** - схожая по функционалу с Яндексом метка с уникальным номером клика в Google Рекламе, которая также добавляется в конец ссылки рекламного объявления и позволяет связывать сеансы в Google Analytics с кликами по объявлению. При использовании параметра gclid можно также импортировать сложные конверсии (онлайн и офлайн) в Google Ads.

<div data-full-width="true"><figure><img src="/files/Vsnli8PV4qaurMU9AKvf" alt=""><figcaption></figcaption></figure></div>

Для передачи \_ga, gclid, \_ym\_uid, yclid нужно в сете настроек сопоставить их с вашими полями в AmoCRM

\_ga, \_ym\_uid - берется стандартно из куки сессии пользователя

gclid, yclid - для передачи меток нужно для начала сохранить их в куки, для этого нужно подключить js скрипт, он находится в `/hostcmsfiles/amocrm/script.js`


# AmoCRM pixel

https\://www\.amocrm.ru/developers/content/digital\_pipeline/site\_visit

#### Получение идентификатора посетителя

Для получения идентификатора посетителя нужно разместить на Вашем сайте следующий код:

{% code overflow="wrap" fullWidth="true" %}

```html
<script type="text/javascript" id="amo_pixel_identifier_js" async="async" src="https://piper.amocrm.ru/pixel/js/identifier/pixel_identifier.js"></script>
```

{% endcode %}

и подключить js скрипт, он находится в `/hostcmsfiles/amocrm/script.js`, теперь при передачи данных с сайта в AmoCRM будет пердаваться `visitor_uid`


# Планировщик задач

https\://www\.hostcms.ru/documentation/modules/schedule/

#### Шаг 1. Добавление вызова в cron

Выполнением действий, заданных в модуле **«Планировщик задач»**, осуществляется файлом `cron/schedule.php`, вызов которого необходимо добавить в cron. Рекомендуется запускать выполнение файла schedule.php раз в минуту.

Пример вызова: `/usr/bin/php /var/www/site.ru/httpdocs/cron/schedule.php`

Пример вызова с передачей php.ini: `/usr/bin/php --php-ini /etc/php.ini /var/www/site.ru/httpdocs/cron/schedule.php`

{% hint style="warning" %}
Реальный путь на сервере к корневой директории сайта и путь к PHP уточните в службе поддержки хостинга.
{% endhint %}

#### Шаг 2

Добавляем задачу, в основном меню выберите **Инструменты** → **Планировщик задач**, нажмите в меню на **+Задача**

<div data-full-width="true"><figure><img src="/files/VryCXKj4QbfWsnXNqmN3" alt=""><figcaption></figcaption></figure></div>

* ***Дата следующего выполнения задачи*** - Дата и время, когда следует выполнить задачу снова. После выполнения задачи к ее времени будет прибавлен установленный интервал, рассчитанное время будет записано в это поле.
* ***Дата добавления задачи*** - Дата и время, когда задача была добавлена.
* ***Интервал*** - Время, устанавливающее периодичность выполнения задачи (рекомендуем указывать `5 минут`).&#x20;
* ***Модуль*** - Модуль, у которого будет вызываться задача (выбираем `AmoCRM`).
* ***Действие*** - Действие модуля, которое будет вызывать задача (выбираем `Выгрузка элементов`).
* ***Идентификатор сущности*** - Идентификатор элемента, над которым нужно произвести действие (указываем ID сайта).
* ***Описание*** - Описание задачи.


# Отладка

{% hint style="danger" %}

### Внимание! Отладкой должен заниматься Ваш технический специалист.

{% endhint %}

### Выгрузка заказа

`request` - это запрос для выгрузки\
`response` - это ответ, если он 200-202 и нет ошибок, занчит все хорошо

Чтобы посмотреть запросы при выгрузке

{% tabs %}
{% tab title="Модуль "История изменений"" %}
Если стоит наш модуль ["История изменений"](https://asmp.su/changelog) то все намного проще, рекомендуем его ставить

После выгрузки заказа, в самом заказе, перейдите на вкладку "Журнал изменений" там будут все запросы/ответы по API

<div data-full-width="true"><figure><img src="/files/I2yKrlNEgSyDBYPwRz6h" alt=""><figcaption></figcaption></figure></div>
{% endtab %}

{% tab title="Модуль "Журнал событий"" %}
Есил у вас редакция HostCMS.Бизнес и выше

Перйдите в модуль  **Система** →  ["Журнал событий"](https://www.hostcms.ru/documentation/modules/eventlog/) найдите логи связанные с Вашим заказом

обычно они выглядят следующим образом: `[513][amocrm][request] ...`\
где 513 - это номер заказа

<div data-full-width="true"><figure><img src="/files/GVgalgSI39PXpmneubT2" alt=""><figcaption></figcaption></figure></div>
{% endtab %}

{% tab title="log.csv" %}
Если у вас редакция HostCMS.Малый Бизнес и ниже

Логи хранятся в файлах в директории **/hostcmsfiles/logs/(текущая дата).log.csv**

Откройте файл и найдите логи связанные с Вашим заказом

обычно они выглядят следующим образом: `[513][amocrm][request] ...`\
где 513 - это номер заказа
{% endtab %}
{% endtabs %}


# Bitrix24

инструкция для v3.2 и HostCMS v7.1.3

Купить модуль 👉 <https://asmp.su/bitrix24>

![](/files/bASCWUzkIELDmNgOWAtX)


# Создание ключа интеграции

Перейдите в раздел **«Приложения» → «Разработчикам» → «Готовые сценарии» → «Другое» → «Входящий вебхук»**, User ID (1) и Secret key (2) - эти данные Вам понадобятся для ввода в настройки модуля

<div data-full-width="true"><img src="/files/awGwn4LW2cSjX5Pi4x2e" alt=""></div>

В настройках прав выберите **«CRM (crm)**» и **«Пользователи (user)»** (3) и нажмите **«Сохранить»** (4)

<div data-full-width="true"><img src="/files/dnvosbuxNBuQTbwPJgXh" alt=""></div>

{% hint style="info" %}
Далее созданный доступ будет храниться у вас в разделе **«Приложения» → «Разработчикам» → «Интеграции»**
{% endhint %}


# Установка модуля

*Перед установкой купите модуль (*[*инструкция*](/#pokupka-modulya)*)*

#### Шаг 1

В центре администрирования (далее ЦА) сайта переходим в раздел **«Магазин приложений»** (1) и в поле поиска вводим название модуля (2), нажимаем искать (3), на нужном модуле кликаем на кнопку «Установить» (4)

<div data-full-width="true"><img src="/files/uysbtwZC8YPabHBEmo4J" alt=""></div>

#### Шаг 2

<div data-full-width="true"><figure><img src="/files/ji3NZar9dKyQXKFCjFXS" alt=""><figcaption></figcaption></figure></div>

В параметрах установки модуля вводим параметры и кликаем на **«Установить»**

* ***Адрес своего аккаунта в Bitrix24** - Адрес своего аккаунта в Bitrix24 (например mycompany.bitrix24.ru или crm.mycompany.ru)*
* ***Код пользователя (User ID), Секретный ключ (Secret Key)** - эти данные нужно получить и ввести в Bitrix24 в разделе «Маркет» → «Разработчикам» → «Готовые сценарии» → «Другое» → «Входящий вебхук» (см.* [Создание ключа интеграции](/bitrix24/sozdanie-klyucha-integracii)*)*


# Добавление сета настроек

#### Шаг 1

В ЦА сайта переходим в раздел **Экспорт/Импорт** → **Bitrix24** → **Добавить** (добавляем сет настроек интеграции)

<div data-full-width="true"><figure><img src="/files/Kvig85pRMUO8cwgYb0L2" alt=""><figcaption></figcaption></figure></div>

#### Шаг 2

В созданном сете заполните поля нужными данными

### Вкладка «Основные»

<div data-full-width="true"><img src="/files/rpKc3ldK3TUJt37hEOq1" alt=""></div>

### Вкладка «Данные»

<div data-full-width="true"><img src="/files/EidIcHqW92Yeo1KgaJSX" alt=""></div>


# События (хуки)

https\://www\.hostcms.ru/documentation/modules/core/events/

Для добавление в отправляемые данные своих данных можно использовать следующие хуки ([подробнее](https://www.hostcms.ru/documentation/modules/core/events/))

<pre class="language-php" data-line-numbers data-full-width="true"><code class="lang-php"><strong>// добавление данных в произвольные поля
</strong><strong>class My_Bitrix
</strong>{
    static public function onBeforeCrmLead($controller, $args)
    {
        $oEntity = $controller->getEntity(); // Shop_Order, Form_Fill
        $actionLead = $args[0]; // add или update
        
        /** $args[1] - параметры,
         * добавление параметров в fields
         */
        $args[1]['fields']['UF_CRM_1467910560'] = array('id' => 60);
    }
}

Core_Event::attach('Bitrix24_Controller.onBeforeCrmLead', array('My_Bitrix', 'onBeforeCrmLead'));
Core_Event::attach('Bitrix24_Controller.onBeforeCrmDeal', array('My_Bitrix', 'onBeforeCrmDeal'));
</code></pre>


# Настройки

<div data-full-width="true"><figure><img src="/files/YiEjAV3nXDQtumow5Yrf" alt=""><figcaption></figcaption></figure></div>

Внесенные при установке и дополнительные настройки можно изменить в ЦА сайта, переходим в раздел **Экспорт/Импорт** → **Bitrix24** → **Настройки**

<div data-full-width="true"><figure><img src="/files/mzq5oh8ppOI1yRX37Zqd" alt=""><figcaption></figcaption></figure></div>

* ***Адрес своего аккаунта в Bitrix24** - Адрес своего аккаунта в Bitrix24 (например mycompany.bitrix24.ru или crm.mycompany.ru)*
* ***Код пользователя (User ID), Секретный ключ (Secret Key)** - эти данные нужно получить и ввести в Bitrix24 в разделе «Маркет» → «Разработчикам» → «Готовые сценарии» → «Другое» → «Входящий вебхук» (см.* [Создание ключа интеграции](/bitrix24/sozdanie-klyucha-integracii)*)*
* ***Тип выгрузки:***
  * *При создании элемента - как только происходит процесс создания элемента в системе, элемент сразу выгуржается в CRM (может тормозить корзину)*
  * *По расписанию - через модуль* [*"Планировщик задач"*](/bitrix24/planirovshik-zadach) *(выгрузка элементов происхдит по расписанию, рекомендуемый вариант)*
* ***Дата начала выгрузки по расписанию** - установите дату с которой вы хотите выгружать элементы по расписанию (т.е. после установки у вас может быть очень большая база с самого начала запуска сайта, дата позволяет выгрузить не все, а только с нужного времени)*


# Планировщик задач

https\://www\.hostcms.ru/documentation/modules/schedule/

#### Шаг 1. Добавление вызова в cron

Выполнением действий, заданных в модуле **«Планировщик задач»**, осуществляется файлом `cron/schedule.php`, вызов которого необходимо добавить в cron. Рекомендуется запускать выполнение файла schedule.php раз в минуту.

Пример вызова: `/usr/bin/php /var/www/site.ru/httpdocs/cron/schedule.php`

Пример вызова с передачей php.ini: `/usr/bin/php --php-ini /etc/php.ini /var/www/site.ru/httpdocs/cron/schedule.php`

{% hint style="warning" %}
Реальный путь на сервере к корневой директории сайта и путь к PHP уточните в службе поддержки хостинга.
{% endhint %}

#### Шаг 2

Добавляем задачу, в основном меню выберите **Инструменты** → **Планировщик задач**, нажмите в меню на **+Задача**

<div data-full-width="true"><figure><img src="/files/NfddA3ulU7qTSl5V9Zfr" alt=""><figcaption></figcaption></figure></div>

* ***Дата следующего выполнения задачи*** - Дата и время, когда следует выполнить задачу снова. После выполнения задачи к ее времени будет прибавлен установленный интервал, рассчитанное время будет записано в это поле.
* ***Дата добавления задачи*** - Дата и время, когда задача была добавлена.
* ***Интервал*** - Время, устанавливающее периодичность выполнения задачи (рекомендуем указывать `5 минут`).&#x20;
* ***Модуль*** - Модуль, у которого будет вызываться задача (выбираем `Битрикс24`).
* ***Действие*** - Действие модуля, которое будет вызывать задача (выбираем `Выгрузка элементов`).
* ***Идентификатор сущности*** - Идентификатор элемента, над которым нужно произвести действие (указываем ID сайта).
* ***Описание*** - Описание задачи.


# Отладка

{% hint style="danger" %}

### Внимание! Отладкой должен заниматься Ваш технический специалист.

{% endhint %}

### Выгрузка заказа

`request` - это запрос для выгрузки\
`response` - это ответ, если он 200-202 и нет ошибок, занчит все хорошо

Чтобы посмотреть запросы при выгрузке

{% tabs %}
{% tab title="Модуль "История изменений"" %}
Если стоит наш модуль ["История изменений"](https://asmp.su/changelog) то все намного проще, рекомендуем его ставить

После выгрузки заказа, в самом заказе, перейдите на вкладку "Журнал изменений" там будут все запросы/ответы по API

<div data-full-width="true"><figure><img src="/files/UtkmPf7TyRBzo9OFGj0Y" alt=""><figcaption></figcaption></figure></div>
{% endtab %}

{% tab title="Модуль "Журнал событий"" %}
Есил у вас редакция HostCMS.Бизнес и выше

Перйдите в модуль  **Система** →  ["Журнал событий"](https://www.hostcms.ru/documentation/modules/eventlog/) найдите логи связанные с Вашим заказом

обычно они выглядят следующим образом: `[513][bitrix24][request] ...`\
где 513 - это номер заказа

<div data-full-width="true"><figure><img src="/files/GVgalgSI39PXpmneubT2" alt=""><figcaption></figcaption></figure></div>
{% endtab %}

{% tab title="log.csv" %}
Если у вас редакция HostCMS.Малый Бизнес и ниже

Логи хранятся в файлах в директории **/hostcmsfiles/logs/(текущая дата).log.csv**

Откройте файл и найдите логи связанные с Вашим заказом

обычно они выглядят следующим образом: `[513][bitrix24][request] ...`\
где 513 - это номер заказа
{% endtab %}
{% endtabs %}


# MegaPost

инструкция для v6.0 и HostCMS v7.1.4

Купить модуль 👉 <https://asmp.su/megapost>

<div data-full-width="true"><img src="/files/-MjErmGPA0es_dBLT2-c" alt=""></div>


# Технические требования

**PHP >= 7.2**

**jQuery >= 1.9.1**

**cURL >= 7.26.0**

**SOAPClient** (для DPD)

**memory limit >= 512Mb** (для Яндекс)


# Установка модуля

*Перед установкой купите модуль (*[*инструкция*](/master/pokupka-modulya)*)*

{% hint style="danger" %}
Для дальнейших действий нужны минимальные знания работы с **css/js**, **макетами**, **XSL-шаблонами (далее - XSL)**, **типовыми динамическими страницами (далее - ТДС)** в HostCMS. Работу должен выполнять Ваш программист или администратор сайта.
{% endhint %}

#### Шаг 1

В центре администрирования (далее ЦА) сайта переходим в раздел **«Магазин приложений»** (1) и в поле поиска вводим название модуля (2), нажимаем искать (3) или "Enter", на нужном модуле кликаем на кнопку **«Установить»** (4)

<div data-full-width="true"><img src="/files/-MjEq_3ke-0P7_tFuB2A" alt="Магазин приложений"></div>

#### Шаг 2

В параметрах установки модуля вводим параметры и кликаем на **«Установить»**

<div data-full-width="true"><img src="/files/-MjEsdITCSnPRwsOLXi5" alt="Параметры установки"></div>

* ***Магазин** - выбор магазина, к которому будут установлены доставки*
* ***API-ключ Яндекс.Карт** - код ключа для работы карт с точками ПВЗ*&#x20;
* ***Установить XSL шаблоны** - устанавливает примеры шаблонов в соответствующем разделе с текущей датой\**
* ***Установить ТДС** - устанавливает примеры шаблонов в соответствующем разделе с текущей датой\**
* ***Установить пример Макета** - устанавливает пример макета в соответствующем разделе с текущей датой\**
* ***Установить "СДЭК", "Почта Россия" и др.** - устанавливает обработчики доставки в соответствующем разделе с текущей датой*

{% hint style="info" %}
\*например: МагазинДоставки \[MEGAPOST] \[05.06.2020 13:00:24]\
СДЭК \[05.06.2020 13:00:24]
{% endhint %}


# Создание ключа API

#### Шаг 1

Перейдите в [Яндекс.Кабинет](https://developer.tech.yandex.ru/) разработчика и нажмите на кнопку **«Получить API»** <img src="/files/-MjEyEsK7TRHsdvgi-jA" alt="" data-size="line">&#x20;

#### Шаг 2

В форме **«Подключить API»** в разделе **«Карты»** выберите **«JavaScript API и HTTP Геокодер»** (1) и нажмите **«Продолжить»** (2)

<div data-full-width="true"><img src="/files/-MjEz30NCVyZPX--DR_g" alt="форма "></div>

{% hint style="warning" %}
Если у Вас нет пункта **«JavaScript API и HTTP Геокодер»**, значит у Вас уже был подключен этот вариант и дальше ничего делать не нужно, просто возьмите API-ключ оттуда &#x20;
{% endhint %}

#### Шаг 3

Заполните форму и нажмите **«Продолжить»**

<div data-full-width="true"><img src="/files/-MjFBvGOWKy0o7NBgCKD" alt=""></div>

* ***ФИО** - ваше ФИО*
* ***Email для связи** - ваш email*
* ***Телефон** - ваш телефон*
* ***Название компании** - ваша компания*
* ***Вы планируете использовать API в открытой или закрытой системе?** - "В открытой"*
* ***Вы планируете использовать API в платном или бесплатном проекте?** - "В бесплатном"*
* ***Вы планируете отображать данные на карте или будете использовать только геокодирование?** - "Буду отображать данные на карте"*
* ***Ссылка на ваш сайт, где будет использоваться API** - ссылка на сайт*
* ***Краткое описание сервиса** - "Интернет магазин, карта используется в корзине для выбора ПВЗ"*

#### Шаг 4

Если все успешно, то будет сообщение **«API интерфейс подключен»**, нажмите **«Перейти к API»**

<div data-full-width="true"><img src="/files/-MjFD9d_Fuqrf9hJ7v1u" alt=""></div>

#### Шаг 5

Скопируйте Ваш API-ключ (1)

<div data-full-width="true"><img src="/files/-MjFDqckLodgyie-5tvN" alt=""></div>

{% hint style="warning" %}
Чтобы обезопасить Ваш API-ключ, рекомендуется привязать его к Вашему сайту, где он будет использоваться, нажмите **«Изменить»** и следуйте шагу 6
{% endhint %}

#### Шаг 6 (не обязательный)

В поле **"Ограничение по IP-адресам"** введите IP адрес Вашего сервера\* или в поле **"Ограничение по HTTP Referer"** введите адрес Вашего сайта (Без обозначения протокола, порта и url. По одному значению в каждой строке. Например, yandex.ru или яндекс.рф) или в обоих полях сразу

<div data-full-width="true"><img src="/files/-MjFE_SAwT7yx7nRHcBB" alt=""></div>

{% hint style="info" %}
\*IP адрес сервера можно узнать на сайте [2ip.ru](https://2ip.ru/lookup/)
{% endhint %}


# DaData

https\://asmp.su/dadata

Создание ключа API для интеграции выбора города

1. Зарегистрируйтесь на сайте [DaData](https://asmp.su/dadata)
2. В личное кабинете скопируйте API-ключ

<div data-full-width="true"><figure><img src="/files/BdP7k3nVKjXosjDD8l4n" alt=""><figcaption></figcaption></figure></div>

{% hint style="success" %}
Лимиты при тарифе «Бесплатный» - 10 000 запросов на в день.
{% endhint %}


# Настройки макета

{% hint style="danger" %}
Для дальнейших действий нужны минимальные знания работы с **макетами**, **XSL-шаблонами (далее - XSL)**, **типовыми динамическими страницами (далее - ТДС)** в HostCMS. Работу должен выполнять Ваш программист или администратор сайта.
{% endhint %}

В главном макете Вашего сайта укажите функцию **MegaPost\_GeoIp::getCountryLocationCity()** (php код перед \<head>) и css стили/js скрипты для работы модуля (обычно в пределах тега \<head>\</head>)

**MegaPost\_GeoIp::getCountryLocationCity()** - для автоопределение города посетителя и записи в сессию (можно не указывать)

{% tabs %}
{% tab title="php Core\_Page" %}
{% code lineNumbers="true" fullWidth="true" %}

```php
<?php
	// GeoIP определяет текущий город и сохраняет в $_SESSION['ASMP_City']
	MegaPost_GeoIp::getCountryLocationCity();
?>
<head>
	<!-- ... ваш код title и тд -->
	<?php
		Core_Page::instance()
			/* ... тут ваши css ... */
			->css('/hostcmsfiles/megapost/css/megapostXXXX.css')
			->showCss();
	?>
	<script type="text/javascript">var apikeymap = 'APIKEY_YMAP';</script>
	<?php
		Core_Page::instance()
			/* ... тут ваши js ... */
			/* все js megapost должны быть подключены после jQuery */
			->js('/hostcmsfiles/megapost/js/megapost.min.js')
			->js('/hostcmsfiles/megapost/js/mp.autocomplete.js')
			->js('/hostcmsfiles/megapost/js/megapost-scriptXXXX.js')
			->showJs();
	?>
</head>
```

{% endcode %}
{% endtab %}

{% tab title="html inline" %}
{% code lineNumbers="true" fullWidth="true" %}

```php
<?php
	// GeoIP определяет текущий город и сохраняет в $_SESSION['ASMP_City']
	MegaPost_GeoIp::getCountryLocationCity();
?>
<head>
	<!-- тут ваш код, css и js -->
	<link rel="stylesheet" type="text/css" href="/hostcmsfiles/megapost/css/megapost9999.css" />
	
	<script type="text/javascript">var apikeymap = 'APIKEY_YMAP';</script>
	
	<!-- все js megapost должны быть подключены после jQuery -->
	<script src="/hostcmsfiles/megapost/js/mp.autocomplete.min.js"></script>
	<script src="/hostcmsfiles/megapost/js/megapost.min.js"></script>
	<script src="/hostcmsfiles/megapost/js/megapost-script9999.js"></script>
</head>
```

{% endcode %}
{% endtab %}
{% endtabs %}

{% hint style="danger" %}
**Готовый пример можно увидеть в демо макете созданном после установки модуля**

в css и js файлах **XXXX** - Ваш уникальный номер файла при установке, посмотреть можно в папке **/hostcmsfiles/megapost/\*/**, т.к. все файлы без уникального номера при обновлении будут заменяться на новые

**APIKEY\_YMAP** - ваш API ключ Яндекс Карт&#x20;
{% endhint %}

### Настройки в JS / megapost-scriptXXXX.js

{% code overflow="wrap" lineNumbers="true" fullWidth="true" %}

```javascript
callback: '/megapost/callback/' // путь callback командера для ajax MegaPost_Command_Controller
jMForm: '[data-megapost=true]' // селектор формы для инициалзиации MegaPost
mblock: '#mpDelivery' // селектор блока инициализации карты
cartOneStep: '[data-cartOneStep=true]' // селектор блока корзины
addressOneStep: '[data-addressOneStep=true]' // селектор блока контактных данных и адреса
deliveryOneStep: '[data-deliveryOneStep=true]' // селектор блока доставки
paymentSystemOneStep: '[data-paymentSystemOneStep=true]' // селектор блока оплаты
cityNameDiv: '.shop_country_location_city_div' // селектор блока города
inputCityName: 'input#shop_country_location_city_name' // селектор поля ввода города для подключени autocomplete
boxLoaderDelivery: '.boxLoaderDelivery' // селектор блока расчета доставок в карточке товара
boxLoaderPVZDelivery: '.boxLoaderPVZDelivery' // селектор блока расчета доставок с картой на отдельной странице
otherCityNameDiv: '.other_city_name_div' // селектор блока произвольного ввода города
otherCityTxt: '<span class="other_city">Ввести другой город (если в списке нет нужного)</span>' // селектор блока корзины
otherCity: true // показывать пункт "Ввести другой город", true - да, false - нет
svgLoader: '<svg class="loader" xmlns="http://www.w3.org/2000/svg" height="10" viewBox="0 0 100 20" fill="currentColor"><g transform="translate(20 10)"><circle r="6"><animateTransform attributeName="transform" begin="-0.375s" calcMode="spline" dur="1s" keySplines="0.3 0 0.7 1;0.3 0 0.7 1" keyTimes="0;0.5;1" repeatCount="indefinite" type="scale" values="0;1;0"/></circle></g><g transform="translate(40 10)"><circle r="6"><animateTransform attributeName="transform" begin="-0.25s" calcMode="spline" dur="1s" keySplines="0.3 0 0.7 1;0.3 0 0.7 1" keyTimes="0;0.5;1" repeatCount="indefinite" type="scale" values="0;1;0"/></circle></g><g transform="translate(60 10)"><circle r="6"><animateTransform attributeName="transform" begin="-0.125s" calcMode="spline" dur="1s" keySplines="0.3 0 0.7 1;0.3 0 0.7 1" keyTimes="0;0.5;1" repeatCount="indefinite" type="scale" values="0;1;0"/></circle></g><g transform="translate(80 10)"><circle r="6"><animateTransform attributeName="transform" begin="0s" calcMode="spline" dur="1s" keySplines="0.3 0 0.7 1;0.3 0 0.7 1" keyTimes="0;0.5;1" repeatCount="indefinite" type="scale" values="0;1;0"/></circle></g></svg>' // иконка прелоадера расчета доставок
// БЛОК ЦЕН
getTotalAmount: '[data-gettotalamount]' // сеелктора блока откуда берем стоимости товаров без скидки
getDiscountAmount: '[data-getdiscountamount]' // сеелктора блока блок откуда берем скидки
setTotalAmount: '[data-settotalamount]' // сеелктора блока куда вставлять сумму товаров без скидки
setDiscountAmount: '[data-setdiscountamount]' // сеелктора блока блок куда вставлять сумму скидки
setDeliveryAmount: '[data-setdeliveryamount]' // сеелктора блока куда вставлять сумму доставки
setDeliveryCashAmount: '[data-setdeliverycashamount]' // сеелктора блока куда вставлять сумму наложки
setTotalSum: '[data-settotalsum]' // сеелктора блока куда вставлять итоговую сумму заказа с учетом скидки и доставки
```

{% endcode %}


# Подключение XSL и ТДС

{% hint style="info" %}
Все примеры **XSL-шаблонов** и ТДС находятся в одноименных папках, под названием **"megapost"** соответсвующего раздела
{% endhint %}

В структуре сайта отредактируйте раздел **"Корзина" (cart)** (у Вас может называться по другому), со следующими настройками:

<div data-full-width="true"><img src="/files/h7x3QxbNusHxN7LMWuZg" alt="Редактирование узла структуры &#x22;Корзина&#x22;"></div>

* **Раздел ТДС** - megapost
* **Страница ТДС** - Интернет-магази корзина \[MEGAPOST] \[ДАТА\_ШАБЛОНА]
* **Кол-во шагов в корзине** - Один, Два или Четыре (Один - все оформление проходит на одной странице, Два - на первом шаге корзина, на втором оформление заказа, Четыре - пошаговое оформление заказа: Корзина->Контакты/Адрес->Способы доставка->Способы оплаты)
* **XSL корзины** - megapost->МагазинКорзина \[MEGAPOST] \[ДАТА\_ШАБЛОНА]
* **XSL адрес доставки** - megapost->МагазинАдресДоставки \[MEGAPOST] \[ДАТА\_ШАБЛОНА]
* **XSL доставок** - megapost->МагазинДоставки \[MEGAPOST] \[ДАТА\_ШАБЛОНА]
* **XSL платежной системы** - megapost->МагазинПлатежнаяСистема \[MEGAPOST] \[ДАТА\_ШАБЛОНА]

В структуре сайта отредактируйте раздел, к которому у Вас подключен **Интернет-Магазин (shop)** (у Вас может называться по другому), со следующими настройками:

<div data-full-width="true"><figure><img src="/files/Evl8VBZDwjgczhtv743G" alt=""><figcaption><p>Редактирование узла структуры "Каталог"</p></figcaption></figure></div>

* **XSL письма администартору** - megapost->ПисьмоАдминистратору \[MEGAPOST] \[ДАТА\_ШАБЛОНА]
* **XSL письма пользователю** - megapost->ПисьмоПользователю \[MEGAPOST] \[ДАТА\_ШАБЛОНА]

#### XSL-шааблон последнего шага уже оформленного заказа

Стандартно он вызывается и генерируется из обработчика платежнйо системы в getNotification(), где и указывается XSL-шаблон "ОплатаПриПолучении" (у вас он может называться по другому),  в какждом используемом Вами обработчике оплаты указать следующий "ОплатаПриПолучении \[MEGAPOST] \[ДАТА\_ШАБЛОНА]"

<div data-full-width="true"><figure><img src="/files/TW77mLK3dZrtI9RfikQ2" alt=""><figcaption></figcaption></figure></div>


# События (хуки) и др

https\://www\.hostcms.ru/documentation/modules/core/events/

#### 1. Хуки для контроллеров корзины

Т.к. в корзине в 1 шаг все блоки подгружаются ajax и для облегчения интеграции (исключаем работу в ТДС) их формирование идет в файле **MegaPost\_Command\_Controller**, который нельзя модифицировать, но можно использовать хуки ([подробнее](https://www.hostcms.ru/documentation/modules/core/events/))

{% code lineNumbers="true" fullWidth="true" %}

```php
// хук для доступа к Shop_Cart_Controller_Show
class My_MegaPost
{
    static public function onBeforeCartShow($controller, $args)
    {
        $Shop_Cart_Controller_Show = $args[0];
        
        $Shop_Cart_Controller_Show
            ->itemsProperties(FALSE)
            ->checkStock(TRUE);
    }
}

Core_Event::attach('MegaPost_Command_Controller.onBeforeCartShow', array('My_MegaPost', 'onBeforeCartShow'));

// хук для доступа к MegaPost_Shop_Delivery_Controller_Show
class My_MegaPost
{
    static public function onBeforeDeliveryShow($controller, $args)
    {
        $Shop_Delivery_Controller_Show = $args[0];
        
        $Shop_Delivery_Controller_Show
            ->shopDeliveries()
                ->queryBuilder()
                    ->where('shop_deliveries.id','NOT IN', array(123))
		    ->setOr()
		    ->where('shop_deliveries.id','IN', array(456));
    }
}

Core_Event::attach('MegaPost_Command_Controller.onBeforeDeliveryShow', array('My_MegaPost', 'onBeforeDeliveryShow'));

// хук для доступа к Shop_Payment_System_Controller_Show
class My_MegaPost
{
    static public function onBeforePaymentSystemShow($controller, $args)
    {
        $Shop_Payment_System_Controller_Show = $args[0];
        
        $Shop_Payment_System_Controller_Show
            ->shopPaymentSystems()
                ->queryBuilder()
                    ->where('shop_payment_systems.id','NOT IN', array(123))
		    ->setOr()
		    ->where('shop_payment_systems.id','IN', array(456));
    }
}

Core_Event::attach('MegaPost_Command_Controller.onBeforePaymentSystemShow', array('My_MegaPost', 'onBeforePaymentSystemShow'));
```

{% endcode %}

#### 2. Остаток на складе

Указать для корзины для всего сайта без хуков и ТДС проверку остатка на складе, можно разместив в файле **bootstrap.php** следующий код

{% code lineNumbers="true" fullWidth="true" %}

```php
// Проверять остаток на складе при добавлении в корзину
$bCheckStock = TRUE;

$oShop_Cart_Controller = Shop_Cart_Controller::instance();
$oShop_Cart_Controller->checkStock($bCheckStock);
```

{% endcode %}

#### 3. Изменение данных расчета доставок

Данный хук позволяет для каждого расчета, получить и изменить данные перед передачей в корзину или вовсе не выводить его (нужно вернуть `FALSE`)

{% code lineNumbers="true" fullWidth="true" %}

```php
class My_MegaPost
{
    static public function onAfterHandlerObject($handler, $args)
    {
        list($object, $Megapost_Condition) = $args;
        
        // доставка ID 1 && курьер && тариф
        if($handler->shop_delivery_id == 1 && $objcet->type == 0 && $objcet->tariffId == 2)
        {
            $objcet->price = 0; // изменим цену
        }
		
    	return NULL; // возвращает объект с данными расчета
    	// return FALSE; // не возвращает расчет
    }
}

Core_Event::attach('Megapost_Handler.onAfterHandlerObject', array('My_MegaPost', 'onAfterHandlerObject'));
```

{% endcode %}


# Настройка MegaPost

Перейдите в раздел **Контент** → **Интернет-магазины**. Выберите магазин, перейдите в список типов доставки **Справочники** → **Доставкии** → **MegaPost Настройки** и настройте нужные параметры

<div data-full-width="true"><img src="/files/-MjcdOeZ65wdZ5bUmP1m" alt=""></div>

### Вкладка «Общие»

<div data-full-width="true"><figure><img src="/files/f20EmhOojIGUBCPqemZH" alt=""><figcaption></figcaption></figure></div>

* **Ключ API ключ Яндекс.Карт** - ключ для работы Яндекс Карт (как получить ключ [подробнее](/megapost/sozdanie-klyucha-api))
* **Кол-во город в подсказках** - кол-во выпадающих город при вводе названия
* **Сервис КЛАДР** - сервис для поиска городов
  * HostCMS - справочник городов HostCMS
  * [DaData](https://asmp.su/dadata) (как получить ключ [подробнее](/megapost/dadata))
* **Ваш токен (dadata.ru)** - обязательный если используете сервис dadata (можно получить бесплатный)
* **Формат вывода подсказок** - задает формат вывода подсказок, по умолчанию `{postcode}, {region_abbr}, {district_abbr}, {city_abbr}, {settlement_abbr}`
* **Использовать полный поиск по адресу** - делает возможность в строке города поиск по улице/дом, автоматически подставляются в соовтетствующие поля улица/дом
* **Показывать ПВЗ региона** - делает возможность например, при выборе города Москва, показывать ПВЗ не только Москвы, но и населенных пунктов входящих в регион Москва или по Екатеринбургу - всех ПВЗ Свердловской области
* **Статус для выгрузки заказа по API** - если доставка в модуле поддерживает выгрузку заказа в ЛК транспортной компании, то при изменение статуса на указанный происходит выгрузка данного заказа (если статус не указан, то выгрузка происходить не будет)
* **Статус для вызова курьера по API** - если доставка в модуле поддерживает вызов курьера транспортной компании, то при изменение статуса на указанный происходит формирование заявки на вызов курьера (если статус не указан, то ничего не происходит)
* **Хранилище кэша** - хранилище для кэшированния данных от транспортных компаний при расчете (рекомендуем "megapost" 30 дней) в редакции "Бизнес" и выше
* **Округление цены доставки** - "До десятых" (312 -> 320)/"Сотых" (312 -> 400)
* **Объединять сумму наложенного платежа со стоимостью доставки в общую сумму** - при указании данного параметра в заказе будет одна позиция как "Доставка" с суммированной ценой, иначе НП отдельной позицией (при условии что настройки НП применяются для данного заказа)
* **Поле для расчета веса, длины, ширины, высоты** - возможный выбор выбора поля веса и габаритов откуда брать значение, либо основные поля (вес, длина, ширина, глубина) товара, либо из дополнительного свойства (Название/XML-тег доп. свойства должно состоять из одноименного названия/поля основного свойства товара и быть типом "Целое число" или "Число с плавающей запятой" *Например: "Вес товара"/"weight\_item"*) (Например: если габариты упаковки хранятся в доп. свойствах)
* **Поле для расчета объема** - в обработчиках доставки где вместо отдельных габаритов можно передавать общий объем товара (например: СДЭК), который хранится в доп. свойстве (Например: если у вас нет габаритов, а только объем в доп. свойстве)

#### ПВЗ: общие настройки элемента

<div data-full-width="true"><figure><img src="/files/sLPhZAHXYfiLYcQJO6A4" alt=""><figcaption><p>ПВЗ: общие настройки элемента</p></figcaption></figure></div>

*Т.к. самовывоза нет как элемента в ЦА и он объединяет все доставки в ПВЗ на карте, то и логика его формирования в XSL шаблоне другая, настроить вывод его стандартных данных можно следующими настройками*

* **Название элемента** - название пункта, которое будет выводится в корзине
* **Зависимые поля** - поля, которые будут отображаться для обязательного ввода в корзине, при выборе данного элемента
* **Изображение** - изображение пункта, которое будет выводится в корзине
* **Порядок сортировки** - сортировка пункта, для общей сортировки со всеми доставками

<div data-full-width="true"><figure><img src="/files/a72k6wEfuC2x3yG9KDzb" alt=""><figcaption><p>Трек номер</p></figcaption></figure></div>

* **XSL шаблон доставок для товара** - шаблон для отображения расчета доставок на странице товара
* **XSL шаблон вывода карты ПВЗ** - шаблон для отображения карты ПВЗ
* **Показывать ошибки доставки (только админам)** - отображает краткие ошибки доставко при расчете в корзине, отображаются только для авторизированных в ЦА
* **Выводить логи в консоль браузера (только админам)** - отображает подробные логи расчетов по API [в консоле браузера](https://support.morozovpimnev.ru/megapost/otladka), отображаются только для авторизированных в ЦА

#### Трек Номер

* **Статус для отправки письма** - при изменение статуса на указанный происходит оптравка письма на Email пользователю/администратору с данными трек номера и инфомрацией где его отследить
* **XSL шаблон письма пользователю** - шаблон письма информации по трек номеру пользователю
* **XSL шаблон письма администратору** - шаблон письма информации по трек номеру администратору


# СДЭК

{% embed url="<https://www.cdek.ru/ru/>" %}

<div data-full-width="true"><figure><img src="/files/UY8dBDTiGNaxBRHoBJ8G" alt=""><figcaption></figcaption></figure></div>

* **ID города-отправителя** - внутренний идентификатор города СДЭК из которого происходит отправка, узнать можно [тут](https://market.morozovpimnev.ru/cdek/)
* **Логин (Account), Пароль (Account)** - сгенерированные ключи доступа API, получить можно в ЛК СДЭК в разделе ["Интеграция"](https://lk.cdek.ru/integration/index)

<div data-full-width="true"><figure><img src="/files/LLHRnvlbjp0S8bb3gkXV" alt=""><figcaption></figcaption></figure></div>

#### Настройка выгрузки в ЛК (личный кабинет СДЭК / создание накладной)

* **Объявленная стоимость товара** - при 0 выгружает товары с ценой указанные в заказе, при указании больше 0 выгружает товарам указанную цену объявленной стоимости товара&#x20;
* ~~**Передавать полную стоимость товара**~~ - не используется
* **ФИО контактного лица, Телефон конатктного лица, Адрес отправителя** - данные для выгрузки накладной и вызова курьера
* **Код ПВЗ СДЭК** - код пункта приема, если вы сдаете отправления сами
* **Дополнительные услуги** - услуги которые будут выгруженные для заказа в ЛК СДЭК (ПРИМЕРКА  \[TRYING\_ON], ЧАСТИЧНАЯ ДОСТАВКА \[PART\_DELIV])

#### Настройки товаров по умолчанию

* **Вес, Длина, Ширина, Высота** - вес и габариты товара по умолчанию, если их нет у самого товара, то будут рассчитываться по указанным

<div data-full-width="true"><img src="/files/-MjbmX1yH7JXXvZ34Avx" alt="Настройки для курьера"></div>

* **Активность** - активность типа доставки
* **+ к цене доставки** - указанная сумма прибавляется к исходной сумме доставки
* **+ % цены доставки** - процент прибавляется к исходной сумме доставки (высчитывается от суммы доставки)
* **Наценка от суммы заказа** - процент прибавляется к исходной сумме доставки (высчитывается от суммы заказа)
* **+ к начальной дате** - прибавляет указанное кол-во дней к исходному минимальному кол-ву дней доставки (например 1 день, если отгрузка происходит не в день заказа)
* **+ к конечной дате** - прибавляет указанное кол-во дней к исходному максимальному кол-ву дней доставки (например 1 день, если отгрузка происходит не в день заказа)
* **+ к весу заказа** - прибавляет дополнительный вес к исходному весу заказа для расчета (например 50гр для упаковки)
* **Страны, Области, Города (если пусто, то применяется ко всем)** - расчет доставки будет выводится только для указанных местоположений (**"НЕ"** - расчет доставки не выводится для указанных местоположений), если ничего не указывать, доставка рассчитывается для всех¹ (например если в у Вас своя собственная доставка по городу и вы не хотите выводить сторонние ТК, укажите город и поставьте галочку "НЕ")
* **Платежные системы** - указания доступности оплат для типа доставки (например если в [общих настройках](https://www.hostcms.ru/documentation/modules/shop/references/delivery/delivery-and-payment-systems-relations/) для доставки выбраны "Наличные" и "Онлайн оплата", то можно указать Курьеру "Онлайн оплата" и для данного типа доставки будет доступна только она)²
* **Тариф** - тарифы для расчета
* **По приоритету** - если галочка стоит, то будет выводится расчет первого доступного тарифа, иначе расчеты по всем выбранным тарифам

{% hint style="warning" %}
¹при указании города, не обязательно для него указывать и страну и область, можно указать только город, данные поля работаю как самостоятельные настройки\
²не указывайте все те же платежные системы, что указаны в [общих настройках](https://www.hostcms.ru/documentation/modules/shop/references/delivery/delivery-and-payment-systems-relations/)  доставки, указывайте только для ограничения для того или иного типа доставки
{% endhint %}

<div data-full-width="true"><img src="/files/-MjbmZwxom2uB-hlYz0W" alt="Настройки для ПВЗ, Наложенный платеж"></div>

* *см. Настройки для курьера*
* **Вывод типа ПВЗ** - выводит на карте Склады/Постаматы/Все
* \[По приоритету] - по умолчанию на карте выводится расчет первого доступного тарифа

#### Наложенный платеж (НП)

* **Формула** - используется для Почты России
* **Процент** - процент НП
* **Тип** - расчет НП от "суммы товары + доставка"/"только товары"/"только доставка"
* **Не включать стоимость доставки в оплату заказа** - отображает расчет цены доставки в корзине для информации, но при создании заказа сумма доставки не будет попадать
* **Налог** - НДС в процентах для доставки (входит в стоимость)


# Почта России

{% embed url="<https://www.pochta.ru/>" %}

<div data-full-width="true"><img src="/files/S4RGwQkKXqmNslYxNMLp" alt="Основные настройки, Настройка выгрузки в ЛК, Настройки товаров по умолчанию"></div>

* **Индекс места отправления** - индекс почтового отделения отправления посылки, для юридических лиц с договором нужно указывать индекс из ЛК Почты России (ПР) раздел "Настройки" → ["Сервис"](https://otpravka.pochta.ru/settings#/service-settings) (ОПС обслуживания) т.к. некоторые тарифы считают только с ним
* **ИНН-договор** - ваш "инн-договор" (через дефис) для расчета индивидуальных тарифов

#### Настройка выгрузки в ЛК (личный кабинет ПР/ создание отправлений)

* **Логин, Пароль** - логин и пароль от ЛК ПР <https://otpravka.pochta.ru/>
* **Токен авторизации** - получить можно в ЛК ПР раздел "Настройки" → ["API"](https://otpravka.pochta.ru/settings#/api-settings)
* **Категория РПО** - категория регистрируемого почтового отправление, уточните у Вашего менеджера (обычно "Простое" \[SIMPLE])
* **Вид РПО** - вид регистрируемого почтового отправление, уточните у Вашего менеджера (обычно "Посылка "нестандартная"" \[POSTAL\_PARCEL])

#### Настройки товаров по умолчанию

* **Вес** - вес товара по умолчанию, если его нет у самого товара, то будут рассчитываться по указанному

<div data-full-width="true"><img src="/files/-MjcnpQMumxKO4HLBs3J" alt="Внутренние отправления"></div>

* **Активность** - активность типа доставки
* **+ к цене доставки** - указанная сумма прибавляется к исходной сумме доставки
* **+ % цены доставки** - процент прибавляется к исходной сумме доставки (высчитывается от суммы доставки)
* **Наценка от суммы заказа** - процент прибавляется к исходной сумме доставки (высчитывается от суммы заказа)
* **+ к начальной дате** - прибавляет указанное кол-во дней к исходному минимальному кол-ву дней доставки (например 1 день, если отгрузка происходит не в день заказа)
* **+ к конечной дате** - прибавляет указанное кол-во дней к исходному максимальному кол-ву дней доставки (например 1 день, если отгрузка происходит не в день заказа)
* **+ к весу заказа** - прибавляет дополнительный вес к исходному весу заказа для расчета (например 50гр для упаковки)
* **Страны, Области, Города (если пусто, то применяется ко всем)** - расчет доставки будет выводится только для указанных местоположений (**"НЕ"** - расчет доставки не выводится для указанных местоположений), если ничего не указывать, доставка рассчитывается для всех \* (например если в у Вас своя собственная доставка по городу и вы не хотите выводить сторонние ТК, укажите город и поставьте галочку "НЕ")
* **Платежные системы** - указания доступности оплат для типа доставки (например если в [общих настройках](https://www.hostcms.ru/documentation/modules/shop/references/delivery/delivery-and-payment-systems-relations/) для доставки выбраны "Наличные" и "Онлайн оплата", то можно указать Курьеру "Онлайн оплата" и для данного типа доставки будет доступна только она) \*\*
* **Тариф** - тарифы для расчета
* **Опись вложения \[22], Проверка комплектности \[38], СМС-уведомления \[44]** - дополнительные услуги, которые нужно учитывать при расчете суммы доставки
* **Корпоративный клиент \[28]**  - если расчет суммы доставки нужен как юр. лица с договором ПР

{% hint style="warning" %}
\* при указании города, не обязательно для него указывать и страну и область, можно указать только город, данные поля работаю как самостоятельные настройки\
\*\* не указывайте все те же доставки, что указаны в [общих настройках](https://www.hostcms.ru/documentation/modules/shop/references/delivery/delivery-and-payment-systems-relations/)  доставки, указывайте только для ограничения для того или иного типа доставки
{% endhint %}

<div data-full-width="true"><figure><img src="/files/rkfdQsiP4K2tqBdpPj3N" alt=""><figcaption><p>Постоматы</p></figcaption></figure></div>

* *см. Внутренние отправления*

<div data-full-width="true"><img src="/files/-MjcoAyprd5rEGxCacFq" alt="Настройки для международного"></div>

* *см. Внутренние отправления*
* **Вариант пересылки** - учитывается для расчета стоимости доставки "наземным путём"/"по возможности воздушным путём"/"только воздушным путём"

#### Наложенный платеж (НП)

* **Формула** - формула расчета НП для отправителей как физ. лицо и юр. лицо с договором ПР
* **Процент** - процент НП
* **Тип** - расчет НП от "суммы товары + доставка"/"только товары"/"только доставка"
* **Не включать стоимость доставки в оплату заказа** - отображает расчет цены доставки в корзине для информации, но при создании заказа сумма доставки не будет попадать
* **Налог** - НДС в процентах для доставки (входит в стоимость)


# Boxberry

{% embed url="<https://boxberry.ru/>" %}

<div data-full-width="true"><figure><img src="/files/O3MPV4FyD5GHNKz8ZIAc" alt=""><figcaption></figcaption></figure></div>

* **API token** - сгенерированные ключи доступа API, получить можно в ЛК Boxberry в разделе "Инфоцентр" → ["Интеграция"](https://account.boxberry.ru/client/infoblock/index?tab=api\&api=methods) (вкладка Методы API)

#### Настройка выгрузки в ЛК (личный кабинет Boxberry / создание накладной)

* **Общая (объявленная) стоимость** - при 0 выгружает товары с ценой указанные в заказе, при указании больше 0 выгружает заказу указанную объявленную стоимость
* ~~**Передавать полную стоимость товара**~~ - не используется
* **Код пункта приема** - код пункта приема, если вы сдаете отправления сами, узнать можно [тут](https://market.morozovpimnev.ru/boxberry/)

#### Настройки товаров по умолчанию

* **Вес** - вес товара по умолчанию, если его нет у самого товара, то будут рассчитываться по указанному

<div data-full-width="true"><img src="/files/-Mjc0vusOkbQu7BT45dQ" alt="Настройки для курьера"></div>

* **Активность** - активность типа доставки
* **+ к цене доставки** - указанная сумма прибавляется к исходной сумме доставки
* **+ % цены доставки** - процент прибавляется к исходной сумме доставки (высчитывается от суммы доставки)
* **Наценка от суммы заказа** - процент прибавляется к исходной сумме доставки (высчитывается от суммы заказа)
* **+ к начальной дате** - прибавляет указанное кол-во дней к исходному минимальному кол-ву дней доставки (например 1 день, если отгрузка происходит не в день заказа)
* **+ к конечной дате** - прибавляет указанное кол-во дней к исходному максимальному кол-ву дней доставки (например 1 день, если отгрузка происходит не в день заказа)
* **+ к весу заказа** - прибавляет дополнительный вес к исходному весу заказа для расчета (например 50гр для упаковки)
* **Страны, Области, Города (если пусто, то применяется ко всем)** - расчет доставки будет выводится только для указанных местоположений (**"НЕ"** - расчет доставки не выводится для указанных местоположений), если ничего не указывать, доставка рассчитывается для всех \* (например если в у Вас своя собственная доставка по городу и вы не хотите выводить сторонние ТК, укажите город и поставьте галочку "НЕ")
* **Платежные системы** - указания доступности оплат для типа доставки (например если в [общих настройках](https://www.hostcms.ru/documentation/modules/shop/references/delivery/delivery-and-payment-systems-relations/) для доставки выбраны "Наличные" и "Онлайн оплата", то можно указать Курьеру "Онлайн оплата" и для данного типа доставки будет доступна только она) \*\*

{% hint style="warning" %}
\*при указании города, не обязательно для него указывать и страну и область, можно указать только город, данные поля работаю как самостоятельные настройки\
\*\*не указывайте все те же доставки, что указаны в [общих настройках](https://www.hostcms.ru/documentation/modules/shop/references/delivery/delivery-and-payment-systems-relations/)  доставки, указывайте только для ограничения для того или иного типа доставки
{% endhint %}

<div data-full-width="true"><img src="/files/-Mk8_KP9X9twR_evWZVq" alt="Настройки для ПВЗ, Наложенный платеж"></div>

* *см. Настройки для курьера*

#### Наложенный платеж (НП)

* **Формула** - используется для Почты России
* **Процент** - процент НП
* **Тип** - расчет НП от "суммы товары + доставка"/"только товары"/"только доставка"
* **Не включать стоимость доставки в оплату заказа** - отображает расчет цены доставки в корзине для информации, но при создании заказа сумма доставки не будет попадать
* **Налог** - НДС в процентах для доставки (входит в стоимость)


# DPD

{% embed url="<https://www.dpd.ru/>" %}

<div data-full-width="true"><img src="/files/-Mk8aAiMJOgewMW76r7E" alt="Основные настройки, Настройка выгрузки в ЛК, Настройки товаров по умолчанию"></div>

* **ID города отправления** - внутренний идентификатор города DPD из которого происходит отправка, узнать можно [тут](https://market.morozovpimnev.ru/dpd/)
* **Ваш клиентский номер в системе DPD** - уникальный идентификатор "Клиента", можно скопировать в ЛК DPD (1)
* **Номер ключа для интеграции** - сгенерированные ключи доступа API, получить можно в ЛК DPD в разделе ["Получение ключа интеграции"](https://www.dpd.ru/ols/order/personal/integrationKey.do2)

<div data-full-width="true"><img src="/files/-Mk8jSvfFmXjss8hu-h7" alt=""></div>

#### Настройка выгрузки в ЛК (личный кабинет DPD/ создание накладной)

* **Код терминала отправления** - уникальный идентификатор терминала DPD можно узнать [тут](https://market.morozovpimnev.ru/dpd/#dpdpvz), если вы сами довозите до терминала то укажите, если вы отдаёте от двери то оставьте пустым (от этого зависит расчет цены доставки и параметры отгрузки)
* **Контактное лицо, Контактный телефон** - контакты отправителя для указания в накладной отгрузки
* **Название страны, города, улицы, дома, офиса, квартиры забора** - адрес для указания в накладной отгрузки (если вы сами довозите до терминала то оставьте пустыми, если вы отдаёте от двери то укажите, при указании параметра "Код терминала отправления" - данные игнорируются)

#### Настройки товаров по умолчанию

* **Вес, Объем** - вес и объем (высчитывается из параметров ДШВ товара, если они есть) товара по умолчанию, если их нет у самого товара, то будут рассчитываться по указанным

<div data-full-width="true"><img src="/files/-Mk8m6FbU2CMwZhWS4-1" alt="Настройки для курьера"></div>

* **Активность** - активность типа доставки
* **+ к цене доставки** - указанная сумма прибавляется к исходной сумме доставки
* **+ % цены доставки** - процент прибавляется к исходной сумме доставки (высчитывается от суммы доставки)
* **Наценка от суммы заказа** - процент прибавляется к исходной сумме доставки (высчитывается от суммы заказа)
* **+ к начальной дате** - прибавляет указанное кол-во дней к исходному минимальному кол-ву дней доставки (например 1 день, если отгрузка происходит не в день заказа)
* **+ к конечной дате** - прибавляет указанное кол-во дней к исходному максимальному кол-ву дней доставки (например 1 день, если отгрузка происходит не в день заказа)
* **+ к весу заказа** - прибавляет дополнительный вес к исходному весу заказа для расчета (например 50гр для упаковки)
* **Страны, Области, Города (если пусто, то применяется ко всем)** - расчет доставки будет выводится только для указанных местоположений (**"НЕ"** - расчет доставки не выводится для указанных местоположений), если ничего не указывать, доставка рассчитывается для всех \* (например если в у Вас своя собственная доставка по городу и вы не хотите выводить сторонние ТК, укажите город и поставьте галочку "НЕ")
* **Платежные системы** - указания доступности оплат для типа доставки (например если в [общих настройках](https://www.hostcms.ru/documentation/modules/shop/references/delivery/delivery-and-payment-systems-relations/) для доставки выбраны "Наличные" и "Онлайн оплата", то можно указать Курьеру "Онлайн оплата" и для данного типа доставки будет доступна только она) \*\*
* **Тариф** - тарифы для расчета

{% hint style="warning" %}
\*при указании города, не обязательно для него указывать и страну и область, можно указать только город, данные поля работаю как самостоятельные настройки\
\*\*не указывайте все те же доставки, что указаны в [общих настройках](https://www.hostcms.ru/documentation/modules/shop/references/delivery/delivery-and-payment-systems-relations/)  доставки, указывайте только для ограничения для того или иного типа доставки
{% endhint %}

<div data-full-width="true"><img src="/files/-Mk8mOTQ8sGz6nopdFVJ" alt="Настройки для ПВЗ, Наложенный платеж"></div>

* *см. Настройки для курьера*

#### Наложенный платеж (НП)

* **Формула** - используется для Почты России
* **Процент** - процент НП
* **Тип** - расчет НП от "суммы товары + доставка"/"только товары"/"только доставка"
* **Не включать стоимость доставки в оплату заказа** - отображает расчет цены доставки в корзине для информации, но при создании заказа сумма доставки не будет попадать
* **Налог** - НДС в процентах для доставки (входит в стоимость)


# ПЭК

{% embed url="<https://pecom.ru>" %}

<div data-full-width="true"><img src="/files/tJyGbwvMckRg8pmRyae3" alt="Основные настройки, Настройка выгрузки в ЛК, Настройки товаров по умолчанию"></div>

* **Код города отправителя** - внутренний идентификатор города ПЭК из которого происходит отправка, узнать можно [тут](https://market.morozovpimnev.ru/pecom/)
* **Логин** - Ваш логин в ЛК ПЭК
* **API ключ** - сгенерированные ключи доступа API, получить можно в ЛК ПЭК в разделе ["Регистрационные данные"](https://kabinet.pecom.ru/profile) → "Ключи API"

<div data-full-width="true"><img src="/files/dlvKp7VG4Pe8UdDCbPMU" alt=""></div>

#### Настройка выгрузки в ЛК (личный кабинет ПЭК / создание накладной)

* **Город отправителя, Телефон отправителя, Контактное лицо отправителя** - контакты отправителя для указания в накладной отгрузки
* **Идентификатор склада** - внутренний ID склада отправления ПЭК, узнать можно [тут](https://market.morozovpimnev.ru/pecom/#warehouseId)

#### Настройки товаров по умолчанию

* **Вес, Длина, Ширина, Высота** - вес и габариты товара по умолчанию, если их нет у самого товара, то будут рассчитываться по указанным


# Деловые линии

{% embed url="<https://www.dellin.ru/>" %}

<div data-full-width="true"><figure><img src="/files/sgAiTYrxUienix32kJjG" alt=""><figcaption></figcaption></figure></div>

* **Ключ приложения** - Ключ приложения. Для получения ключа необходимо пройти регистрацию [тут](https://dev.dellin.ru/registration/)
* **КЛАДР города-отправителя** - код КЛАДР города отправления посылки
* **Логин/Пароль от Личного кабинета** - (необязательно) требуется для учета индивидуальных скидок

<div data-full-width="true"><figure><img src="/files/U9zHwlDgIZtPq03pmXgL" alt=""><figcaption></figcaption></figure></div>

#### Настройка выгрузки в ЛК

* ID терминала отправки - код пункта приема

#### Настройки товаров по умолчанию

* **Вес, Объем** - вес и габариты товара по умолчанию, если их нет у самого товара, то будут рассчитываться по указанным

<div data-full-width="true"><figure><img src="/files/zlRPwyK0gu9jNMYfw5pu" alt=""><figcaption></figcaption></figure></div>


# Энергия

{% embed url="<https://nrg-tk.ru/>" %}

<div data-full-width="true"><figure><img src="/files/mRF5RX7NilwXtsCMK3kX" alt=""><figcaption><p>Основные настройки, Настройка выгрузки в ЛК, Настройки товаров по умолчанию</p></figcaption></figure></div>

* **Код города отправителя** - внутренний идентификатор города Энергия из которого происходит отправка, узнать можно [тут](https://market.morozovpimnev.ru/nrgtk/)
* **API токен** - сгенерированные ключи доступа API, получить можно в ЛК Энергия в разделе ["Ключ разработчика"](https://clients.nrg-tk.ru/token)

#### Настройки товаров по умолчанию

* **Вес, Длина, Ширина, Высота** - вес и габариты товара по умолчанию, если их нет у самого товара, то будут рассчитываться по указанным

<div data-full-width="true"><figure><img src="/files/DsojXWEOkOyBoxSwgDGR" alt=""><figcaption><p>Настройки для курьера</p></figcaption></figure></div>

* **Активность** - активность типа доставки
* **+ к цене доставки** - указанная сумма прибавляется к исходной сумме доставки
* **+ % цены доставки** - процент прибавляется к исходной сумме доставки (высчитывается от суммы доставки)
* **Наценка от суммы заказа** - процент прибавляется к исходной сумме доставки (высчитывается от суммы заказа)
* **+ к начальной дате** - прибавляет указанное кол-во дней к исходному минимальному кол-ву дней доставки (например 1 день, если отгрузка происходит не в день заказа)
* **+ к конечной дате** - прибавляет указанное кол-во дней к исходному максимальному кол-ву дней доставки (например 1 день, если отгрузка происходит не в день заказа)
* **+ к весу заказа** - прибавляет дополнительный вес к исходному весу заказа для расчета (например 50гр для упаковки)
* **Страны, Области, Города (если пусто, то применяется ко всем)** - расчет доставки будет выводится только для указанных местоположений (**"НЕ"** - расчет доставки не выводится для указанных местоположений), если ничего не указывать, доставка рассчитывается для всех \* (например если в у Вас своя собственная доставка по городу и вы не хотите выводить сторонние ТК, укажите город и поставьте галочку "НЕ")
* **Платежные системы** - указания доступности оплат для типа доставки (например если в [общих настройках](https://www.hostcms.ru/documentation/modules/shop/references/delivery/delivery-and-payment-systems-relations/) для доставки выбраны "Наличные" и "Онлайн оплата", то можно указать Курьеру "Онлайн оплата" и для данного типа доставки будет доступна только она) \*\*
* **Тариф** - тарифы для расчета


# Яндекс

{% embed url="<https://dostavka.yandex.ru/>" %}

{% hint style="danger" %}
ВНИМАНИЕ! Для работы и отображения ПВЗ требуется более 400Мб памяти на сервере иначе возможны проблемы в работе сайта
{% endhint %}

<div data-full-width="true"><figure><img src="/files/MrIywtldcLfZfCYw3KAa" alt=""><figcaption></figcaption></figure></div>

* **API токен** - сгенерированные ключи доступа API, получить можно в ЛК Яндекс Доставки в [Профиль](https://dostavka.yandex.ru/account2/profile) (Токен для API нажмите Получить)
* **Адрес точки отправления для Express** - полный адрес откуда будет забор товара курьером для доставки по городу Express
* ID ПВЗ отправления для Доставки в др. город - идентификатор пункта забора для доставки в другие города, можно узнать у своего менеджера или найти [тут](https://market.morozovpimnev.ru/yandex/)

<div data-full-width="true"><figure><img src="/files/czARjv37pTkkNDTDj4gF" alt=""><figcaption></figcaption></figure></div>

#### Настройки товаров по умолчанию

* **Вес, Длина, Ширина, Высота** - вес и габариты товара по умолчанию, если их нет у самого товара, то будут рассчитываться по указанным

<div data-full-width="true"><figure><img src="/files/Jx4Rww76HvQERaVeK37I" alt=""><figcaption></figcaption></figure></div>

* **Активность** - активность типа доставки
* **+ к цене доставки** - указанная сумма прибавляется к исходной сумме доставки
* **+ % цены доставки** - процент прибавляется к исходной сумме доставки (высчитывается от суммы доставки)
* **Наценка от суммы заказа** - процент прибавляется к исходной сумме доставки (высчитывается от суммы заказа)
* **+ к начальной дате** - прибавляет указанное кол-во дней к исходному минимальному кол-ву дней доставки (например 1 день, если отгрузка происходит не в день заказа)
* **+ к конечной дате** - прибавляет указанное кол-во дней к исходному максимальному кол-ву дней доставки (например 1 день, если отгрузка происходит не в день заказа)
* **+ к весу заказа** - прибавляет дополнительный вес к исходному весу заказа для расчета (например 50гр для упаковки)
* **Страны, Области, Города (если пусто, то применяется ко всем)** - расчет доставки будет выводится только для указанных местоположений (**"НЕ"** - расчет доставки не выводится для указанных местоположений), если ничего не указывать, доставка рассчитывается для всех¹ (например если в у Вас своя собственная доставка по городу и вы не хотите выводить сторонние ТК, укажите город и поставьте галочку "НЕ")
* **Платежные системы** - указания доступности оплат для типа доставки (например если в [общих настройках](https://www.hostcms.ru/documentation/modules/shop/references/delivery/delivery-and-payment-systems-relations/) для доставки выбраны "Наличные" и "Онлайн оплата", то можно указать Курьеру "Онлайн оплата" и для данного типа доставки будет доступна только она)²
* **Тариф** - тарифы для расчета³

{% hint style="warning" %}
¹при указании города, не обязательно для него указывать и страну и область, можно указать только город, данные поля работаю как самостоятельные настройки\
²не указывайте все те же платежные системы, что указаны в [общих настройках](https://www.hostcms.ru/documentation/modules/shop/references/delivery/delivery-and-payment-systems-relations/)  доставки, указывайте только для ограничения для того или иного типа доставки

³Для тарифа Express - такси по городу, должна быть включена настройка ["**Использовать полный поиск по адресу**"](/megapost/nastroika-megapost#vkladka-obshie) т.к. расчет идет по полному адресу
{% endhint %}


# Мой склад \[HostCMS]

​Вывод своих пунктов выдачи (собственных магазинов)

<div data-full-width="true"><img src="/files/QLoJtF5aMZG7Yl1DvvTR" alt=""></div>

<div data-full-width="true"><img src="/files/Y0hoK60ojEBG4Wo8AJYc" alt="Основные настройки"></div>

* **Вид** - отображение пунктов в корзине, *Списком:* выводит как обычные доставки для курьера, *Карта:* все офисы отображаются на одной карте при выборе пункта "Самовывоз из пункта выдачи"
* **Объект** - *Доставка:* условия доставки (можно применять условия, например самовывоз с собственного склада только при заказе от 5000 руб.), *Склады:* Интернет-магазины - Склады
* **Дней доставки от/до** - мин. и макс. время когда можно получить заказ самовывозом

#### Пример заполнения "Список условий доставки" \*

<div data-full-width="true"><img src="/files/9vQQWl1zJh14gbq2gi3g" alt="Список условий доставки"></div>

<div data-full-width="true"><img src="/files/l1nc4lQYZxchLGjNZ0Yw" alt="Редактирование информации об условии доставки"></div>

{% hint style="info" %}
\*для вида **"Карта"**, координаты заполняются в поле **"Сроки доставки"** в виде *ШИРОТА,ДОЛГОТА* (через запятую), "Описание" заполняется в следующей последовательности, каждое с новой строки:

*Телефон*\
*Время работы*\
*Комментарий*&#x20;
{% endhint %}

#### Пример заполнения "Склады" \*\*

<div data-full-width="true"><img src="/files/DlfpOk6Tac7xatua3nlv" alt="Склады"></div>

<div data-full-width="true"><img src="/files/qnsOL2qc8xWgwEocuie6" alt="Редактирование склада"></div>


# 5POST

{% embed url="<https://fivepost.ru/>" %}

<div data-full-width="true"><figure><img src="/files/WEUKaOWrK9w2Mtp5ffs4" alt=""><figcaption></figcaption></figure></div>

API ключ - приходит на почту указанную при регистрации в архиве, пароль от архива приходит в SMS на телефон указанный при регистрации

ID склада отгрузки - код вашег скада созданого в ЛК 5POST ["Мои склады"](https://fivepost.ru/partners-portal/warehouses)

<div data-full-width="true"><figure><img src="/files/Cxo0hnDjU11ZCO6BLWMR" alt=""><figcaption></figcaption></figure></div>


# ЖелДорЭкспедиция

{% embed url="<https://www.jde.ru/>" %}

<div data-full-width="true"><figure><img src="/files/kWspVwMhdkAY96cx1OHm" alt=""><figcaption></figcaption></figure></div>

* **Код города отправления** - идентификатор города отправителя, можно узнать у своего менеджера или найти [тут](https://market.morozovpimnev.ru/jde/)
* **User-id / API-ключ** - сгенерированные API ключи доступа, получить можно в ЛК ЖелДорЭкспедиция в [Настройки / API](https://i.jde.ru/cabinet/settings/)


# MegaPost условия

Перейдите в раздел **Контент** → **Интернет-магазины**. Выберите магазин, перейдите в список типов доставки **Справочники** → **Доставки** → **MegaPost Настройки** → **MegaPost условия** → **Добавить**

<div data-full-width="true"><img src="/files/-MjdVTJWWJK63iUbqboe" alt=""></div>

<div data-full-width="true"><img src="/files/-MjdW6_3jHGa5IT0EscT" alt="Добавление информации об условии доставки"></div>

* **Название** - название условия доставки (любое)
* **Страна, Область, Город** - местоположение к которому применяется условие (**"НЕ"** - исключается)
* **Вес заказа от/до** - вес при котором условие будет выполняться
* **Цена заказа от/до** - сумма заказа при которой условие будет выполняться
* **Сумма доставки от/до** - сумма доставки при которой условие будет выполняться
* **Условие применяется для** - тип доставки для которого применятся условие "Курьерская доставка"/"Самовывоз (ПВЗ)"/"Для всех" *(к типу "Курьерская доставка" относится и "Внутренние отправления" Почты России)*
* **Тип цены** - расчет цены доставки при выполнении условия (Процент - прибавляемый процент к доставке от суммы доставки, Сумма - целое число прибавляемое к сумме доставки, Скидка - скидка на сумму доставки)
* **Цена доставки** - число для вычисления "типа цены"
* **Исходная цена** - отменяет настройки параметра "типа цены"
* Активно - активность условия
* **Не показывать расчёт** - при попадание под условие по текущим параметрам не будет выводить доставку (Например: для заказов весом выше 25кг)
* **Тариф** - применяемость условия под конкретный тариф (Например: тариф "4030" Почты России)
* **Оператор** - применяемость условия под конкретного оператора (для агрегаторов/сервисов доставки, которые объединяют в себе разные ТК)
* **Доставки для которых будет применяться условие (если пустое поле, то применяется для всех)** - доставки для условия
* **Платежные системы** - при указании платежных систем, при попадание под условие по текущим параметрам, будут выводится свои платежные системы


# Зависимые поля

Зависмие поля, это поля, котрые отображаются для обязательного заполнения, после выбора конкретной доставки (`div.delivery_filed`)

Поля настраиваются в элемент доставки при ее редактировании, выбор осуществляется поиском при вводе названия или названия поля в базе mysql, возможно добавления доп. свойств

<div data-full-width="true"><figure><img src="/files/Gi9hz4v3TPHFab4wdSg9" alt=""><figcaption><p>Редактирование доставки</p></figcaption></figure></div>

Зависмые поля попадают в XML данные доставки в тэг `<dependent_fields>`, вывод в XSL шаблоне можно посмотреть в исходнике шаблона **МагазинДоставки \[MEGAPOST]**

{% code lineNumbers="true" fullWidth="true" %}

```html
<shop_delivery id="123">
   ...
   <dependent_fields>
      <field>surname</field>
      <field>patronymic</field>
      <field>address</field>
      <field>house</field>
      <field>flat</field>
   </dependent_fields>
</shop_delivery>
```

{% endcode %}


# Тип платежной системы

В зависимости от типа оплаты, доступен различный функционал

<div data-full-width="true"><figure><img src="/files/7ig6zciW9XK7CfIYTDue" alt=""><figcaption><p>Справочник платежных систем</p></figcaption></figure></div>

При выборе в корзине оплаты с типом:

#### Наличные (тип 0)

Производится расчет наложенного платежа, в зависимости от [настроек выбранной доставки](https://support.morozovpimnev.ru/megapost/nastroika-megapost/sdek#nalozhennyi-platezh-np) и добавляется к сумме заказа

#### Счет (тип 3)

Происходит отображение блока (`div.payment_filed`) с полями для заполнения юр. данных (компания, инн, кпп), вывод в XSL шаблоне можно посмотреть в исходнике шаблона **МагазинПлатежнаяСистема \[MEGAPOST]**


# Карточка товара

### Вывод расчета доставок в карточке товара

На странице товара нужно вставить html код в любое место (см. код ниже), куда скрипт будет подгружать расчет доставки (где 123 - ID товара)

{% code title="МагазинТовар" lineNumbers="true" fullWidth="true" %}

```markup
<div class="boxLoaderDelivery" data-shopitemid="123"></div>
```

{% endcode %}

{% hint style="info" %}
XSL-шаблон доставок указывается в [Настройках MegaPost](https://support.morozovpimnev.ru/megapost/nastroika-megapost#vkladka-obshie) -> "**XSL шаблон доставок для товара**"
{% endhint %}


# Вывод карты ПВЗ

### Вывод карты ПВЗ на странице

На странице (например страница доставки) нужно вставить html код в любое место (см. код ниже), куда скрипт будет подгружать карту с ПВЗ (где 123 - ID вашего магазина)

{% code title="Страница доставки" lineNumbers="true" fullWidth="true" %}

```markup
<div class="boxLoaderPVZDelivery" data-shopid="123"></div>
```

{% endcode %}

{% hint style="info" %}
XSL-шаблон карты ПВЗ указывается в [Настройках MegaPost](https://support.morozovpimnev.ru/megapost/nastroika-megapost#vkladka-obshie) -> "**XSL шаблон вывода карты ПВЗ**"
{% endhint %}


# Выгрузка заказов в ЛК

У некоторых доставок реализована выгрузка заказов с сайта в личный кабинет транспортных компаний в ручном режиме.

Выгрузка происходи при изменении статуса заказа на тот, который указан в [Настройка MegaPost](/megapost/nastroika-megapost) параметр **"Статус для выгрузки заказа по API"** (если статус не указан, то выгрузка происходить не будет).

После успешной выгрузки\* должен вернуться трек номер, который сохраняется в дополнительное свойство заказа "Номер отправления", который вы можете уже использовать в своих целях (например вывести в XSL-шаблоне и делать отправку клиенту)

{% hint style="danger" %}
Все логи выгрузки записываются в **«Журнал событий»**\*, можно ознакомиться для анализа ошибок.\
*\*модуль доступен в редакции **HostCMS.Бизнес**, для младшей редакции смотрите файлы в директории **/hostcmsfiles/logs/(текущая дата).log.csv***
{% endhint %}

### Выгрузка заказа сразу после создания заказа

{% hint style="danger" %}
Это нестандартный функционал, хук приведен для примера и стандартно должен работать, если что то не работает, то произведите тестирования кода со своим администартором сайта
{% endhint %}

— в корне сайта в файле **bootstrap.php** разместите следующий код:

{% code lineNumbers="true" fullWidth="true" %}

```php
class My_Shop_Order_Observer
{
  static public function onAfterProcessOrder($object, $args)
  {
    $oShop_Order = $object->getShopOrder();
    $oShop_Order_Before = clone $oShop_Order;

    $oShop_Order->shop_order_status_id = 123; // статус из настроек megapost
    $oShop_Order->save();
    
    $handler = Shop_Payment_System_Handler::factory($oShop_Order->Shop_Payment_System);
    $handler->shopOrderBeforeAction($oShop_Order_Before)->shopOrder($oShop_Order);
    
    MegaPost_Observer::onBeforeChangedOrder($handler, array('edit'));
  }
}

Core_Event::attach('Shop_Payment_System_Handler.onAfterProcessOrder', array('My_Shop_Order_Observer', 'onAfterProcessOrder'));
```

{% endcode %}


# Изменение названий тарифов

Посмотреть все названия можно в файле */modules/megapost/i18n/ru.php*, для их изменения можно воспользоваться стандартной [интернационализацией](https://www.hostcms.ru/documentation/modules/additional/i18n/) HostCMS (Расширение языковых файлов для модулей), в корне сайта в файле **bootstrap.php** разместите следующий код:

{% code title="bootstrap.php" lineNumbers="true" fullWidth="true" %}

```php
/* 
 * в файле ru.php было
 * 'pochta_tariff_0_4030' => "Посылка нестандартная"
 * 'pochta_tariff_0_23030' => "Посылка онлайн обыкновенная"
 */
 
Core_I18n::instance()->expandLng('megapost',
	array(
		'pochta_tariff_0_4030' => 'Посылка обычная',
		'pochta_tariff_0_23030' =>  'Посылка онлайн',
	)
);
```

{% endcode %}


# Город для расчета

Если вы все сделали как в [Настройки макета](/megapost/nastroiki-maketa) и указали код **MegaPost\_GeoIp::getCountryLocationCity()**, то при первом заходе в сессию (ASMP\_City) посетителя сохраняется вся информацию по его местоположению для дальнейшего расчета доставок, при любом изменении города сессия перезаписывается

{% code lineNumbers="true" fullWidth="true" %}

```php
print_r($_SESSION['ASMP_City']);

/*
Array
(
    [ip] => 192.168.0.1
    [city] => Екатеринбург
    [region] => Свердловская область
    [country_iso] => RU
    [country] => Россия
    [shop_country_id] => 175
    [shop_country_location_id] => 55
    [region_id] => 66
    [region_kladr] => 6600000000000
    [shop_country_location_city_id] => 1888
    [postcode] => 620033
    [kladr] => 6600000100000
)
*/
```

{% endcode %}

Если вы хотите подставить свой город, то можно сделать следующее, после вызова **MegaPost\_GeoIp::getCountryLocationCity()**, разместите следующий код

{% tabs %}
{% tab title="из справочника HostCMS" %}
{% code lineNumbers="true" fullWidth="true" %}

```php
if(!isset($_SESSION['ASMP_City']))
{
    $oShop_Country_Location_City = Core_Entity::factory('Shop_Country_Location_City', 123); // где 123 - ID города
    $_SESSION['ASMP_City'] = MegaPost_GeoIp::makeCity($oShop_Country_Location_City);
}

MegaPost_GeoIp::getCountryLocationCity();
```

{% endcode %}
{% endtab %}

{% tab title="любой другой город" %}
{% code lineNumbers="true" fullWidth="true" %}

```php
if(!isset($_SESSION['ASMP_City']))
{
    $aReturn = array(
        'city' => 'Екатеринбург',
        'region' => 'Свердловская область',
        'country' => 'Россия',
        'country_iso' => 'RU',
        'kladr' => 6600000100000,
        'region_kladr' => 6600000000000,
        'region_id' => 66,
    );
    
    $_SESSION['ASMP_City'] = $aReturn;
}

MegaPost_GeoIp::getCountryLocationCity();
```

{% endcode %}
{% endtab %}
{% endtabs %}


# Добавление доставки

### Добавление типа доставки (по формуле)

Обновите модуль до последней доступной версии ([как обновить](/megapost/obnovlenie-modulya))

Перейдите в раздел  (:house: **Домой** / **Интернет-магазины** / **Демонстрационный магазин**\* / **Типы доставки**) и нажмите **«Добавить»** (1)

{% hint style="warning" %}
\*у Вас может быть свое название магазина
{% endhint %}

<div data-full-width="true"><img src="/files/-MjcxfrMFYXKMcbrV8-6" alt="Типы доставки"></div>

Заполните нужные поля, выберите **"По формуле"** и в поле **"Код обработчика"** код\*, нажмите **"Сохранить" \*\***

{% hint style="success" %}
**\***&#x41A;од обработчика для конкретной доставки и конкретной версии можно получить по ссылке <https://asmp.su/bn>
{% endhint %}

{% hint style="danger" %}
**\*\*Внимание не забудьте поменять в коде у Shop\_Delivery\_Handler ID на правильные**\
— Обработчик доставки представляет собой класс, унаследованный от **Shop\_Delivery\_Handler**, имя класса зависит от идентификатора доставки по схеме **Shop\_Delivery\_Handler{ID}**
{% endhint %}

<div data-full-width="true"><img src="/files/-MjcyTPJUSIOWmismy3B" alt=""></div>

Перейдите в [«MegaPost настройки»](/megapost/nastroika-megapost) и в новой вкладке доставки, настройте параметры


# Шаблон карточки заказа

Свой шаблон с данными из MegaPost можно настроить следующим образом

<div data-full-width="true"><figure><img src="/files/8wC6xjlFGZhKZ2BShgSP" alt=""><figcaption></figcaption></figure></div>

Создайте константу `SHOP_ORDER_CARD_XSL`, внесите в нее название XSL-шаблона "МагазинКарточкаЗаказа \[MEGAPOST] \[ДАТА\_ШАБЛОНА]"

<div data-full-width="true"><figure><img src="/files/XLAUd0PspiCxgVltNkJA" alt=""><figcaption></figcaption></figure></div>

{% hint style="info" %}
Все примеры **XSL-шаблонов** находятся в одноименных папках, под названием **"megapost"** соответсвующего раздела
{% endhint %}


# MegaPost\_Command\_Controller

Все ajax запросы идут через командер MegaPost\_Command\_Controller

* **getCity** - Список городов
* **setCity** - Сохранение выбранного города в сессии
* **cartOneStep** - Показ корзины/пересчет корзины
* **deliveryOneStep** - Показ списка доставок
* **paymentSystemOneStep** - Показ списка оплат
* **deliveryCalculate/deliveryPVZCalculate** - Калькулятор доставки на странице товара и показ карты на отдельной странице

Если вы хотите изменить/заменить его, то в [настрйоках JS](https://support.morozovpimnev.ru/megapost/pages/mXnQ4DBffGA3IvxheBNV#nastroiki-v-js-megapost-scriptxxxx.js) в параметре `callback` указываете свой путь и в `bootstrap.php` размещаете свой обработчик **route**

{% code lineNumbers="true" fullWidth="true" %}

```php
Core_Router::add('megapost/callback', '/megapost/mycallback/')
    ->controller('MegaPost_Command_MyController');
```

{% endcode %}

Создайте файл `/modules/megapost/command/mycontroller.php` с class `MegaPost_Command_MyController` и внесите нужные изменения


# Работа с Яндекс картой (ymaps)

Получить доступ к методам карты **ymaps** можно следующим образом:

{% code lineNumbers="true" fullWidth="true" %}

```javascript
setTimeout(
    function(){
        var mymaps = MegaPostClient.Init.jMblock.data('megapost').getMap(); // возвращает ymaps, если карта была создана, иначе будет ошибка 
        mymaps.map.behaviors.disable('scrollZoom'); // например, отключаем скролл карт
}, 1000);
```

{% endcode %}

{% hint style="info" %}
данный код лучше использовать в файле /hostcmsfiles/megapost/js/megapost-script9999.js (9999 - Ваш уникальный номер файла при установке), в блоке функции **getMblock**
{% endhint %}

<div data-full-width="true"><img src="/files/S0Bupy2t8lKGVT1Y0a0B" alt=""></div>


# Core\_Http

https\://www\.hostcms.ru/api7/classes/Core-Http-Curl.html

Модуль использует стандартный функционал HostCMS Core\_Http Curl для запросов к API сервисов

Иногда необходимо внести некоторые настройки в curlcache options, когда сервис не отвечает и отдает статуст 0

в файл `/modules/core/config/http.php` в curlcache нужно в массив options нужно внести следующее:

{% code fullWidth="true" %}

```php
CURLOPT_VERBOSE => TRUE,
CURLOPT_SSL_VERIFYHOST => FALSE,
CURLOPT_SSL_VERIFYPEER => FALSE,
```

{% endcode %}


# Content Security Policy

Для работы яндекс карты и других ее плагинов в ЦА в файл `/modules/core/config/config.php` нужно внести следующее:

{% code overflow="wrap" fullWidth="true" %}

```php
'backendContentSecurityPolicy' => "default-src 'self' www.hostcms.ru www.youtube.com youtube.com api-maps.yandex.ru; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: *.cloudflare.com *.kaspersky-labs.com api-maps.yandex.ru suggest-maps.yandex.ru *.maps.yandex.net yandex.ru yastatic.net; img-src 'self' chart.googleapis.com data: blob: www.hostcms.ru api-maps.yandex.ru *.maps.yandex.net yandex.ru; font-src 'self'; connect-src 'self' blob: api-maps.yandex.ru suggest-maps.yandex.ru *.maps.yandex.net yandex.ru *.taxi.yandex.net; style-src 'self' 'unsafe-inline' blob:; frame-src 'self' www.hostcms.ru api-maps.yandex.ru; child-src 'self' www.hostcms.ru api-maps.yandex.ru",
```

{% endcode %}

Если у вас уже там существуют свои настройки, то ниже приведен отдельный список настроек для [Яндекс](https://yandex.ru/dev/jsapi-v2-1/doc/ru/v2-1/dg/concepts/load#using-csp)

В таблице ниже приведены правила, которые необходимо добавить в политику приложения для работы c API. Правила перечисляются отдельно для каждой директивы. Обратите внимание на многоточия в примерах — это означает, что правила, необходимые для работы с API, приведены без учета других правил, которые разработчик может задать для своего приложения. Если для какой-либо директивы в политике будет разрешена загрузка из любых источников (например, 'img-src \*;'), то для этой директивы соответствующие правила API можно не задавать.

<table data-header-hidden><thead><tr><th width="159.5999755859375">Директива</th><th>Правила, которые требуется добавить в директиву</th></tr></thead><tbody><tr><td><code>img-src</code></td><td><p>Для директивы <code>img-src</code> в список разрешенных источников необходимо добавить домены:</p><ul><li><code>https://*.maps.yandex.net</code> (для загрузки тайлов);</li><li><code>api-maps.yandex.ru</code> (для загрузки курсоров и т. п.);</li><li><code>enterprise.api-maps.yandex.ru</code> (для загрузки курсоров в платной версии API);</li><li><code>https://yandex.ru</code>.</li></ul><p>С этих доменов будут загружаться изображения API. Кроме того, некоторые изображения API вставляются через data:URL, поэтому в директиве <code>img-src</code> также необходимо указать протокол <strong>data:</strong>.</p><pre><code>img-src data: https://*.maps.yandex.net api-maps.yandex.ru ...;
</code></pre></td></tr><tr><td><code>frame-src</code></td><td><p>В директиве <code>frame-src</code> должены быть разрешены домены</p><ul><li><code>https://api-maps.yandex.ru</code></li><li><code>https://enterprise.api-maps.yandex.ru</code> (для платной версии API)</li></ul><p>С этих доменов будут загружаться компоненты API, которые размещаются во фреймах (например, блок «Открыть в Яндекс Картах»):</p><pre><code>frame-src https://api-maps.yandex.ru ...;
frame-src https://enterprise.api-maps.yandex.ru ...;
</code></pre><p>Примечание</p><p>Директива <code>frame-src</code> используется в CSP версии 1.0; в версии 2.0 эта директива заменена на <code>child-src</code>. Однако некоторые браузеры еще не поддерживают CSP 2.0, поэтому для обеспечения кроссбраузерной совместимости в политике рекомендуется указывать обе эти директивы:</p><pre><code>frame-src https://api-maps.yandex.ru ...;
child-src https://api-maps.yandex.ru ...;
frame-src https://enterprise.api-maps.yandex.ru ...;
child-src https://enterprise.api-maps.yandex.ru ...;
</code></pre></td></tr><tr><td><code>script-src</code></td><td><p>В директиве <code>script-src</code> нужно добавить следующие домены:</p><ul><li><code>https://api-maps.yandex.ru</code></li><li><code>https://enterprise.api-maps.yandex.ru</code> (для платной версии API)</li><li><code>https://suggest-maps.yandex.ru</code></li><li><code>https://*.maps.yandex.net</code></li><li><code>https://yandex.ru</code></li><li><code>https://yastatic.net</code></li></ul><p>С этих доменов будут загружаться модули API. Кроме того, для работы с шаблонами в директиве <code>script-src</code> рекомендуется включить поддержку 'unsafe-eval’ (это необходимо для работы условных операторов).</p><pre><code>script-src 'unsafe-eval' https://api-maps.yandex.ru
 https://suggest-maps.yandex.ru https://*.maps.yandex.net
 https://yandex.ru ...;
</code></pre></td></tr><tr><td><code>connect-src</code></td><td><p>Для директивы <code>connect-src</code> следует разрешить домены:</p><ul><li><code>https://api-maps.yandex.ru</code></li><li><code>https://enterprise.api-maps.yandex.ru</code> (для платной версии API)</li><li><code>https://suggest-maps.yandex.ru</code></li><li><code>https://*.maps.yandex.net</code></li><li><code>https://yandex.ru</code></li><li><code>https://*.taxi.yandex.net</code></li></ul><pre><code>connect-src https://api-maps.yandex.ru
 https://suggest-maps.yandex.ru https://*.maps.yandex.net
 https://yandex.ru ...;
</code></pre></td></tr><tr><td><code>style-src</code></td><td><p>Для загрузки стилей API в директиве <code>style-src</code> необходимо указать протокол <strong>blob:</strong>.</p><pre><code>style-src: blob: ...;
</code></pre><p>API будет подключать стили на страницу через элемент &#x3C;\link>, содержащий blob URL нужного стиля. Если в приложении использование blob невозможно, то для корректной работы с API в директиве <code>style-src</code> можно указать nonce-значение, сгенерированное на стороне клиента. В этом случае API будет подключать стили через inline-элемент &#x3C;\style nonce="...">.</p><pre><code>style-src 'nonce-&#x3C;токен>' ...;
</code></pre><p>Это же значение следует передать в параметре <code>csp</code> при подключении API:</p><p>Для бесплатной версии API:</p><pre><code>https://api-maps.yandex.ru/2.1/?apikey=&#x3C;API-ключ>&#x26;lang=ru_RU&#x26;csp[style_nonce]=&#x3C;токен>
</code></pre><p>Для платной версии API:</p><pre><code>https://enterprise.api-maps.yandex.ru/2.1/?apikey=&#x3C;API-ключ>&#x26;lang=ru_RU&#x26;csp[style_nonce]=&#x3C;токен>
</code></pre><p>Следует иметь в виду, что атрибут <code>nonce</code> реализован в CSP 2.0 и не поддерживается в версии 1.0. Однако в некоторых браузерах еще не включена поддержка CSP 2.0, поэтому для обеспечения кроссбраузерной совместимости в <code>style-src</code> рекомендуется использовать протокол blob:.</p></td></tr></tbody></table>

Если для какого-либо ресурса API политика определена неправильно, то карта (либо ее объекты) будут отображаться некорректно. При этом API не отслеживает, для каких ресурсов политика задана неверно. Чтобы получить информацию о том, какие ресурсы карты не могут быть загружены, можно воспользоваться директивой [report-uri](https://developer.mozilla.org/en-US/docs/Web/Security/CSP/CSP_policy_directives#report-uri).

Ниже приведен пример политики, в которой определены правила для работы с API, а также другие правила приложения:

{% code fullWidth="true" %}

```
Content-Security-Policy:
  img-src data: https://*.maps.yandex.net https://api-maps.yandex.ru https://yandex.ru 'self';
  child-src https://api-maps.yandex.ru;
  frame-src https://api-maps.yandex.ru;
  script-src https://api-maps.yandex.ru https://suggest-maps.yandex.ru http://*.maps.yandex.net https://yandex.ru https://yastatic.net 'self';
  connect-src https://api-maps.yandex.ru https://suggest-maps.yandex.ru https://*.maps.yandex.net https://yandex.ru https://*.taxi.yandex.net;
  style-src blob:;
```

{% endcode %}


# Обновление модуля

* Перейдите в раздел "Обслуживание" → **"Обновления"**
* Установите поочередно обновления **"MegaPost"** до последней версии\*
* В Ваших текущих используемых XSL-шаблонах, ТДС, css/js проверить недостающие новые изменения и добавить если такие имеются (если после обновления все работает, то можно пропустить этот шаг)
* Перейдите в раздел  (:house: **Домой** / **Интернет-магазины** / **Демонстрационный магазин**\*\* / **Типы доставки**) из последней копии по дате обработчиков доставки (2) скопируйте **"Код обработчика"** и замените его в текущем используемой обработчике доставки (1)\*\*\*, после чего удалите копии (3)
* Использование нового js скрипта модуля если у вас был подключен */hostcmsfiles/megapost/js/megapost-script9999.js* (где **9999** уникальный номер файла при установке, посмотреть можно в папке */hostcmsfiles/megapost/\*/*), то подключить нужно самый последний созданный по дате скрипт с другим уникальный номером (если после обновления все работает, то можно пропустить этот шаг)
* Проверить [«MegaPost настройки»](/megapost/nastroika-megapost), пересохраните (при необходимости внесите их снова)

<div data-full-width="true"><img src="/files/-Mjck2FVBMbXJUi9DB3H" alt="Копии обработчиков доставки после обновления"></div>

{% hint style="warning" %}
\*При обновлении/удалении текущие используемые XSL-шаблоны, ТДС, css/js и обработчики доставки не заменяются/удаляются, а создаются как новые (копии) с текущей датой (например: МагазинДоставки \[MEGAPOST] \[05.06.2020 13:00:24] / СДЭК \[05.06.2020 13:00:24]) для каждой установленной версии\
\*\*у Вас может быть свое название магазина
{% endhint %}

{% hint style="danger" %}
**\*\*\* Внимание не забудьте поменять в коде у Shop\_Delivery\_Handler ID на правильные (1)**\
— Обработчик доставки представляет собой класс, унаследованный от **Shop\_Delivery\_Handler**, имя класса зависит от идентификатора доставки по схеме **Shop\_Delivery\_Handler{ID}**
{% endhint %}

<div data-full-width="true"><img src="/files/-Mjcl-ON8nDs-qdF1VWT" alt="Код обработчика доставки по формуле"></div>

{% hint style="danger" %}
**ВНИМАНИЕ!** После обновления, не оставляйте копии обработчиков доставки, удаляйте их!
{% endhint %}


# Отладка

{% hint style="danger" %}

### Внимание! Отладкой должен заниматься Ваш технический специалист.

{% endhint %}

### Расчет доставки

Авторизуйтесь в ЦА сайта, откройте в браузере **"Консоль JavaScript"** **Ctrl + Shift + J** (для Яндекс.Браузера/Chrome) и перейдите в корзину, дождитесь расчета, после чего Вы увидите данные отправленных и пришедших запросов

{% hint style="info" %}
Для вывода данных в Настройках MegaPost должен быть включен параметр ["Выводить логи в консоль браузера"](/megapost/nastroika-megapost#pvz-obshie-nastroiki-elementa)
{% endhint %}

<div data-full-width="true"><figure><img src="/files/zUs9uYkwLsoFg2qleIxg" alt=""><figcaption></figcaption></figure></div>

Кажада доставка подписана и все запросы/ответы разворачиваются\
request - это запрос для расчета\
response - это ответ, если он 200-202 и нет ошибок, занчит все хорошо

так же в конце выводится общее время расчета каждой доставки (например 1.033 с.)

### Выгрузка заказа

Чтобы посмотреть запросы при выгрузке

{% tabs %}
{% tab title="Модуль "История изменений"" %}
Если стоит наш модуль ["История изменений"](https://asmp.su/changelog) то все намного проще, рекомендуем его ставить

После выгрузки заказа, в самом заказе, перейдите на вкладку "Журнал изменений" там будут все запросы/ответы по API к транспортной компании

<div data-full-width="true"><figure><img src="/files/0baHn14xWDcbC4GiEv3v" alt=""><figcaption></figcaption></figure></div>
{% endtab %}

{% tab title="Модуль "Журнал событий"" %}
Есил у вас редакция HostCMS.Бизнес и выше

Перйдите в модуль  **Система** →  ["Журнал событий"](https://www.hostcms.ru/documentation/modules/eventlog/) найдите логи связанные с Вашим заказом

обычно они выглядят следующим образом: `[513][cdek][request] ...`\
где 513 - это номер заказа

<div data-full-width="true"><figure><img src="/files/jGkUOoJsU3sRelVpgLek" alt=""><figcaption></figcaption></figure></div>
{% endtab %}

{% tab title="log.csv" %}
Если у вас редакция HostCMS.Малый Бизнес и ниже

Логи хранятся в файлах в директории **/hostcmsfiles/logs/(текущая дата).log.csv**

Откройте файл и найдите логи связанные с Вашим заказом

обычно они выглядят следующим образом: `[513][cdek][request] ...`\
где 513 - это номер заказа
{% endtab %}
{% endtabs %}


# Возможные ошибки

### 1. Ошибка при нажатии на "MegaPost Настройки"

— Удалите все копии/ненужные доставки в корзину, оставьте только те которые используете

<div data-full-width="true"><img src="/files/-MjhBBa0ihJ6xo0DrvQm" alt=""></div>

### 2. Дублирование названия доставки в заказе

— в корне сайта в файле **bootstrap.php** разместите следующий код:

{% code title="bootstrap.php" lineNumbers="true" fullWidth="true" %}

```php
Core_I18n::instance()->expandLng('shop_delivery',
	array(
		'delivery_with_condition' => 'Доставка "%1$s"'
	)
);
```

{% endcode %}

### 3. Не работают условия по городам

— Перейдите в раздел  (:house: **Домой** / **Интернет-магазины** / **Справочник стран**), найдите нужный город и убедитесь что у него заполнено поле КЛАДР (если не заполнен - заполните его, при вводе названия города, реализованы выпадающие подсказки уже с КЛАДР и индексом, при нажатии автоматом заполняют нужные поля)

<div data-full-width="true"><img src="/files/-MkkqvnE0QjVZ2qwV_b8" alt=""></div>

### 4. Query error 42S22: SQLSTATE\[42S22]: Column not found: 1054 Unknown column 'megapost\_conditions.min\_weight' in 'where clause'.

выполните SQL запрос:

{% code lineNumbers="true" fullWidth="true" %}

```sql
ALTER TABLE `megapost_conditions` ADD `max_weight` DECIMAL(14,2) NOT NULL DEFAULT '0.00' AFTER `name`;
ALTER TABLE `megapost_conditions` ADD `min_weight` DECIMAL(14,2) NOT NULL DEFAULT '0.00' AFTER `max_weight`;
ALTER TABLE `megapost_conditions` ADD `price_initial` TINYINT(1) NOT NULL DEFAULT '0' AFTER `price`;
ALTER TABLE `megapost_conditions` ADD `max_delivery_price` DECIMAL(14,2) NOT NULL DEFAULT '0.00' AFTER `min_price`;
ALTER TABLE `megapost_conditions` ADD `min_delivery_price` DECIMAL(14,2) NOT NULL DEFAULT '0.00' AFTER `max_delivery_price`;
ALTER TABLE `megapost_conditions` ADD `option` TINYINT(1) NOT NULL DEFAULT '0' AFTER `min_delivery_price`;
ALTER TABLE `megapost_conditions` ADD `tariff` MEDIUMTEXT NULL DEFAULT NULL AFTER `type`;
ALTER TABLE `megapost_conditions` ADD `operator` MEDIUMTEXT NULL DEFAULT NULL AFTER `tariff`;
```

{% endcode %}

### 5. Ошибка при нажатии на "MegaPost условия"

— В разделе "Модули" выкл и вкл. снова модуль MegaPost

<div data-full-width="true"><img src="/files/LlkeMxlBYNP7c4aHyvp3" alt=""></div>

### 6. Почты России: ошибка 406 /1.0/unloading-passport/

Обратиться к Вашему менеджеру ПР, указать ошибку и попросить перезагрузить API с их стороны (т.к. ваш ЛК работает со старой версией API), а так же попросить увеличить лимиты

### 6.1. Почта России: ошибка 400

Ошибка расчета: неверное значение параметра при расчете.\
Нужно смотреть ответ от Почты, в нем будет конкретная ошибка

### 7. Почта России: не совпадают расчеты на сайте и в ЛК ПР

Перейдите в официальный тарификатор Почты России <https://tariff.pochta.ru/> выберите нужный тариф и введите параметры, чтобы у Вас получился нужный расчет, потом перенесите эти же параметры в [настройки MegaPost](/megapost/nastroika-megapost/pochta-rossii)

### 8. Boxberry: Неверный код пункта приема.

В ЛК Boxberry "Мой профиль" → ["Информация о магазине"](https://account.boxberry.ru/client/profile/index?tab=store-info) заполните "Пункт приема"

### 9. Не работает расчет для Москвы и Санкт-Петербурга

Если в расчете задействованы стандартные справочники регионов и городов HostCMS, то обычно Москва и Санкт-Петербург лежат в регионах с кодом региона 50 и 47 соответсвтенно

— создайте для них отдельные регионы с кодом региона 77 и 78 и перенесите города (получится что город Москва теперь будет в регине Москва)

{% code overflow="wrap" fullWidth="true" %}

```sql
// для быстрого массового переноса городов у которых кладр начинается на 77 в новый регион, где 999 - новый ID региона, а 111 - старый ID региона
UPDATE shop_country_location_cities SET shop_country_location_id = 999 WHERE shop_country_location_id = 111 AND kladr LIKE "77%"
```

{% endcode %}

### 10. Ошибка при открытии настроек MegaPost. Exception: property\_exists(): Argument #1 ($object\_or\_class) must be of type object|string, null given

<figure><img src="/files/mNHkeUIdOv4fDeJIOXd1" alt=""><figcaption></figcaption></figure>

**В коде у какого-то обработчика Shop\_Delivery\_Handler ID не правильный** класс, унаследованный от **Shop\_Delivery\_Handler**, имя класса зависит от идентификатора доставки по схеме **Shop\_Delivery\_Handler{ID}**

### 11. checkMemoryLimit: There are not enough 195212512 bytes of memory to read the file!

Текущей памяти на сервере не достаточно и нужно увеличить лимит памяти `memory_limit`,  через `php.ini` или `.htaccess` (уточните у своего хостинг провайдера)

### 12. Ошибка "Доступ к модулю "megapost" запрещен

<div data-full-width="true"><figure><img src="/files/zGKel4cSIYSildMvQWem" alt=""><figcaption></figcaption></figure></div>

Ошибка говорит о том, что у пользователя нет прав доступа к модулю и его действиям

Подробнее тут: [Политика безопасности и права доступа](https://www.hostcms.ru/documentation/modules/company/security/)

1. Нужно включить разрешение к модулю "megapost" в Права доступа к модулям
2. Нужно включить разрешение на действия в форме ID=75 (Оформленные заказы) "megapost" в **Права доступа к действиям формам**


# RetailCRM

инструкция для v5.3 и HostCMS v7.1.4

Купить модуль 👉 <https://asmp.su/_retailcrm>

<div align="left"><img src="/files/-Mj-p_nk6SIES7xuv3JD" alt=""></div>


# Создание ключа доступа к API

В аккаунте **RetailCRM** перейдите в раздел **«Настройки»** → **«Интеграция»** → **«Ключи доступа к API»** и нажмите **«Добавить»**

<div data-full-width="true"><img src="/files/-Mj-vkX4-zp6E_cmMnk_" alt="Новый ключ API"></div>

* ***Ключ** - это Ваш ApiKey*
* ***Активность** - включено*
* ***Комментарий** - любой текст*
* ***Тип доступа** - подойдет любой вариант*
* ***Разрешенные методы API** - включить все галочки*


# Установка модуля

*Перед установкой купите модуль (*[*инструкция*](/#pokupka-modulya)*)*

{% hint style="danger" %}
Для дальнейших действий нужны минимальные знания работы с **типовыми динамическими страницами (далее - ТДС)** в HostCMS. Работу должен выполнять Ваш программист или администратор сайта.
{% endhint %}

#### Шаг 1

В центре администрирования (далее ЦА) сайта переходим в раздел **«Магазин приложений»** (1) и в поле поиска вводим название модуля (2), нажимаем искать (3) или "Enter", на нужном модуле кликаем на кнопку **«Установить»** (4)

<div data-full-width="true"><img src="/files/-Mj-lkTNboQXSJDOLy5Q" alt="Магазин приложений"></div>

#### Шаг 2

В параметрах установки модуля вводим параметры и кликаем на **«Установить»**

<div data-full-width="true"><img src="/files/-Mj-qv8qnkLzYHw6ZjvQ" alt="Параметры установки &#x22;retailCRM&#x22;"></div>

* ***Адрес своего аккаунта в retailCRM субдомен** - если ссылка на личный кабинет в RetailCRM у вас <https://demo.retailcrm.ru/>, то субдомен будет и нужно ввести в настройки - «demo» (без .retailcrm.ru)*
* ***ApiKey** - ключ доступа можно создать или получить в RetailCRM в разделе «Настройки» → «Интеграция» → «Ключи доступа к API» (см.* [Создание ключа доступа к API](/retailcrm/sozdanie-klyucha-dostupa-k-api)*)*


# Добавление магазина

#### Шаг 1

В ЦА сайта переходим в раздел **Экспорт/Импорт → retailCRM → Добавить** (1)

<div data-full-width="true"><img src="/files/-Mj0MM4yGfklWaUsusen" alt=""></div>

#### Шаг 2

В созданном магазине заполните поля нужными данными

### Вкладка «Основные»

<div data-full-width="true"><figure><img src="/files/NPZh2Tw8411JyjfKRsVg" alt=""><figcaption></figcaption></figure></div>

* ***Объект данных** - интернет-магазин из которого выгружать заказы в RetailCRM*&#x20;
* ***Магазин в RetailCRM** - магазин RetailCRM в который выгружать заказы с сайта*&#x20;
* *Обновление заказов - имеет 4 варианта: Не обновлять - при обновлении заказов в HostCMS/RetailCRM, обновленные данные не будут передаваться в HostCMS/RetailCRM; Обновлять из HostCMS - при обновлении заказов в HostCMS, обновленные данные будут передаваться в RetailCRM; Обновлять из retailCRM - при обновлении заказов в RetailCRM, обновленные данные будут передаваться в HostCMS (нужно настроить* [*триггер*](/retailcrm/nastroika-triggera-dlya-sozdaniya-obnovleniya-zakazov-iz-retailcrm-v-hostcms) *`isUpdate`); Двухсторонний обмен - при обновлении заказов в HostCMS/RetailCRM, обновленные данные будут передаваться в HostCMS/RetailCRM (нужно настроить триггер см. стр. 9);*&#x20;
* ***Склад в RetailCRM*** - *Склад отгрузки (требуется в некоторых моментах связанных с расчетом доставки)*
* ***Создавать заказы в HostCMS созданные в retailCRM** - созданные новые заказы в RetailCRM будут созданы как новые заказы в HostCMS \[нужно настроить* [*триггер*](/retailcrm/nastroika-triggera-dlya-sozdaniya-obnovleniya-zakazov-iz-retailcrm-v-hostcms) *`isCreate`]*
* ***Закупочная цена** - при настроенном обновлении каталога с помощью ICML, будет передана выбранная цена как закупочная*&#x20;
* ***Активность** - активность магазина для передачи в RetailCRM*

#### Статусы, Оплаты, Доставки

{% hint style="info" %}
Для передачи правильных данных - настройте их соответствие, при передаче данных, которым не настроено соответствие, будет ошибка, которую можно увидеть в **«Журнале событий»**\* и заказ не создастся в RetailCRM
{% endhint %}

{% hint style="warning" %}
\* модуль доступен в редакции **HostCMS.Бизнес**, для младшей редакции смотрите файлы в директории **/hostcmsfiles/logs/(текущая дата).log.csv**
{% endhint %}

<div data-full-width="true"><img src="/files/-Mj0QttqNJbrHTZhRBTK" alt="Статусы"></div>

* ***Статусы HostCMS/Статусы retailCRM** - данные в HostCMS, который соответствует данным в RetailCRM*

<div data-full-width="true"><img src="/files/-Mj0SHUJkX_V-91o08ks" alt="Оплаты"></div>

* ***Платежные системы HostCMS/Типы оплат retailCRM** - данные в HostCMS, который соответствует данным в RetailCRM*

<div data-full-width="true"><img src="/files/-Mj0SpZ9j0yGGCH6ULjn" alt="Доставки"></div>

* ***Доставки HostCMS/Доставки retailCRM** - данные в HostCMS, который соответствует данным в RetailCRM*

### Вкладка «Поля»

#### Физическое лицо, Юридическое лицо / Индивидуальный предприниматель, Адрес доставки, Другое

Для передачи правильных данных - настройте их соответствие, в поля заказа в RetailCRM можно передать любые данные из HostCMS, в том числе дополнительные свойства заказа и готовые наборы:

* **ФИО** (объеденная строка из фамилии, имени и отчества)
* **Модуль «MegaPost»** (объеденная строка из кода ПВЗ, адрес ПВЗ, тариф и тд)
* **Полный адрес** (объеденная строка из улица, дом и квартира)

<div data-full-width="true"><img src="/files/-Mj0VHAf6gyQ9a9K0mxQ" alt="Поля"></div>


# Экспорт товаров в RetailCRM через ICML

Формат ICML является расширением формата YML. Он позволяет выгружать техническую информацию о товарах в систему (ID и XML ID товаров, информация об остатках), а также сложную структуру каталогов с торговыми предложениями (SKU).

Для формирования ICML-файла экспорта в RetailCRM создайте узел в структуре сайта под узлом интернет-магазина (стандартно узел имеет путь */shop/*), укажите для созданного узла название раздела, например, **retailcrm**, заполните основные атрибуты страницы, выберите раздел типовой динамической страницы **«RetailCRM»**, страницу **«Обмен с retailCRM»**. Выберите из выпадающего списка магазин, для которого необходимо создать экспорт.

<div data-full-width="true"><img src="/files/-Mj0WqcuUcieW8_T92rd" alt="Добавление раздела"></div>

В аккаунте RetailCRM в разделе **«Настройки»** → **«Магазины»**, во вкладке **«Каталог»** укажите адрес страницы (1), например, *<http://www.site.ru/shop/retailcrm/>*

<div data-full-width="true"><img src="/files/-Mj0Xu6G2F3xtj1N6mgN" alt="URL ICML-файла"></div>

> <https://xn--80aff1anfpi.xn--p1ai/shop/retailcrm/>
>
> *пример ICML файла*

### Управление свойствами товаров, экспортируемыми в RetailCRM <a href="#mcetoc_1ba9tdn2l6" id="mcetoc_1ba9tdn2l6"></a>

Опция **itemsProperties()** контроллера **retailCRM\_Controller\_ICML** позволяет управлять списком дополнительных свойств, указываемых для товара при экспорте в RetailCRM.

А коде настроек типовой динамической страницы можно включить экспорт дополнительных свойств товаров:

{% code lineNumbers="true" fullWidth="true" %}

```php
$retailCRM_Controller_ICML = new retailCRM_Controller_ICML($oShop);		
$retailCRM_Controller_ICML
  ->itemsProperties(TRUE)
  ->show();
```

{% endcode %}

или ограничить по ID список экспортируемых свойств:

{% code lineNumbers="true" fullWidth="true" %}

```php
$retailCRM_Controller_ICML = new retailCRM_Controller_ICML($oShop);			
$retailCRM_Controller_ICML
  ->itemsProperties(array(17,19))
  ->show();
```

{% endcode %}

Опция **itemsForbiddenProperties()** контроллера **`retailCRM_Controller_ICML`** позволяет управлять списком дополнительных свойств, которые требуется исключить при экспорте в RetailCRM

{% code lineNumbers="true" fullWidth="true" %}

```php
$retailCRM_Controller_ICML = new retailCRM_Controller_ICML($oShop);
$retailCRM_Controller_ICML
    ->itemsForbiddenProperties(array(11, 12))
    ->show();
```

{% endcode %}

### Экспорт товаров, присутствующих на складе

Опция **checkRest(TRUE)** позволяет выгружать только те товары, которые присутствуют на складах.

{% code lineNumbers="true" fullWidth="true" %}

```php
$retailCRM_Controller_ICML = new retailCRM_Controller_ICML($oShop);
$retailCRM_Controller_ICML
    ->checkRest(TRUE)
    ->show();
```

{% endcode %}

### Группировка модификаций

Опция **groupModifications(TRUE)** объединяет все предложения, которые являются вариациями одной модели (модификации).

{% code lineNumbers="true" fullWidth="true" %}

```php
$retailCRM_Controller_ICML = new retailCRM_Controller_ICML($oShop);
$retailCRM_Controller_ICML
    ->groupModifications(TRUE)
    ->show();
```

{% endcode %}

### Экспорт модификаций <a href="#mcetoc_1ba9tdn2l8" id="mcetoc_1ba9tdn2l8"></a>

Стандартно модификации не экспортируются совместно с товарами, управлять экспортом модификаций позволяет опция **modifications()** контроллера **retailCRM\_Controller\_ICML**

{% code lineNumbers="true" fullWidth="true" %}

```php
$retailCRM_Controller_ICML = new retailCRM_Controller_ICML($oShop);
$retailCRM_Controller_ICML
    ->modifications(TRUE)
    ->show();
```

{% endcode %}

### Создание статичных ICML-файлов через CRON для больших магазинов

Добавьте в CRON на хостинге вызов файла **cron/retailcrm.php**. Проверьте работу, в корневой директории будут создаваться XML-файлы по схеме **retailcrm1.xml**, где 1 — идентификатор магазина.

{% tabs %}
{% tab title="CRON задача" %}
{% code lineNumbers="true" fullWidth="true" %}

```bash
# каждый день в 00:00
0 0 * * * /usr/bin/php /var/www/web/sites/site.ru/cron/retailcrm.php
```

{% endcode %}
{% endtab %}
{% endtabs %}

В аккаунте RetailCRM в разделе **«Настройки»** → **«Магазины»**, во вкладке **«Каталог»** укажите адрес страницы, например, *<http://www.site.ru/retailcrm1.xml>*


# Настройка триггера для создания/обновления заказов из RetailCRM в HostCMS

https\://docs.retailcrm.ru/Developers/Automation/ObjectReference

Если в настройках магазина включена опция **«Обновлять из retailCRM»** или **«Двухсторонний обмен»**, в RetailCRM в разделе **«Автоматизация»** → **«Триггеры»** создайте триггер:

<div data-full-width="true"><img src="/files/-Mj0l4m3P5SCb_-PJ_Ed" alt="Триггер"></div>

* ***Активность** - ВКЛ*
* ***Название** - любое (например: "Изменение заказа \[сайт]")*
* ***Символьный код** - любое (например: "izmenenie-zakaza-site")*
* ***Порядок** - любой (например: "990")*
* ***Событие** - "Изменение заказа"*
* ***Условие** - "Редактор"*
* ***Условие применения триггера** - запросить в ТП*&#x20;
* ***Действие** - "Выполнить HTTP-запрос"*

<div data-full-width="true"><img src="/files/-Mj0nt9zDLynDQZdygUv" alt="Выполнить HTTP-запрос"></div>

* ***Адрес** - http(s)://АДРЕСВАШЕГОСАЙТА/retailcrm/api/*
* ***HTTP метод** - "POST"*
* ***HTTP-заголовки** - Должно быть 2 заголовка:*
  * *Заголовок: APIKEY | Значение: ВАШAPIКЛЮЧ (который вводили в модуле при установке )*
  * *Заголовок: Content-Type | Значение: application/json*

<div data-full-width="true"><img src="/files/-Mj0qfO2jd1q15Ajy91y" alt=""></div>

* ***Передавать параметры** - "Указать тело запроса самостоятельно"*
* ***Тело запроса** - запросить в ТП* [*https://t.me/morozovpimnev*](https://t.me/morozovpimnev)

{% hint style="warning" %}
В теле запроса можно удалить ненужные поля, которые не хотите обновлять, кроме:

**id, isCreate, isUpdate, isDelete, site, number**
{% endhint %}

{% hint style="info" %}
Документация по работе с объектами, с которыми можно работать в триггерах <https://docs.retailcrm.ru/Developers/Automation/ObjectReference>
{% endhint %}


# Выгрузка ранее сделанных заказов в RetailCRM

В ЦА сайта переходим в раздел **«retailCRM»** и нажимаем **«Выгрузить заказы»**, после выбора диапазона дат заказов и магазина, можно нажать **«Выгрузить»**

<div data-full-width="true"><img src="/files/-Mj0r_ogafIjsDAdMumm" alt="Выгрузить заказы"></div>


# События (хуки)

https\://www\.hostcms.ru/documentation/modules/core/events/

Для добавление в отправляемые данные своих данных можно использовать следующие хуки ([подробнее](https://www.hostcms.ru/documentation/modules/core/events/))

<pre class="language-php" data-line-numbers data-full-width="true"><code class="lang-php"><strong>// добавление данных в произвольные поля
</strong><strong>class My_RetailCRM
</strong>{
    static public function onBeforeCreateOrder($controller, $args)
    {
        $oShop_Order = $args[0]; // Shop_Order_Model
        $oRetailCRM = $args[1]; // RetailCRM_Model
        
        /** $args[2] - параметры,
         * добавление параметров в customFields
         */
        $args[2]['customFields']['dop_pole'] = '123';
    }
}

Core_Event::attach('retailCRM_Controller.onBeforeCreateOrder', array('My_RetailCRM', 'onBeforeCreateOrder'));
</code></pre>


# Настройки

<div data-full-width="true"><figure><img src="/files/TlGy36cwXOo49XFZIcFF" alt=""><figcaption></figcaption></figure></div>

Внесенные при установке и дополнительные настройки можно изменить в ЦА сайта, переходим в раздел **«retailCRM»** -> **«Настройки»**

<div data-full-width="true"><figure><img src="/files/KXnHOlHjggza6YlroTCd" alt=""><figcaption></figcaption></figure></div>

*
* ***Адрес своего аккаунта в retailCRM субдомен** - если ссылка на личный кабинет в RetailCRM у вас <https://demo.retailcrm.ru/>, то субдомен будет и нужно ввести в настройки - «demo» (без .retailcrm.ru)*
* ***ApiKey** - ключ доступа можно создать или получить в RetailCRM в разделе «Настройки» → «Интеграция» → «Ключи доступа к API» (см.* [Создание ключа доступа к API](/retailcrm/sozdanie-klyucha-dostupa-k-api)*)*
* ***Тип выгрузки:***
  * *При создании элемента - как только происходит процесс создания элемента в системе, элемент сразу выгуржается в CRM (может тормозить корзину)*
  * *По расписанию - через модуль* [*"Планировщик задач"*](/retailcrm/planirovshik-zadach) *(выгрузка элементов происхдит по расписанию, рекомендуемый вариант)*
* ***Дата начала выгрузки по расписанию** - установите дату с которой вы хотите выгружать элементы по расписанию (т.е. после установки у вас может быть очень большая база с самого начала запуска сайта, дата позволяет выгрузить не все, а только с нужного времени)*
* ***Идентификатор торгового предложения (по умочланию Идентификатор \[id])\****

{% hint style="warning" %}
\*Важно! Обратите внимание, что идентификатор торгового предложения должен быть уникальным, и если при генерации скопировать идентификатор товара в идентификатор торгового предложения, то идентификатор может совпасть с идентификатором другого торгового предложения, это может привести к неисправимым последствиям.
{% endhint %}


# Планировщик задач

https\://www\.hostcms.ru/documentation/modules/schedule/

#### Шаг 1. Добавление вызова в cron

Выполнением действий, заданных в модуле **«Планировщик задач»**, осуществляется файлом `cron/schedule.php`, вызов которого необходимо добавить в cron. Рекомендуется запускать выполнение файла schedule.php раз в минуту.

Пример вызова: `/usr/bin/php /var/www/site.ru/httpdocs/cron/schedule.php`

Пример вызова с передачей php.ini: `/usr/bin/php --php-ini /etc/php.ini /var/www/site.ru/httpdocs/cron/schedule.php`

{% hint style="warning" %}
Реальный путь на сервере к корневой директории сайта и путь к PHP уточните в службе поддержки хостинга.
{% endhint %}

#### Шаг 2

Добавляем задачу, в основном меню выберите **Инструменты** → **Планировщик задач**, нажмите в меню на **+Задача**

<div data-full-width="true"><figure><img src="/files/DpyY01l1slisLQUdTth1" alt=""><figcaption></figcaption></figure></div>

* ***Дата следующего выполнения задачи*** - Дата и время, когда следует выполнить задачу снова. После выполнения задачи к ее времени будет прибавлен установленный интервал, рассчитанное время будет записано в это поле.
* ***Дата добавления задачи*** - Дата и время, когда задача была добавлена.
* ***Интервал*** - Время, устанавливающее периодичность выполнения задачи (рекомендуем указывать `5 минут`).&#x20;
* ***Модуль*** - Модуль, у которого будет вызываться задача (выбираем `retailCRM`).
* ***Действие*** - Действие модуля, которое будет вызывать задача (выбираем `Выгрузка элементов`).
* ***Идентификатор сущности*** - Идентификатор элемента, над которым нужно произвести действие (указываем ID сайта).
* ***Описание*** - Описание задачи.


# Отладка

{% hint style="danger" %}

### Внимание! Отладкой должен заниматься Ваш технический специалист.

{% endhint %}

### Выгрузка заказа

`request` - это запрос для выгрузки\
`response` - это ответ, если он 200-202 и нет ошибок, занчит все хорошо

Чтобы посмотреть запросы при выгрузке

{% tabs %}
{% tab title="Модуль "История изменений"" %}
Если стоит наш модуль ["История изменений"](https://asmp.su/changelog) то все намного проще, рекомендуем его ставить

После выгрузки заказа, в самом заказе, перейдите на вкладку "Журнал изменений" там будут все запросы/ответы по API

<div data-full-width="true"><figure><img src="/files/UtkmPf7TyRBzo9OFGj0Y" alt=""><figcaption></figcaption></figure></div>
{% endtab %}

{% tab title="Модуль "Журнал событий"" %}
Есил у вас редакция HostCMS.Бизнес и выше

Перйдите в модуль  **Система** →  ["Журнал событий"](https://www.hostcms.ru/documentation/modules/eventlog/) найдите логи связанные с Вашим заказом

обычно они выглядят следующим образом: `[513][retailcrm][request] ...`\
где 513 - это номер заказа

<div data-full-width="true"><figure><img src="/files/3ccfRzltz17qBxaEl6z7" alt=""><figcaption></figcaption></figure></div>
{% endtab %}

{% tab title="log.csv" %}
Если у вас редакция HostCMS.Малый Бизнес и ниже

Логи хранятся в файлах в директории **/hostcmsfiles/logs/(текущая дата).log.csv**

Откройте файл и найдите логи связанные с Вашим заказом

обычно они выглядят следующим образом: `[513][retailcrm][request] ...`\
где 513 - это номер заказа
{% endtab %}
{% endtabs %}


# Мультиязычность

инструкция для v4.9 и HostCMS v7.0.2

Купить модуль 👉 <https://asmp.su/multilanguage>


# Установка модуля

*Перед установкой купите модуль (*[*инструкция*](/#pokupka-modulya)*)*

{% hint style="danger" %}
Для дальнейших действий нужны минимальные знания работы с **css/js**, **макетами**, **XSL-шаблонами (далее - XSL)**, **типовыми динамическими страницами (далее - ТДС)** в HostCMS. Работу должен выполнять Ваш программист или администратор сайта.
{% endhint %}

#### Шаг 1

В центре администрирования (далее ЦА) сайта переходим в раздел **«Магазин приложений»** (1) и в поле поиска вводим название модуля (2), нажимаем искать (3) или "Enter", на нужном модуле кликаем на кнопку **«Установить»** (4)

<div data-full-width="true"><img src="/files/-MlLLQwDNf1Mr6qvONGD" alt="Магазин приложений"></div>

{% hint style="info" %}
\*примеры XSL шаблонов устанавливаются в папку **MultiLanguage** / Мультиязычность \[MultiLanguage] \[05.06.2020 13:00:24]
{% endhint %}


# Создание ключа Яндекс.Облако

#### Шаг 1

Перейдите в аккаунт [Яндекс.Облако](https://console.cloud.yandex.ru/)

{% hint style="danger" %}
**ВНИМАНИЕ! Дальнешие шаги можно делать, только если у Вас уже есть активный платежный аккаунт** [**https://console.cloud.yandex.ru/billing?section=accounts**](https://console.cloud.yandex.ru/billing?section=accounts)
{% endhint %}

#### Шаг 2

Копируем идентификатор каталога `"default"`, присутствующего по-умолчания или создаем новый, вносим его в настройки (Яндекс.Облако: идентификатор каталога). Далее переходит в каталог `"default"`

<div data-full-width="true"><figure><img src="/files/zGxvAILjGKFFNnoWgndw" alt=""><figcaption></figcaption></figure></div>

#### Шаг 3

В рамках каталога создаем сервисный аккаунт с присвоением ему роли `editor`

<div data-full-width="true"><figure><img src="/files/g3DcbRF33R7k7vg4DEGg" alt=""><figcaption></figcaption></figure></div>

#### Шаг 4

После добавления переходим в профиль сервисного аккаунта и создаем API ключ, полученный **секретный ключ** вносим в настройки (Яндекс.Облако: API ключ)

<div data-full-width="true"><figure><img src="/files/lFtfL4q5JY3KG9twGqX0" alt=""><figcaption></figcaption></figure></div>

<div data-full-width="true"><figure><img src="/files/2obl4Q898hIJRlOB4ynM" alt=""><figcaption></figcaption></figure></div>


# Настройка модуля

#### Шаг 1

Переходим в раздел «Модули», находим нужный модуль (1) и нажимаем кнопку «Редактировать» (2)

<div data-full-width="true"><img src="/files/GNWYFZOkeVewxtkN03Jp" alt="Список модулей"></div>

#### Шаг 2

Перейдите во вкладку «Настройки модуля» (1) и укажите нужные настройки (настройки сохраняются для текущего сайта, в котором вы находитесь)

<div data-full-width="true"><img src="/files/TXXNvBjDJFrgobakKTI1" alt="Настройки модуля (>= 6.9.8)"></div>

* ***translate** – (TRUE|FALSE), нужно ли при сохранении элемента автоматически переводить не достающие языки*
* ***type** – (site|url|cookie), как система будет идентифицировать язык*&#x20;
  * *<mark style="color:yellow;">**\[site]**</mark> работа на N-количестве поддоменов (en.site.ru, de.site.ru и тд), для одного сайта можно создать необходимое кол-во поддоменов.*
  * *<mark style="color:yellow;">**\[url]**</mark> работа на одном домене N-количестве путей (site.ru/news/ -> site.ru/en/news/), для одного сайта можно создать необходимое кол-во путей.\**
  * *<mark style="color:yellow;">**\[cookie]**</mark> работа на одном домене (site.ru), такой вариант подойдет для простых сайтов, для которых достаточно смены контента на той же странице.\**
* ***yandex|google|googlefree|yandexcloud** – настройки для драйвера перевода, нужно указать полученные API ключи*

{% hint style="warning" %}
**\*ВНИМАНИЕ!** Type **\[url]** и **\[cookie]** не работает с функционалом **«Кэширование в статичные файлы (зеркалирование)»**
{% endhint %}

Для версии HostCMS < 6.9.8 настройки модуля вносятся как PHP-код с параметрами модуля или файла `/modules/multilanguage/config/config.php`

{% code title="для всех сайтов" lineNumbers="true" fullWidth="true" %}

```php
<?php

return array (
	'translate' => TRUE,
	'type' => 'url',
	'yandex' => '',
	'google' => '',
	'googlefree' =>'gtx',
	'yandexcloud_folder_id' => '',
	'yandexcloud_secret' => '',
);
```

{% endcode %}

{% code title="для сайта ID = 123" lineNumbers="true" fullWidth="true" %}

```php
<?php

return array (
	123 => array(
		'translate' => TRUE,
		'type' => 'url',
		'yandex' => '',
		'google' => '',
		'googlefree' =>'gtx',
		'yandexcloud_folder_id' => '',
		'yandexcloud_secret' => '',
	)
);
```

{% endcode %}


# Основной язык сайта

Основной язык сайта, это язык, в котором у вас изначально хранятся основные данные без доп. языков, так же он указан в настройках сайта "Язык сайта" (1)

<div data-full-width="true"><figure><img src="/files/m6gQMgYp2M6USa7LkNgv" alt=""><figcaption></figcaption></figure></div>


# Создание доп. языков

#### Шаг 1

В ЦА сайта переходим в раздел «Мультиязычность» и добавляем нужные дополнительные языки

<div data-full-width="true"><img src="/files/C0fPYmWRDRoTfMR7MqUE" alt="Мультиязычность"></div>

#### Шаг 2

В созданном языке заполните поля нужными данными

### Вкладка «Основные»

<div data-full-width="true"><figure><img src="/files/l12tY5nZITNl2oBrchf8" alt=""><figcaption></figcaption></figure></div>

* ***Название языка** — произвольное название для отображения на сайте для посетителей (например: English или En)*
* ***Драйвер** — (yandex|google|googlefree|yandexcloud), указание названия драйвера из настроек модуля, через какой сервис будет перевод\**
* *Основной язык* - при выбранной опции, будет показывать пользователю текущий язык игнорируя основной язык сайта (например когда сайт был изначально полностью на русском, а теперь нужно показывать по умолчанию на англ.)
* ***Доступен в списке языков** - активность языка*
* ***Обозначение языка** – код языка (например: en, uk), так же используется как путь для типа <mark style="color:yellow;">**\[url]**</mark>*
* ***Порядок сортировки** – сортировка языка*
* ***Домены сайта** – домен для языка, доступно когда выбран тип в настройках модуля тип <mark style="color:yellow;">**\[site]**</mark>*
* **Код зяыка переводы** – *код языка для драйвера переводов (например нужно отображать обозначение языка как CN (китайский), но перевод нужен ZH (код китайского языка в стандарте ISO 639-1)*

{% hint style="warning" %}
\* драйвер языка можно не указывать, если в настройках модуля вы указали **translate=>FALSE** и собираетесь добавлять переводы вручную
{% endhint %}


# Настройка макета

{% hint style="danger" %}
Для дальнейших действий нужны минимальные знания работы с **макетами**, **XSL-шаблонами (далее - XSL)**, **типовыми динамическими страницами (далее - ТДС)** в HostCMS. Работу должен выполнять Ваш программист или администратор сайта.
{% endhint %}

### Вывод выбора языка для посетителей сайта

В главном макете Ваше сайта, в том месте где хотите вывести выбор языка вставьте код (например в шапке сайта)

{% code lineNumbers="true" fullWidth="true" %}

```php
<?php
// Показ и выбор языка
$MultiLanguage_Controller_Show = new MultiLanguage_Controller_Show(
	Core_Entity::factory('Site', CURRENT_SITE)
);
				
$MultiLanguage_Controller_Show
	->xsl(Core_Entity::factory('Xsl')->getByName('Мультиязычность'))
	->show();
?>
```

{% endcode %}

{% hint style="info" %}
\*при установке XSL шаблоны идут с датой текущей установки в названии, например: **Мультиязычность \[05.06.2020 13:00:24]**
{% endhint %}


# Сущность язык

Получить текущий язык можно в любом месте макета, ТДС или своем функционале следующий образом

{% tabs %}
{% tab title="HostCMS >= 6.6.7" %}
{% code lineNumbers="true" fullWidth="true" %}

```php
<?php
    Core::getLng(); // en
?>
```

{% endcode %}
{% endtab %}

{% tab title="HostCMS < 6.6.7" %}
{% code lineNumbers="true" fullWidth="true" %}

```php
<?php
    MultiLanguage_Observer::getLng(); // en
?>
```

{% endcode %}
{% endtab %}
{% endtabs %}


# Настройка SEO заголовков

#### Шаг 1

{% code lineNumbers="true" fullWidth="true" %}

```php
// В главном макете сайта в блоке head замените следующий код
/*
<title><?php Core_Page::instance()->showTitle()?></title>
<meta name="description" content="<?php Core_Page::instance()->showDescription()?>">
<meta name="keywords" content="<?php Core_Page::instance()->showKeywords()?>">
*/
// на нижний

<title><?php MultiLanguage_Page::instance()->showTitle()?></title>
<meta name="description" content="<?php MultiLanguage_Page::instance()->showDescription()?>">
<meta name="keywords" content="<?php MultiLanguage_Page::instance()->showKeywords()?>">
```

{% endcode %}

#### Шаг 2

Для каждого элемента (структура сайта, интернет-магазин или информационные системы) и варианта языка теперь можно задать свои мета тэги и использовать свои шаблоны SEO

&#x20;<mark style="background-color:blue;">**RU**</mark>&#x20;

> **`Купить {group.name} в магазине {this.pageNumber ", страница %d"}`**

`// Купить телевизоры в магазине, страница 2`

&#x20;<mark style="background-color:blue;">**EN**</mark>&#x20;

> **`Buy {group.multiLng 'name'} in shop {this.pageNumber ", page %d"}`**

`// Buy TV in shop, page 2`

&#x20;<mark style="background-color:blue;">**RU**</mark>&#x20;

> **`Купить {item.name} в нашем магазине`**

`// Купить Телевизор LG 5000 NR в нашем магазине`

&#x20;<mark style="background-color:blue;">**EN**</mark>&#x20;

> **`Buy {item.multiLng 'name'} in our shop`**

`// Buy TV LG 5000 NR in our shop`


# Настройка HREFLANG

для типа \[site] \[url]

Для помощи поисковым система индексации языковых версий страницы, в главном макете сайта в блоке head разместите следующий код

{% code lineNumbers="true" fullWidth="true" %}

```php
<?php
    MultiLanguage_Page::instance()->showHrefLang();
    // Результат
    // <link rel="alternate" hreflang="ru" href="https://site.ru" />
    // <link rel="alternate" hreflang="en" href="https://site/en/" />

?>
```

{% endcode %}


# Интернационализация в XSL-шаблонах

В HostCMS интернационализация XSL-шаблонов осуществляется с использованием сущностей. Часто используемы внешние данные могут быть предварительно объявлены как сущности, а затем использованы в XSL-шаблоне.

Такое решение позволяет использовать один и тот же XSL-шаблон на разных сайтах, работающих на разных языках.

Для каждого языка, используемого на сайтах системы, автоматически создается отдельный DTD, который доступен при редактировании XSL-шаблона. Добавление нового языка автоматически добавляет для него DTD.

<div data-full-width="true"><img src="/files/6S3Stl2nuoMF5SHzkmOU" alt="Редактирование информации об XSL-шаблоне"></div>

Подключение соответствующего языку DTD происходит автоматически, для этого в XSL-шаблоне указывается:

{% code lineNumbers="true" fullWidth="true" %}

```xml
<!DOCTYPE xsl:stylesheet SYSTEM "lang://21">
```

{% endcode %}

* *где **21** - идентификатор XSL-шаблона.*

#### Объявление сущностей в DTD

<div data-full-width="true"><img src="/files/2EJVaKU2EmeKDrna4b4z" alt="Код DTD для языка &#x22;ru&#x22;"></div>

<div data-full-width="true"><img src="/files/YX0aY5hnzH9hPSzTGkNV" alt="Код DTD для языка &#x22;en&#x22;"></div>

Например, объявление сущности **labelSearch**:

{% code lineNumbers="true" fullWidth="true" %}

```xml
<!ENTITY labelSearch "Поиск">
```

{% endcode %}

позволяет в дальнейшем использовать ее в XSL-шаблоне:

{% code lineNumbers="true" fullWidth="true" %}

```xml
<h1>&labelSearch;</h1>
```

{% endcode %}

или в атрибутах

{% code lineNumbers="true" fullWidth="true" %}

```xml
<img src="/images/my-image.png" alt="&labelSearch;" title="&labelSearch;" />
```

{% endcode %}


# Интернационализация в макетах

Закладка «Язык». Используется для указания текстовых значений, выводимых в макете в зависимости от языка, указанного для сайта. Потребность в использовании интернационализации возникает при автоматической установке макетов, адаптированных для разных языков.

В макете интернационализация используется следующим образом:

{% code lineNumbers="true" fullWidth="true" %}

```php
<?php echo $this->_('payment') // Оплата ?>
```

{% endcode %}

<div data-full-width="true"><img src="/files/llYOnTdF6LjiNJSctRYP" alt="Редактирование макета"></div>


# Интернационализация в ТДС или собственных php файлах

Языки в ТДС используются из макета, который подключен к тому же узлу структуры сайта, что и типовая динамическая страница и используются следующим образом:

{% code lineNumbers="true" fullWidth="true" %}

```php
$template = Core_Page::instance()->template; // текущий подключенный макет на странице
echo $template->_('payment'); // Оплата
```

{% endcode %}

Использовать языки в собственных PHP файлах можно следующим образом:

{% code lineNumbers="true" fullWidth="true" %}

```php
$template = Core_Entity::factory('Template', 123); // где 123 - ID нужного макета
echo $template->_('payment'); // Оплата
```

{% endcode %}


# Работа с объектами ORM

Вывести перевод для текущего языка элемента определённого поля можно так (если перевода нет, то вернет значения дефолтного языка)

{% code lineNumbers="true" fullWidth="true" %}

```php
$oInformationsystem_Item = Core_Entity::factory('Informationsystem_Item', 123);
echo $oInformationsystem_Item->multiLng('name'); // About

// для доп. свойства
$oProperty = Core_Entity::factory('Property', 123);
$aPropertyValues = $oProperty->getValues($shop_item_id);  
echo $aPropertyValues[0]->multiLng('value')
```

{% endcode %}

Получить все переводы всех полей для элемента в виде объектов

{% code lineNumbers="true" fullWidth="true" %}

```php
/* 
 * Получение маасива объектов, $bCache = TRUE
 * @param string $entity model name
 * @param int $entity_id
 * @param boolean $type FALSE|TRUE
 * @param boolean $bCache cache mode
 * @return array
 */
Core_Entity::factory('MultiLanguage_Field')->getAFields('shop_item', 123);

// Результат
//Array (
//	[0] => MultiLanguage_Field_Model Object
//	[1] => MultiLanguage_Field_Model Object
//)

/* 
 * Получение массива объектов с ключами полей
 */
Core_Entity::factory('MultiLanguage_Field')->getAFields('shop_item', 123, TRUE);

// Результат
//Array (
//	[name] => MultiLanguage_Field_Model Object
//	[description] => MultiLanguage_Field_Model Object
//)

/* 
 * Получение объекта по полю
 * @param string $entity model name
 * @param int $entity_id
 * @param string $field field name
 * @param boolean $bCache cache mode
 * @return self|NULL
 */
Core_Entity::factory('MultiLanguage_Field')->getByField('shop_item', 123, 'name');
```

{% endcode %}

## Сохранение перевода для элемента

Сохранение происходит через параметр `datalng_{lng}_{field}`, где {lng} это код языка, а {field} имя поля элемента

{% code lineNumbers="true" fullWidth="true" %}

```php
$oInformationsystem_Item = Core_Entity::factory('Informationsystem_Item', 123);
$oInformationsystem_Item->datalng_en_name = 'My name';
$oInformationsystem_Item->save();
```

{% endcode %}

{% code lineNumbers="true" fullWidth="true" %}

```php
// получаем текущий язык


// получение 
```

{% endcode %}

Вывести домен текущего язык&#x430;*, для типа <mark style="color:yellow;">**\[site]**</mark>*

{% code lineNumbers="true" fullWidth="true" %}

```php
$oMultiLanguage = Core_Entity::factory('MultiLanguage')->getByLng(Core::getLng());
    
if(!is_null($oMultiLanguage)
    echo $oMultiRegion->Site_Alias->name; // msk.site.ru
```

{% endcode %}

Вывести путь текущего язык&#x430;*, для типа <mark style="color:yellow;">**\[url]**</mark>*

{% code lineNumbers="true" fullWidth="true" %}

```php
<?php
$lngPath = '';

$oMultiLanguage = Core_Entity::factory('MultiLanguage')->getByLng(Core::getLng());
!is_null($oMultiLanguage) && $lngPath = $oMultiLanguage->getPath();

?>

<a href="/<?php echo $lngPath ?>politics/">Политика конфиденциальности
```

{% endcode %}


# Sitemap

для типа \[site] \[url]

В Типовой Динамической Странице (ТДС), которая отвечает у вас за формирование sitemap внесите следующие изменения

{% code lineNumbers="true" fullWidth="true" %}

```php
// замените
// $oCore_Sitemap = new Core_Sitemap($oSite);
// на
$oCore_Sitemap = new MultiLanguage_Sitemap($oSite);
```

{% endcode %}


# Хлебные крошки

Если в Вашем XSL шаблоне нет проверки узла на **link/url**, то в хлебных крошка можно наблюдать название языка, для этого добавьте в Вашем XSL шаблоне следующее

{% code lineNumbers="true" fullWidth="true" %}

```html
<!-- заменить -->
<!--<xsl:template match="/site">
	<xsl:if test="count(*[@id]) &gt; 0">
		<a href="/">Главная</a>
		<xsl:apply-templates select="*[@id]" />
	</xsl:if>
</xsl:template>-->
<!-- на -->
<xsl:template match="/site">
	<xsl:if test="count(*[@id][link/node() or url/node()]) &gt; 0">
		<a href="/">Главная</a>
		<xsl:apply-templates select="*[@id][link/node() or url/node()]" />
	</xsl:if>
</xsl:template>
```

{% endcode %}


# Массовый перевод

В ЦА сайта переходим в раздел «Мультиязычность» - «Запустить перевод»

Если у вас настроена интеграция с каким либо сервисом (указан driver) для перевода, то есть возможность массово добавить переводы для элементов без перевода. При нажатии на кнопку "Посчитать" выедет кол-во элементов без перевода

<div data-full-width="true"><img src="/files/DU1ZfkpkF4SupZF9sHcs" alt=""></div>

<div data-full-width="true"><img src="/files/RfEtRR4pHkVvqhtUJgNs" alt=""></div>


# Мультирегиональность

инструкция для v3.9.5 и HostCMS v7.0.7

Купить модуль 👉 <https://asmp.su/multiregion>


# Установка модуля

*Перед установкой купите модуль (*[*инструкция*](/#pokupka-modulya)*)*

{% hint style="danger" %}
Для дальнейших действий нужны минимальные знания работы с **css/js**, **макетами**, **XSL-шаблонами (далее - XSL)**, **типовыми динамическими страницами (далее - ТДС)** в HostCMS. Работу должен выполнять Ваш программист или администратор сайта.
{% endhint %}

#### Шаг 1

В центре администрирования (далее ЦА) сайта переходим в раздел **«Магазин приложений»** (1) и в поле поиска вводим название модуля (2), нажимаем искать (3) или "Enter", на нужном модуле кликаем на кнопку **«Установить»** (4)

<div data-full-width="true"><img src="/files/aZawpSOfSW8joC5knM99" alt="Магазин приложений"></div>

#### Шаг 2

В параметрах установки модуля выбираем нужные и кликаем на **«Установить»**

<div data-full-width="true"><img src="/files/RXCLNWcrxRLoS8wFXnSa" alt=""></div>

* ***Установить XSL шаблоны** - устанавливает примеры шаблонов (в папку **MultiRegion**) в соответствующем разделе с текущей датой\**
* ***Установить пример Макета** - устанавливает пример макета (в папку **MultiRegion**) в соответствующем разделе с текущей датой\**

{% hint style="info" %}
\*например: Мультирегиональность \[MultiRegion] \[05.06.2020 13:00:24]
{% endhint %}


# Настройка модуля

#### Шаг 1

В ЦА сайта переходим в раздел «Модули», находим нужный модуль (1) и нажимаем кнопку «Редактировать» (2)

<div data-full-width="true"><img src="/files/qdOX7fInmXZnUHzLXihu" alt=""></div>

#### Шаг 2

Перейдите во вкладку «Настройки модуля» и укажите нужные настройки (настройки сохраняются для текущего сайта, в котором Вы находитесь)

<div data-full-width="true"><figure><img src="/files/Hcq4W1iB4g35hcvsUNW0" alt=""><figcaption></figcaption></figure></div>

* ***Сервис КЛАДР** – сервис для поиска городов*
  * &#x20;*HostCMS - справочник городов HostCMS*
  * [*DaData*](https://asmp.su/dadata) *(как получить ключ* [*подробнее*](/megapost/dadata)*)*
* ***Ваш токен (dadata.ru)** – обязательный если используете сервис dadata (можно получить бесплатный)*
* ***Тип**– (site|url|cookie), как система будет идентифицировать регион*&#x20;
  * *<mark style="color:yellow;">**\[site]**</mark> работа на N-количестве поддоменов (msk.site.ru, spb.site.ru и тд), для одного сайта можно создать необходимое кол-во поддоменов.*
  * *<mark style="color:yellow;">**\[url]**</mark>* *работа на одном домене N-количестве путей (site.ru/shop/ -> site.ru/msk/shop/), для одного сайта можно создать необходимое кол-во путей.*
  * *<mark style="color:yellow;">**\[cookie]**</mark>* *работа на одном домене (site.ru), такой вариант подойдет для простых сайтов, для которых достаточно смены контактных данных.*
* ***Кол-во городов в выпадающем списке при поиске** – кол-во городов в выпадающем списке при ввводе названия города в поиске*
* **Название XSL шаблона модального окна выбора/поиска города** *– Название XSL шаблона модального окна выбора/поиска города, по умолчанию «МультирегиональностьМодальноеОкно»*
* **ID типа email указанный в регионе, на который отсылать информацию о поступившем заказе** *– ID типа email указанный в регионе, на который отсылать информацию о поступившем заказе*

{% hint style="danger" %}
**\*ВНИМАНИЕ!** Type **\[url]** и **\[cookie]** не работает с функционалом **«Кэширование в статичные файлы (зеркалирование)»**
{% endhint %}

Для версии HostCMS < 6.9.8 настройки модуля вносятся как PHP-код с параметрами модуля или в файлу `/modules/multiregion/config/config.php`

{% code title="для всех сайтов" lineNumbers="true" fullWidth="true" %}

```php
<?php

return array (
	'serviceKladr' => '', // Сервис КЛАДР
	'kladrToken' => '', // Ваш токен (kladr-api)
	'dadataToken' => '', // Ваш токен (dadata.ru)
	'type' => 'url', // Тип
	'cityLimit' => 5, // Кол-во городов
	'defaultCityId' => 1, // город по умолчанию, если не удалось определить по GeoIP
	'favoriteCities' => '1,1745,173,526,339,2289,1550,2229,1888', // города фавориты в модальном окне предложенные пользователю в блоке «Например»
	'xsl' => 'МультирегиональностьМодальноеОкно', // Название XSL шаблона
	'send_order_email' => 1 // ID типа email указанный в регионе
);
```

{% endcode %}

{% code title="для сайта ID = 123" lineNumbers="true" fullWidth="true" %}

```php
<?php

return array (
	123 => array(
		'serviceKladr' => '',
		'kladrToken' => '',
		'dadataToken' => '',
		'type' => 'url',
		'cityLimit' => 5,
		'defaultCityId' => 1,
		'favoriteCities' => '1,1745,173,526,339,2289,1550,2229,1888',
		'xsl' => 'МультирегиональностьМодальноеОкно',
		'send_order_email' => 1
	)
);
```

{% endcode %}


# Создание регионов

#### Шаг 1

В ЦА сайта переходим в раздел **«Мультирегиональность»** и добавляем нужные регионы

<div data-full-width="true"><img src="/files/LDDSfDBh5kwOlTtnqqKu" alt="Мультирегиональность"></div>

#### Шаг 2

В созданном регионе заполните поля нужными данными

### Вкладка «Основные»

<div data-full-width="true"><img src="/files/zunuSvapJJ4Hd2BNPUZd" alt="Вкладка «Основные»"></div>

* ***Название региона** — произвольное название для отображения на сайте для посетителей*&#x20;
* ***Путь** — путь для ссылки региона, для типа <mark style="color:yellow;">**\[url]**</mark>*
* ***Активность** - активность региона*
* ***Области*****¹** *– области привязанные к региону (можно не указывать, если указан город)*
* ***Города*****¹** *– города привязанные к региону (наибольший приоритет перед областью) (можно не указывать, если указана область)*
* ***Склады** – склады привязанные к региону (если пусто выводит наличие по умолчанию для сайта всех складов)*
* ***Цены** – цены (цены интернет-магазина) привязанные к региону (если пусто или доп. цена товара равна 0, то берет основную цену товара +* [*наценка*](#vkladka-ceny)*)*
* ***Домены сайта** – домен региона, для типа <mark style="color:yellow;">**\[site]**</mark>*
* ***Регион по умолчанию** – основной регион*

{% hint style="info" %}
**¹** Список областей/городов для выбора, это стандартный [справочник стран HostCMS](https://www.hostcms.ru/documentation/modules/shop/references/country/)
{% endhint %}

### Вкладка «Поля»

<div data-full-width="true"><img src="/files/AKgSsugRg9jEgxQa3Hcf" alt="Вкладка «Поля»"></div>

### Вкладка «Цены»

<div data-full-width="true"><img src="/files/JHDOJcze8Ja4XOHDFLSn" alt="Вкладка «Цены»"></div>

* ***Тип наценки** — процент или сумма для региона*
* ***Величина наценки** - целое число*

### Вкладка «SEO»

<div data-full-width="true"><img src="/files/tQ9zfaHtpmtOkHECmIBr" alt="Вкладка «SEO»"></div>

* ***Заголовок (title)** — текст, который будет подставляться к концу всех title на всём сайта*
* ***Описание (description)** — текст, который будет подставляться к концу всех description на всём сайта*
* ***Ключевые слова (keywords)** — текст, который будет подставляться к концу всех keywords на всём сайта*
* ***Скрипты** — scripts, которые можно вывести для отдельного региона, если хотите вести раздельную статистику или отображать для текущего региона, для типа <mark style="color:yellow;">**\[site]**</mark>*
* ***robots.txt**\* — свой robots для отдельного региона с разными настройками, для типа <mark style="color:yellow;">**\[site]**</mark>*

{% hint style="warning" %}
\* если robots оставить не заполненный, система будет формировать его автоматически с общими настройками указанными в разделе **«Сайты» → Вкладка «robots.txt»** при этом заменяя директивы Host и Sitemap на домен текущего региона
{% endhint %}

{% hint style="danger" %}
Проверьте что в корне сайта нет файла **robots.txt**, иначе ничего не будет работать
{% endhint %}


# Настройки городов

Города в справочнике стран (:house: **Домой** / **Интернет-магазины** / **Справочник стран**) имеют следующие настройки

<div data-full-width="true"><figure><img src="/files/vBZ0PyDDtkiCYZmJKwVM" alt=""><figcaption></figcaption></figure></div>

<img src="/files/Hj6XJQOeF2qX2BzwRFcG" alt="" data-size="line">**По умолчанию** - *город по умолчанию, если не удалось определить по GeoIP*\ <img src="/files/UARMB94pJW4KivEZLKSu" alt="" data-size="line">**Избранное** - *города фавориты в модальном окне предложенные пользователю в блоке «Например»*&#xB9;

<figure><img src="/files/gKqzs4xoo5ofRnYyUEML" alt=""><figcaption></figcaption></figure>


# Настройка макета

{% hint style="danger" %}
Для дальнейших действий нужны минимальные знания работы с **макетами**, **XSL-шаблонами (далее - XSL)**, **типовыми динамическими страницами (далее - ТДС)** в HostCMS. Работу должен выполнять Ваш программист или администратор сайта.
{% endhint %}

### Вывод выбора региона/города для посетителей сайта

В главном макете Вашего сайта укажите css стили/js скрипты для работы модуля (обычно в пределах тега \<head>\</head>)

{% tabs %}
{% tab title="php Core\_Page" %}
{% code lineNumbers="true" fullWidth="true" %}

```php
<head>
	<!-- ... ваш код title и тд -->
	<?php
		Core_Page::instance()
			/* ... тут ваши css ... */
			->css('/hostcmsfiles/multiregion/css/style9999.css')
			->showCss();
	?>
	<?php
		Core_Page::instance()
			/* ... тут ваши js ... */
			/* все js multiregion должны быть подключены после jQuery */
			->js('/hostcmsfiles/multiregion/js/mp.autocomplete.js')
			->js('/hostcmsfiles/multiregion/js/script9999.js')
			->showJs();
	?>
</head>
```

{% endcode %}
{% endtab %}

{% tab title="html inline" %}
{% code fullWidth="true" %}

```php
<?php
	// GeoIP определяет текущий город и сохраняет в $_SESSION['ASMP_City']
	MultiRegion_GeoIp::getCountryLocationCity();
?>
<head>
	<!-- тут ваш код, css и js -->
	<link rel="stylesheet" type="text/css" href="/hostcmsfiles/multiregion/css/style9999.css" />
	
	<!-- все js multiregion должны быть подключены после jQuery -->
	<!--
		* !!!Раскомментировать один из двух скриптов подсказок городов
		* jquery-ui.min.js (с Widget Autocomplete) или jquery.autocomplete.min.js, 
		* если не один из них не был подключен ранее.
		* Рекомендуем jquery.autocomplete.min.js!
	-->
	<!--script src="/hostcmsfiles/multiregion/js/jquery-ui.min.js"></script-->
	<!--script src="/hostcmsfiles/multiregion/js/jquery.autocomplete.min.js"></script-->
	<script src="/hostcmsfiles/multiregion/js/script9999.js"></script>
</head>
```

{% endcode %}
{% endtab %}
{% endtabs %}

{% hint style="danger" %}
**Готовый пример можно увидеть в демо макете созданном после установки модуля**

в css и js файлах **9999** - Ваш уникальный номер файла при установке, посмотреть можно в папке **/hostcmsfiles/multiregion/\*/**, т.к. все файлы без уникального номера при обновлении будут заменяться на новые
{% endhint %}

В главном макете Ваше сайта, в том месте где хотите вывести выбор города/региона вставьте код (например в шапке сайта)

{% code lineNumbers="true" fullWidth="true" %}

```php
<?php
// Показ и выбор города
$MultiRegion_Controller_Show = new MultiRegion_Controller_Show(
	Core_Entity::factory('Site', CURRENT_SITE)
);
				
$MultiRegion_Controller_Show
	->xsl(Core_Entity::factory('Xsl')->getByName('Мультирегиональность'))
	->show();
?>
```

{% endcode %}

* ***favoriteCities** — устанавливает массив идентификаторов городов фаворитов для показа*
* ***regionsMode** — режим показа регионов, может принимать следующие значения:*&#x20;
  * *none - не показывать регионы (по умолчанию)*
  * *all - все регионы*
* ***directory** — (TRUE|FALSE) режим показа данных региона (телефоны, email, адреса), по умолчанию FALSE*

{% hint style="info" %}
\*при установке XSL шаблоны идут с датой текущей установки в названии, например: **Мультирегиональность \[05.06.2020 13:00:24]**
{% endhint %}

### Окно подтверждения города

Для появления окна подтверждения города нужно в Вашем подключённом скрипте `/hostcmsfiles/multiregion/js/scriptXXXXX.js` раскомментировать следующий код

<pre class="language-javascript" data-line-numbers data-full-width="true"><code class="lang-javascript"><strong>// 46 line: this.CurrentCity.data('hint') == true
</strong><strong>if(typeof this.getCookie('city_close') == "undefined" || this.CurrentCity.data('hint') == true)
</strong>{
	var _mrTooltips = $('.mr_tooltips');

	_mrTooltips.fadeIn();
}
</code></pre>

Окно подтверждения появляется только пока посетитель не подтвердит свой выбор (город хранится в куках) и если регионы не совпадают, например сайт определил посетителя из регионы 2, а он находится на странице/сайте региона 1, для типа cookie окно выбора не работает, если вы хотите его включить и для cookie то в **XSL-шаблоне** **"Мультирегиональность"** отредактируйте следующее:

{% code fullWidth="true" %}

```html
<!-- текущее -->
<!--<a href="javascript:;" onclick="$.getMRModal()" class="mr_current-city" data-path="{$path}" data-hint="false">
	<xsl:if test="$type != 'cookie' and current_multiregion_id and current_multiregion_id != current_shop_country_location_city_multiregion/multiregion/@id">
		<xsl:attribute name="data-hint">true</xsl:attribute>
	</xsl:if>
	<xsl:value-of select="current_city/city"/>
</a>-->
<!-- замнеить на этот код data-hint="true" -->
<a href="javascript:;" onclick="$.getMRModal()" class="mr_current-city" data-path="{$path}" data-hint="true">
	<xsl:value-of select="current_city/city"/>
</a>
```

{% endcode %}


# Работа с объектами ORM

Получить объект текущего региона или города можно в любом месте макета, ТДС или своем функционале следующий образом

{% code lineNumbers="true" fullWidth="true" %}

```php
<?php
    Core_Page::instance()->multiregion; // MultiRegion_Model Object
    Core_Array::getSession('ASMP_City', array()); // Array ASMP_City
?>
```

{% endcode %}

Вывод данных региона/города в макете/ТДС/PHP

{% code lineNumbers="true" fullWidth="true" %}

```php
<div>Телефон: <?php echo Core_Page::instance()->multiregion->getPhone(1); // 1 - ID типа телефона ?></div>
<div>Адрес: <?php echo Core_Page::instance()->multiregion->getAddress(1); // 1 - ID типа адреса ?></div>
<div>Полный Адрес: <?php echo Core_Page::instance()->multiregion->getAddress(1, TRUE); // 1 - ID типа адреса, TRUE - полный адрес Индекс, Страна, Область, Город, Адрес, FALSE - только Адрес ?></div>
<div>Email: <?php echo Core_Page::instance()->multiregion->getEmail(1); // 1 - ID типа Email ?></div>
```

{% endcode %}

Подстановки названия текущего региона/города в макете/ТДС/PHP со склонением

**Morphos\_Geographical::getCase(**$name, $cas&#x65;**)**

{% code lineNumbers="true" fullWidth="true" %}

```php
<?php
    // Екатеринбургу
    echo Morphos_Geographical::getCase(Core_Page::instance()->multiregion->name, "дательный");
    // Екатеринбурге
    echo Morphos_Geographical::getCase(Core_Array::get(Core_Array::getSession('ASMP_City', array()), 'city'), "родительный");
?>
```

{% endcode %}

Вывести домен текущего регион&#x430;*, для типа <mark style="color:yellow;">**\[site]**</mark>*

{% code lineNumbers="true" fullWidth="true" %}

```php
<?php
    $oMultiRegion = Core_Page::instance()->multiregion;
    echo $oMultiRegion->Site_Alias->name; // msk.site.ru
?>
```

{% endcode %}

Вывести путь текущего регион&#x430;*, для типа <mark style="color:yellow;">**\[url]**</mark>*

{% code lineNumbers="true" fullWidth="true" %}

```php
<a href="/<?php echo Core_Page::instance()->multiregion->getPath() ?>politics/">Политика конфиденциальности</a>
```

{% endcode %}


# Настройка SEO заголовков

#### Шаг 1

{% code lineNumbers="true" fullWidth="true" %}

```php
// В главном макете сайта в блоке head замените следующий код
/*
<title><?php Core_Page::instance()->showTitle()?></title>
<meta name="description" content="<?php Core_Page::instance()->showDescription()?>">
<meta name="keywords" content="<?php Core_Page::instance()->showKeywords()?>">
*/
// на нижний

<title><?php MultiRegion_Page::instance()->showTitle()?></title>
<meta name="description" content="<?php MultiRegion_Page::instance()->showDescription()?>">
<meta name="keywords" content="<?php MultiRegion_Page::instance()->showKeywords()?>">
```

{% endcode %}

#### Шаг 2

Теперь во всех SEO полях структуры сайта, интернет-магазина или информационных систем можно использовать Meta шаблоны подстановок\*

> **`Демонстрационный магазин в {multiregion.morphos 'name' 'предложный'}`**

`// Демонстрационный магазин в Екатеринбурге`

> **`Демонстрационный магазин в {multiregion.seo_title}`**

`// Демонстрационный магазин в Екатеринбурге`

{% hint style="danger" %}
\* обязательное условие, чтобы был создан регион по умолчанию и привязан к основному домену
{% endhint %}




---

[Next Page](/llms-full.txt/1)

