Всего 123 789 комментариев

Артур Шевченко
27 мая 2024, 18:33
+1
Скорее всего нужно использовать FIND_IN_SET
Артур Шевченко
27 мая 2024, 18:26
+1
Оперативной памяти серверу не хватает. Надо искать утечку. Скорее всего где-то есть самописный сниппет, который получает из БД много объектов.
Андрей
27 мая 2024, 15:45
0
@Илья Уткин В дополнение к правкам плагина.

Вчера лег СДЭК, его апи не работает.

У клиента сайт на Modx 2.8.3 + miniShop2 3.0.7 + ms_CDEK2 2.1.2 + CDEKIntegrate 1.1.10

После того как легло API СДЭКА клиентский сайт начал выдавать 500 ошибку при попытке просмотра заказов в админке и оформление заказов на фронте.

Пришлось деинсталировать плагин, чтобы магазин заработал.

По логам вот так

[27-May-2024 15:16:52 Europe/Moscow] PHP Fatal error: Uncaught CdekSDK2\Exceptions\RequestException: Idle timeout reached for «api.cdek.ru/v2/oauth/token». in /home/.../public_html/core/components/cdekintegrate/model/vendor/cdek-it/sdk2.0/src/Http/Api.php:246
Stack trace:
#0 /home/.../public_html/core/components/cdekintegrate/model/vendor/cdek-it/sdk2.0/src/Http/Api.php(192): CdekSDK2\Http\Api->request('POST', 'https://api.cde...', Array)
#1 /home/.../public_html/core/components/cdekintegrate/model/vendor/cdek-it/sdk2.0/src/Http/Api.php(149): CdekSDK2\Http\Api->post('/oauth/token', Array)
#2 /home/.../public_html/core/components/cdekintegrate/model/vendor/cdek-it/sdk2.0/src/Client.php(210): CdekSDK2\Http\Api->authorize()
#3 /home/.../public_html/core/components/cdekintegrate/model/cdekintegrate.class.php(82): CdekSDK2\Client->authorize()
#4 /home/.../public_html/core/xpdo/xpdo.class.php(1235): cdekIntegrate->__construct(Object(modX), Array)
#5 /home/.../public_html/core/cache/includes/elements/modplugin/39.include.cache.php(5): xPDO->getService('cdekIntegrate', 'cdekIntegrate', '/home/f/f4udest...', Array)
#6 /home/.../public_html/core/model/modx/modscript.class.php(76): include('/home/f/f4udest...')
#7 /home/.../public_html/core/model/modx/modx.class.php(1674): modScript->process(NULL)
#8 /home/.../public_html/core/components/minishop2/model/minishop2/minishop2.class.php(1045): modX->invokeEvent('msOnCreateOrder', Array)
#9 /home/.../public_html/core/components/minishop2/handlers/msorderhandler.class.php(432): miniShop2->invokeEvent('msOnCreateOrder', Array)
#10 /home/.../public_html/core/components/minishop2/model/minishop2/minishop2.class.php(207): msOrderHandler->submit(Array)
#11 /home/.../public_html/core/cache/includes/elements/modplugin/22.include.cache.php(20): miniShop2->handleRequest('order/submit', Array)
#12 /home/.../public_html/core/model/modx/modscript.class.php(76): include('/home/f/f4udest...')
#13 /home/.../public_html/core/model/modx/modx.class.php(1674): modScript->process(NULL)
#14 /home/.../public_html/core/model/modx/modrequest.class.php(70): modX->invokeEvent('OnHandleRequest')
#15 /home/.../public_html/core/model/modx/modx.class.php(1461): modRequest->handleRequest()
#16 /home/.../public_html/index.php(54): modX->handleRequest()
#17 /home/.../public_html/assets/components/minishop2/action.php(12): require('/home/f/f4udest...')
#18 {main}
thrown in /home/.../public_html/core/components/cdekintegrate/model/vendor/cdek-it/sdk2.0/src/Http/Api.php on line 246

