Окт
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