Оформлення замовлення

    В даний момент форма замовлення робиться за допомогою сніпета eForm. Можливо також зробити все на основі FormLister, використовуючи prepare-конструкції.

    Оформлення замовлення на eForm

    Важливо: на сторінці формування замовлення сніпет Shopkeeper повинен викликатися раніше eForm!

    В чанку форми замовлення обов'язково додати приховане поле:

    <input type="hidden" name="reportTpl" value="shopOrderReport">

    де shopOrderReport - це назва чанку з шаблоном звіту(параметр &report сніпета eForm).

    &eFormOnBeforeMailSent=`populateOrderData` - функція для заповнення даних про обрані товари.

    Для того щоб замовлення відправлялися в модуль Shopkeeper, в виклик сніпета eForm добавити параметр

    &eFormOnMailSent=`sendOrderToManager`

    Приклад виклику eForm:

    [!eForm?
    &formid=`shopOrderForm`
    &tpl=`shopOrderForm`
    &report=`shopOrderReport`
    &ccsender=`1`
    &gotoid=`11`
    &subject=`Нове замовлення`
    &eFormOnBeforeMailSent=`populateOrderData`
    &eFormOnMailSent=`sendOrderToManager`
    !]

    Товари в каталозі Shopkeeper

    Можна зберігати товари в окрему таблицю БД (не документи).При цьому залишається можливість використовувати стандартні TV-параметри для товарів и плагіни. Для створення і редагування товарів використовується стандартний інтерфейс (можна налаштувати за допомогою плагіна ManagerManager). Для виведення товарів на сайті використовується сніпет catalogView.

    Товари можна "вкласти" в будь-який документ (категорію), обравши в дереві документів. Оскільки категорія каталогу (структура) створюється як раніше, документами, але самі товари будуть зберігатися в окремій таблиці БД.

    Якщо товар з каталогу Shopkeeeper, в чанк товару (сніпет catalogView) потрібно вставити приховане поле:

    <input type="hidden" name="shk-catalog" value="1">

    Щоб в модулі Shopkeeper (в адмінці) з'явилась силка "Каталог", потрібно в конфігурації вказати ID категорії каталога (документ MODx) за замовчуванням.

    Також необхідно налаштувати конфігурацію плагіна SaveToSHK — вказати ID шаблону товарів і ID TV-параметра ціни.

    Важливо!

    Рекомендується використовувати ЧПУ. В шаблонах сайту рекомендується використовувати <base href="[(site_url)]"> всередині і відносні шляхи. Якщо чанки зберігаються в файлах (використовується команда @FILE:), перевірте кодування цих файлів. Вона повинна бути така ж як і у вашого сайта.

    Рекомендується встановити плагін PHx. В чанку chunk_shopOrderFormWebUser.tpl він використовується для заповнення прихованих полів даними авторизованого користувача.

    Для виведення кошика (сніпета) в різних місцях рекомендується створювати різні шаблони для сторінок або використовувати плагін PHx. Якщо використовується множення ціни товару на ціну додаткового параметра, в шаблоні інформації про товар (chunk_shopStuff.tpl і chunk_shopToCart.tpl) поле з ID товару (<input name="shk-id" value="[*id*]">) має бути вище додаткових параметрів по HTML-коду.

    Оформлення замовлення на FormLister

    В файлі assets/snippets/shopkeeper/shopkeeper.inc.php шукаємо рядки

    require_once MODX_BASE_PATH."assets/snippets/shopkeeper/classes/class.shopkeeper.php";
    $shopCart = new Shopkeeper($modx, $shkconf);

    замінюємо їх на

    require_once MODX_BASE_PATH."assets/snippets/shopkeeper/classes/class.shopkeeper.php";
    $shopCart = new Shopkeeper($modx, $shkconf);
    if (!empty($saveObject)) {
        $modx->setPlaceholder($saveObject, $shopCart);
    }

    У виклик Shopkeeper на сторінці замовлення тепер потрібно додати параметр:

    &saveObject=`shk`

    Далі слід створити сніпет ShkForm, через який будемо викликати FormLister:

    <?php
    $out = '';
    $purchases = !empty($_SESSION['purchases']) ? unserialize($_SESSION['purchases']) : array();
    if (!empty($shkObject) && ($shk = $modx->getPlaceholder($shkObject)) && ($shk instanceof Shopkeeper) && !empty($purchases)) {
            $params['ignoreMailerResult'] = 1;
            $params['protectSubmit'] = 0;
            $params['submitLimit'] = 0;
            $params['prepareProcess'] = [function ($modx, $data, $FormLister) use ($shk) {
                    $shk->populateOrderData($data); 
                    $shk->sendOrderToManager($data);
                    return $data;
            }];
    
            $out = $modx->runSnippet('FormLister', $params);
    }
    
    return $out;

    Приклад

    Виклик Shopkeeper:

    [!Shopkeeper?
    &cartType=`full`
    &priceTV=`price`
    &changePrice=`1`
    &counterField=`1`
    &style=`0`
    &noJavaScript=`0`
    &noJQuery=`1`
    &flyToCart=`nofly`
    &orderFormPage=`5067`
    &cartTpl=`shopCart`
    &cartHelperTpl=`cart_action_helper_tpl`
    &cartRowTpl=`shopCartRow`
    &orderDataTpl=`shopOrderData`
    &saveObject=`shk`
    !]

    Виклик ShkForm:

    [!ShkForm?
    &formid=`shopOrderForm`
    &shkObject=`shk`
    &formTpl=`shopOrderForm`
    &reportTpl=`shopOrderReport`
    &captcha=`modxCaptcha`
    &parseDocumentSource=`1`
    &rewriteUrls=`1`
    &filters=`{
        "name":["trim", "stripTags", "removeExtraSpaces"],
        "email":["trim", "email"],
        "phone":["trim", "phone", "removeExtraSpaces"],
        "address":["trim", "stripTags", "removeExtraSpaces"],
        "message":["trim", "stripTags", "compressText"]
    }`
    &rules=`{
        "name":{
            "required":"Введіть ім'я"
        },
        "email":{
            "required":"Введіть электронну скриньку",
            "email":"Введіть электронну скриньку правильно"
        },
        "phone":{
            "required":"Введіть номер телефону",
            "phone":"Введіть номер телефону правильно"
        },
        "address": {
            "required":"Введіть адрес"
        },
        "payment":{
            "required":"Виберіть способ оплати",
            "!equals": {
                "params":["0"],
                "message":"Виберіть спосіб оплати"
            }
        }
    }`
    &formControls=`payment,delivery`
    &subject=`Нове замовлення на сайті`
    &to=`test@test.ru`
    &successTpl=`shopThankYou`
    !]

    Чанк shopOrderReport:

    <p>В інтернет-магазині зроблено замовлення.</p>
    <p>Номер замовлення: [+orderID+]</p>
    <b>Склад замовлення:</b>
    [+orderData+]
    <br /><br />
    <b>Дані покупця:</b><br />
    <table cellpadding="3">
            <tr><td><b>Адрес: </b></td><td>[+address.value+]</td></tr>
            <tr><td><b>Спосіб доставки: </b></td><td>[+delivery.value+]</td></tr>
            <tr><td><b>Спосіб оплати: </b></td><td>[+payment.value+] </td></tr>
            <tr><td><b>П.І.П.: </b></td><td>[+name.value+]</td></tr>
            <tr><td><b>E-mail: </b></td><td><a href="mailto:[+email.value+]">[+email.value+]</a></td></tr>
            <tr><td><b>Телефон: </b></td><td>[+phone.value+]</td></tr>
            <tr><td><b>Повідомлення: </b></td><td>[+message:nl2br+]</td></tr>
    </table>

    Обговорення на сайті співтовариства