2016
19
Окт

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

grigoriev
12681
Cчетчик скачиваний
посмотреть click css
DEMO

Решил посмотреть сколько раз скачивают один из моих скриптов с сайта. Для этого решил написать счётчик скачиваний файлов для сайта. В интернете много реализаций данной задачи, но тем неменее ознакомтесь с моим решением.

Логика работы счётчика скачивания довольна проста. Для его реализации будем использовать мой любимый 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

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

You have no rights to post comments

Используя данный сайт, вы даете согласие на использование файлов cookie, помогающих мне сделать его удобнее для вас. Уведомление о cookie