Сергей Шлоков

Сергей Шлоков

Был в сети 06 ноября 2025, 19:54
Заказы не принимаю
Просто в России, если написано акция до 8, это это, блин, до 8, а не до обеда восьмого и не до 7…
А если магазин работает до 21, то закрываться он должен в 22 часа, а не в 21-00 и не в 21-30. :)
В той России, в которой живу я, если хотят, чтобы акция действовала и 8-го, говорят «акция продлится до 8-го включительно». Ибо приставка «до» имеет строго определенное значение.
Важна актуальность информации.
Представь, ты сидишь в офисе на 3-ем этаже и тебе надо узнать время. Часы находятся на первом этаже. Ты просишь курьера сбегать и узнать. Они прибегает и говорит — 12 часов 22 минуты 41 секунда. Ты его опять посылаешь, он уже приходит не спеша и сообщает — 12 часов 24 минуты 18 секунд. Как ты думаешь, время соответствует реальному?
А вот если он сбегает (или сходит) и узнает сколько человек в очереди в столовой, то эта информация будет актуальной. Тут не так важны секунды.
Чувствуешь разницу?
Это что-то новенькое — php для динамических элементов. Сергей, а ты понимаешь, что на ajax запрос требуется время? И может случится так, что запрос будет выполняться несколько секунд.
Такие вещи делаются только на яваскрипте. Забиваешь в яндекс «Вывод текущего времени на странице javascript» и получаешь кучу примеров.
писал впервые из нескольких кусков
Это очень заметно. Чисто для понимания давайте пробежимся по коду.
// очищаем кеш
Зачем?
П.С. Вообще это можно сделать непрограммно — просто создавать некэшированные страницы. Но в данном случае не понятно, зачем это нужно.

//Получаем ID текущего ресурса
$id = $modx->resource->get('id');
Зачем? В первой строчке уже получали.

//текущая дата
$today = date('Y-m-d');
Зачем? В strtotime и так по умолчанию берется текущая дата.

$date = date('Y-m-d',strtotime("-$day day", strtotime(preg_replace('~^(\d+)\.(\d+)\.(\d+)$~', '$3-$2-$1', $today))));
Это вообще что за конструкция? Явно откуда-то скопирована без понимания. Хватило бы
$date = date('Y-m-d',strtotime("-$day day"));
Но и это лишнее, так как в mySql есть готовые функции для работы с датами.

$tmpip = $arr_one[«ip»];
$allip[] = $tmpip;
А почему нельзя было написать так $allip[] = $arr_one[«ip»]?

if (in_array("$ip", $allip)) {
$ip нужно указывать без кавычек.

print $unlock;
Возврат значений из сниппета должен быть через return.

Явно есть над чем поработать.
Смотрите, Сергей, если задача — разрешить добавлять комментарий 1 раз в n дней, то решается она несколькими строчками.
Вариант 1. Через сниппет как у вас.
$sql = "SELECT 1 FROM modx_ec_messages C LEFT JOIN modx_ec_threads D ON C.thread=D.id
WHERE D.resource = {$modx->resource->id} AND C.date>DATE_SUB(NOW(),INTERVAL {$day} DAY) AND ip = ?" ;
$stmt = $modx->prepare($sql);
$stmt ->execute($_SERVER['REMOTE_ADDR']);
if ($stmt->rowCount() ) {
	// Запрещено
	return '';
}
// Выполняем указанные сниппет
return $modx->runSnippet($snippet, $scriptProperties);
Ну и вызывать так
// Вместо unlock указываем snippet и любые другие параметры указанного сниппета
[[!voting_ban? &snippet=`ecForm` &day=`7`]]
Вариант 2. Через плагин.
Если у этого компонента есть событие добавления комментария по аналогии с Tickets, то форма показывается, но при добавлении комментария плагин проверяет возможность добавления.

Вот как минимум 2 варианта.
П.С. Ещё было бы логично проверять почту. У пользователя ip может быть динамическим. А лучше разрешать оставлять отзыв только авторизованным пользователям. Тогда ещё проще.
Зачем это нужно понятно из названия. А что делает данный сниппет? Потенциальный пользователь данного решения должен копаться в коде, чтобы понять?
И ещё вопрос.
Ложу тут — если покажется нужным — прошу перенести куда следует.
В данном предложении как правильно читать — лОжу или ложУ?

П.С. Данное решение никак не тянет на готовое.