Всего 125 962 комментария

Роман
27 апреля 2022, 16:17
0
Сейчас попробую написать. Для теста.
Михаил
27 апреля 2022, 16:09
0
Спасибо! О я знаю откуда этот кусок :) gist.github.com/TrywaR/93feccb27285d8e1e26c9364390be187
Пробовал так, но почему то не срабатывает отправка тоже.
Может просто опечатался где то, пойду проверять.
Михаил
27 апреля 2022, 16:05
0
Ага, спасибо за помощь, конечно код за меня писать не надо.
Вопрос был в том, почему при смене события оно не срабатывает, а не как плагин уведомления в телегу написать.
Роман
27 апреля 2022, 16:04
+1
switch ($modx->event->name) {
  case 'msOnChangeOrderStatus':
    if ($status === 2) {
      //тут отправка в телегу
      die();
    }
  break;
}
Sergey (Sentinel)
27 апреля 2022, 15:40
0
а зачем тут SelectFilters?
попробуй так
...
'filters' => 'ms|vendor:vendors,
parent:parents',
...
и название чанков наверное не верно
по идеи так
'tplFilter.outer.resource|parent' => 'filterSelectOuter',
'tplFilter.row.resource|parent' => 'filterSelectRow',
все есть тут
docs.modx.pro/komponentyi/msearch2/snippetyi/mfilter2#%D0%A7%D0%B0%D0%BD%D0%BA%D0%B8-%D0%B8-%D0%BE%D1%84%D0%BE%D1%80%D0%BC%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5
Артур Шевченко
27 апреля 2022, 15:22
0
Ты просил пример, я тебе скинул пример. В моём примере есть объект заказа $msOrder из него можно получить любую информацию по этому заказу. Если тебе нужно слать уведомления при смене статуса, поменяй событие. список доступных событий есть в документации. А если хочешь, чтобы написали тот код который будет работать так как тебе нужно, составь ТЗ и опубликуй в разделе Работа.
Наумов Алексей
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
@Николай Хохлунов, здравствуйте. Как можно записаться на бета-тест билдера?