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

Максим
22 мая 2025, 15:49
0
Выявил такую штуку… Скорее всего, то что корзина на странице не обновляется, связано с тем что нет какой-то обёртки у неё, что бы скрипт мог понять что именно нужно обновлять после изменения содержимого. Сейчас же сниппет и для отображения на всех страницах, и на самой странице корзины общий — выводит только его содержимое. То есть, если добавить на страницу [[!msCart]], то он просто выводит содержимое корзины в виде таблицы или просто текстом напишет что товаров нет, без какой-то обёртки. Посмотрю как выглядит корзина в minishop2, может оттуда можно будет что-то взять
Максим
22 мая 2025, 15:23
0
Оказалось что в updateToken пропустил один this, теперь ошибок нет вообще, но корзина не обновляется, что бы показать увеличение количества товаров, после добавления… Содержимое страницы обновляется только после перезагрузки страницы. Буду искать причину. Но если что знает от чего так, то подскажите, буду признателен.
Максим
22 мая 2025, 15:06
0
Продолжу делится тем как продвигается исправление встречающихся мне ошибок. Надеюсь что двигаюсь в правильном направлении, может это кому-то то же поможет. В файле заменил все встречаемые this на ms3, в методах setToken и updateToken (в файле customer.js). Теперь товар добавляется в корзину, только сама корзина на странице не обновляется. Товар в корзине можно увидеть только после обновления страницы.



Теперь ошибка в консоли вот такая. Что-то не так в функции updateToken, ошибка уже не на какой-то конкретной строке, а выводится из try/catch
Максим
22 мая 2025, 13:19
0
Не знаю верно ли делаю или нет, может кто-то подскажет, пока заменил:
ms3.setToken()
на
ms3.customer.setToken()
Ошибка пропала. На странице, при нажатии на кнопку добавления товара в корзину, появилось всплывающее модальное об отсутствии токена (ранее страница просто перезагружалась). Копаюсь дальше. Сейчас видна в консоли другая ошибка:

AlexFux
22 мая 2025, 10:08
0
Ради интереса спрошу — у заболевших сайтов ядро (папка Core) за пределами публичной части?
И ещё — у этих-же сайтов ссылка на админку вида "/manager", или своя?
Максим
22 мая 2025, 09:54
0
Дополню предыдущий пост. Сама функция, которую мы пытаемся вызвать, находится чуть ниже по коду, в этом же файле — она асинхронная

Семён
22 мая 2025, 09:31
0
Вот как раз-таки по этому врядли это проблема таймвеба, скорее всего старая версия MODX и дыры в компонентах. А-то накинулись на таймвеб все)
Максим
22 мая 2025, 09:24
0
Спасибо что откликнулись.

Пока была надежда что кто-то прям с такой же проблемой столкнулся кто-то, поэтому не прикреплял скриншоты. Сейчас будут подробности. Вот тут указаны эти методы, в самом репозитории модуля — https://github.com/modx-pro/MiniShop3/issues/15

Вот скриншот из консоли браузера


Если что, вот сама страница где тестовый товар. Перейдя в него, можно увидеть кнопку так же добавления товара в корзину.

В каталоге ошибка в консоли вылазит сразу при загрузке страницы, так же и в карточке товара.

Вот скриншот блока кода из файла:
Ivan
22 мая 2025, 00:55
0
Он теперь стоит 2.5к) Благодарность обозначенная автором)
Артур Шевченко
21 мая 2025, 21:07
0
Ну там ещё стэк вызовов есть, номер строки на которой ошибка возникла, а ты прислал только текст и что с ним делать? Перевести? ms3.setToken is not a function — ms3.setToken это не функция.
Максим
21 мая 2025, 17:04
0
У меня сайт на MODx 3.1.1, требуется настроить на нём магазин. Я поставил MiniShop3. Я в курсе что это альфа-версия и могут быть какие-то проблемы в работе, просто не хочется самим писать какой-то примитивный функционал магазина (займусь этим если ничего не решу с ошибками), что бы закрыть все потребности на сайте. Тем более что когда-то давным давно писалось что основной функционал с MiniShop2 перенесён. Может кто-то ставил уже этот модуль и решал возникнувшие проблемы? В частности, у меня проблема с асинхронной функцией ms3.setToken() в файле customer.js (возможно дальше тоже появятся ошибки, но это пока в числе первых), возвращается ошибка «ms3.setToken is not a function». Знает кто-то как её исправить? В поиске не нашёл что бы у кого-то подобная проблема была…

