Всего 123 791 комментарий

Артур Шевченко
09 марта 2023, 12:28
0
Немного не по адресу вопрос, за валидацию отвечает FormIt.
Сергей Карпович
09 марта 2023, 12:14
0
Если для поля установлено несколько валидаторов, например:
name.vTextRequired и name.vTextMinLength
То при незаполненном поле — показывается текст ошибки и с первого валидатора со второго валидатора, хотя до него еще не дошли. Это можно поправить?
Те. если поле не заполнено — показываем name.vTextRequired, если заполнено мало, то name.vTextMinLength
Денис Усачев
09 марта 2023, 12:09
0
msFavorites.ids
<?php
/** @var array $scriptProperties */
/** @var msFavorites $msFavorites */
if (!$msFavorites = $modx->getService('msfavorites.msFavorites', '', MODX_CORE_PATH . 'components/msfavorites/model/')) {
    return 'Could not load msFavorites class!';
}
/** @var pdoFetch $pdoFetch */
if (!$modx->loadClass('pdofetch', MODX_CORE_PATH . 'components/pdotools/model/pdotools/', false, true)) {
    return false;
}

if (!empty($returnIds)) {
    $return = 'ids';
}
if ($return === 'ids') {
    $returnIds = 1;
}

if (!isset($list) OR $list == '') {
    $list = 'default';
}
if (!isset($type) OR $type == '') {
    $type = 'resource';
}

$list = is_array($list) ? $list : array_map('trim', explode(',', $list));
$rows = $modx->runSnippet('msFavorites.objects', array_merge($scriptProperties, ['return' => 'data', 'list' => $list, 'type' => $type, 'groupKey' => 'list']));
$pls = [
    'list'  => [],
    'total' => [],
];
foreach ($list as $l) {
    $keys = !empty($rows[$l]) ? array_column($rows[$l], 'key') : [];
    $pls['list'][$l] = !empty($keys) ? implode(',', $keys) : '-0';
    $pls['total'][$l] = count($keys);
}
$msFavorites->setPlaceholders($pls);

$log = '';
if ($modx->user->hasSessionContext('mgr') && !empty($showLog)) {
    $log .= '<pre class="msFavoritesLog">' . print_r($pdoFetch->getTime(), 1) . '</pre>';
}
$modx->setPlaceholder('msFavorites.log', $log);

$output = [];
switch ($return) {
    case 'data':
        $output = $pls;
        break;
    case 'json':
        $output = json_encode($pls, true);
        break;
    case 'ids':
    default:
        $output = reset($pls['list']);
        if (!empty($toPlaceholder)) {
            $modx->setPlaceholder($toPlaceholder, $output);
            $output = '';
        }
        break;
}

return $output;
Денис Усачев
09 марта 2023, 11:42
0
1. выдает ровно 10 id [32,46,55,64,73,84,95,105,114,120]

2. pdoPage &limit=`999` ставлю но без изминений,
так как в resources передаю id
&resources=`{'!msFavorites.ids' | snippet}`  
что равно 
&resources=`32,46,55,64,73,84,95,105,114,120`
Scorp Satex
09 марта 2023, 10:21
0
1. Вызов
{'!msFavorites.ids' | snippet}
— сколько idшников выдает? тоже 10 штук или больше?
2. У pdoPage есть параметры: docs.modx.pro/komponentyi/pdotools/snippetyi/pdopage Один из них — &limit по умолчанию limit и там указано 10. Попробуйте указать там 99.
Алексей Смирнов
08 марта 2023, 20:21
0
Ну если квалификация позволяет расковырять — расковыряйте.
Там встроенный обработчик. Можно по аналогии сделать свой. И тогда получите свой вариант.
Prihod
08 марта 2023, 20:19
+1
Все те кто при установки базового пакета выбирает также установку всех нужных ему и не нужных дополнительных пакетов расширяющих базовый должны иметь ввиду, что вам может не хватить лимита времени которое у вас отведено на выполнение php скрипта из-за чего пакеты либо вообще не установятся, либо установятся не полностью. В итоге у вас лог ошибок modx будет забит ошибками вида

Problem getting service iemsoptionsprice2, instance of class IeMsOptionsPrice2, from path
Problem getting service iemssaleprice, instance of class IeMsSalePrice, from path
Problem getting service iemsoptionscolor, instance of class IeMsOptionsColor, from path
Что бы их убрать нужно либо установить/переустановить пакеты фигурирующие в логе классическим способом, либо удалить о них информацию в следующих местах

  1. На странице пространство имен /manager/?a=workspaces/namespace
  2. В системных настройках в опции extension_packages /manager/?a=system/settings
  3. Также может понадобиться удалить, если он есть, плагин его дополнения
Александр
08 марта 2023, 20:19
0
Как понял, в самом компоненте, в котором работал с контроллером.
Использовал свой код + ваши подсказки и код в другом контроллере от zoomx и все сработало.
Хотя до этого и там не работало.
Константин Ильин
08 марта 2023, 20:16
0
Не за что! В чем была проблема?
Александр
08 марта 2023, 20:06
0
в итоге получилось.
Спасибо вам больше за помощь!
Константин Ильин
08 марта 2023, 19:04
0
Тут дальше только выяснять постепенно как я писал вам ранее, выводите в лог или как то логгируйте, что получаете и т.д. сам Пример(!) как у меня работает я дал, ну и в теории повторюсь вы получаете строку с заказом ее надо из json вытащить и получить заказ.

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

