Информер загруженных изображений для ms2Gallery



Для чего:

Если вы часто обновляете одни и те же альбомы и хотите уведомить об этом пользователей и/или в самом ресурсе хотите задокументировать хронологию обновлений.


Доступные параметры:

&parents — список родителей для сбора информации.
&depth — глубина поиска.
&dayRange — количество дней от текущей даты, в диапазоне которых совершается выборка. При &dayRange=`0` выборка не ограничивается.
&tplWrapper — чанк-обертка всех результатов. Доступны плейсхолдеры [[+day]] и [[+output]].
&tplRow — чанк с информацией об обновлениях одного документа в заданный день. Доступны плейсхолдеры [[+id]], [[+pagetitle]] и [[+count]].

Код сниппета (ms2gallery.Latest):
<?php
	if (!isset($tplWrapper)) {return;}
	if (!isset($tplRow)) {return;}
	if (!isset($dayRange)) {$dayRange = 10;}
	if (!isset($parents)) {$parents = $modx->resource->id;}
	if (!isset($depth)) {$depth = 1;}

	$modx->addPackage('ms2gallery', MODX_CORE_PATH . 'components/ms2gallery/model/');

	//Получаем начальную дату для сбора данных в нужном формате
	if ($dayRange != 0) {
		$hourRange = intval($dayRange) * 24;
		$dateCountdown = mktime(-$hourRange, 0, 0);
		$dateCountdown = date('Y-m-d 00:00:00', $dateCountdown);
	}
	//Если &dayRange=`0` - выбираем все изображения
	else {
		$dateCountdown = 0;
	}
	
	$parents = explode(",", $parents);

	$resources = $parents;
	if ($depth != 0) {
		foreach ($parents as $parent) {
			$resources =  array_merge($resources, $modx->getChildIds($parent, $depth));
		}
	}


	$q = $modx->newQuery('msResourceFile');
	$q->where(
		array(
			'`msResourceFile`.`resource_id`:IN' => $resources, 
			'`msResourceFile`.`parent`' => 0, 
			'`msResourceFile`.`active`' => 1, 
			'`msResourceFile`.`createdon`:>=' => $dateCountdown
		)
	);
	$q->leftJoin('modDocument', 'modDocument', 'modDocument.id = msResourceFile.resource_id');
	$q->sortby('`msResourceFile`.`createdon`', 'desc');
	$q->select('`msResourceFile`.`createdon`, `msResourceFile`.`id`, `msResourceFile`.`resource_id`, `modDocument`.`pagetitle`');
	
	if ($q->prepare() && $q->stmt->execute()) {
		$result = array();
		foreach ($q->stmt->fetchAll(PDO::FETCH_ASSOC) as $item) {
			//Очищаем дату до "дня"
			$day = strtotime(substr($item['createdon'], 0, 10));
			
			//Счетчик добавленных изображений для одного ресурса в рамках одного дня
			${'count_' . $day . '_' . $item['resource_id']}++;

			$data = array(
				'pagetitle' => $item['pagetitle'],
				'count' => ${'count_' . $day . '_' . $item['resource_id']}
			);
			
			$result[$day][$item['resource_id']] = $data;
		}

	}
	
	$return = '';
	
	foreach ($result as $key => $data) {
		$output = '';
		
		foreach ($data as $data_key => $data_value) {
			$output .= $modx->getChunk($tplRow, array(
				'id' => $data_key,
				'pagetitle' => $data_value['pagetitle'],
				'count' => $data_value['count']
			));
		}
		
		$return .= $modx->getChunk($tplWrapper, array(
			'day' => $key,
			'output' => $output
		));
	}
	
	return $return;

Примеры чанков для формирования результата:

&tplWrapper
<div class="item">
	<h2>[[+day:date=`%e %B %Y`]]</h2>
	<div class="text">
		<b>Обновлены:</b> <ul>[[+output]]</ul>
	</div>
</div>

&tplRow
<li>
	<b>[[+pagetitle]]</b> (<a href="[[~[[+id]]]]">+[[+count]]</a>)
</li>
Максим Кузнецов
11 апреля 2016, 06:06
modx.pro
14
2 390
+10

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

Василий Столейков
11 апреля 2016, 09:25
0
Классно! А интересно, можно ли определить ещё и пользователя, обновившего альбом? Чтобы получилась типа пользовательской ленты по типу соцсетей.
    Максим Кузнецов
    11 апреля 2016, 10:12
    +3
    Да, почему нет.

    Нужно:

    1. В выборку
    $q->select('`msResourceFile`.`createdon`, `msResourceFile`.`id`, `msResourceFile`.`resource_id`, `modDocument`.`pagetitle`');

    добавить автора изображения:
    ,`modDocument`.`createdby`

    2. Счетчик и передаваемую информацию персонализировать для каждого автора, т.е. строка:
    ${'count_' . $day . '_' . $item['resource_id']}++;
    
    $data = array(
    	'pagetitle' => $item['pagetitle'],
    	'count' => ${'count_' . $day . '_' . $item['resource_id']}
    );

    заменится на:
    ${'count_' . $day . '_' . $item['resource_id'] . '_' . $item['createdby']}++;
    
    $data = array(
    	'pagetitle' => $item['pagetitle'],
    	'info' => array(
    		'count' => ${'count_' . $day . '_' . $item['resource_id'] . '_' . $item['createdby']},
    		'createdby' => $item['createdby']
    	)
    );

    3. В цикл передачи данных в чанк:
    foreach ($data as $data_key => $data_value) {
    	$output .= $modx->getChunk($tplRow, array(
    		'id' => $data_key,
    		'pagetitle' => $data_value['pagetitle'],
    		'count' => $data_value['count']
    	));
    }

    Нужно передавать айди, заголовок и связку информации об авторе и количестве добавленных им изображений:
    foreach ($data as $data_key => $data_value) {
    	$output .= $modx->getChunk($tplRow, array(
    		'id' => $data_key,
    		'pagetitle' => $data_value['pagetitle'],
    		'output' =>$modx->getChunk($tplUser, array(
    			'count' => $data_value['info']['count'],
    			'createdby' => $data_value['info']['createdby']
    		))
    	));
    }
    — соответственно, появится новый чанк &tplUser. Вот пример его содержания:
    [[+count]] изображений от [[+createdby:userinfo=`fullname`]]

    А чанк &tplRow изменится на такой:
    <li>
    	В альбом<b>[[+pagetitle]]</b> добавлены: [[+output]]
    </li>

    Вроде ничего не забыл..)
      Василий Столейков
      11 апреля 2016, 10:17
      0
      Круто, спасибо!
      Нужно будет опробовать — если объединить с загрузкой в ms2Gallery с фронта — то получится хорошая основа для соцсети.
        Максим Кузнецов
        11 апреля 2016, 10:21
        +1
        Не за что..)

        Если не трудно — отпишитесь потом, если реализация выйдет удобной. Я схожую задачу реализовал через (не рекламы ради) связку Tickets + UserFiles и плагин на OnDocFormSave, который при выполнении условий перепривязывал загруженные изображения на свежесозданный документ.

        А ms2guploader все никак не доберусь протестировать + интересует, дружит ли он с облачной загрузкой.
      Максим Кузнецов
      11 апреля 2016, 10:31
      0
      UPD: не успел отредактировать — в передачу данных по «автору добавления / количеству изображений»:
      'output' =>$modx->getChunk($tplUser, array(
      	'count' => $data_value['info']['count'],
      	'createdby' => $data_value['info']['createdby']
      ))
      — нужно результат загнать в цикл по $data_value['info']['createdby'].
    Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
    8