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

Александр Туниеков
26 июля 2024, 19:29
0
В pdoTools вот код модификатора
$this->_modifiers['resource'] = function ($id, $field = null) use ($pdo, $modx, $fenom) {
            $pdo->debugParserModifier($id, 'resource');
            /** @var modResource $resource */
            if (empty($id)) {
                $resource = $modx->resource;
            } elseif (!is_numeric($id)) {
                $field = $id;
                $resource = $modx->resource;
            } elseif (!$resource = $pdo->getStore($id, 'resource')) {
                $resource = $modx->getObject('modResource', ['id' => intval($id)]);
                $pdo->setStore($id, $resource, 'resource');
            }

            $output = '';
            if (!empty($resource)) {
                if (!empty($field)) {
                    if (strtolower($field) == 'content') {
                        $output = $resource->getContent();
                    } else {
                        $output = $resource->get($field);
                        if (is_null($output)) {
                            $output = $resource->getTVValue(preg_replace('#^tv\.#i', '', $field));
                        }
                    }
                } else {
                    $output = $resource->toArray();
                }
            }
            $pdo->debugParserModifier($id, 'resource');

            return $output;
        };
Судя по $pdo->getStore ресурс где-то кешируется. Но как-то пробовал ускорить сайт 10 вызовов {resource_id | resource: 'tv_param_name'} сильно замедляют сайт.
Я ведь правильно понимаю — использование выше сниппета выше более рационально если надо дергать 5 — 6 полей другого ресурса?
Более рационально, если тип поля text. $resource->getTVValue($tv['name']); делает запросы в базу.
Сергей
26 июля 2024, 10:53
+2
Вот оно и переопределяет ПУСТЫМ значением mailManager. Поменял эти две строчки на одну, протестировал сейчас — работает как надо.
$to = $this->modx->getOption("mailManager", $snippetProperties, $this->modx->getOption("ec_mail_manager"), true);

PS: надо тестировать и выпускать апдейт )
Сергей
26 июля 2024, 10:46
0
Тоже думал сначала что глюк, но обновил 4 сайта и везде одинаково не подхватывает. Пока явно указал везде mailManager в вызовах. Код easycommnotifier.class.php у меня сходится — такой же везде.
Наумов Алексей
26 июля 2024, 09:31
0
Добрый день. Может глюк?) Вообще код вот такой, выглядит вроде верно, но проверить сейчас не могу…

// Почта менеджера указана в настройке ec_mail_manager
$to = $this->modx->getOption('ec_mail_manager', null, '');
// Параметр mailManager сниппета ecForm (ecReplyForm) переопределяет эту настройку
$to = $this->modx->getOption('mailManager', $snippetProperties, $to, true);

// Если везде пусто - письма пойдут на адрес, указанный в emailsender
if (empty($to)) {
    $to = $this->modx->getOption('emailsender');
}
Это файл /core/components/easycomm/model/easycomm/easycommnotifier.class.php, строка примерно 120…
Вячеслав Варов
26 июля 2024, 08:44
0
Спасибо!) А как с происходит обработка {resource_id | resource: 'tv_param_name'}

каждый такой вызов делает свой отдельный запрос в бд? Я ведь правильно понимаю — использование выше сниппета выше более рационально если надо дергать 5 — 6 полей другого ресурса?
Павел Романов
25 июля 2024, 17:03
1
+1
В настройках TV вкладка «Параметры ввода», тип ввода «Ace»
Сергей
25 июля 2024, 16:07
0
Почему может не подхватывать системную настройку ec_mail_manager? Подставляет emailsender, а при указании mailManager подхватывает его верно.

PS: перестало подхватывать сразу после обновления пакета до последней версии, до этого работало.
Александр Туниеков
24 июля 2024, 21:56
0
Поправил немного
<?php
$id = $input;
if (empty($id)) {
    $resource = $modx->resource;
} else {
    $resource = $modx->getObject('modResource', ['id' => intval($id)]);
}
if(!$resource) return [];

$out = $resource->toArray();
// чтоб страница не упала в рекурсию
unset($out['content']);

