Финансовая поддержка VPS, бесплатные дополнения и docs Донаты оплачивают сервер и двигают бесплатные дополнения MODX и документацию. Поддержать

Всего 126 110 комментариев

Ivan K.
Ivan K.
Здравствуйте.
Отличное и нужное решение. Обязательно воспользуюсь.
Но хотел уточнить не возникнет ли проблем при использовании MODX3 + php8.1?
И в плане безопасности можно ли использовать в «личном кабинете пользователя» (простые юзеры, которые залогинены в контексте web) данное решение? хотел кастомную таблицу подключить, чтобы юзеры меняли в ней данные.
Сергей
Сергей
Володя, подскажи пожалуйста на какое событие нужно создать скрипт, что бы при фильтрации через msearch2 выбиралась нужная опция. Сейчас работает только при повторном обновлении страницы в дефолтным классом. И почему у кастомного msopfilters.class.php нет выбора нужной опции при фильтрации. И почему то при добавлении зависимостей, очень медленно работает. Речь о фильтрации и выводе в каталоге.
Сергей Шлоков
Сергей Шлоков
Как по мне, чересчур громоздко. Логика с date и start/end не очевидна. Да и в коде слишком много лишней логики. Я бы предложил вариант с датой и длительностью (просто в целях разминки полушарий)
$date = $modx->getOption('date', $scriptProperties, '');
$duration = $modx->getOption('duration', $scriptProperties, '1');
$chunk = $modx->getOption('tpl', $scriptProperties, '');

if (empty($date) || empty($chunk)) {
  return '';
}

[$day, $month, $year] = sscanf($date, "%d.%d.%d");
$year ??= date('Y');
$date = "$day.$month.$year";

$currentTimestamp = time();
$startTimestamp = strtotime($date);
$endTimestamp = strtotime($date . " + $duration days");

if ($currentTimestamp >= $startTimestamp && $currentTimestamp < $endTimestamp) {
  $pdoTools = $modx->getService('pdoTools');
  return $pdoTools->getChunk($chunk);
}
Указал год — сработает только для него. Не указал, ежегодно. Если длительность не указана, то она равна 1 дню.
Артур Шевченко
Артур Шевченко
Немного сократил и добавил поддержку файловых чанков.
<?php
$start = $modx->getOption('start', $scriptProperties, '');
$end = $modx->getOption('end', $scriptProperties, '');
$chunk = $modx->getOption('tpl', $scriptProperties, '');

// определяем в каких случаях мы ничего не будем делать, нам важно не перетрудиться.
if((!$start && !$end) || !$chunk){
    return '';
}
// завозим поддержку файловых чанков
if(!$parser = $modx->getService('pdoTools')){
    $parser = $modx;
}

$now = strtotime('d.m.Y');
$currentYear = date('Y');
// предполагается что дада передаётся строкой вида "d.m"
$startTime = strtotime($start . '.' . $currentYear);

// если задана только дата начала, считае, что оформление будет активно только в эту дату
if(!$end){
    if($now === $startTime){
        return $parser->getChunk($chunk);
    }
}

$startParts = explode('.', $start);
$endParts = explode('.', $end);

// проверяем больше месяц даты начала месяца даты окончания
if((int)$startParts[1] > (int)$endParts[1]){
    $endTime = strtotime($end . '.' . ($currentYear + 1));
}else{
    $endTime = strtotime($end . '.' . $currentYear);
}

if ($now < $startTime || $now > $endTime) {
   return '';
}
return $parser->getChunk($chunk);
Дима Касаткин
Дима Касаткин
Вообще чем-то похоже на работу пакета BannerY получилось кстати. Только опять же, со срабатыванием каждый год. На самом деле для ежегодных праздников твой вариант подходит конечно идеально!
Дима Касаткин
Дима Касаткин
Пользуюсь похожей конструкцией, чтобы редактировать TV-шки с фронта. Отличный пример допиливания полезного функционала под проект, спасибо!

P.S. Поправь плиз отступы в форматировании кода во 3 и 4 блоках, а то я shift+tab чуть не нажал машинально, когда читал :)
Сергей
Сергей
ckeditor.js?v=1.4.6-pl:10528 Uncaught TypeError: Cannot read properties of undefined (reading 'build')
    at Object.build (ckeditor.js?v=1.4.6-pl:10528:76)
    at Object.build (ckeditor.js?v=1.4.6-pl:10528:76)
    at CKEDITOR.dialog.addPage (ckeditor.js?v=1.4.6-pl:10080:160)
    at new CKEDITOR.dialog (ckeditor.js?v=1.4.6-pl:9929:81)
    at a.openDialog (ckeditor.js?v=1.4.6-pl:10616:122)
    at a.<anonymous> (ckeditor.js?v=1.4.6-pl:10620:30)
    at e (ckeditor.js?v=1.4.6-pl:4488:33)
    at Array.y (ckeditor.js?v=1.4.6-pl:4493:105)
    at x (ckeditor.js?v=1.4.6-pl:4498:64)
    at ckeditor.js?v=1.4.6-pl:4511:41
Денис Усманов
Денис Усманов
И добавлю, что предлагаемый тобою вариант, полуавтоматический, т.е. после срабатывания придётся менять дату на следующий год. Мне нужно было сделать решение, которое как говорится «на века» и «без лишней возни») т.к. у заказчика сайтом управляет в основном HR отдел по вакансиям, и там точно разбираться с такими вещами не будут.
Денис Усманов
Денис Усманов
Привет! Да, можно вполне было пойти, через ресурсы, но мне нужно было решение в виде сниппета, который выводил бы по датам чанки с CSS/HTML/JS в разных местах… Поэтому, сниппет оказался на мой взгляд, самым верным решением.
DimoniXo
DimoniXo
Проблема всё чаще появляется, по причине того, что хостинги переходят на MySQL 8. Причина в том, что gallery использует слово «rank» в запросах а бд, а в новой версии MySQL это слово зарезервировано.
Решение:

В файле
core/components/gallery/processors/mgr/item/getlist.class.php

На строке 31 заменить
public $defaultSortField = 'rank';
на
public $defaultSortField = '`rank`';
На строке 66 заменить
$c->groupBy('rank');
на
$c->groupBy('`rank`');
Андрей Чаплыгин
Андрей Чаплыгин
Alexey, большое спасибо! То что нужно!

Немного дополню для интересующихся:

Если добавить в набор передаваемых параметров
'SOLUTIONTYPE' => 'Sole',
и включить в аккаунте PayPal оплату без авторизации (PayPal Account Optional), при редиректе на оплату в PayPal вы увидите ту же форму входа в аккаунт + появится дополнительная кнопка «Оплатить дебетовой\кредетовой катрой», при клике на которую вас всё равно попросят ввести email адрес, уже после чего дадут заполнить данные карты для оплаты.

Чтобы и этого избежать и упростить жизнь пользователю, впишите в тот же набор параметров ещё вот это
'LANDINGPAGE' => 'Billing',
С этим параметром, пользователь сразу будет отправлен на страницу, где останется только заполнить данные карты, без необходимости нажимать дополнительные кнопки и вводить email.

PS. На всякий случай скажу, что делаю это для клиента из США, поэтому добавил ещё и эту опцию
'LOCALECODE' => 'US',
Не уверен, что она необходима, учитывая что код US вроде как ставится по дефолту, но тем не менее, может кому будет полезно.