Константин Ильин

Константин Ильин

С нами с 10 февраля 2014; Место в рейтинге пользователей: #131
24 марта 2023, 06:49
0
Дайте пожалуйста наводку. Ситуация такая
— minishop2 4.0.0 (обновлялись с 2.5)
— возможно это критично, /components/minishop2/js/web/default_custom.js и наверняка от 2.5 версии.
— есть кастомная платежка, лежит в папке components/minishop2/custom/payment/rbs.class.php

В ней реализован метод send, в конце такие строчки:
if (!class_exists('msPaymentInterface')) {
    require_once dirname(dirname(dirname(__FILE__))) . '/handlers/mspaymenthandler.class.php'; ///model/minishop2/mspaymenthandler.class.php
}



 public function send(msOrder $order)
    {
......
    $response = curl_exec($curl);
    $response = json_decode($response, true);
    
    curl_close($curl);
    file_put_contents(MODX_ASSETS_PATH.'rbs.txt', '-------', FILE_APPEND);
    
    if ($this->config['logging']) {
        $this->modx->log(modX::LOG_LEVEL_ERROR, '[ms2:rbs] Метод ' . $method . '  gateway request: ' . print_r($data, 1) . ' gateway response:' . print_r($response, 1));
    }
    return $response;
}
При оформления заказа file_put_contents и this->modx->log (при включенном логировании) — не отрабатывают, т.е. данный метод send вообще не запускается.

Так же если сделать alert в callbacks.submit.response.success
disk.yandex.ru/i/as4oZIV5VbkrsQ
Видно, что нет redirect, отсюда и не перенаправляет на платежку.

Если же сделать так:
$o = $modx->getObject('msOrder', 1300);
if ($payment = $modx->getObject('msPayment', array('id' => $o->get('payment'), 'active' => 1))) {
    $response = $payment->send($o);
    if (is_array($response)) {
        $response = json_encode($response, true);
    }
    exit($response);
}
То все отрабатывает и дает ссылку.

Подскажите почему может не запускаться класс оплаты при оформлении с фронта?
24 марта 2023, 06:30
0
Все верно D = document; и да, чтобы писать короче.
23 марта 2023, 15:30
+1
буду следить (особенно жду эту фичу с дозагрузкой), понравился компонент, и сам начал пользоваться fetch в скриптах

Js ванилу не так давно начал, поэтому такие огрехи встречаются :)
let a = D.querySelector('.modalTmp form').getAttribute('data-fetchit')
23 марта 2023, 08:02
0
Спасибо, «кастомно» получилось

if (FetchIt === undefined){
    D.querySelector('head').append('<script src="/assets/components/fetchit/js/fetchit.js" defer=""></script>');
}
if(!empty(FetchIt)){
    let a = D.querySelector(".modalTmp").querySelector('form').getAttribute('data-fetchit')
    FetchIt.create({
        action: a,
        assetsUrl: "/assets/components/fetchit/",
        actionUrl: "/assets/components/fetchit/action.php",
        inputInvalidClass: "is-invalid",
        customInvalidClass: "",
        clearFieldsOnSuccess: true,
        pageId: hashp,
    });
}
22 марта 2023, 12:52
0
Подскажите пожалуйста, если форма подгружается после инициализации FetchIt, например модалку(с вызовом сниппета FetchIt) подгружаю по надобности, как на форму в модалке «инициализировать» FetchIt?
19 марта 2023, 15:30
0
Используйте склонения если это проблема
Нужно посмотреть что содержится в $_modx->resource.lang при выборе нескольких языков(массив или строка), оттуда делать подсчет.
— Если массив, то просто {set $countLangs = count($_modx->resource.lang)}
— Если строка, то через explode в массив, а дальше как предыдущем пункте

Когда есть $countLangs пробуем так:
{$countLangs | declension : 'яблоко|яблока|яблок'} // яблок
{$countLangs | declension : 'яблоко|яблока|яблок' : true} // 3 яблока
{$countLangs | decl : 'яблоко,яблока,яблок' : false : ','} // яблоко
Или
{if $countLangs > 1}
{set $l = 'языках'}
{else}
{set $l = 'языке'}
{/if}
статья доступна на {$_modx->resource.lang} {$l}
08 марта 2023, 20:16
0
Не за что! В чем была проблема?
08 марта 2023, 19:04
0
Тут дальше только выяснять постепенно как я писал вам ранее, выводите в лог или как то логгируйте, что получаете и т.д. сам Пример(!) как у меня работает я дал, ну и в теории повторюсь вы получаете строку с заказом ее надо из json вытащить и получить заказ.

так же в вашем коде два раза вызывается $miniShop2->order->submit()

Так же вы не поменяли $modx на $this->modx
Адаптируйте мой код под ваш самостоятельно
08 марта 2023, 18:41
0
у вас видимо какой-то отдельный компонент-класс и как вы его запускаете не совсем понятно, но пользуйтесь тогда для отладки, в разных участках кода
$this->modx->log(1, print_r($result,1));
Смотреть в Журнале ошибок в самом модх.
Начните с самого простого в самом начале функции post()
$this->modx->log(1, print_r('Это я class shopOrder2 запустился',1));
если у вас журнале вообще ничего не выводит и ошибки тоже(и ошибки в серверном логе тоже нет), то скорее всего ваш класс вообще не запускается и с ним не работает modx или вы его вообще не вызываете и т.п.
08 марта 2023, 18:11
0
код весь покажите тогда

