Наверх

Простой список избранного для MODX

Ещё один пример использования customExtra — на этот раз для реализации избранного для зарегистрированных пользователей на сайте.

Сниппет написан на скорую руку, по идее нужно оформление выносить в чанки, добавлять возможность менять параметры сниппета. Кроме того, сниппет не предназначен для вызова в списке статей — только на странице конкретной статьи.

<?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 комментария

  1. Евгений 12 декабря 2021, 01:00 # 0
    Спасибо! Помоги реализовать этот механизм в списке статей, на одной странице, я отблагодарю денежкой!
    1. Илья Уткин 13 декабря 2021, 08:31 # 0
      Привет! Напиши на ilyautkin@mail.ru

    Авторизация

    через сервис Loginza:


    Шаблоны MODX

    1 2 Дальше »

    Объектная
    модель
    MODX