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

Павел Романов
28 мая 2024, 12:22
2
+2
Сделайте сниппет getTags:
<?php
$id = $modx->getOption('id', $scriptProperties, $modx->resource->get('id'));
$table = $modx->getOption('table_prefix').'ms2_products';
if($query = $modx->query("SELECT * FROM {$table} WHERE id = {$id}")){
	$prod = $query->fetch(PDO::FETCH_ASSOC);
	$tags = json_decode($prod['tags'], 1);
	foreach($tags as $tag){
	    $out .= $modx->getChunk($tpl, array('tag' =>  $tag));
	}
}
return $out;

Вызывайте:
[[getTags? &tpl=`tag_tpl`]]

Если не на странице товара, указывайте &id:
[[getTags? &id=`[[+id]]` &tpl=`tag_tpl`]]

Чанк tag_tpl:
<a href="/search/?[[+tag]]" class="some-class">[[+tag]]</a>
Алексей Смирнов
28 мая 2024, 10:31
+1
да в этом случае необходимо воспользоваться информацией которая тут: ссылка на многотекстаиполезного #23005
Илья
28 мая 2024, 10:19
0
Спасибо! Этот вариант работает.

т.е. там нет двух или трех id через запятую
Да, может быть несколько ID. Подскажите, в этом случае только через FIND_IN_SET?
Баир
28 мая 2024, 03:49
0
Можете помочь с поиском утечки? Я просто даже не знаю, что делать. Руководство требует разобраться, а я ничего не могу сделать(
Егор
28 мая 2024, 02:09
0
Да, спасибо! Оно.
Нужно было создать файл «modifier.field.php» и положить его в папку:
«core/components/zoomx/smarty/plugins/» и все заработало.

Содержимое файла «modifier.field.php»:
<?php
/*
 * Smarty plugin
 * -------------------------------------------------------------
 * Файл:    modifier.field.php
 * Тип:     modifier
 * Имя:     field
 * Назначение:  Get a field of the specified resource.
 * -------------------------------------------------------------
 */
function smarty_modifier_field($id, $field)
{
    global $modx;

    $id = (int)$id;
    if ($id && $resource = $modx->getObject('modResource', ['id' => $id])) {
        return $resource->{$field};
    }

    return null;
}

или

<?php
// Плагин
// Событие OnModxInit

if ($modx->context->key !== 'mgr') {
    function fieldModifier($id, $field)
    {
        global $modx;
    
        $id = (int)$id;
        if ($id && $resource = $modx->getObject('modResource', ['id' => $id])) {
            return $resource->{$field};
        }
    
        return null;
    }

    // Регистрируем функцию модификатора
    $smarty = parserx();
    $smarty->registerPlugin("modifier","field", "fieldModifier");
}

(продублирую на всякий случай)

{5|field:"pagetitle"}
// Можно вернуть дефолтное значение
{5|field:"pagetitle"|default:"Ресурс не найден!"}
svvtx
28 мая 2024, 00:51
+1
{$parent_id = 'parent'|resource} //Получаем id родителя
{$grand_parent_id = $parent_id|field:'parent'} //Получаем id дедушки
{$grand_parent_id|field:'pagetitle'} //выводим заголовок
Не тестил, но должно работать.
Как добавить модификатор field modzone.ru/blog/2020/12/19/zoomx-creating-smarty-plugins/
Перед и после | в смарти нельзя ставить пробелы.
Алексей Смирнов
27 мая 2024, 23:13
+1
Вы мешаете синтаксис фенома и phx MODX.
Запишите все на феноме для начала:
{var $output = 'ms2GalleryResources' | snippet: [
    'tpl' => 'proekt-item-portfolio',
    'parents' => '394',
    'where' => '{ "connection:=":"'~$_modx->resource.connection~'","connection:!=":"1"}',
    'limit' => '6',
    'includeThumbs' => 'medium',
    'includeTVList' => 'days, connection, video',
    'depth' => '0',
    'showLog' => '1'
]}
{if $output}
<h3 class="text-center">{$_modx->resource.connection} в наличии</h3>
<div class="row flex-content-center">
{$output}
</div>
{/if}
и если не сработает можно двигаться дальше.
например у вас гарантированно в ТВ поле connection Находится один id? те там нет двух или трех id через запятую?
Артур Шевченко
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;