Сниппет написан на скорую руку, по идее нужно оформление выносить в чанки, добавлять возможность менять параметры сниппета. Кроме того, сниппет не предназначен для вызова в списке статей — только на странице конкретной статьи.
<?php
// Избранное доступно только для авторизованных пользователей
if (!$modx->user->id) return;
// Иконка и подсказка по умолчанию
$icon = 'fa fa-star-o';
$title = 'Добавить в избранное';
// Флаг наличия статьи в избранном
$in_fav = false;
// Параметры ресурса
$id = $modx->resource->id;
$pagetitle = $modx->resource->pagetitle;
$uri = $modx->resource->uri;
// Параметры пользователя
$user = $modx->user->id;
$fullname = $modx->user->Profile->fullname;
$user_link = '?a=security/user/update&id=' . $user;
// Массив для сохранения данных в CustomExtra
$fav_item = array('id1' => $user, 'id2' => $id);
// Проверяем, нужно ли добавлять в избранное или только вывести
$is_action = isset($_POST['favorite']) && $_POST['favorite'];
// Подключаем пакет CustomExtra
$modx->addPackage('customextra',
$modx->getOption('core_path').'components/customextra/model/'
);
if ($fav = $modx->getObject('customExtraItem', $fav_item)) {
// Если ресурс уже в избранном, по запросу удаляем его
if ($is_action) {
$fav->remove();
} else {
$in_fav = true;
}
} else {
// Если нет - добавляем в избранное
if ($is_action) {
// Для удобства записываем данные пользователя и страницы
$fav_item['name'] = '<a href="'.$user_link.'">'.$fullname.'</a>';
$fav_item['description'] = '<a href="/'.$uri.'">'.$pagetitle.'</a>';
$fav = $modx->newObject('customExtraItem', $fav_item);
$fav->save();
$in_fav = true;
}
}
// Если страница в избранном, меняем иконку и подсказку
if ($in_fav) {
$icon = 'fa fa-star';
$title = 'Убрать из избранного';
}
// Выводим иконку с JS-скриптом для запросов
$output = '<span id="favorite">
<a href="'.$uri.'#favorite" title="'.$title.'"
onclick="$.ajax({
url: document.location.href,
type: \'POST\',
data: { favorite : 1 },
success: function(content) {
$(\'#favorite\').replaceWith(content);
}
}); return false;"><i class="'.$icon.'"></i></a>
</span>';
// Для AJAX-запроса выводим только результат
if ($is_action) {
print $output;
die();
} else {
return $output;
}Вывести избранные статьи для пользователя можно, например, так:
[[!+modx.user.id:eq=`0`:then=`Пожалуйста, авторизуйтесь на сайте`:else=``]]
[[!pdoResources?
&class=`customExtraItem`
&loadModels=`customextra`
&sortby=`{ "id" : "ASC" }`
&where=`{ "id1":[[!+modx.user.id]] }`
&tpl=`@INLINE {{+id2}}`
&outputSeparator=`,`
&toPlaceholder=`resources`
]]
[[!pdoPage:default=`В избранном пусто`?
&element=`getTickets`
&parents=`0`
&resources=`[[!+resources]]`
&sortby=`FIELD(Ticket.id, [[!+resources]])`
]]
[[!+page.nav]]
Объектная
2 комментария