Просмотры, комментарии всех дочерних тикетов

Может кому-то пригАдится пригодится сниппет для подсчета всех дочерних тикетов, их комментариев и количества просмотров. Выводит информацию по всем дочерним тикетам, вне зависимости от иерархии и вложенности. Написан на очень скорую руку (точнее, переделан и собран из сниппетов Василия), так что, почти Франкенштейн… Мне сгодился для форума на сайте, построенного на Тикетсах, в силу того, что есть вложенные разделы тикетов в другие разделы тикетов.

Итак, frankensteinTicketsInfoCount:
<?php
/* @var pdoFetch $pdoFetch */
$pdoFetch = $modx->getService('pdoFetch');
$pdoFetch->setConfig($scriptProperties);
$pdoFetch->addTime('pdoTools loaded');

$tpl = $modx->getOption('tpl', $scriptProperties, 'tpl.Tickets.comment.list.row');
$outputSeparator = $modx->getOption('outputSeparator', $scriptProperties, "\n");

// Define threads of comments
if (!empty($parents) || !empty($resources) || !empty($threads)) {
	$where = array();
	$options = array(
		'innerJoin' => array(
			'Thread' => array(
				'class' => 'TicketThread',
				'on' => '`Ticket`.`id` = `Thread`.`resource`',
			),
			'View' => array(
				'class' => 'TicketView',
				'on' => '`Ticket`.`id` = `View`.`parent`',)
		),
		'groupby' => '`Ticket`.`id`',
		'select' => array(
			'Thread' => '`Thread`.`comments`',
			'View' => 'COUNT(`View`.`parent`) as `views`',
		),
		'showUnpublished' => !empty($showUnpublished),
		'showDeleted' => !empty($showDeleted),
		'depth' => isset($depth)
			? (int)$depth
			: 10,
	);
	if (!empty($parents)) {
		$options['parents'] = $parents;
	}
	if (!empty($resources)) {
		$options['resources'] = $resources;
	}
	if (!empty($threads)) {
		$threads = array_map('trim', explode(',', $threads));
		$threads_in = $threads_out = array();
		foreach ($threads as $v) {
			if (!is_numeric($v)) {
				continue;
			}
			if ($v[0] == '-') {
				$threads_out[] = abs($v);
			}
			else {
				$threads_in[] = abs($v);
			}
		}
		if (!empty($threads_in)) {
			$where['Thread.id:IN'] = $threads_in;
		}
		if (!empty($threads_out)) {
			$where['Thread.id:NOT IN'] = $threads_out;
		}
	}

	$rows = $pdoFetch->getCollection('Ticket', $where, $options);
	$cvt = array();
	$output = array();
	
	$cvt['comments'] = 0;
	$cvt['views'] = 0;
	$cvt['tickets'] = 0;
	
	foreach ($rows as $row) {
		$cvt['comments'] += $row['comments'];
		$cvt['views'] += $row['views'];
		$cvt['tickets'] += 1;
	}
	
	$tpl = $pdoFetch->defineChunk($output);
	$output[] = empty($tpl)
		? '<pre>' . $pdoFetch->getChunk('', $cvt) . '</pre>'
		: $pdoFetch->getChunk($tpl, $cvt, $pdoFetch->config['fastMode']);
}

$pdoFetch->addTime('Returning processed chunks');

$output = implode($outputSeparator, $output);

$log = '';
if ($modx->user->hasSessionContext('mgr') && !empty($showLog)) {
	$log .= '<pre class="getCommentsLog">' . print_r($pdoFetch->getTime(), 1) . '</pre>';
}

// Return output
$output .= $log;

if (!empty($tplWrapper) && (!empty($wrapIfEmpty) || !empty($output))) {
	$output = $pdoFetch->getChunk($tplWrapper, array('output' => $output), $pdoFetch->config['fastMode']);
}

if (!empty($toPlaceholder)) {
	$modx->setPlaceholder($toPlaceholder, $output);
}
else {
	return $output;
}
Принимаемые параметры видно из кода, если нужно кому-то, опишу.
Виктор Долгий
15 июня 2016, 12:22
modx.pro
13
2 473
+4

Комментарии: 10

brioni
15 июня 2016, 15:55
0
Полезная вещь — в избранное
    Алексей Федоров
    15 июня 2016, 17:51
    0
    Тоже пытаюсь собрать форум на Тикетс. Ссылку на свой результат можешь дать?
      Виктор Долгий
      15 июня 2016, 17:55
      0
      Отправил тебе на почту.
        Андрей П
        15 июня 2016, 18:15
        0
        Мне, пожалуйста, тоже. Спасибо
          Виктор Долгий
          15 июня 2016, 19:15
          0
          Не отправляет сообщение на почту через профиль. Напиши куда скинуть тебе.
          Алексей Федоров
          15 июня 2016, 18:18
          0
          Получил, спасибо)
            Foton
            16 июня 2016, 08:55
            0
            И мне, пожалуйста!)
          but1head
          15 июня 2016, 18:34
          +1
          Может есть смысл добавить поле в бд и при заходе в дочерний раздел\тикет ставить +1?
          Грубоговоря:
          Делаем плагин, разбиваем ссылку (site.ru/forum/thread/subthread/post), ищем ресурс по array('alias' => 'thread') и ставим ему +1. Это явно быстрее отработает нежели код в шапке, учитывая что Вы его вызывать будите для каждого tplRow раздела форума (наверно). Можно вообще это на аякс повесить, после загрузки страницы.
          Ну и при выводе просто выводить это поле, total_views, например.

          Про доп.поля в БД
          Про разбив урла и поиск ресурса
            Виктор Долгий
            15 июня 2016, 19:05
            0
            Можно, конечно, но делать пока не охота, пока устраивает и так, в силу небольшого количества форумов на данном этапе, а в последующем не выводить просмотры, только тикеты и комменты. Плюс, кеширую все это по часу.
            Виктор Долгий
            16 июня 2016, 13:19
            +1
            К слову, скинул ссылку тем, кто просил, и сразу начали сайт на «надежность» проверять, спам через формы обратной связи гонять. Молодцы! ;) Вот и помогай после этого…
              Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
              10