Dmitry P.

Dmitry P.

С нами с 22 ноября 2017; Место в рейтинге пользователей: #408
Dmitry P.
04 августа 2020, 10:39
0
У меня возникла похожая проблема, только в тестовом режиме компонент ругался при каждой оплате. Методом тыка выяснил, что сигнатура в компоненте не совпадает с сигнатурой от робокассы, и связано это вроде как с наличием копеек.
Помогло поправить метод receive в классе оплаты Robokassa (core/components/minishop2/custom/payment/robokassa.class.php)
Добавил вычисление сигнатуры без копеек
$sum3 = number_format($order->get('cost'), 0, '.', '');
$crc3 = strtoupper(md5($sum3 . ':' . $id . ':' . $this->config['pass2']));
И в последующем ифе проверку
if ($crc == $crc1 || $crc == $crc2 || $crc == $crc3) {...}
Полный код метода:
public function receive(msOrder $order, $params = array())
    {
        $id = $order->get('id');
        $crc = strtoupper($_REQUEST['SignatureValue']);
        // Production
        $sum1 = number_format($order->get('cost'), 6, '.', '');
        $crc1 = strtoupper(md5($sum1 . ':' . $id . ':' . $this->config['pass2']));
        // Test
        $sum2 = number_format($order->get('cost'), 2, '.', '');
        $crc2 = strtoupper(md5($sum2 . ':' . $id . ':' . $this->config['pass2']));
        
        /** вот эти две строки добавил*/
        $sum3 = number_format($order->get('cost'), 0, '.', '');
        $crc3 = strtoupper(md5($sum3 . ':' . $id . ':' . $this->config['pass2']));

        if ($crc == $crc1 || $crc == $crc2 || $crc == $crc3) { //и здесь одно условие
            /** @var miniShop2 $miniShop2 */
            $miniShop2 = $this->modx->getService('miniShop2');
            @$this->modx->context->key = 'mgr';
            $miniShop2->changeOrderStatus($order->get('id'), 2);
            exit('OK');
        } else {
            $this->paymentError('Err: wrong signature.', $params);
        }
    }
Dmitry P.
02 июля 2020, 15:29
+3
т.к. migx хранит пути к файлам только относительно указанного ему медиаисточника, я написал небольшой плагин на событие «pdoToolsOnFenomInit», который создает модификатор для фенома, в котором находится baseUrl меди-источника по его ID
<?php

switch ($modx->event->name) {
    case 'pdoToolsOnFenomInit':
        $fenom->addModifier('mediapath', function ($input) use ($modx) {
            if (!$output = $modx->pdoTools->getStore($input, 'mediapath')) {
                if (!$output = $modx->cacheManager->get('media_' . $input)) {
                    if ($source = $modx->getObject('sources.modMediaSource', $input)) {
                        $source = $source->toArray();
                        $output = '/' . ltrim($source['properties']['baseUrl']['value'], '/');
                    } else {
                        $output = '/';
                    }
                    $modx->cacheManager->set('media_' . $input, $output, 0);
                }
                $modx->pdoTools->setStore($input, $output, 'mediapath');
            }

            return $output;
        });
        break;
}
полученный путь кешируется средствами модыкса (чтоб каждый раз в базу запросы не делать), плюс еще кладется в Store pdoTools-ов, чтоб в циклах не дергать каждый раз кеш :)
использовать можно так:
<img class="image" src="{mediapath(2) ~ $i.image}">
Dmitry P.
02 июля 2020, 12:13
0
Отличная статья! Ковыряю vesp еще с первых статей, очень много нового для себя узнал.
Очень интересно было бы почитать еще про работу с файлами и организации, например, галерей.
Dmitry P.
11 июня 2020, 07:17
+1
в инструкции написано, что сниппеты не кешируются
но по моему опыту, при таком вызове может кешироваться только код сниппета, но не получаемые им данные
Dmitry P.
22 марта 2020, 08:41
+1
{set $prices = $_modx->resource.Prices | fromJSON}
    {$prices[2][2]} {*получить значение ячейки (2,2), индексы с 0 начинаются*}

    {foreach $prices as $row}
        Size: {$row[0]}
        Availability: {$row[4]}
    {/foreach}
