Статьи

Google Analytics API v3 и PHP: фильтры и диаграммы

В предыдущих частях мы говорили о том, как использовать API Google Analytics, и создали демонстрационную версию, демонстрирующую некоторые базовые функции. В этой части мы собираемся расширить демо.

Logo GA

Новая функциональность

Мы будем добавлять некоторые новые функции:

  • Диапазон дат: мы можем запрашивать данные из определенного диапазона дат.
  • Максимальные результаты: в предыдущей части мы использовали 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 ); 

Date range

Макс результаты

Наше демо дает только 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 

Итак, нам нужно создать список измерений, опцию выбора для оператора и ввод значения, которое будет использоваться в фильтре.

Dimension filter

Мы также добавили выбор для показа или не показывать правило.

Вернемся на сторону сервера, нам нужно перехватить ввод пользователя. Мы можем использовать 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; 

Without a filter

Я получил этот результат без использования фильтра.

Using a filter

На этом скриншоте я использую фильтр:

  • Не показывать (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; 

Order by

На этом снимке экрана я удалил (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.

Запуск предыдущего кода даст такой результат.

Pie chart result

Вывод

В этой части мы рассмотрели еще несколько API Google Analytics, демонстрируя его мощь и настраиваемость. Большая часть API используется в проводнике запросов Google Analytics и может быть исследована таким образом. Дайте мне знать, что вы думаете об API и об этом уроке, и не стесняйтесь проверить финальный репозиторий для тестирования демо.