Информер загруженных изображений для 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>
Комментарии: 8
Классно! А интересно, можно ли определить ещё и пользователя, обновившего альбом? Чтобы получилась типа пользовательской ленты по типу соцсетей.
Да, почему нет.
Нужно:
1. В выборку
добавить автора изображения:
2. Счетчик и передаваемую информацию персонализировать для каждого автора, т.е. строка:
заменится на:
3. В цикл передачи данных в чанк:
Нужно передавать айди, заголовок и связку информации об авторе и количестве добавленных им изображений:
А чанк &tplRow изменится на такой:
Вроде ничего не забыл..)
Нужно:
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>
Вроде ничего не забыл..)
Круто, спасибо!
Нужно будет опробовать — если объединить с загрузкой в ms2Gallery с фронта — то получится хорошая основа для соцсети.
Нужно будет опробовать — если объединить с загрузкой в ms2Gallery с фронта — то получится хорошая основа для соцсети.
Не за что..)
Если не трудно — отпишитесь потом, если реализация выйдет удобной. Я схожую задачу реализовал через (не рекламы ради) связку Tickets + UserFiles и плагин на OnDocFormSave, который при выполнении условий перепривязывал загруженные изображения на свежесозданный документ.
А ms2guploader все никак не доберусь протестировать + интересует, дружит ли он с облачной загрузкой.
Если не трудно — отпишитесь потом, если реализация выйдет удобной. Я схожую задачу реализовал через (не рекламы ради) связку Tickets + UserFiles и плагин на OnDocFormSave, который при выполнении условий перепривязывал загруженные изображения на свежесозданный документ.
А ms2guploader все никак не доберусь протестировать + интересует, дружит ли он с облачной загрузкой.
Расскажите подробнее, если не затруднит, как Вы реализовали связку Tickets + UserFiles.
Примерно вот так.)
Спасибо: )
UPD: не успел отредактировать — в передачу данных по «автору добавления / количеству изображений»:
'output' =>$modx->getChunk($tplUser, array(
'count' => $data_value['info']['count'],
'createdby' => $data_value['info']['createdby']
))
— нужно результат загнать в цикл по $data_value['info']['createdby'].
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.