Сортировка ресурсов по просмотрам и скачиваниям файла в MODx

Задача: Вывести в блок самые популярные статьи

Создадим TV-параметр, назовем его interesting. Тип ввода — число, точность: 2, минимальное значение: 0.

Создадим сниппет interestingCount с кодом:

if($modx->user->isAuthenticated('mgr')){ // Проверка на админа (Не хочется портить статитику)
  return false;
}
$page = $modx->getObject('modResource', $modx->resource->get('id')); //получаем ID текущего ресурса
$page->setTVValue('interesting', $page->getTVValue('interesting')+1); // Изменяем TV-параметр

Оффтоп: Проверить на админа можно и без сниппета. Можно указать в шаблоне:

[[!+modx.user.id:memberof=`Administrator`:then=`<span>Вот эту надпись увидет только админ!</span>`]]

Размещаем его в шаблоне:

[[!interestingCount]]

Выводим ресурсы через getResources (извеняюсь за тавтологию):


[[!getResources?
  &parents=`19`
  &tpl=`side-list-tpl`
  &sortbyTV=`interesting`
  &sortbyTVType=`integer`
  &sortdirTV=`DESC`
  &limit=`7`
  &depth=`0`
  &where=`{"template:=":3}`
]]

Напомню что есть что в getResources

  • parents — id родителя ресурсов, которые нужно вывести.
  • tpl — чанк-шаблон, по которому будут выведены ресурсы
  • sortbyTV — TV-параметр, по котрому будет производиться сортировка
  • sortbyTVType — тип данных, по которому будет производиться сортировка
  • sortdirTV — Метод сортировки (по убыванию)
  • limit — лимит
  • depth — насколько в глубь по дереву ресурсов будет заходить цикл. 0 - значит только непосредственно в этом паренте.
  • where — условие для фильтрации. не обязательный параметр. В данном случае выводим только ресурсы, у которых шаблон имеет id 3

Сортировка ресурсов по количеству скачиваний файла

А как насчет того чтобы посчитать кол-во загрузок файла на странице ресурса и отсортировать уже по этому параметру?

Алгоритм действий:

Создадим TV-параметр, назовем его dlcount. Тип ввода — число, точность: 2, минимальное значение: 0.

Создадим TV-параметр, назовем его dllink. Тип ввода — файл.

Создадим сниппет dlfile с кодом:

$result = array("dllink" => false, "error" => true);
if(!empty($_GET["id"]) AND (int)$_GET["id"] == $_GET["id"]){
  $page = $modx->getObject('modResource', $_GET["id"]);
  if($page){
    $dllink = $page->getTVValue('dllink');
    $dlcount = $page->getTVValue('dlcount');
    if(strlen($dllink) && $page->setTVValue('dlcount', $dlcount+1)){
      $result = array(
        "dllink" => $page->getTVValue('dllink'),
        "error" => false,
      );
    }
  }
}
echo json_encode($result);

Создаем страницу с пустым шаблоном, убеждаемся что она открывается по адресу ваш-сайт.ру/file.html, отключаем там визуальный редактор и вставляем сниппет [[!dlfile]]

В шаблоне размещаем подобную структуру (для работы скрипта нужна очень редкая библиотека jQuery):

<a href="/file.html?id=[[*id]]" class="pre-link" target="_blank">Скачать файл</a>
<script>
$("a.pre-link").click(function(e){
  e.preventDefault();
  var t = $(this);
  var link = t.attr("href");
  $.ajax({
    type: "GET",
    url:link,
    dataType:'json',
    success: function(data){
      console.log(data); //Вывод в консоль полученных данных (для отладки)
      if(data.error == false){
        t.attr("href",data.linkdl);
        window.location = data.linkdl;
      }
    },
    error: function (xhr, ajaxOptions, thrownError){
      console.log(xhr.responseText); //Вывод в консоль полученных данных в случае ошибки (для отладки)
    }
  });
});
</script>

Комментарии (1)

  1. Robin 05 февраля 2023, 14:51 # 0
    нерабочая херня
    *Комментарий будет опубликован после проверки модератором

    Похожие статьи

    Наш сайт использует куки, нажмите «ОК» если вы не против
    OK