$id = $resource->id;
$sql = "
    SELECT IF(tvr.value != \"\", tvr.value, tv.default_text) AS tv_value, tv.name, tv.type
    FROM {$modx->getTableName('modTemplateVarResource')} tvr
    LEFT JOIN {$modx->getTableName('modTemplateVar')} tv
    ON tv.id = tvr.tmplvarid
    LEFT JOIN {$modx->getTableName('modTemplateVarTemplate')} tvt
    ON tvt.tmplvarid = tvr.tmplvarid 
    WHERE tvr.contentid = {$id} AND tvt.templateid = {$resource->template}
";
// $modx->log(1,$sql);
$q = $modx->prepare($sql);
$q->execute();
$tvs = $q->fetchAll(PDO::FETCH_ASSOC);

foreach($tvs as $tv){
    switch($tv['type']){
        case 'text': case 'textarea':
            $out[$tv['name']] = $tv['tv_value'];
        break;
        default:
            $out[$tv['name']] = $resource->getTVValue($tv['name']);
    }
}
return $out;
Александр Туниеков
24 июля 2024, 21:35
+2
Я тут решил немного помочь и сделал сниппет
res
<?php
$id = $input;
if (empty($id)) {
    $resource = $modx->resource;
} else {
    $resource = $modx->getObject('modResource', ['id' => intval($id)]);
}
if(!$resource) return [];

$out = $resource->toArray();
$id = $resource->id;
$sql = "
    SELECT IF(tvr.value != \"\", tvr.value, tv.default_text) AS tv_value,tv.name
    FROM {$modx->getTableName('modTemplateVarResource')} tvr
    LEFT JOIN {$modx->getTableName('modTemplateVar')} tv
    ON tv.id = tvr.tmplvarid
    LEFT JOIN {$modx->getTableName('modTemplateVarTemplate')} tvt
    ON tvt.tmplvarid = tvr.tmplvarid 
    WHERE tvr.contentid = {$id} AND tvt.templateid = {$resource->template}
";
// $modx->log(1,$sql);
$q = $modx->prepare($sql);
$q->execute();
$tvs = $q->fetchAll(PDO::FETCH_ASSOC);

foreach($tvs as $tv){
    $out[$tv['name']] = $tv['tv_value'];
}
return $out;
Использовать
{set $res = 1 | res}
<pre>{$res | print_r}</pre>
Расчитанно, что все tv текстовые. Если надо чтоб tv обрабатывались перед помещением в массив, то надо вызывать getTVValue.
foreach($tvs as $tv){
    $out[$tv['name']] = $resource->getTVValue($tv['name']);
}
Артур Шевченко
24 июля 2024, 18:37
0
Яндекс такси определяет нужный вход исходя из местоположения пользователя и если само приложение определит неверно, то никакое API исправить это не поможет. API существует
Вячеслав Варов
24 июля 2024, 17:44
0
У меня Ubuntu и настроил все на NGINX — работает норм
Гарри
24 июля 2024, 11:05
+1
[[!migxLoopCollection?
    &classname=`MaterialSubcategories\Model\subcategories`
    &where=`{"id":"[[+subcategory_id]]"}`
    &joins=`[{"alias":"Categories","classname":"MaterialCategories\\Model\\categories","on":"Categories.id = subcategories.category_id"}]`
    &tpl=`@CODE: [[+title]]/[[+category_id]] - [[+Categories_name]]`
]]
Сергей
24 июля 2024, 10:42
0
Как вы считаете, что лучше Debian и Ubuntu для modx? Я бы выбрал centos. но там нет поддержки isp6.
Артур Шевченко
23 июля 2024, 20:31
0
Добавить поле в заказ и в плагине на событие msOnChangeOrderStatus записывать в это поле текущую дату, если статус равен id статуса «Оплачен».
adminixi
23 июля 2024, 20:26
0
Понятно, а как сохранить дату оплаты?
Артур Шевченко
23 июля 2024, 15:57
0
Данная настройка ограничивает максимальное количество одной позиции товара, а не количество позиций. Если нужно, чтобы в корзине было не больше одного товара — пиши плагин на событие msOnBeforeAddToCart.
Артур Шевченко
23 июля 2024, 15:50
0
А ты сохраняешь дату оплаты? Минишоп сохраняет только дату создания и дату последнего изменения.