Хорошо бы добавить проверку на доступность API СДЭКА, чтобы сайты не падали.

А так плагин очень нужный и экономит много времени менеджеру.
Giant Dad
27 мая 2024, 15:29
0
Прошу прощения, оказалось mspTinkoff криво установился и не отрабатывал при оформлении заказа. Всё работает, спасибо
Кровельный
27 мая 2024, 14:06
0
А вот этот код, передаёт нормально через конфиг:
<?php
class msCartCustomHandler extends msCartHandler {
    /**
    * msCartCustomHandler constructor.
    *
    * @param miniShop2 $ms2
    * @param array $config
    */
    public function __construct(miniShop2 $ms2, array $config = array())
    {
        $this->ms2 = $ms2;
        $this->modx = $ms2->modx;

        $cityFields = $this->modx->getService('cityfields','cityFields', $this->modx->getOption('cityfields.core_path', null, $this->modx->getOption('core_path').'components/cityfields/').'model/cityfields/');
        if ($cityFields instanceof cityFields) {
            if (!empty($cityFields->currentCityId)) {
                $currentCityId = $cityFields->currentCityId;
            }
            
        }
        $this->config = array_merge(array(
            'currentCityId' => $currentCityId,
            'cart' => & $_SESSION['minishop2']['cart'],
            'max_count' => $this->modx->getOption('ms2_cart_max_count', null, 1000, true),
            'allow_deleted' => false,
            'allow_unpublished' => false,
        ), $config);

        $this->cart = &$this->config['cart'];
        $this->modx->lexicon->load('minishop2:cart');

        if (empty($this->cart) || !is_array($this->cart)) {
            $this->cart = array();
        }
    }
    
   /**
     * @param array $data
     *
     * @return array
     */
    public function status($data = array())
    {
        $status = [
            'total_count' => 0,
            'total_cost' => 0,
            'total_weight' => 0,
            'total_discount' => 0,
            'total_positions' => count($this->cart),
        ];
        foreach ($this->cart as $item) {
            if (empty($item['ctx']) || $item['ctx'] == $this->ctx) {
                $status['total_count'] += $item['count'];
                $status['total_cost'] += $item['price'] * $item['count'];
                $status['total_weight'] += $item['weight'] * $item['count'];
                $status['total_discount'] += $item['discount_price'] * $item['count'];
            }
        }

        $status = array_merge($data, $status);

        $response = $this->ms2->invokeEvent('msOnGetStatusCart', [
            'status' => $status,
            'cart' => $this,
        ]);
        if ($response['success']) {
            $status = $response['data']['status'];
        }
        $this->modx->log(1, print_r($this->config['currentCityId'], 1));

        return $status;
    }
}
?>
Вячеслав
27 мая 2024, 13:22
0
@Илья Уткин Подскажите пожалуйста будет обновление АПИ до 3 версии или нет????
Вячеслав
27 мая 2024, 13:19
0
@Илья Уткин Подскажите пожалуйста будет обновление АПИ до 3 версии или нет????
Вячеслав
27 мая 2024, 13:13
0
Временный фикс:

Cниппет ms_CDEK2

1. Одну строку комментируем, новую добавляем:
//$modx->regClientScript('https://www.cdek.ru/website/edostavka/template/js/widjet.js');
$modx->regClientScript('https://cdn.jsdelivr.net/gh/cdek-it/widget@2.5.5/widget/widjet.js');
2. Еще одну строку ниже комментируем, а новую добавляем:
//path: «www.cdek.ru/website/edostavka/template/scripts/»,
path: «cdn.jsdelivr.net/gh/cdek-it/widget@2.5.5/widget/scripts/»,
Giant Dad
27 мая 2024, 12:44
0
делаю так же, в переменной $response получаю {«success»:true,«message»:"",«data»:{«msorder»:18}} почему-то нет redirect. При этом заказ в админке сайта создаётся, у заказа указывается требуемый тип оплаты (Тинькоф. подключен модуль mspTinkoff). Почему так?
Кровельный
27 мая 2024, 11:11
0
Не получается присоединить конструктор, а при вызове someMethod() ошибка 500.
<?php
class msCartCustomHandler extends msCartHandler {
    public function __construct(modX & $modx, array $config = array()) {
        parent::__construct($modx, $config);
        // Ваш код инициализации здесь
    }