Работа с массивами аналогична пхп.
По феному есть документация раз и два
Dmitry P.
20 марта 2020, 15:52
+1
{foreach $_modx->resource.Prices | fromJSON as $row}
    {foreach $row as $cell}
        {$cell} {*тут выведутся все значения всех ячеек*}
    {/foreach}
{/foreach}
Dmitry P.
19 февраля 2020, 10:20
0
можно сниппету msOrder указать настройку 'userFields' => ['phone' => 'mobilephone']
тогда и у нового пользователя при создании заказа будет телефон в mobilephone записываться, и у залогиненного пользователя подставляться в это поле phone будет номрально
Dmitry P.
30 мая 2019, 15:39
0
я так недавно пробовал сделать — стандартный js минишопа начинает в консоле ругаться
Dmitry P.
28 мая 2019, 12:43
0
Нужно посмотреть ошибки в консоле браузера. Может где-то нарушен порядок подключения js-ов
Dmitry P.
28 мая 2019, 12:07
0
в просто js-файле не сработает
а вот через чанк должно получиться
Dmitry P.
28 мая 2019, 11:03
0
попробуй настройку pdoMenu &checkPermissions
Укажите, какие разрешения нужно проверять у пользователя при выводе ресурсов, например &checkPermissions=`list`.
Dmitry P.
28 мая 2019, 10:58
0
чтоб получить голый json из migx-переменной нужно просто получить заначение ТВ-шки напрямую
[[*migxTV]]
или fenom'ом
{$_modx->resource.migxTV}
Dmitry P.
28 мая 2019, 10:52
+1
попробуй вызвать через $this->modx

а вообще, чтоб в любом файле подключить $modx, у меня работает такой код:
define('MODX_API_MODE', true);
require_once dirname(dirname(dirname(dirname(__FILE__)))) . '/index.php'; //путь до index.php, который лежит в корне

$modx->getService('error', 'error.modError');
$modx->setLogLevel(modX::LOG_LEVEL_ERROR);
$modx->setLogTarget('FILE');
Dmitry P.
08 февраля 2019, 13:00
0
при работе с дополнением msPromoCode уведомления noty с применением/отменой промо-кода отображаются без стиля. другие библиотеки тоже неправильно показываются.

Dmitry P.
30 января 2019, 19:43
1
+1
ну так-то да, я что-то не подумал:
откуда форма знает куда ей стучаться?
может попробовать воткнуть в каждую форму скрытую кнопку «в корзину»..? минишоповские скрипты должны понять такой ход :)
<button type="submit" name="ms2_action" value="cart/add" style="display: none;">В корзину</button>
Dmitry P.
30 января 2019, 16:41
0
а один товар, но с разными опциями минишоп добавит в корзину по отдельности
Dmitry P.
30 января 2019, 16:37
0
минишоп по-умолчанию должен корректно объединять товары с одним id-шником и одинаковым набором опций
Dmitry P.
30 января 2019, 16:02
+1
наверно самый просто вариант — это для каждой опции отправлять свою форму в корзину
т.е. для каждого варианта опции заверстать форму со скрытыми инпутами
что-то типа такого
<form method="post" class="ms2_form">
    <input type="hidden" name="id" value="resource_id">
    <input type="hidden" name="options[some_name]" value="some_value" >
    <input type="number" name="count" value="1">
</form>
<form method="post" class="ms2_form">
    <input type="hidden" name="id" value="resource_id">
    <input type="hidden" name="options[some_name]" value="some_value_2" >
    <input type="number" name="count" value="1">
</form>
<button id="super_button">В корзину</button>
<script>
    $('#super_button').click(function(){
        $('form.ms2_form').each(function(){
            if ($(this).find('input[name="count"]').val() > 0) { 
                $(this).submit();
             } 
        });
    });
</script>
Dmitry P.
21 января 2019, 12:18
+1
а если попробовать в чанке menuinner прописать что-то типа
[[+idx:el=`10`:then=`<li><a href="[[~[[+id]]]]"><img src="[[+img:phpthumbof=`w=500&h=290&zc=1`]]"/><p>[[+pagetitle]]</p></a></li>`:else=``]]
Dmitry P.
18 января 2019, 09:54
0
Скорей всего как-то так:
&sortby=`{"Data.price=0,Data.price":"ASC"}`