На гите есть упоминание этой функции и пометка что «Метод setToken является асинхронной, но вызывается как синхронный. Возможны ошибки в будущем.». Может кто-то знает как убраь эту ошибку?
Василий Наумкин
21 мая 2025, 14:35
0
Да для всех, какие есть в дистрибутиве — лишнего-то там быть ничего не должно, по идее.

В идеале вообще автоматизировать и качать всё новое бесплатное из репозитория MODX / modstore, распаковывать и забивать в БД:
— название: MODX или дополнение
— версия дистрибутива
— путь к файлу
— sha1 хэш файла
Артур Шевченко
21 мая 2025, 10:18
0
создать онлайн базу для проверки хэшей файлов MODX и дополнений через API
Интересная идея, я бы занялся на досуге. Ты мог бы в общих чертах описать для каких файлов делать хэш у ядра и у компонентов?
pandaworks
21 мая 2025, 08:49
0
Бинго!
Так-то я знаю, что в leftJoin указываются соответствия строк таблиц, но что после объявления псевдонима дальше используется только он — это я забыла. Спасибо!
Василий Наумкин
21 мая 2025, 04:00
+3
Насколько я вижу из кода, скрипт в первый раз сохраняет хэши файлов, а потом их проверяет. Но если сайт уже заражён — то это никак не поможет.

Подкидываю альтернативную идею, если интересно — проверять версию MODX (или брать из настроек), скачивать соответствующий дистрибутив, и проверять хэши файлов сайта по файлам дистрибутива.

То есть, берём оригинальные файлы index.php в connectors, manager и корне, а так же файлы из core — и проверяем, чтобы все они присутствовали на сайте с оригинальным хэшем.

Если все основные файлы не изменены, то сайт не заражён и должен работать корректно.

Правда, есть еще возможность заражения только файлов дополнений, без ядра. Наверное, можно и их сверять с дистрибутивами из репозитория по той же логике — скачать нужную версию и сравнить хэши…

Кстати, вот вам еще идея — создать онлайн базу для проверки хэшей файлов MODX и дополнений через API. Чтобы простые GET запросы, типа /api/hash/modx/2.8.1/core/model/modx.class.php возвращали sha1 хэш запрошенного файла или 404.

