Этот хук обрабатывает форму "Купить в 1 клик", создает заказ в miniShop2

Подходит для Formit, FetchIt на других потетсровать не удалось)))
Искал решение но тут на портале много заморочек с правкой скриптов JS и тп, думаю самый просто вариант это хук…

Пример вызова:
{'!FetchIt' | snippet : [
            'form' => 'form_oneclick',
            'hooks' => 'msOrderOneClick,FormItSaveForm,email',
        ]}
Создаем сниппет msOrderOneClick:
<?php
/**
 * Хук FormIt для покупки в 1 клик через miniShop2
 *
 * Этот хук обрабатывает форму "Купить в 1 клик", создает заказ в miniShop2
 * и возвращает результат для дальнейшей обработки FormIt
 */

/** @var modX $modx Глобальный объект MODX для работы с API */
/** @var \Sterc\FormIt\Hook $hook Объект хука FormIt, содержащий данные формы и методы обработки */
/** @var miniShop2 $miniShop2 Объект miniShop2 для работы с магазином */

// Получаем текущего пользователя и его профиль для получения email
$user = $modx->user;                           // Текущий авторизованный пользователь
$profile = $user->getOne('Profile');          // Профиль пользователя с дополнительными данными

// Определяем обязательные поля формы
$requiredFields = ['name', 'phone','comment', 'pageId'];

// ID способов доставки и оплаты (настраиваются в админке miniShop2)
$delivery_id = 1; //Тут указываем ид типа доставки из настроек minishop2
$payment_id = 1;  //Тут указываем ид типа оплаты из настроек minishop2

// Проверка заполнения обязательных полей
foreach ($requiredFields as $field) {
    // Если поле пустое, добавляем ошибку валидации
    if (empty($hook->getValue($field))) {
        $hook->addError($field, 'Поле обязательно для заполнения');
        return false; // Прерываем выполнение хука
    }
}

// Получаем данные из формы и устанавливаем приоритеты для email
$receiver = $hook->getValue('name');                                    // Имя покупателя
$phone = $hook->getValue('phone');                                      // Телефон покупателя

// Email: из формы -> из профиля пользователя -> из настроек сайта (по умолчанию)
$email = $hook->getValue('email') ? : $profile->email ? : $modx->getOption('emailsender');

$comment = $hook->getValue('comment');                                  // Комментарий к заказу
$product_id = (int)$hook->getValue('pageId');                          // ID товара для покупки


// Инициализация miniShop2
$miniShop2 = $modx->getService('miniShop2');                           // Получаем сервис miniShop2

// Инициализируем miniShop2 с параметром json_response=true для получения JSON ответа
$miniShop2->initialize($modx->context->key, ['json_response' => true]);

// Проверка успешной инициализации miniShop2
if (!$miniShop2) {
    $hook->addError('form', 'Сервис магазина miniShop2 недоступен');   // Добавляем ошибку
    return false;                                                      // Прерываем выполнение
}

// Добавляем товар в корзину
$miniShop2->cart->clean();                                             // Очищаем текущую корзину
$cartAdd = $miniShop2->cart->add($product_id, 1);                     // Добавляем выбранный товар (1 штука)

// Создаем заказ в miniShop2, заполняя необходимые поля
$miniShop2->order->add('receiver', $receiver);                        // Добавляем имя получателя
$miniShop2->order->add('phone', $phone);                              // Добавляем телефон
$miniShop2->order->add('comment', 'Заказ в 1 клик: ' . $comment);    // Добавляем комментарий с префиксом
$miniShop2->order->add('email', $email);                              // Добавляем email покупателя
$miniShop2->order->add('delivery', $delivery_id);                     // Добавляем способ доставки
$miniShop2->order->add('payment', $payment_id);                       // Добавляем способ оплаты

// Отправляем заказ (сохраняем в базе данных)
$orderSave = $miniShop2->order->submit();
if (!$orderSave) {
    $hook->addError('form', 'Сервис корзины miniShop2 недоступен');   // Добавляем ошибку
    return false;                                                      // Прерываем выполнение
}

// Возвращаем результат выполнения для FormIt
// FormIt будет обрабатывать этот результат в зависимости от настроек (hooks)
return true;
vectorserver
Сегодня в 07:56
modx.pro
104
+4
Поблагодарить автора Отправить деньги

Комментарии: 1

Артур Шевченко
2 часа назад
0
самый просто вариант это хук
Я тоже так думаю
    Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
    1