там еще $pdo->… выше получаю:
$pdo = $modx->getService('pdoTools');
08 марта 2023, 16:54
0
не только 'json_response' => 1, а getService тоже смотрите параметры передаю
08 марта 2023, 16:44
0
видимо у меня так же, т.е. нужно самостоятельно получить заказ, т.к. далее у меня такой код:

$resp['r'] = $arr = json_decode($miniShop2->order->submit(),1);
if($arr['success'] && $arr["data"]["msorder"] > 0){
    $msOrder = $modx->getObject('msOrder', $arr["data"]["msorder"]);
    $order = $msOrder->toArray();
    $resp['out'] = $pdo->parseChunk('@FILE cart/fastOrderSuccess.tpl',$arr);
}
08 марта 2023, 15:55
0
У меня так вызывается
$scriptProperties = [
     'json_response' => 1,
];
/* возможно эта строчка поможет */
$miniShop2 = $modx->getService('minishop2','miniShop2', MODX_CORE_PATH . 'components/minishop2/model/minishop2/', $scriptProperties);

$miniShop2->initialize($modx->context->key, $scriptProperties);
$miniShop2->order->clean();
$miniShop2->cart->clean();
$miniShop2->cart->add($dataForm['id'],($dataForm["count"] ?: 1),$option);
/* ... */
$resp['r'] = json_decode($miniShop2->order->submit(),1);
05 марта 2023, 16:55
+1
ну если хотите так же модх, как говорится первая ссылка в гугле
perfkirill.ru/stati/modx/if-else-modx
//Добавить еще условие :or:is=`[]`

[[*gallery-page:is=``:or:is=`[]`:then=`пусто`:else=`есть фотографии`]]
05 марта 2023, 10:22
+1
Если Вам, то, что Артур написал сложно, то Вам наверно мимо программирования или читать/учится больше надо.
Ну и на феном переходите, на modx парсере все это еще хуже выглядит с точки зрения программирования.
{set $gallery = $_modx->resource['gallery-page']}
{if $gallery in list ['', '[]'] }
     /* Тут берем галерею из другого ресурса если текущая пустая */
    {set $gallery = 1 | resource: 'gallery-page'}
{/if}

/* доп проверка на пустоту , мало ли на другом ресурсе тоже нет галереи */
{if !($gallery in list ['', '[]'])}
    /* Если не пусто то выводим в цикле */
    {set $gArr = $gallery | fromJSON}
    {foreach $gArr as $item}
        <div>{$item['Ключ в migx']}</div>
    {/foreach}
{/if}
14 февраля 2023, 08:31
0
Есть недавно созданный замечательный компонент AjaxFormitLogin
{'!AjaxFormitLogin' | snippet : [
    'form' =>  'updateProfileForm',
    'snippet' => 'FormIt',
    'hooks' => 'AjaxIdentification',
    'method' => 'update',
    'successMessage' => 'Данные сохранены.',
    'clearFieldsOnSuccess' => 0,
    '-spamProtection' => 1
    'validate' => 'email:required:email',
    'validationErrorMessage' => 'Исправьте, пожалуйста, ошибки!',
    'email.vTextRequired' => 'Укажите email.'
]}
10 февраля 2023, 09:17
+1
Навскидку так вроде.
Кнопке добавить data-pagetitle
<button  ...  data-pagetitle="{$pagetitle | htmlent}"  ...>
В js
oncLickModal.addEventListener('show.bs.modal', function (e) {
    .....
    // Добавляем эту строку, ставим pagetitle в .modal-title
    oncLickModal.querySelector('.modal-title').innerText =  e.relatedTarget.dataset.pagetitle;

});
08 февраля 2023, 12:32
0
Мои извинения.
Как писал Артур выше
Если не заработает оставь параметр tpl пустым — посмотри какие плейсхолдеры доступны
Там поискать ваше поле и какое значение там. Возможно там json или что-то типа того
08 февраля 2023, 11:42
0
То что они лежат где-то это одно. Вам же нужно выбрать у каждого ресурса иpображение,
Например открываете ресурс «Лампочки», там вкладка Доп поля и там ваше поле должно отображаться, если вы указали для TV шаблон в котором отображать это поле. В итоге В вашем поле выбираете нужное вам изображение и сохраняете ресурс.
Должно быть заполнено: disk.yandex.ru/i/1E2QED82nhDY8w

Все довольно просто, никаких источников файлов для быстрого старта не надо создавать.

TV
— Ввод Изображение
— Выбрать для какого(их) шаблонов отображать

— Зайти в ресурс(ы) и выбрать/загрузить картинку к нему
08 февраля 2023, 11:06
0
Имеется ввиду Вы картинку точно загрузили к ресурсу? Потому что, [[+imagecat]] или [[+tv.imagecat]] должны что-то выдавать, если нет опечаток и изображение загружено.
И у тв лучше сделать так:
Параметр ввода изображение или что-то удобное вам
А параметр вывода вообще не трогать, оставить по умолчанию