Конечно, это не спасёт от уже залитых шеллов и вредоносов, но они не будут запускаться через сайт. А если запустятся и что-то изменят, то следующая проверка это покажет. И если раз за разом файлы будут меняться — то можно уже более внимательно искать, что там такое у вас залито.
Илья Павлов
20 мая 2025, 22:04
0
я сегодня уже после того как столкнулся с ошибкой обновил до актуальных ModX c 3.0.6 и Formit тоже версия была 2024 года
Артур Шевченко
20 мая 2025, 21:22
+1
Обычно для компонентов не требуется указывать префикс таблиц в методе addPackage().
И кажется ты не понимаешь что это за магические письмена
$q->leftJoin('goodStarVoteCount', 'countaverage', 'modResource.id = countaverage.thread');
Первым аргументом в метод leftJoin передаётся имя класса ('goodStarVoteCount'); вторым псевдоним для таблицы ( 'countaverage'), если не передать будет взято имя класса; третьим аргументом передаётся условие соединение таблиц как в операторе ON в SQL ( 'modResource.id = countaverage.thread').
На чистом SQL запрос будет примерно таким
SELCET `modResource`.`id` as `id`, `countaverage`.`countaverage` as `count` FROM `modx_site_content` as `modResource`
LEFT JOIN `modx_good_stars_vote_count` as  `countaverage` ON `modResource`.`id` = `countaverage`.`thread`
WHERE `modResource`.`published` = 1 AND  `modResource`.`deleted` = 0
Как видишь в секциях SELECT и ON используется псевдоним таблицы, в xPDO тоже надо использовать псевдонимы, если они указаны в leftJoin или setTableAlias. Поэтому вот это всё
'modTemplateVarResource.preview.value as preview',
'modTemplateVarResource.event_date.value as event_date',
'modTemplateVarResource.event_date_end.value as event_date_end',
'modTemplateVarResource.event_city.value as event_city',
'goodStarVoteCount.countaverage as countaverage'
неверно, должно быть так
'preview.value as preview',
'event_date.value as event_date',
'event_date_end.value as event_date_end',
'event_city.value as event_city',
'countaverage as countaverage'
И наконец, чтобы проверить какой же запрос будет выполнен можно сделать так
$q->prepare();
echo $q->toSQL();
Наумов Алексей
20 мая 2025, 21:19
+1
Вы уже второй с такой ошибкой, то ли в свежем MODX что-то изменилось, толи в Formit. Я поправлю в ближайшие дни, постараюсь
Илья Павлов
20 мая 2025, 18:02
0
Добрый день!
Установил, настроил, капча выводится, но если не чекнуть её и отправить форму получаю ошибку:
Failed to load resource: the server responded with a status of 500 ()
Журнал ошибок ModX пуст.
Modx 3.1.2-pl, YaSmartCaptcha 1.0.2-pl, Formit 5.1.1-pl.

В логе сервера такая ошибка:
[Tue May 20 17:49:57 2025] [error] [pid 78865] sapi_apache2.c(358): [client] PHP Fatal error: Uncaught Error: Object of class Sterc\\FormIt could not be converted to string in /public_html/core/components/yasmartcaptcha/model/yasmartcaptcha.class.php:58\nStack trace:\n#0 /public_html/core/components/yasmartcaptcha/model/yasmartcaptcha.class.php(58): str_replace(Array, Array, 'https://smartca...')\n#1 /public_html/core/cache/includes/elements/modx/revolution/modsnippet/52.include.cache.php(42): YaSmartCaptcha->initialize('web', Array)\n#2
/public_html/core/src/Revolution/modScript.php(88): include('/home/p...')\n#3 /public_html/core/src/Revolution/modParser.php(508): MODX\\Revolution\\modScript->process(NULL)\n#4 /public_html/core/components/pdotools/src/Parsing/Parser.php(276): MODX\\Revolution\\modParser->processTag(Array, true)\n#5 /public_html/core/src/Revolution/modParser.php(221): ModxPro\\PdoTools\\Parsing\\Parser->processTag(Array, true)\n#6 /public_html/core/components/pdotools/src/Parsing/Parser.php(73): MODX\\Revolution\\modParser->processElementTags('', '<!doctype html>...', true, false, '[[', ']]', Array, 9)\n#7 /public_html/core/src/Revolution/modResource.php(520): ModxPro\\PdoTools\\Parsing\\Parser->processElementTags('', '<!doctype html>...', true, false, '[[', ']]', Array, 10)\n#8 /public_html/core/src/Revolution/modResource.php(468): MODX\\Revolution\\modResource->parseContent()\n#9 /public_html/core/src/Revolution/modResponse.php(72): MODX\\Revolution\\modResource->prepare()\n#10 /public_html/core/src/Revolution/modRequest.php(154): MODX\\Revolution\\modResponse->outputContent(Array)\n#11 /public
Подскажите, пожалуйста, может я что-то не так настроил?