Всего 125 956 комментариев

Наумов Алексей
27 апреля 2022, 15:12
+1
насколько помню, такие простые теги pdoTools обработает без парсинга, сделав просто str_replace
Роман
27 апреля 2022, 15:09
+1
Василий спасибо за разбор и за pdoTools. Давно заметил, что modParser больше памяти потребляет, да и по скорости иногда проигрывает. pdoTools отличный инструмент, редко встречаю сайты, которые бы его не использовали.
Miša Bulic
27 апреля 2022, 13:41
0
У меня такой вопрос, если всё переписано на феном, но внутри сниппета по умолчанию выводится вот так:
@INLINE <ol class="breadcrumb">[[+output]]</ol>
значит ли это что я параллельно использую стандартный парсер?
Михаил
27 апреля 2022, 13:19
0
Но вы ведь тут не передаете информацию оплачен заказ или нет? Только информацию о заказе, а при ондлайноплате меняется статус заказа, вот отправлять этот статус при изменении, у меня как раз проблема.
Уведомления о новых заказах и так приходят.
Василий Наумкин
27 апреля 2022, 11:55
0
Не понял почему это нельзя исправить.
Потому, что тогда парсер перестанет быть рекурсивным и ты не сможешь делать вот так:
[[~[[+id]]]]

Смысл в том, что после разбора внутреннего тега [[+id]] получается новый тег, например [[~9]], а он уже превращается в ссылку на документ с id = 9.

То есть, нужно парсить этот тег минимум 2 раза — это и есть рекурсия. Так весь MODX и работает, это его чуть ли не основная фишка.
Иван
27 апреля 2022, 11:47
0
Как ты исправишь основную фишку рекурсивого парсера — рекурсивный разбор тегов?
Если я правильно понял, то проблема в том, что парсер MODX парсит изнутри, а не снаружи, поэтому парсит лишнее. Не понял почему это нельзя исправить.
Артур Шевченко
27 апреля 2022, 10:41
0
Плагин
<?php
switch ($modx->event->name) {
    case 'msOnCreateOrder':
        $msOrder->set('comment', 'https://art-sites.ru/smeta?order_id='.$msOrder->get('id'));
        $msOrder->save();
        $modx->runSnippet('sendOrderToTelegram', array('msOrder' => $msOrder));
    break;
}
Сниппет sendOrderToTelegram
<?php
if(!isset($msOrder)){
    $modx->log(1, 'sendOrderToTelegram: Не передан объект заказа');
    return false;
}
$token = "токен";
$chat_id = "идентификатор чата";
 
$orderNum = $msOrder->get('num');
$total_cost = $msOrder->get('cost');
$pay_id = $msOrder->get('payment');
$sql = '
SELECT name 
FROM modx_ms2_payments
WHERE id = '.$pay_id;
$statement = $modx->query($sql);
$name = $statement->fetchAll(PDO::FETCH_COLUMN);
$pay_name = $name[0];
$msAddress = $msOrder->getOne('Address');
$msReceiver = $msAddress->get('receiver');
$linkToEstimate = $msOrder->get('comment');
$msComment = $msAddress->get('comment');
$msPhone = $msAddress->get('phone');
$msProducts = $msOrder->getMany('Products');

$design_cost = 0;
$layout_cost = 0;
$setting_cost = 0;
$marketing_cost = 0;
$other_cost = 0;
$expense = 0;
$index = 1;
       
foreach ($msProducts as $msProduct) {
    $prod_id = $msProduct->get('product_id');
    $prod_count = $msProduct->get('count');
    $prod_price = $msProduct->get('price');
    $prod_cost = $msProduct->get('cost');
    $prod_weight = $msProduct->get('weight');
    $resource = $modx->getObject('modResource', $prod_id);
    $prod_name = $resource->get('longtitle');
    $prod_parent = $resource->get('parent');
    $expense += $resource->get('add_cost');
            
    switch($prod_parent){
        case 24:
            $design_cost += $prod_price  * $prod_count;
            //$modx->log(xPDO::LOG_LEVEL_ERROR, 'EXPENSE_D ' . $expense_d);
        break;
        case 17:
            $layout_cost += $prod_price  * $prod_count;
        case 35:
        case 46:
        case 56:  
            $setting_cost += $prod_price  * $prod_count;
        break;  
        case 57:
            $marketing_cost += $prod_price  * $prod_count;
        break;
        default:
            $other_cost += $prod_price  * $prod_count;
        break;  
    }
            
    $products .= "
{$index}. {$prod_name} 
({$prod_count}шт. по цене {$prod_price} руб.);
";
            $index = $index + 1; 
          
}

