Всего 125 676 комментариев

Наумов Алексей
04 августа 2021, 10:01
0
А самый правильный — интерфейс ISessionHandler с методом flushSessions, от которого наследуется уже modSessionHandler, и что бы именно он вызывался в процессоре.
Андрей
04 августа 2021, 02:03
0
Я на на modhost проверял, modx 2.8.3, pdoTools 2.12.10-pl, PHP Version 7.4.12
Andrey
03 августа 2021, 22:18
1
0
123 — значение по умолчанию, если параметра нет. Можно и без этого, просто:
$vtype = $modx->getOption('type', $scriptProperties);
Или вообще может такое закостылить:
$type = $type;
:D
Andrey
03 августа 2021, 20:10
0
В журнале ошибок нет?
Префикс pdo не менялся?
&tvPrefix=`tv`
или
[[+myMenuTitle:default=`[[+menutitle:default=`[[+pagetitle]]`]]`]]
?
Влад
03 августа 2021, 19:53
0
Проверил тестовый вариант на другом сайте modx — все работает.
Версии всего на обоих сайтах одинаковые.
Наверное, какие-то extras конфликтуют.
Буду разбираться сейчас.
Спасибо за помощь!
Влад
03 августа 2021, 19:35
0
Проделал то же самое — не работает.
Забыл написать, что версия PHP на хостинге 7.4.21.
Дело в том, что этому сайту много лет и 5 лет назад все работало.
Может быть версия PHP для сниппета не подходит.
Евгений Шеронов
03 августа 2021, 19:35
+1
Если мы храним сессии в файлах, то они там и остаются. Храним сессии в базе — они там и остаются.
А если жёсткий диск полетит?)

все будет потеряно
А в сессии ничего важного и не должно быть. Максимальные потери здесь — содержимое корзины да и выход из аккаунта. А если настроить сохранение на диск, то и потеряется только сессионные данные за последние n секунд)
Shedko Denis
03 августа 2021, 18:37
0
По сайту (кроме чанков) феном выключен (о чем не писал в вопросе).
В выше приведенном примере вызов через сниппет.

Или я чего не понимаю?
Shedko Denis
03 августа 2021, 18:04
0
)) да. Такое очевидно решение.
Спасибо.

Изменил сниппет на

<?php
$js  = file_get_contents($file, FILE_USE_INCLUDE_PATH); 
$js2 = str_ireplace ("[[", "[ [ " , $js); 
return  $js2;
все. код вставляется без изменений.
Осталось только с JS разобраться.
Андрей
03 августа 2021, 17:47
0
Это только у меня так или includeTVs сейчас не работает?
Скопировал прямо твой вызов с чанком myTplHome, остальные оставил дефолтными, всё работает. Проверь остальные чанки, возможно где то ошибка.
Andrey
03 августа 2021, 17:41
0
А так?
<?php
$values = array();
$vtype = $modx->getOption('type', $scriptProperties, 123, true);
$ids = $modx->runSnippet('pdoResources', array(
	 'parents' => $parents,
	 'limit' => 0,
	 'returnIds' => 1,
	 'includeTVs' => 'certificateBuildingType',
	 'tvFilters' => 'certificateBuildingType==' . $vtype

));
$resources = explode(',', $ids);
foreach($resources as $id){
	 $resource = $modx->getObject('modResource', $id);
	 $tv = $resource->getTVValue($tvname);
	 if(is_numeric($tv)) $values[] = $tv;
}
$out = array_sum($values); 
return $out;
Евгений Webinmd
03 августа 2021, 17:27
+1
можно сделать replace фигурных скобок на фигурные скобки с пробелом до и после
Сергей Шлоков
03 августа 2021, 17:08
+2
MODX не умеет очищать сессии, если используется иной, отличный от modSessionHandler класс.
Вот это шляпа. По хорошему нужно править это.
Самый простой выход — через js в админке менять хандлер у этого пункта меню, в котором указать свой процессор (поправленную копию системного процессора).
Константин
03 августа 2021, 16:18
0
Подскажите пожалуйста, как поменять порядок вывода языков

Сниппет:
<?php
$output = "";
$pdo = $modx->getService('pdoTools');

$uri = $_SERVER['REQUEST_URI'];
if(substr($uri, 0, 1)) {
$uri = mb_substr($uri, 1);
$tmp = explode('/', $uri);
if($path = $tmp[0]) {
$tmp = $modx->getObject('localizatorLanguage', array('http_host:LIKE' => "%/{$path}/"));
if($tmp) {
$uri = str_replace("{$path}/", "", $uri);
}
}
}

$protocol = 'https://';
$languages = $modx->getIterator('localizatorLanguage', ['active' => 1]);
foreach($languages as $language) {
if(mb_substr($language->http_host, -1) == '/') {
$placeholders = array(
'cultureKey'=>$language->key,
'active'=>$language->key == $modx->localizator_key? 'active': '',
'url'=>$protocol. $language->http_host. $uri,
);
} else {
$placeholders = array(
'cultureKey'=>$language->key,
'active'=>$language->key == $modx->localizator_key? 'active': '',
'url'=>$protocol. $language->http_host. '/'. $uri,
);
}
$output .= $pdo->getChunk($tpl, $placeholders);
}

return $output;

Вывод:

{$_modx->runSnippet('!getLanguages', ['tpl' => 'section-langs-2'])}

Заранее спасибо!
Наумов Алексей
03 августа 2021, 15:49
0
Просто не выйдет…
MODX не умеет очищать сессии, если используется иной, отличный от modSessionHandler класс.

В процессоре проверяется настройка session_handler_class, и если там указано что-то не стандартное — сразу ошибка.

Как вариант — сделать свой пункт в меню для очистки сессий, а стандартный скрыть… ну и тогда нужно дописать процессор и т.п.
Наумов Алексей
03 августа 2021, 15:10
0
Точно, будем фиксить в следующих версиях)
Семён Кудрявцев
03 августа 2021, 15:08
0
Потестил компонент, не работает функционал «Завершить все сеансы» — может быть имело смысл не создавать свою таблицу, а расширить существующую и тогда бы это работало. В итоге получаем ошибку —
А так затея интересная, автору респект.
Max
Max
03 августа 2021, 15:06
0
Да, похоже это то что нужно, но с плагинами к ms2 я ни разу не работал, они не по событию как то запускаются, нужно найти где их регистрировать. Думал может есть проще методы))))) Спасибо за ссылку, возможно попытаюсь разобраться))
Иван
03 августа 2021, 14:56
0
Я писал про дополнение «AjaxForm» (может ещё какое-то есть), которое очень популярно. Этот сниппет для каждого посетителя сайта (в т.ч. для ботов) создает записи в сессии, где хранит параметры сниппетов. Представляете какой это объём информации для сайта с хорошей посещаемостью? Сталкивался с сайтами, где на одну страницу минимум 5 раз используется AjaxForm.
Во времена повсеместного бума интернет-приватности и частичного отказа от cookies я вот хочу перенести в сессии некоторые настройки персонализации для незарегистрированных посетителей сайта (например открыто или закрыто боковое меню) и вообще сводить к минимуму использование cookies там где возможно.
К Вашему сведению, сессия работает через куку, где хранится её ID. Так что переводить на сессию в Вашем случае смысла нет. Лучше используйте в JS LocalStorage или SessionStorage. Технологии нужно использовать по их назначению, тогда и проблем не будет.