В предыдущих частях мы говорили о том, как использовать API Google Analytics, и создали демонстрационную версию, демонстрирующую некоторые базовые функции. В этой части мы собираемся расширить демо.
Новая функциональность
Мы будем добавлять некоторые новые функции:
- Диапазон дат: мы можем запрашивать данные из определенного диапазона дат.
- Максимальные результаты: в предыдущей части мы использовали 10 результатов для целей скорости, теперь мы собираемся принять это как пользовательский ввод.
- Фильтры: мы можем отфильтровать результат, используя некоторые конкретные измерения или метрики.
- Заказ: мы можем заказать результат, используя запрашиваемые размеры.
- Тип диаграммы: это не функциональность Google Analytics, но мы собираемся сделать более симпатичные графики с использованием Highcharts .
Диапазон дат
Для выбора диапазона дат мы будем использовать bootstrap-daterangepicker .
Во-первых, мы включаем файлы CSS и JS и их зависимости.
// views/home.blade.php <div class="form-group"> <label class="col-sm-3 control-label" for="">Date range</label> <div class="daterange col-md-9"> <input name="daterange" class="form-control" value="2013-01-01 - 2014-12-30"> </div> </div>
Мы создаем компонент диапазона дат.
// views/home.blade.php $('input[name="daterange"]').daterangepicker({ format: 'YYYY-MM-DD', startDate: '2013-01-01', endDate: '2013-12-31' });
В нашем GA_service@report
мы использовали последний месяц в качестве даты диапазона.
$now = new DateTime(); $end_date = $now->format('Ym-d'); $start_date = $now->modify('-1 month')->format('Ym-d');
Вместо этого мы собираемся передать начальную и конечную дату в качестве параметра методу после получения их в нашем HomeController@report
.
$daterange = explode( ' - ', Input::get('daterange') ); $start_date = $daterange[0]; $end_date = $daterange[1]; $report = $this->ga->report( $view, $start_date, $end_date, $dimensions, $metrics );
Макс результаты
Наше демо дает только 10 результатов. Мы можем сделать это настраиваемым, или принять это как пользовательский ввод. Недостатком этого является то, что отклик становится медленным и требует слишком много нагрузки, поэтому вы должны быть осторожны при его использовании.
<div class="form-group"> <label class="col-sm-3 control-label" for="">Max results</label> <div class="col-md-9"> <input name="max_results" type="text" class="form-control" value="10"> </div> </div>
После добавления входных данных в нашу форму мы можем получить параметр max_results
в нашем методе HomeController@report
и передать его в метод GA_Service@report
.
// HomeController@report $max_results = intval( Input::get('max_results') ); $report = $this->ga->report( $view, $start_date, $end_date, $max_results, $dimensions, $metrics ); // GA_Service@report $options['max-results'] = $max_results; $data = $analytics->data_ga->get( $view, $start_date, $end_date, $metrics, $options );
фильтры
В этом разделе мы пытаемся отфильтровать ответ, используя выбранные измерения и метрики.
Пример:
ga:country =@morocco
(Показать только те страны, которые содержат слово Марокко)
Фильтр размеров
В предыдущей части мы объяснили, как работают фильтры:
ga:column operator value
Итак, нам нужно создать список измерений, опцию выбора для оператора и ввод значения, которое будет использоваться в фильтре.
Мы также добавили выбор для показа или не показывать правило.
Вернемся на сторону сервера, нам нужно перехватить ввод пользователя. Мы можем использовать JS, чтобы сгруппировать переменную, отправляемую на сервер, но я пытаюсь избежать использования JS или ajax для сохранения серверной части.
Я создал новый файл GA_utils
в нашей папке app/src
. Это мы можем поставить разные функции.
При публикации формы таким способом переменные запроса должны выглядеть примерно так:
array(11) { ... ["dimension_filter_show"]=> array(2) { [0]=> string(4) "show" [1]=> string(5) "dshow" } ["dimension_filters"]=> array(2) { [0]=> string(10) "ga:keyword" [1]=> string(9) "ga:medium" } ["dimension_filter_rules"]=> array(2) { [0]=> string(7) "contain" [1]=> string(6) "regexp" } ["dimension_filter_values"]=> array(2) { [0]=> string(6) "azerty" [1]=> string(7) "morocco" } }
Чтобы сгруппировать каждый индекс с соответствующими, мы используем следующую функцию.
// app/src/GA_utils.php public static function groupFilters(array $show, array $filters, array $rules, array $values){ $count = count($filters); $group_filters = []; for( $i = 0; $i < $count; $i++ ){ // skip if no value is provided if( empty($values[$i]) ) continue; $group_filters[] = [ 'show' => $show[$i], 'column' => $filters[$i], 'rule' => $rules[$i], 'val' => $values[$i] ]; }//for return $group_filters; }//groupFilters
Теперь результат должен стать.
array(2) { [0]=> array(4) { ["show"]=> string(4) "show" ["column"]=> string(10) "ga:keyword" ["rule"]=> string(7) "contain" ["val"]=> string(6) "azerty" } [1]=> array(4) { ["show"]=> string(5) "dshow" ["column"]=> string(9) "ga:medium" ["rule"]=> string(6) "regexp" ["val"]=> string(7) "morocco" } }
Теперь, когда мы получили чистый ввод от пользователя, мы можем приступить к кодированию фильтров перед их отправкой.
public static function encodeDimensionFilters( $filters ){ $url = []; foreach ($filters as $filter) { $operator =""; if( $filter['rule'] == "contain" ){ if( $filter['show'] == "show" ) $operator = '=@'; else $operator = '!@'; } else if( $filter['rule'] == "exact" ){ if( $filter['show'] == "show" ) $operator = '=='; else $operator = '!='; } else if( $filter['rule'] == "regexp" ){ if( $filter['show'] == "show" ) $operator = '=~'; else $operator = '!~'; } $url[] = "{$filter['column']}{$operator}{$filter['val']}"; }//foreach $uri = implode( ";", $url ); //$uri = urlencode($uri); return $uri; }//encodeDimensionFilters
Эта функция возьмет предыдущий массив фильтров и закодирует его как ga:column operator value
. Это разделит их, используя точку с запятой (что означает and
— запятая or
).
На этом этапе наш метод HomeController@report
будет использовать предыдущие методы.
$filters = []; $group_filters = []; $group_filters['dimensions'] = GA_Utils::groupFilters( Input::get('dimension_filter_show'), Input::get('dimension_filters'), Input::get('dimension_filter_rules'), Input::get('dimension_filter_values') ); $filters[] = GA_Utils::encodeDimensionFilters( $group_filters['dimensions'] );
Вы можете посетить документацию для более подробного объяснения.
Перед тестированием фильтров я создам необходимый код для фильтра метрик, и мы можем протестировать все сразу.
Фильтр метрик
Фильтр метрик совпадает с фильтром измерений, за исключением того, что столбцы взяты из списка метрик, а операторы являются математическими.
$group_filters['metrics'] = GA_Utils::groupFilters( Input::get('metric_filter_show'), Input::get('metric_filters'), Input::get('metric_filter_rules'), Input::get('metric_filter_values') ); $filters[] = GA_Utils::encodeMetricFilters( $group_filters['metrics'] ); $filters = implode(';', $filters);
После получения и кодирования фильтров мы добавляем размерный и метрический фильтр точкой с запятой ( and
оператором).
ПРИМЕЧАНИЕ: размерные и метрические фильтры не могут быть объединены с помощью запятой ( or
оператора).
Теперь наш фильтр должен дать нам что-то вроде:
// show countries containing the word morocco and page views are greater than 100 ga:country=@morocco;ga:pageviews>100
Мы добавим закодированный фильтр и передадим его в GA_Service@report
в качестве параметра.
API Google Analytics принимает закодированный фильтр как параметр, например max_results
и т. Д.
// app/src/GA_Service@report $options['filters'] = $filters;
Я получил этот результат без использования фильтра.
На этом скриншоте я использую фильтр:
- Не показывать
(not set)
не указывать(not set)
страну! - Показывать только просмотры страниц больше 10.
Результаты заказа
Google Analytics дает нам хороший способ сортировки результатов:
ga : country ,- ga : pageviews
Мы можем заказать по размерам или метрикам. В нашей демонстрации я буду использовать только один список выбора, содержащий все метрики и измерения.
// app/views/home.blade.php <div class="col-md-7 nopadding"> <select class="filter_columns form-control" name="orderbys[]"> @foreach( $dimensions as $key => $group ) <optgroup label="{{ $key }}" > @foreach( $group as $dimension ) <option value="{{ $dimension->id }}">{{ $dimension->attributes->uiName }}</option> @endforeach </optgroup> @endforeach @foreach( $metrics as $key => $group ) <optgroup label="{{ $key }}" > @foreach( $group as $metric ) <option value="{{ $metric->id }}">{{ $metric->attributes->uiName }}</option> @endforeach </optgroup> @endforeach </select> </div> <div class="col-md-4 nopadding"> <select class="form-control" name="orderby_rules[]"> <option value="">ASC</option> <option value="-">DESC</option> </select> </div>
После отправки формы нам нужно сгруппировать и закодировать список заказов по правилам.
// app/src/GA_Utils.php public static function groupOrderby(array $orderbys, array $rules){ $count = count($orderbys); $group_orderbys = []; for( $i = 0; $i < $count; $i++ ){ $group_orderbys[] = [ 'column' => $orderbys[$i], 'rule' => $rules[$i] ]; }//for return $group_orderbys; }//groupOrderby public static function encodeOrderby( $orderbys ){ $res = []; foreach( $orderbys as $orderby ){ $res[] = $orderby['rule'] . $orderby['column']; }//foreach return implode( ',', $res ); }//encodeOrderby
В нашем HomeController@report
мы закодируем наш заказ входными данными.
// app/controllers/HomeController@report $orderbys = GA_Utils::encodeOrderby( GA_Utils::groupOrderby(Input::get('orderbys'), Input::get('orderby_rules') ) );
Google Analytics API принимает закодированный заказ в качестве опции.
// app/src/GA_Service@report $options['sort'] = $orderbys;
На этом снимке экрана я удалил (not set)
страну и отсортировал по стране. Подробнее о сортировке результатов вы можете прочитать в документации .
Использование диаграмм
Эта часть не связана с Google Analytics API, но если вы используете службу Google Analytics, вы заметили эти причудливые графики. В этой части я буду использовать Highcharts , и я буду использовать пример круговой диаграммы из их демонстрации .
Чтобы нарисовать круговую диаграмму, нам нужно name
и массив по оси y
[ { "name":"(not set)", "y":"1" }, { "name":"Argentina", "y":"4" }, { "name":"Belgium", "y":"15" }, { "name":"Brazil", "y":"104" } ... ]
Давайте начнем с добавления нового списка параметров выбора, содержащего параметры круговой диаграммы и таблицы.
На нашем сервере мы создадим только JSON-представление данных нашего отчета.
$json_data = []; foreach( $report['items'] as $item ){ $json_data[] = [ 'name' => $item[0], 'y' => $item[1] ]; }//foreach return View::make('report', [ 'columns' => $report['columnHeaders'], 'items' => $report['items'], 'totalResults' => $report['totalResults'], 'report_json' => json_encode($json_data), 'chart_type' => Input::get('chart_type') ]);
Единственная оставшаяся часть — поймать эти значения внутри нашего представления. Мы проверяем, хочет ли пользователь стол или пирог.
@if( $chart_type == 'pie' ) <div class="pie"> <div id="pie_canvas"></div> </div> <script src="http://code.highcharts.com/highcharts.js"></script> <script> $(function(){ var el = $("#pie_canvas"), serie_data = {{ $report_json }}; el.highcharts({ chart: { plotBackgroundColor: null, plotBorderWidth: 1, plotShadow: false }, title: { text: '' }, tooltip: { pointFormat: '{series.name}: <b>{point.percentage:.1f}%</b>' }, plotOptions: { pie: { allowPointSelect: true, cursor: 'pointer', dataLabels: { enabled: true, format: '<b>{point.name}</b>: {point.percentage:.1f} %', style: { color: (Highcharts.theme && Highcharts.theme.contrastTextColor) || 'black' } }, showInLegend: true } }, series: [{ type: 'pie', name: '', data: serie_data }] });//highchart }); </script> @else // print the table here @endif
Сначала мы highchart.js
файл highchart.js
, затем используем некоторую конфигурацию из их документации. Важной частью является serie_data = {{ $report_json }}
.
Внутри нашего контроллера мы создали массив значений, а затем закодировали эти значения для использования в нашем JS.
Примечание: при выборе круговой диаграммы вам нужно выбрать только одну метрику и одно измерение, или вам придется расширить демонстрационную версию и использовать функциональность детализации, предоставляемую highchart.
Запуск предыдущего кода даст такой результат.
Вывод
В этой части мы рассмотрели еще несколько API Google Analytics, демонстрируя его мощь и настраиваемость. Большая часть API используется в проводнике запросов Google Analytics и может быть исследована таким образом. Дайте мне знать, что вы думаете об API и об этом уроке, и не стесняйтесь проверить финальный репозиторий для тестирования демо.