Окт
Cчетчик скачиваний для сайта

Решил посмотреть сколько раз скачивают один из моих скриптов с сайта. Для этого решил написать счётчик скачиваний файлов для сайта. В интернете много реализаций данной задачи, но тем неменее ознакомтесь с моим решением.
Логика работы счётчика скачивания довольна проста. Для его реализации будем использовать мой любимый ajax. Вешаем на кнопку при возникновении событи clik
обращение через ajax к php файлу счётчика. В php происходит обработка ajax запроса и запись в текстовый файл цифры суммарного количества скачек. После удачной
записи возвращается ответ с суммарным счётчиком скачиваний и происходит редирект пользователя на ссылку для скачки файла (файл скачивается). Вот такая вот простая логика
Теперь начнём её реализовать. Заранее создадим скачиваемый файл test.zip. Сделаем код кнопки и покажем счётчик скачек.
<button data-download="/download/test.zip" id="btnSend">Скачать файл</button> <h3>Количество скачек: <span id="countView"></span></h3>
Мы создали кнопку с id="btnSend", выводить счётчик будем в span с id="countView", в атрибуте data-download
будем хранить ссылку на скачиваемый файл
Теперь давайте прикрутим к кнопке обработчик клика. Здесь уже будем использовать js и jquery. Про то как реализовать clik силами jquery можно
почитать здесь. Но перед установкой обработчика клика мы будем ajax обращаться к файлу count.php,
в котором будет заключена вся работа счётчика. Подробнее о передаче данных ajax можно почитать здесь.
Это нужно что бы вывести из файла куда пишет счётчик, количество уже сделанных закачек и вывести их в
span с id="countView"
/*получаем текущее кол-во закачек*/
$(document).ready(function(){
//запрещаем кещировать ajax запрос
//иначе счётчик будет брехать
$.ajaxSetup({cache: false});
var html;
$.ajax({
//как будем передавать данные
type: "GET",
//куда передаём
url: "count.php",
//какие данные передаём
data: {flag: 2},
//событие после получения ответа от count.php
success: function(data){
html=data;
//выводим текущее кол-во закачек
$('#countView').html(html);
}
});
/*вешаем событие на кнопку скачать файл*/
var clickevent=false;//флаг проверки нажатия
//обработчик клика
$('#btnSend').click(function(){
if(!clickevent){
$.ajax({
//как будем передавать данные
type: "GET",
//куда передаём
url: "count.php",
//какие данные передаём
data: {flag: 1},
//событие перед отправкой ajax
beforeSend: function(){
//если кнопка была нажата то труе
clickevent=true;
},
//событие после получения ответа,
//получаем данные в data
success: function(data){
//после выполнения действий разрешаем опять
//обрабатывать клик по кнопке
clickevent=false;
html=data;
//выводим новый счётчик
$('#countView').html(html);
//получаем ссылку из data-download
//редиректит по ссылке скачки, качаем файл
window.location.href = $('#btnSend').data('download');
}
});
}
return false;//запрещаем обрабатывать событие при клике
});
});
Для предотвращения повторного ошибочного нажатия кнопки отправки я ввёл в скрипт флаг clickevent. Пока не вернётся ответ
от count.php с обновившимися данными счётчика клик по кнопке будет запрещён. Я так думаю работа кода после клика по кнопке более менее ясна.
После клика по кнопке скачать в файл count.php передаются данные, там они обрабатываются и возвращается обновлённые данные счётчика, происходит редирект на
ссылку скачивания и соответственно сама закачка файла.
Давайте теперь разберём сердце нашего скрипта, а именно файл count.php.
function clearInt ($date){
//приводим date к числу, не отрицательному
return abs((int)$date);
}
if($_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest') {
//проверяем какой флаг пришёл
if(clearInt($_GET['flag']==1)) {
//открываем файл для чтения
$f=fopen("mycount.txt","a+");
//закрывает доступ к файлу из других программ
flock($f,LOCK_EX);
//получаем из файла значение счётчика
$count=fread($f,100);
//плюсуем счётчик
@$count++;
//затираем файл
ftruncate($f,0);
//пищем новое покакзание счётчика
fwrite($f,$count);
//закрываем файл
fclose($f);
//возвращаем значение
echo $count;
}
if(clearInt($_GET['flag']==2)) {
$c=fopen("mycount.txt","a+");
flock($c,LOCK_EX);
$festc=fread($c,100);
fclose($c);
//возвращаем значение
echo $festc;
}
}
Здесь я то же думаю всё просто. Если приходит флаг 1 то делаем перезапись счётчика. Если приходит флаг 2 то просто возвращаются данные о количестве закачек. Всё остальное я думаю понятно из комментариев в коде.
Cчетчик скачиваний Joomla
Решил прикрутить подобный счётчик на один из моих проектов на joomla. По идее нужно конечно написать либо отдельный модуль, либо интегрировать код в
контроллер компонента com content, что бы данные счётчика писались не в файл, а в бд и для каждой статьи отдельно. Но на на такую разработку нет времени и
я решил вопрос более просто. Счётчик мне был нужен для одной страницы. Я взял файл count.php и перенёс его в шаблон джумла, который на данный момент подключён (
в корне сайта templates/ваш_шаблон). Не забываем вставить в самый верх count.php код defined('_JEXEC') or die; (это для джумла). Кнопку закачки вставляем в
создаваемую нами страницу, а js код можно так же встроить в страницу, либо подключить отдельным файлом. У меня например отдельным файлом (он находится в папке js шаблона).
В самом шаблоне в хедере происходит подключение через код
<script type="text/javascript" src="/<?php echo $this->baseurl ?> /templates/<?php echo $this->template ?>/js/myjs.js"></script>
И не забываем get запросом ajax мы обращаемся по адресу url: "/index.php?tmpl=count", а не url: "count.php",. Вот так вот
просто я прикрутил счётчик скачиваний файлов к joomla.
Комментарии
Ovescor
14.12.2016 03:53 Ответить
А попроще никак? У меня тупо слово-ссылка на скачку.
Алексей
14.12.2016 14:52 Ответить
А как у вас реализован показ количества закачек с этой ссылки? Так то да, делаете ссылку на архив например с расширением zip и сервер (если он правильно настроен) понимает что этот файл нужно скачать, вопрос как реализовать подсчёт количества закачек.
Дмитрий
07.10.2017 17:54 Ответить
Нифига ничего не понятно. Структура папок и файлов. Какой файл и как называется.... В каком файле какой код.... Трудно написать что этот код вписываем в файл например index, а этот код в файл обработчик с таким то названием....?? ? И так далее... Можете пояснить подробнее ?
Алексей Григорьев
07.10.2017 21:40 Ответить
Да, может быть я не совсем точно объяснил расстановку файлов. В общем есть файл index.php в нём html код кнопки скачки, выводится счётчик закачек, и js код ajax запросов к файлу count.php. При загрузке в браузер файла index.php автоматически отправляется к count.php флаг 2. При получении этого флага count.php выдаёт цифру скачек взятого из файла mycount.txt потом этот счётчик выводится в index.php. Если в index.php была нажата кнопка скачки то в count.php летит флаг 1. По этому флагу count.php берёт цифру из mycount.txt прибавляет к ней 1 и новое число перезаписывает в mycount.txt. Новое число выводится в index.php