Алексей Федоров

Алексей Федоров

Был в сети 01 апреля 2020, 14:31
Заказы не принимаю
Сергей Шлоков
Сергей Шлоков
Ну самое простое это сделать сниппет, в котором запрашивать группы
<?php
if ($modx->user->get('id')) {
	$q = $modx->newQuery('modUser',array('`modUser`.`id`'=>$modx->user->get('id')));
	$q->innerJoin('modUserGroupMember','UserGroupMembers');
	$q->innerJoin('modUserGroup','UserGroup','`UserGroupMembers`.`user_group` = `UserGroup`.`id`');
	$q->select('UserGroup.name');
	$groupsArray = array();
	if ($q->prepare() && $q->stmt->execute()) {
	    while($row = $q->stmt->fetch(PDO::FETCH_ASSOC)) {
		    $groupsArray[] = $row['name'];
	    }
	}
	// Список групп через запятую
	$userGroups = implode(',',$groupsArray);
} else {
	$userGroups = 'Аноним';
}
return $userGroups;
и вставлять его в нужное место.
Сергей Скат
Сергей Скат
Василий Наумкин
Василий Наумкин
Сергей Шлоков
Сергей Шлоков
А вот как пользователя добавить в группу «Покупатель товара N» — уже не знаю
Есть 2 часа времени? Поехали
$modx->user->joinGroup('Покупатель товара N')
Всё. Поезд дальше не идет. Просьба освободить вагоны. :)
П.С. Когда сделаю, выложу. Мне не жалко.
Wassi Wassinen
Wassi Wassinen
Нет, не удалось. Нашел решение, которое мне показалось более изящным и масштабируемым — публикую товары minishop2 через вот этот чудесный компонент

https://modstore.pro/packages/users/ms2form

Умеет публиковать категории товаров (раздел тикетов) и сами товары (тикет). Поддерживает тэги, мультикатегории, крутой редактор и т.д. Вместе с автором всё еще шлифуем компонент. На выходе, надеюсь, получится интересно.
Максим Кузнецов
Максим Кузнецов
Отлично, значит результат есть.

Теперь, если дату необходимо представить с возможностями «тикетов» — (сегодня/вчера, 5 минут назад) и так далее, то вам необходимо поставить дополнение DateAgo
modstore.pro/packages/utilities/dateago и вызывать в нужном месте таким:
[[!dateAgo? &input=`[[+pub_date:default=`[[+publishedon]]`]]`]]
или таким образом:
[[+pub_date:default=`[[+publishedon:dateAgo]]`:dateAgo]]

Если же такой необходимости нет, то преобразовать текущий результат (unix timestamp) в обычную дату можно следующим образом:

[[+pub_date:default=`[[+publishedon:strtotime:date=`%a %b %e, %Y`]`:strtotime:date=`%a %b %e, %Y`]]
(возможно, без последнего ":strtotime:date=`%a %b %e, %Y`", но точно не скажу).

Формат даты, соответственно, настраивается по желанию (вот перечень доступных).
Максим Кузнецов
Максим Кузнецов
С вашего позволения, приведу сюда пример реализации большинства пунктов (не отрицаю востребованнось решения данных задач сразу из коробки, т.к. работы для реализации этих пунктов нужно сделать прилично):

Страницы пользователей с нормальными урл

1. Создаем страницу «профиль пользователя» (не путаем с личным кабинетом), выставляем ему псевдоним, допустим users, к которой будут обращаться в виде site.ru/users?profile=имя

2. Ставим дополнение pdoTools

3. Создаем сниппет user.Profile и добавляем его в шаблон вывода
<?php
	$count = $modx->getCount('modUser', array('username' => $_GET[profile]));
	if($count <= 0){
		echo'	<h2>
				<a>Ошибка</a>
			</h2>
			<div>
				Пользователя не существует.
			</div>';
	}
	else {
		$params = array();
		$params['users'] = $_GET[profile];
		$params['showBlocked'] = '1';
		$params['tpl'] = 'user.Profile';
		$params['prepareSnippet'] = 'user.Profile.Prepare';
		
		$result = $modx->runSnippet('pdoUsers', $params);
		
		if (!empty($result)) {
			return $result;
		}
		else {
			return '<h2>
					<a>Ошибка</a>
				</h2>
				<div>
					Что-то сломалось.. Сейчас починим.
				</div>';
		}

	}
— насколько я помню, сразу вызвать pdoUsers с параметром конкретного пользователя нежелательно, т.к. если пользователя не существует, он выдает по-умолчанию весь список пользователей. Возможно, сейчас что-то поменялось или это можно обойти — не проверял.

Для данного сниппета также можно дописывать условия, если пользователь не активирован и тд и тп. При помощи параметров tpl и prepareSnippet кастомизируем до нужного уровня.

4. Дописываем в .htaccess
RewriteRule ^users/([^/]+)$ /users?profile=$1 [L]
— чтобы ссылка приняла вид site.ru/users/Имя_пользователя

Возможность добавлять поля в профиль пользователя

При регистрации: дополнение login
Для редактирования пользователем (личный кабинет) — дополнение office

Возможность указывать шаблон для оформления страницы пользователя

1. Добавляем дополнительное поле в личный кабинет пользователя (шаблон отображения)
2. В шаблоне отображения профиля пользователя дописываем классы, завязанные на полученном значении (class=«userInfo-[[+tpl.style]]»)
2.А. Если необходимо менять структуру шаблона в зависимости от выбранного пользователя значением, то в сниппете в первой части дописываем до

$params = array();
получение extended-поля по id пользователя с вытекающими условиями if, внутри которых будет разный параметр $params['tpl']

Добавить «из коробки» дату регистрации и дату последней активности

Дату регистрации — сниппет логин и 1 доп. поле.
С датой последней активности сложнее, т.к. в таблицах Modx'a, насколько я помню, есть только поле последней авторизации. Возможно, нужно завязывать на сессии +временной промежуток.

Возможность сделать станицу пользователя общедоступной для просмотра

Аналогично пункту 2.А. в разделе «шаблона отображения»
Евгений
Евгений
Abu
Abu
Оставлю памятку разграничения тикетов между пользователями и менеджерами.

1) Создается 2 группы пользователей: Users и Managers

*все действия в контексте web, роль Member

2) Создается группа ресурсов Restricted -при создании можно сразу автоматически дать доступ Administrator, анонимный доступ, дать доступ нашим группам Users,Managers (в результате в группах появляется доступ к группе ресурсов — Restricted и все пользователи могут их load,list,view (Resource))

3) Создается группа ресурсов Editable — автоматически дать доступ Administrator, дать анонимный доступ, дать доступ группам Users,Managers (в результате в группах появляется доступ к группе ресурсов — Editable)

4) Далее, чтобы можно было добавлять секции, добавляем в группах Administrator, Managers, Users —
еще один доступ к ресусам Editable, уже с политикой — TicketSectionPolicy.

5) Группам Administrator, Managers — дадим доступ и к ресурсам Restricted с политикой TicketSectionPolicy

6) Добавляем разрешенные к редактированию пользователями и менеджерами ресурсы в группу Editable, а разрешенные только к редактированию менеджерами ресурсы в Restricted — например Новости сайта в Restricted, а Вопросы пользователей в Editable.