Александр Наумов

Александр Наумов

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

Если это всё не то — прошу прощения.
Fi1osof
09 декабря 2015, 21:06
5
+3
Да, 50к — это явно перебор. Лучше делать сайтмап с постраничностью. Вот такое у меня норм работает, поисковики нормально на автомате кушают.
Василий Наумкин
24 октября 2015, 05:37
1
0
1. У платных дополнений есть техподдержка в магазине. Такие вопросы принято задавать там.

2. phpThumb — это библиотека, которая используется в MODX для работы с изображениями. phpThumbOF — это сниппет, который её использует и он ms2Gallery не нужен.

3. Ответ на ваш вопрос
Павел
03 сентября 2015, 23:34
1
+1
Вот, как вариант набросал. Без Jevix теги не обрезает лишние. А вместе с ним все идеально работает, может пригодится кому:

Сниппет «Restext»;
<?php
$separator = array('?','!','.');// Разделители

    if(empty($len)){
        $len = '1000';
    }
    
    $string = substr($string, 0, $len);
    $i =strlen($string);
    
    do{
        $i--;
    }while(!in_array($string[$i], $separator) && $i >= 0);
    
    $string = substr($string, 0, $i);
    
    if(!empty($end)){
        return $string.$end;
    }else return $string;
Пример вызова:
[[!Restext? &string=`[[Jevix? &input=`[[+content]]` &cfgAllowTags=`br`]]` &len=`400` &end=`.`]]
Параметры: &string — текст для обработки, &len — максимальная длина, &end — добавляет любой символ в конце.

На ночь, много думать не хотелось, нужен результат, а он есть))
Сергей Шлоков
03 сентября 2015, 23:34
2
+3
Вообще полезно читать официальную документацию. Вот код примера из нее, чуть измененный
<?php
$output = '';
$options = !empty($options)?$options:50;
if (!empty($input) && !empty($options)) {
  if (strlen($input) > $options) {
    $output = substr($input, 0, strrpos(substr($input, 0, $options), '.'));
  } else{
    $output = $input;
  }
}
return $output;
Засовываем это в сниппет, например, smartcuttext и вызываем
[[+content:smartcuttext =`200`]]
Воеводский Михаил
12 июля 2015, 13:24
2
+3
Отправка SMS очень проста: здесь 3 примера на php, которые можно скопировать — сообщения будут прекрасно отправляться.

Что требуется при регистрации от сайта:
1. Сгенерировать код подтверждения и записать его в сессию
2. Сформировать текст сообщения
3. Отправить собщение
4. Проверить записанный в сессии код с введенным пользователем.
Володя
09 июля 2015, 09:18
2
+1
примитивный пример:
Создать сниппет — QveryCustom
вызов
[[!QveryCustom?
&QveryCustom=`[[*pagetitle]]`
]]
код сниппета
$_REQUEST['QveryCustom'] = $QveryCustom;
return '';
вызов mSearch2
[[!mSearch2?
&queryVar=`QveryCustom`
]]
все, радуемся…
Павел Ширяев
18 апреля 2015, 10:31
1
0
О, точно, спасибо! :)

Кстати, и коментарий Wassi Wassinen тоже работает — почему-то мне не удалось его нагуглить. Тем лучше, будет здесь, и кто-то в поиске на него наткнется.
Fi1osof
22 января 2015, 15:42
5
+3
Ставите Console.
Выполняете код:
ini_set('max_execution_time', 0);
ignore_user_abort(true);
$c = 'modResource';
$q = $modx->newQuery($c);
$q->sortby('id');
$q->select(array(
	"{$c}.*",
));
$s = $q->prepare();
$s->execute();
while($row = $s->fetch(2))
	$response = $modx->runProcessor('resource/update', $row);
	if($response->isError()){
		print_r($response->getResponse());
		return;
	}
	$modx->error->reset();
}
Так как у вас документов много, советую сначала прогнать только корневые документы (добавить в запрос $q->where(array('parent' => 0));), а потом по каждому разделу в отдельности, указывая соответствующий parent.
Василий Наумкин
02 апреля 2014, 13:16
3
+1
if ($modx->event->name == 'OnLoadWebDocument') {
	$section_root = 15;
	
	if ($modx->resource instanceof Ticket) {
		if ($category = $modx->resource->getOne('Section')) {
			if ($category->get('parent') == $section_root) {
				if (!$modx->user->isMember(array('Group1','Group2'))
					&& $modx->resource->get('createdby') != $modx->user->id
					&& $category->get('createdby') != $modx->user->id
				) {
					$modx->sendUnauthorizedPage();
				}
			}
		}
	}
	elseif ($modx->resource instanceof TicketsSection && $modx->resource->get('parent') == $section_root) {
		if (!$modx->user->isMember(array('Group1','Group2')) && $modx->resource->get('createdby') != $modx->user->id) {
			$modx->sendUnauthorizedPage();
		}
	}
}