if($design_cost > 0){
    $design_txt ="
--- на дизайн: {$design_cost} руб.";
}
if($layout_cost > 0){
    $layout_txt ="
--- на вёрстку: {$layout_cost} руб.";
}
if($setting_cost > 0){
    $setting_txt ="
--- на настройку: {$setting_cost} руб.";
}
if($marketing_cost > 0){
    $marketing_txt ="
--- на маркетинг: {$marketing_cost} руб.";
}  
if($other_cost > 0){
    $other_txt ="
--- на остальное: {$other_cost} руб.";
} 
if($expense > 0){
    $expense_txt ="
--- на допы: {$expense} руб.";
}
if($msComment){
    $comment="
--------------------------------
КОММЕНТАРИЙ ЗАКАЗЧИКА:
{$msComment}";
}
$txt = "
НОВЫЙ ЗАКЗАЗ #{$orderNum}
--------------------------------
ЗАКАЗЧИК: {$msReceiver}
--------------------------------
СПОСОБ ОПЛАТЫ: {$pay_name}
--------------------------------
ИТОГО: {$total_cost} руб.
--------------------------------
В ТОМ ЧИСЛЕ:
{$design_txt}{$layout_txt}{$setting_txt}{$marketing_txt}{$other_txt}{$expense_txt}
--------------------------------
НОМЕР ДЛЯ СВЯЗИ:
{$msPhone}
--------------------------------
ССЫЛКА НА СМЕТУ:
{$linkToEstimate}
--------------------------------
СОСТАВ ЗАКАЗА:
{$products}{$comment}";
       
$txt = urlencode($txt);
$url = "https://api.telegram.org/bot{$token}/sendMessage?chat_id={$chat_id}&text={$txt}";
$ch = curl_init();
curl_setopt_array($ch, array(CURLOPT_URL => $url, CURLOPT_RETURNTRANSFER => true));
$result = curl_exec($ch);
curl_close($ch);
Как получить токен и идентификатор чата написано в интернете.
Артур Шевченко
27 апреля 2022, 10:37
0
Понятно, я сразу не обратил внимания, extended это одно поле формата json поэтому ты через хук можешь получить только его, обратиться напрямую к id_club нельзя, т.к. того поля у пользователя нет.
Дмитрий
27 апреля 2022, 09:59
0
Здравствуйте, удалось сделать смену картинки в списке?
Константин
27 апреля 2022, 08:57
0

{set $filters = '!SelectFilters' | snippet: [
'default' => [
'ms|vendor:vendors', 'resource|parent:parents'
]
]}

{$_modx->runSnippet('!mFilter2', [
'element' => 'msProducts',
'class' => 'msProduct',
'showEmptyFilters' => 1,
'limit' => 12,
'tplOuter' => 'mFilter2OuterTpl',
'tpls' => 'listProductTpl,gridProductTpl',
'includeTVs' => 'available',
'includeThumbs' => 'medium',
'tplPageWrapper' => '@INLINE
    {$prev}{$pages}{$next}
',
'tplPageActive' => '@INLINE {$pageNo}',
'tplPage' => '@INLINE {$pageNo}',
'tplPagePrev' => '@INLINE «',
'tplPageNext' => '@INLINE »',
'tplPagePrevEmpty' => '@INLINE «',
'tplPageNextEmpty' => '@INLINE »',
'filters' => $filters,
'aliases' => 'ms|vendor==vendor,
msoption|marka==marka,
msoption|model==model',
'ajaxMode' => 'button',
'filterOptions' => '{
«more_tpl»: "<button class=\«btn btn-blue btn-rounded btn_more\»>Загрузить еще"
}',

'tplFilter.outer.default' => 'filterSelectOuter',
'tplFilter.row.default' => 'filterSelectRow',

'tplFilter.outer.vendor' => 'filterCheckboxOuter',
'tplFilter.row.vendor' => 'filterCheckboxRow',

'tplFilter.outer.marka' => 'filterSelectOuter',
'tplFilter.row.marka' => 'filterSelectRow',

'tplFilter.outer.model' => 'filterSelectOuter',
'tplFilter.row.model' => 'filterSelectRow',

'tplFilter.outer.resource|parent:parents' => 'filterSelectOuter',
'tplFilter.row.resource|parent:parents' => 'filterSelectRow',

])}


Андрей
27 апреля 2022, 07:56
0
не читал, но так тоже что и у меня и работает, но со стандартными полями.
получилось вот так, не через хук, но работает.
$profile = $modx->user->getOne('Profile');
$fields = $profile->get('extended');
$id_user = $fields['id_club'];
Василий Наумкин
27 апреля 2022, 07:45
+2
Как ты исправишь основную фишку рекурсивого парсера — рекурсивный разбор тегов? Это просто такой метод работы, который очень многим в MODX и нравится. Напихать тегов друг на друга, парсер сам разберётся.

