Сниппет написан на скорую руку, по идее нужно оформление выносить в чанки, добавлять возможность менять параметры сниппета. Кроме того, сниппет не предназначен для вызова в списке статей — только на странице конкретной статьи.
<?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 комментария