Василий Столейков

Василий Столейков

С нами с 19 декабря 2012; Место в рейтинге пользователей: #23
Василий Наумкин
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('/');
	}
}

Если это всё не то — прошу прощения.
Сергей
06 декабря 2015, 22:16
1
+2
Твоей проблеме уже год. В плагине в 21 строке исправь значение у createVirtual с true на false.
Василий Наумкин
02 декабря 2015, 15:57
3
+2
Прикольно, именно так уже какое-то время и фильтруются новости на главной modx.pro. Там есть 2 ТВ параметра: выводить на главной, или скрывать на главной.

При работе с ТВ запрос с фильтрацией по этим 2м ТВ выходил под 0.5 сек, сейчас — 0.06 сек. Мой плагин выглядит вот так:
<?php
switch ($modx->event->name) {
	
	case 'OnMODXInit':
		$modx->loadClass('modResource');
		$modx->map['modResource']['fields']['show_on_start'] =
		$modx->map['modResource']['fields']['hide_on_start'] = 
		$modx->map['modResource']['fields']['ticket_rating'] = 0;
		$modx->map['modResource']['fieldMeta']['show_on_start'] =
		$modx->map['modResource']['fieldMeta']['hide_on_start'] = array(
			'dbtype' => 'tinyint',
			'precision' => 1,
			'attributes' => 'unsigned',
			'phptype' => 'boolean',
			'null' => true,
			'default' => 0,
		);
		$modx->map['modResource']['fieldMeta']['ticket_rating'] = array(
			'dbtype' => 'int',
			'precision' => 10,
			'attributes' => '',
			'phptype' => 'int',
			'null' => true,
			'default' => 0,
		);
		break;
		
		case 'OnBeforeDocFormSave':
			$resource->set('show_on_start', !empty($resource->get('tv7')));
			$resource->set('hide_on_start', !empty($resource->get('tv8')));
			break;
		
		case 'OnTicketVote':
			if ($object->class == 'Ticket') {
				if ($ticket = $modx->getObject('Ticket', $object->id)) {
					$properties = $ticket->getProperties('tickets');
					$rating = !empty($properties['rating'])
						? $properties['rating']
						: 0;
					$ticket->set('ticket_rating', $rating + $object->value);
					$ticket->save();
				}
			}
			break;
}
Ка видите, там еще и сортировка по рейтингу тикетов есть — дарю! OnTicketVote был добавлен в последней версии Tickets.
Илья Уткин
26 ноября 2015, 18:49
1
+2
<img src="[[+gravatar]]?s=100&d=[[+photo:default=`[[++rb_base_dir]]img/nophoto.png`]]" />
Василий Наумкин
24 ноября 2015, 19:43
3
+3
Уже можно обновляться =)

{if $_modx->isMember('Users')}
	Для юзеров
{else}
	Для всех остальных
{/if}
Максим Кузнецов
04 ноября 2015, 20:43
1
+2
— это пример быстрых плейсхолдеров. Подробнее о них можно почитать здесь.

Решение вполне рабочее.
Сергей Шлоков
03 ноября 2015, 11:10
1
+2
Микросниппет, который выводит группы пользователей через запятую, если их несколько
$groups = implode(',',$modx->user->getUserGroupNames());
return $groups;
Пётр Молчанов
03 ноября 2015, 10:55
2
+2
isMember — самый нормальный вариант
$user = $modx->getObject('modUser',array('active' => true, 'id' => $userid )); // подставляй айди пользователя
if($user == null)
        return "Пользователь не найден!";
if($user->isMember('Гость')) {

} elseif($user->isMember('Копирайтер')) {

}
и т.д.
если нужно для каждой что-то выводить, то убери else из условий, проверяй только if'ом
Василий Наумкин
29 октября 2015, 09:03
2
+1
Ну, наверное так и есть, потому что переменные в PHP (да и вдругих языках) не могут называться через тире. Только через подчёркивание.

Если речь о ТВ в чанке, то можно так
Моя ТВшечка: {$_pls['tv-name']}

Если на странице, то так:
{var $tv_name = $_modx->getPlaceholder('tv-name')}
Моя ТВшечка: {$tv_name}