Сегодня продолжим тему использования сервиса Bit.ly вместе с PHP фреймворком Yii. В прошлой части мы рассмотрели создание коротких ссылок для страниц вымышленного сайта с новостями.
В этой части мы создадим отдельную страницу, на которой будет отображаться статистика переходов по коротким ссылкам.
Приступим.
Шаг первый. Добавляем новое поле в модель.
На данный момент у нас есть модель News
, которая содержит следующие поля:
n_id
– первичный ключ;
n_title
– заголовок новости;
n_content
– текст новости;
n_short_url
– короткая ссылка (не обязательное поле).
Мы добавим ещё одно поле n_clicks
, в которое будем записывать количество переходов по короткой ссылке.
class News extends CActiveRecord { public $n_clicks; ...
Сохранять значение этого поля в базе данных не нужно, ведь оно будет очень быстро устаревать, поэтому мы будем получать его с сервиса Bit.ly при каждой загрузке страницы со статистикой.
Шаг второй. Создаём метод для получения статистики.
В прошлой части мы создали компонент BitLyShortener
с методом получения короткой ссылки. Используем этот же компонент и добавим в него новый метод.
public static function getStatistics(&$models) { //если массив пуст - не делаем ничего if (0 == count($models)) { return; } /* В запросе к Bit.ly можно передать до 15 ссылок. Поэтому сначала формируем общую часть запроса, а затем - добавляем в цикле ссылки, для которых нужно получить статистику. */ $requestBase = 'http://api.bit.ly/v3/clicks?' .'login='.self::LOGIN .'&apiKey='.self::APIKEY .'&format=json'; //разбиваем массив с моделями на блоки по 15 элементов $modelsChunks = array_chunk($models, 15, true); //для каждого блока формируем и отправляем запрос foreach ($modelsChunks as $i => $chunk) { $request = $requestBase; foreach ($chunk as $key => $model) { $request .= '&shortUrl='.urlencode($model->n_short_url); } $response = file_get_contents($request); $res = json_decode($response, true); //сохраняем результаты foreach ($chunk as $key => $model) { $models[$key]->n_clicks = $res['data']['clicks'][$key - $i*15]['global_clicks']; } } }
Принцип получения статистики такой же, как и принцип создания короткой ссылки. Нужно отправить специальным образом сформированный запрос. Но есть нюанс.
Сервис Bit.ly накладывает ограничение на количество ссылок, для которых можно получить статистику. На данный момент обрабатывается не более 15 ссылок на запрос.
Поэтому мы разбиваем массив с короткими ссылками на блоки по 15 штук, и для каждого блока отправляем отдельный запрос.
Вообще сервис возвращает несколько значений
"clicks": [ { "short_url": "http://tcrn.ch/a4MSUH", //короткая ссылка "global_hash": "bWw49z", //глобальный хеш идентификатора bit.ly "user_clicks": 0, //количество кликов по данной ссылке "user_hash": "a4MSUH", //идентификатор пользователя bit.ly "global_clicks": 1105 //количество кликов по всем коротким ссылкам, которые соответствуют данному полному URL },
Из всех этих параметров нам нужен только global_clicks
. Его мы и записываем в исходный массив с новостями.
Шаг третий. Создаём страницу со статистикой.
Для этого добавим в контроллер метод actionStatistics
public function actionStatistics() { $criteria = new CDbCriteria; $pages = new CPagination(News::model()->count($criteria)); $pages->pageSize = self::PAGE_SIZE; $models = News::model()->findAll($criteria); //получаем данные о посещаемости от Bit.ly BitLyShortener::getStatistics($models); $this->render('statistics', array('models'=>$models)); }
И создаём представление protected/views/news/statistics.php
<?php foreach ($models as $model) { ?> <p> <strong><?php echo $model->n_title; ?></strong><br /> Короткая ссылка: <?php echo $model->n_short_url; ?><br /> Количество переходов: <?php echo $model->n_clicks; ?> </p> <?php } //TODO добавить листалку страниц //end of statistics.php
В результате, по адресу index.php?r=news/statistics
должна появиться страница со статистикой.
Как видите, ничего сложного. Главное, не ошибиться при составлении запроса для Bit.ly.
Архив с файлами для этого примера (необходимо распаковать в папку protected).
SourceВсе вопросы и замечания пишите в комментариях. Постараюсь ответить 😉
Интересно почитать
В магазине gamesdealer.ru есть все для покера: карты, фишки и покерные наборы.
Магазин Irobot-home.ru: лучшие роботы пылесосы от iRobot.