Ну а замена простых плейхолдеров… Самый главный архитектор системы об этом давно знает и ничего менять не хочет.

Хочешь исправить — ставь pdoTools и пользуйся, для того расширения и нужны.
Дима Сайт old см. профиль
27 апреля 2022, 02:20
0
@Николай Хохлунов, здравствуйте. Как можно записаться на бета-тест билдера?
Андрей
26 апреля 2022, 22:35
0
Разве только для formit? С fullname работает же.
Сейчас речь об UpdateProfile из пакета Login.
Данные нужны текущего пользователя.
Речь идет о синхронизации информации из профиля с ресурсом, в некоторой части совпадающей с профилем, когда этот профиль меняется.
Иван
26 апреля 2022, 22:23
0
То есть, если вы прячете какой-то кусок оформления для вывода только нужным пользователям за условиями в чанке — именно этот кусок и будет первым делом разобран, а потом MODX решит, нужно ли его выводить, когда проверит условие с юзером.
Прошу прощения за мой дилетантский вопрос, но не лучше ли было исправить этот косяк и прислать код разработчикам MODX на Гитхаб? Обработку простых тегов тоже можно было бы предложить оптимизировать в коде основного парсера.
Сергей Шлоков
26 апреля 2022, 22:23
0
Сергей, я считаю вполне обоснованным «недопонимание» со стороны Василия, мне бы тоже не понравился упрёк в мою сторон
Наверно ты прав. Думаю, будет правильнее удалить это. Статья чисто техническая. И не хотелось бы придавать ей какую-то эмоциональную окраску. И у меня нет никакого упрёка или претензий ни к Василию как к разработчику, ни к pdoTools. Многие из нас участвовали в совершенствовании этой библиотеки. Поэтому знаем все её преимущества. А Василий потратил огромное количество своего времени на её развитие. Только неблагодарный может предъявлять какие-то претензии. Я точно к таким не отношусь.

А недопонимание объясняется легко. К сожалению, у нас с Василием давно уже нет взаимопонимания. И уважительного отношения на личностном уровне. Но я от этого не страдаю. Уверен, и он тоже. И в дальнейшем я не планирую повышать нулевой уровень нашего общения.

И в конце статьи тогда стоило бы уточнить про предустановку pdoTools
А бывают сайты без pdoTools? Лендинги наверно? Но про них говорить смысла нет. Просто я в статье закрепил то, о чем много раз говорил и в чатах и комментариях в ответ на вопросы типа насколько быстрее будет работать сайт, если в карточке товара заменить синтаксис MODX на Fenom. В одном из своих последних комментариев тут я как раз и писал, что главная причина ускорения сайта — это pdoTools.

Многие разработчики сами замечают, что после замены ничего не изменилось по скорости. Как и на не заметил прироста на своём сайте. В этой статье я объяснил почему. Да и сам Василий в своём сегодняшнем посте тоже. Цифры для pdoParser до 100 чанков. Большинство сайтов (может даже 90%) использует пагинацию и даже 100 чанков парсить в цикле не будет. Не у всех на каждой странице сайта 890 комментариев.
Артур Шевченко
26 апреля 2022, 22:19
0
О каких хуках речь? Что за доп? Данные какого пользователя ты хочешь получить текущего или произвольного? В целом метод getValue в FormIt возвращает поля формы, которую т отправляешь.
Артур Шевченко
26 апреля 2022, 21:32
0
Делаешь диапазон, смотришь как это выглядит в get-параметрах, потом по совету @Алексей Смирнов путём хитрых манипуляций, скорее всего через отдельный сниппет, формируешь массив чекбоксов и выводишь его. ЛИБО пишешь скрипт для Console который пройдёт по всем ресурсам и добавить в созданное тобой поле диапазон. Т.е. ты задашь массив диапазонов и проверишь в какой из них каждый ресурс попадает и заполнишь свое поле. Например. Есть ресурс у которого значение мощности 11 и ты в скрипте проверяешь в какой диапазон это значение попадает, а затем это значение записываешь в отдельное поле и фильтруешь уже не по мощности, а по диапазону. Надеюсь понятно объяснил. Я так на одном своём сайте делал. Дополнительно ещё плагин написал, который при создании ресурса сразу определяет в какой диапазон он попадает.
Giant Dad
26 апреля 2022, 20:56
0
а есть какие-то похожие примеры?