Константин Ильин

Константин Ильин

Был в сети 22 октября 2025, 18:41
Заказы принимаю
в вашем исходном коде, в название события есть пробел в начале, оно раньше не запускалось.
case ' OnBeforeDocFormSave':
так же строчка $words = $res->getTVValue('words'); может вернуть уже готовый массив и не надо его вытаскивать из json, как я ранее писал надо смотреть что там возвращает. Вот так:
$words = $res->getTVValue('words');
$modx->log(1, print_r($words,1));
Потом смотреть в журнале ошибок модх
Сам код тоже можно улучшить, я так понимаю у вас там одни и те же действия, можно как функцию сделать, а так же switch позволяет вот так:
<?php
switch ($modx->event->name) {
        case 'OnDocPublished':
        case 'OnBeforeDocFormSave':
        case 'OnDocFormSave':
            if ($resource->get('template') == 24 && !$resource->get('content')) $resource->set('published', 0);
            $res = $modx->getObject('modResource', id_ресурса_где_вбиты_слова);
            $words = $res->getTVValue('words'); // тут получить слова, распарсить строку, смотря что там вернет.
            // еще проще в php файл записать эти слова и подключать через include
            
            $content = $resource->get('content');
            $pattern = '/(?:' . join('|', $words) . ')/i';
            $content = preg_replace($pattern, '', $content);
            
            $resource->set('content', $content);
            $resource->save();
        break;
              
}
Баха, подскажи пожалуйста, что-то никак не соображу как подключить свой файловый сниппет, такие вызовы не срабатывают
'snippet' => '@FILE snippets/snippet.php',
/* или */
'snippet' => 'file:snippets/snippet.php',
Причем для Формы файловая «ссылка» срабатывает
'form' => '@FILE chunks/forms/zayavka.form.tpl'
Если вкратце у меня работает так (Подсмотрено у Артур Шевченко, спасибо ему)
1. тоже генерируется рандомная строка
2. тоже проверяется через contains
3. и полю nobot эта рандомная строка присвоится только(!) при наведении на форму, а у вас как я понял сразу.

У меня полет нормальный
{set $secret = md5(rand(0,999999999))}
{'!AjaxForm' | snippet :[
    ....
    'secret' => $secret ,
    'validate' => 'vscval:contains=^'~$secret~'^'
    ....
]}

//В форме
<input type="hidden" name="vscval" style="display:none" data-vscval="{$_pls['secret']}">

//Js
function watchForms(){
    if(document.querySelector('form')){
        document.querySelectorAll('form').forEach((ff) => {
            ff.addEventListener('mousemove', (e) => {
                if(ff.querySelector('input[name="vscval"]')){
                    let inpSecret = ff.querySelector('input[name="vscval"]'),
                        inpSecretData = inpSecret.getAttribute('data-vscval');
                    if(inpSecret.value == ''){
                        inpSecret.value = inpSecretData;
                    }
                }
            });
        });
    }
}
watchForms()
Оо здравствутйе! Я думал вы пропали совсем и даже сильно не надеялся на ответ)

Тенденция такая сейчас, что все компоненты переходят на чистый js. Меня тоже сподвигло перейти на чистый js, около полугода пишу. В начале было не очень) Ну и помимо тендеции это лишняя подключаемая библиотека, например у меня на сайте нигде нет jQuery и тут его придется подключить.
Версия что сейчас в репозитории меня многим не устраивает и выпилить джеквери и переделать запрос по плиточкам по факту ничего кардинально не изменит.
Расскажите что не так и какие планы в целом?

мне примерно через месяц понадобится msOptionsPrice2, и не хотелось бы попасть в ситуацию когда купил msOptionsPrice2 и на след день вышла msOptionsPrice3.

И в целом для магазина три основных компонента, miniShop2, mSearch2, msOptionsPrice2. Если miniShop2 развивается нет нет, то последние два «отстают», извините меня за душноту опять же оба подключают jQuery.
Приветствую!
хотел бы узнать Володя
@Володя больше не занимаетесь развитием/улучшением msOptionsPrice2?
вопросы такие:
— уход от jQuery
— по каждому товару из плитки запрос на сервер, лучше было бы один большой запрос
Странно, видимо как-то надо еще подключать
// попробовать так вызывать, указать явно PDO::LOG_LEVEL_ERROR
$this->modx->log(xPDO::LOG_LEVEL_ERROR, '1-1');

// тут я пальцем в небо, какие из этих строчек может помогут, но сначала то что выше написал попробуйте
$this->modx->getService('error','error.modError');
$this->modx->setLogLevel(xPDO::LOG_LEVEL_ERROR);

ну как вариант еще в файл сохранять
<?
file_put_contents(MODX_ASSETS_PATH.'log.txt', print_r('1-1',1), FILE_APPEND | LOCK_EX);
Залоггируйте каждый if используя
$this->modx->log(1, print_r('переменная или строка/этап',1))
Чтобы посмотреть куда заходит код и что он получает

//Например этот участок кода

if ($this->config['json_response']) {
    /** Вот мои изменения ниже */
    $success_page = $this->modx->getOption('ms2_order_success_page');
    $this->modx->log(1, print_r($success_page,1))
    if(is_numeric($success_page)) {
        if ($this->modx->getCount('modResource', array('id'=>$success_page,'published' => true,'deleted' => false))) {
            $this->modx->log(1, print_r('1-1',1))
            $url = $this->modx->context->makeUrl($success_page);
            return $this->success('', array('redirect' => $url.'?msorder='.$order->get('id')));
	}
    }
    $this->modx->log(1, print_r('1-2',1))
    return $this->success('', ['msorder' => $msOrder->get('id')]);
}
$this->modx->log(1, print_r('2-1',1))
$redirect = $this->modx->context->makeUrl(
    $this->modx->resource->id,
    ['msorder' => $msOrder->get('id')]
);
$this->modx->log(1, print_r('2-2'.$redirect,1))
$this->modx->sendRedirect($redirect);
А так у меня недавно была проблема с редиректом, но пока отложилась эта проблема, может что-то поменялось в обновлениях нынче раз не у меня одного проблема появилась.
Если у вас свежая версия easycomm, то у него есть скрипты не требующие сторонних зависимостей:
Внимание! В версии 1.11.4-pl (15.02.2022) добавлен файл скриптов /assets/components/easycomm/js/web/ec.js, не требующий зависимостей в виде jQuery и jquery.form. Вы можете указать этот файл в настройках компонента.
Смотрите документацию компонента
Когда то помогло решение через плагин на событие msOnChangeOrderStatus.
вот пример
switch ($modx->event->name) {
    case 'msOnChangeOrderStatus':
    // тут нужно получить ваш плейсхолдер sd.email и присвоить emailManagers , вместо тестовой строки
    $emailManagers= 'test@test.ru,tst@ee.ru';
    
    // тут присваиваем новые емайлы
    $modx->setOption('ms2_email_manager', $emailManagers); 
    
    // так же можно учитывать статусы писать какую то логику если надо
    if ($status != 1) {
        $modx->setOption('ms2_email_manager', $emailManagers); 
    }
    break;
}