Так же вы не поменяли $modx на $this->modx
Адаптируйте мой код под ваш самостоятельно
Александр
08 марта 2023, 18:49
0
все вызывается и работает (заказ то создается), если отключить json_response, то я получу ответ в том виде, который я отдаю, но без id новосозданного заказа.
Данный контроллер используется в api для построения фронта отдельно от 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:20
0
<?php

class shopOrder2 extends shopBaseRestController
{
    public $allowedMethods = array('post');

    public function post()
    {
        
        // инициализируем miniShop2
            $scriptProperties = [
                'json_response' => 1,
            ];
        	
        	$miniShop2 = $this->modx->getService('minishop2','miniShop2', MODX_CORE_PATH . 'components/minishop2/model/minishop2/', $scriptProperties);
        	
        	// опции товара, если они необходимы
        	$option = array();
        	/*$option = array(
        	  "option1" => "value1",
        	  "option2" => "value2",
        	);*/
        	// инициализируем miniShop2 в текущем контексте
        	$miniShop2->initialize($this->modx->context->key, $scriptProperties);
        
        $cart = $miniShop2->cart->get();

        if (!count($cart)) {
            $result = [
                'message' => 'Корзина пуста',
                'success' => false
            ];
            return $this->failure('', $result);
        }

        //Получатель
        $email = $this->getProperty('email');
        $phone = $this->getProperty('phone');
        $receiver = $this->getProperty('name');

        //Дата и время доставки
        //$soon = (bool)$this->getProperty('soon');
        $delivery_date = $this->getProperty('delivery_date');
        $delivery_time = $this->getProperty('delivery_time');

        //Адрес
        $street = $this->getProperty('street');
        $building = $this->getProperty('building');
        $room = $this->getProperty('apartment');
        $entrance = $this->getProperty('entrance');
        $floor = $this->getProperty('floor');

        $comment = $this->getProperty('comment');

        //Доставка и оплата
        $payment = (int)$this->getProperty('payment');
        $delivery = (int)$this->getProperty('delivery');

        $miniShop2->order->add('payment', $payment);
        $miniShop2->order->add('delivery', $delivery);

        $miniShop2->order->add('receiver', $receiver);
        $miniShop2->order->add('email', $email);
        $miniShop2->order->add('phone', $phone);

        $miniShop2->order->add('soon', $soon);
        $miniShop2->order->add('delivery_date', $delivery_date);
        $miniShop2->order->add('delivery_time', $delivery_time);

        $miniShop2->order->add('street', $street);
        $miniShop2->order->add('building', $building);
        $miniShop2->order->add('room', $room);
        $miniShop2->order->add('entrance', $entrance);
        $miniShop2->order->add('floor', $floor);
        $miniShop2->order->add('comment', $comment);

        $result['r'] = json_decode($miniShop2->order->submit(),1);
        
        $result['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();
            $result['orderId'] = $order;
            $resp['out'] = $pdo->parseChunk('@FILE cart/fastOrderSuccess.tpl',$arr);
        }
        $result['orderId'] = $response['data']['msorder'];
        
        return $this->success('', $result);

    }
}
Константин Ильин
08 марта 2023, 18:11
0
код весь покажите тогда

там еще $pdo->… выше получаю:
$pdo = $modx->getService('pdoTools');
Александр
08 марта 2023, 17:57
0
Не помогло, к сожалению.
Повторил ваше получение заказа и все равно тот же вывод
{"success":true,"message":"","data":{"msorder":56}}
в виде html с игнорированием вообще каких-либо конструкций вывода информации. Что само по себе очень странно.
Даже нет ошибки из-за отсутствия такого чанка как у вас (специально решил не менять, чтобы вызвать ошибку)
Константин Ильин
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, 16:03
0
Действительно
$scriptProperties = ['json_response' => 1];
помогает, но в таком случае ответ приходит в виде html с содержимым {«data»: {«msorder»:15}} и полностью игнорирует построение ответа.
Вот пример:
if (isset($response['success']) && $response['success'] == true) {
            $result['post'] = $this->properties;
            $result['response'] = $response;
            $result['orderId'] = $response['data']['msorder'];
            $miniShop2->cart->clean();
            return $this->success('', $result);
        }
и по идее, вывод должен быть таким только с наполненной data[]:
{
    "success": true,
    "message": "",
    "object": {
        "post": {
            "payment": "1",
            "delivery": "1",
            "name": "Алекс",
            "email": "test@test.ru"
        },
        "response": {
            "success": true,
            "message": "",
            "data": []
        },
        "orderId": null
    },
    "code": 200
}
а выведет при включенном json_response вот так:
{"success":true,"message":"","data":{"msorder":53}}
Причем в html формате.

Никак не могу решить данную проблему
Константин Ильин
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);