Задача: Вывести в блок самые популярные статьи
Создадим 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)
Не писать ответ