Сuriosity

Сuriosity

С нами с 19 марта 2015; Место в рейтинге пользователей: #170
Максим Кузнецов
20 мая 2018, 11:44
1
+4
Способ 1:

1. Создаешь страницу «Дневники» (/diary/), в которой будут храниться дневники всех пользователей. Лучше сделать страницу коллекцией, чтобы админка не захламлялась.

2. Создаешь плагин, который при регистрации пользователя нужной группы создает раздел с тикетами в странице из шага 1. Код плагина будет примерно таким.

3. Для шаблона разделов с дневниками и страниц с записями (тикеты) закрываешь просмотр всем, кроме администратора и автора:
{if $_modx->isAuthenticated($_modx->context.key) == 0}
	Для просмотра публикации необходимо авторизоваться
{else}
	{if ($_modx->user.id | ismember : 'Administrator') || ($_modx->user.id == $_modx->resource.createdon)}
		Контент
	{else}
		{$_modx->sendRedirect($_modx->makeUrl(1), ['responseCode' => 'HTTP/1.1 403 Forbidden'])}
	{/if}
{/if}

4. Закрываем страницы от индексации, sitemap-a и прочее СЕО.

Плюсы: все дневники пользователей и записи разделены как в админке, так и во фронтэнде. Решение достаточно простое и, фактически, ограничивается возможностями дополнений из коробки.

Минусы: плодятся множество страниц. При большом объеме пользователей и их хорошей активности, объем БД и нагрузка на процессоры, связанные с работой ресурсов MODX-a (очистка кэша, генерация дерева и тд) будет выше, чем от самостоятельной таблицы.


Способ 2:

1. Создаешь раздел тикетов «Дневники» (/diary/). Все тикеты всех пользователей добавляются в данный раздел.

2. В шаблоне из пункта 1 совершаешь проверку пользователей по такому принципу:
{if $_modx->isAuthenticated($_modx->context.key) == 0}
	Для просмотра публикации необходимо авторизоваться
{else}
	{if ($_modx->user.id | ismember : 'Administrator')}
		{var $where = ''}
	{else}
		{var $where = ' "createdby": ' ~ $_modx->user.id}
	{/if}

	Дальше передаем {$where} в сниппет, выводящий список тикетов, чтобы показывать лишь нужные данные.
{/if}

3. Аналогично закрываем страницу тикета, sitemap, СЕО и тд и тп.

Плюсы: меньше разделов тикетов и глубина вложенности страниц, чем в пункте 1.

Минусы: не так удобно смотреть записи из админки.


Способ 3:

1-N. Написать свою таблицу с нужными полями, свою маршрутизацию запросов и вообще все с нуля.

Плюсы: самое быстрая итоговая скорость, минимально отягощающая работу самого MODX-a.

Минусы: реализация займет гораздо больше времени, а требования к навыкам намного выше.
Василий Наумкин
01 мая 2015, 20:31
2
+1
<?php
$pls = array();

$c = $modx->newQuery('TicketAuthor');
$c->select('MAX(votes_tickets_up + votes_tickets_down)');
if ($c->prepare() && $c->stmt->execute()) {
	$pls['maxticketsvote'] = $c->stmt->fetchColumn();
}

$c = $modx->newQuery('TicketAuthor');
$c->select('MAX(votes_comments_up + votes_comments_down)');
if ($c->prepare() && $c->stmt->execute()) {
	$pls['maxcommvote'] = $c->stmt->fetchColumn();
}

$modx->setPlaceholders($pls);

После вызова можно использовать плейсхолдеры
[[+maxticketsvote]] и [[+maxcommvote]]