Василий Наумкин

Василий Наумкин

С нами с 08 декабря 2012; Место в рейтинге пользователей: #1
Василий Наумкин
10 декабря 2015, 09:45
+1
Там всё очень сложно.

Меня пока хватило вот на это решение.
Василий Наумкин
10 декабря 2015, 09:43
0
Ничем, просто так привык, когда только учился.

Сейчас стараюсь писать попроще, но еще много подобного можно найти в разных разработках.
Василий Наумкин
10 декабря 2015, 07:26
8
+5
У меня на сайте, например, бывают платные разделы. Чтобы добавить пользователю доступ в них при оплате, работает вот такой плагин:
case 'OnWebPageInit':
if ($uid = $modx->user->id) {
	if ($extended = $modx->user->Profile->get('extended')) {
		if (!empty($extended['updateGroups'])) {
			unset($_SESSION['modx.user.'.$modx->user->id.'.userGroupNames']);
			$extended['updateGroups'] = 0;
			$modx->user->Profile->set('extended', $extended);
			$modx->user->Profile->save();
			
			$ctxQuery = $modx->newQuery('modContext');
			$ctxQuery->select($modx->getSelectColumns('modContext', '', '', array('key')));
			if ($ctxQuery->prepare() && $ctxQuery->stmt->execute()) {
				if ($contexts = $ctxQuery->stmt->fetchAll(PDO::FETCH_COLUMN)) {
					$serialized = serialize($contexts);
					$modx->exec("UPDATE {$modx->getTableName('modUser')} SET {$modx->escape('session_stale')} = {$modx->quote($serialized)}");
				}
			}
		}
	}
}
break;
Написан давно, работает без нареканий.

Для разлогинивания заблокированных пользователей использую вот такой код в том же плагине:
if ($modx->user->id) {
	if (!$modx->user->active || $modx->user->Profile->blocked) {
		$modx->runProcessor('security/logout');
		$modx->sendRedirect('/');
	}
}

Если это всё не то — прошу прощения.
Василий Наумкин
09 декабря 2015, 21:57
+2
А стоит ли им прям сессии-то удалять? А вдруг там товары какие хранятся в корзине?

Я обычно просто ставлю юзеру флажок в extended, который проверяется плагином на загрузку страницы. Как только зашел юзер с этим флажком — сессия ему аккуратно обновляется и флажок удаляется. Никто не страдает.
Василий Наумкин
09 декабря 2015, 21:10
0
Да всё он выводит, нужно просто разобраться, что и в каком виде хранится в БД, а не тупо копировать чанки от getResources.

В параметре &where можно проверять ТВ на null.
Василий Наумкин
09 декабря 2015, 21:10
1
+2
Да, можно делать отдельным сниппетом:
<?php
$pdo = $modx->getService('pdoTools');
if (!$isset($placeholders)) {
	$placeholders = array();
}

return $pdo->getChunk($tpl, $placeholders);

Можно вообще не использовать Fenom в контенте страницы и шаблонах, а только в чанках — это самый простой и беспроблемный способ работы. Именно он по умолчанию и включен.
Василий Наумкин
09 декабря 2015, 21:02
+1
А нафига в карте сайта Fenom-то? Да еще и на 50 000 документов. Тогда хоть кэширование скомпилированных чанков надо включать.

А вообще, там просто str_replace нужен, он по умолчанию и используется.
Василий Наумкин
09 декабря 2015, 20:32
+1
bezumkin.ru/sections/components/1775/

Из-за лютых тормозов потом пришлось изменить логику работы этого параметра. Хотя, скорость волнует не всех разработчиков.
Василий Наумкин
09 декабря 2015, 16:22
0
Это потому, что парсер pdoTools подлезает в самом конце, уже после сохранения кэша документа.

Если подлезать раньше, то начинаются другие проблемы, поэтому оставил пока так.
Василий Наумкин
09 декабря 2015, 16:20
+1
Зашел на сайт, он на тестах показывает ошибку, что маловато памяти. Установил выборку 1 раз 1000 ресурсов, вызываю по очереди всё. Перед первым вызовом делаю полную очистку кэша.

Не Fenom
1 запуск — 0.2594 s
2 запуск — 0.0522 s

Fenom
1 запуск — 0.2845 s
2 запуcк — 0.0674 s

Разница в районе погрешности на простейших чанках и 1000 итераций. Если такой результат не устраивает, всегда можно вернуться к сниппету IF и фильтрам вывода.
Василий Наумкин
09 декабря 2015, 09:08
0
Думаю, тут проблема в использовании tvFilters.

pdoTools работает с реальными данными в таблице, а значения по умолчанию от ТВ туда не пишутся.
Василий Наумкин
09 декабря 2015, 04:10
+1
Проблема с картой сайта заключается в том, что она вызывается несколько раз и с разными параметрами, а сниппет по умолчанию включает кэш для хранения результатов.

Вот и выходило, что кэш от работы одного вызова затирал другой. Обновил pdoTools и исправил этот недостаток. Теперь всё должно работать нормально.
Василий Наумкин
06 декабря 2015, 23:41
+1
Там выше ссылку дали, где парни за видео 250 баксов требуют.

Даже если это 8 часов работы (полный день), то всё равно выходит не менее 2000 руб за час. Отсюда вывод, что видео стоит дороже, чем программирование.

Я на видеокассету в 2004 году снимал пионерский лагерь и нормально всё было.

Камеру ближе к докладчику, шабурчащим подзатыльник. Делов-то?

Рыдаю, спасибо! Всё же не стоит пренебрегать горячими закусками.
Василий Наумкин
06 декабря 2015, 14:07
+3
Отличный способ!

А &tvFilters нужен исключительно для совместимости с getResources. Никому не рекомендую его использовать.
Василий Наумкин
06 декабря 2015, 09:08
+2
Добавлю от себя $50.

Итого останется только согласие Ивана и найти еще $50.
Василий Наумкин
05 декабря 2015, 17:14
0
Проблема тут в том, что откуда бы код не взялся, он в итоге собирается в единое и потом на уровне modResponse отрабатывается как единый шаблон.
Это отключено по умолчанию. Так же как и доступ в php и modX.

А доступ в {$_modx} включен по умолчанию и он должен быть безопасным. Сегодня ты очень сильно помог в этой задаче. Надеюсь, что больше никаких уязвимостей при конфигурации по умолчанию не найдётся.

Если же разработчик (не редактор) хочет — он может смело всё включить. Но он должен это сделать сам, понимая, чем рискует.