    public function someMethod() {
        // Пример вызова метода getService
        $cityFields = $this->modx->getService('cityfields','cityFields', $this->modx->getOption('cityfields.core_path', null, $this->modx->getOption('core_path').'components/cityfields/').'model/cityfields/');
        
        if ($cityFields instanceof cityFields) {
            // Использование методов компонента
            return $cityFields->currentCityId();
        }
    }
	
    /**
     * @param array $data
     *
     * @return array
     */
    public function status($data = array())
    {
        $status = [
            'total_count' => 0,
            'total_cost' => 0,
            'total_weight' => 0,
            'total_discount' => 0,
            'total_positions' => count($this->cart),
        ];
        foreach ($this->cart as $item) {
            if (empty($item['ctx']) || $item['ctx'] == $this->ctx) {
                $status['total_count'] += $item['count'];
                $status['total_cost'] += $item['price'] * $item['count'];
                $status['total_weight'] += $item['weight'] * $item['count'];
                $status['total_discount'] += $item['discount_price'] * $item['count'];
            }
        }

        $status = array_merge($data, $status);

        $response = $this->ms2->invokeEvent('msOnGetStatusCart', [
            'status' => $status,
            'cart' => $this,
        ]);
        if ($response['success']) {
            $status = $response['data']['status'];
        }
        $this->modx->log(1, print_r($this->someMethod(), 1));

        return $status;
    }
}
?>
Семен Морозов
27 мая 2024, 00:32
0
Опять модуль СДЭК не работает. У всех так или только у меня? Пишет в корзине «ошибка расчета стоимости доставки» и карту ПВЗ не открывает.
Олег
26 мая 2024, 19:39
0
сам стормозил. надо было в скрипте перед запуском поставить
$mediaSourcePath = ' ';
$bindMediaSourceTv = true;
Олег
26 мая 2024, 16:47
0
у меня после запуска скрипта через консоль перестали отображаться картинки по всему сайту (сайт уже существовал и был заполнен контентом). Вручную отменял настройки.
Это так и должно быть или нужно перед запуском скрипта какие-то еще манипуляции делать? Или скрипт надо только на чистый сайт запускать?
Евгений Ц.
26 мая 2024, 16:20
0
Вызывать надо некэшированным [[!Sendex…
Егор
26 мая 2024, 09:40
0
никаких претензий нет. Smarty не поддерживает "set" у него немного все иначе.
Вы пишите мне в ответе то, что я написал в сообщении, в тексте вопроса. Я знаю как вывести это используя fenom, а как на smarty — нет.
Андрей Степаненко
26 мая 2024, 09:33
0
{set $parent_id = $_modx->resource.parent} 
{set $grand_parent_id = $parent_id | resource : 'parent'} 
{$grand_parent_id | resource : 'pagetitle'}
чем ответ не устроил? Или чисто к словую smarty претензия?
Егор
26 мая 2024, 09:26
0
ты бот что-ли? Или это так гпт ответил? Вопрос был не в том, как на феноме вывести, а как вывести в шаблоне с использованием smarty (без fenom).

На данный момент, я смог получить id родителя, но как его использовать далее, чтобы получить pagetitle у родителя например, пока не пойму. Мб, заработался…
{$parent_id = 'parent'|resource} //Получаем id родителя
{$parent_id} // id родителя
Андрей Степаненко
26 мая 2024, 09:26
+1
Чтобы вызвать метод `getService` в наследуемом классе в MODX Revolution 2.8.3-pl, нужно использовать объект `$this->modx`. В вашем случае, чтобы воспользоваться функциями из другого компонента в обработчике корзины, можно сделать это следующим образом:

<?php
class msCartCustomHandler extends msCartHandler {
    public function __construct(modX & $modx, array $config = array()) {
        parent::__construct($modx, $config);
        // Ваш код инициализации здесь
    }

    public function someMethod() {
        // Пример вызова метода getService
        $myService = $this->modx->getService('myComponent', 'MyComponent', $this->modx->getOption('myComponent.core_path', null, $this->modx->getOption('core_path').'components/myComponent/').'model/myComponent/');
        
        if ($myService instanceof MyComponent) {
            // Использование методов компонента
            $myService->someComponentMethod();
        }
    }
}
?>
1. **Инициализация класса**: В конструкторе класса `msCartCustomHandler` вызывается конструктор родительского класса `msCartHandler`, чтобы корректно инициализировать объект.
2. **Вызов `getService`**: В методе `someMethod` происходит вызов `getService`, который загружает и инициализирует необходимый компонент (в данном примере `myComponent`).
3. **Проверка и использование**: Проверяется, что возвращаемое значение действительно является экземпляром необходимого класса компонента, после чего можно использовать методы этого компонента.

Этот подход позволяет вам гибко использовать функциональность различных компонентов MODX в вашем наследуемом классе.
Андрей Степаненко
26 мая 2024, 09:22
0
Ваша проблема связана с неправильным переключением контекстов в MODX. Убедитесь, что ваш .htaccess и скрипт роутинга правильно настроены для работы с Babel. Давайте рассмотрим основные моменты.

### .htaccess

В файле .htaccess у вас всё верно настроено для переадресации запросов на index.php с соответствующим `cultureKey` и `q`. Однако, убедитесь, что у вас есть следующие строки в начале файла:

```apache
RewriteEngine On
RewriteBase /
```

### Роутинг

Ваш скрипт переключения контекстов выглядит правильно, но добавьте дополнительную обработку для других языков и `cultureKey`. Также убедитесь, что у вас есть все необходимые контексты в MODX.

### Пример улучшенного роутинга

```php
<?php
if ($modx->context->get('key') != «mgr») {
$allowedLanguages = ['en', 'ua', 'ru', 'fr', 'de'];
$cultureKey = isset($_REQUEST['cultureKey'])? $_REQUEST['cultureKey']: 'en';

if (in_array($cultureKey, $allowedLanguages)) {
$modx->switchContext($cultureKey);
} else {
$modx->switchContext('web');
}

unset($_GET['cultureKey']);
}
```

### Проверка контекстов и ресурсов

1. Убедитесь, что контексты `en`, `ua`, `ru`, `fr`, `de` существуют в системе.
2. Проверьте, что ресурс `franchiza` существует в каждом контексте и имеет одинаковый alias.
3. Перейдите в менеджер ресурсов и убедитесь, что все ресурсы переведены и имеют правильные alias.

### Дополнительные настройки Babel

Убедитесь, что Babel правильно настроен для всех контекстов:

1. Перейдите в «Системные настройки» -> Babel.
2. Проверьте значения настройки `babel.contextKeys` (ключи всех контекстов, разделенные запятыми).

### Пример настройки Babel

```plaintext
babel.contextKeys = en,ua,ru,fr,de
```

Если проблема сохраняется, проверьте журнал ошибок MODX на наличие дополнительных подсказок.
Андрей Степаненко
26 мая 2024, 09:19
0
Для получения данных родителя на странице товара в шаблоне `product.tpl` с использованием Fenom, вы можете использовать следующий код:

{set $parent_id = $_modx->resource.parent} 
{set $grand_parent_id = $parent_id | resource : 'parent'} 
{$grand_parent_id | resource : 'pagetitle'}
Данный код выполняет следующие действия:
1. Получает ID родителя текущего ресурса.
2. Использует этот ID для получения ID «дедушки» (родителя родителя).
3. Выводит заголовок страницы «дедушки» по его ID.

Этот способ достаточно прост и позволяет получить необходимые данные без использования дополнительных сниппетов.

Если у вас есть вопросы или нужна дополнительная информация, пожалуйста, обращайтесь.