Skip to content

Commit

Permalink
Initial commit
Browse files Browse the repository at this point in the history
  • Loading branch information
dima424658 committed Jun 10, 2022
1 parent 1957b7a commit 1ad5a19
Show file tree
Hide file tree
Showing 12 changed files with 960 additions and 0 deletions.
141 changes: 141 additions & 0 deletions admin/controller/analytics/metrica.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,141 @@
<?php

namespace Opencart\Admin\Controller\Extension\Yandex\Analytics;

class Metrica extends \Opencart\System\Engine\Controller
{
public function index(): void
{
$this->load->language('extension/yandex/analytics/metrica');

$this->document->setTitle($this->language->get('heading_title'));

$this->load->model('extension/yandex/analytics/metrica');

if ($this->model_extension_yandex_analytics_metrica->hasUpdates()) {
$data['notify_module_version'] = $this->language->get('text_notify_module_version');
}

$data['breadcrumbs'] = [];

$data['breadcrumbs'][] = [
'text' => $this->language->get('text_home'),
'href' => $this->url->link('common/dashboard', 'user_token' . '=' . $this->session->data['user_token'])
];

$data['breadcrumbs'][] = [
'text' => $this->language->get('text_extension'),
'href' => $this->url->link('marketplace/extension', 'user_token' . '=' . $this->session->data['user_token'] . '&type=analytics')
];

$data['breadcrumbs'][] = [
'text' => $this->language->get('heading_title'),
'href' => $this->url->link('extension/yandex/analytics/metrica', 'user_token=' . $this->session->data['user_token'])
];

$data['save'] = $this->url->link('extension/yandex/analytics/metrica|save', 'user_token=' . $this->session->data['user_token']);
$data['back'] = $this->url->link('marketplace/extension', 'user_token=' . $this->session->data['user_token'] . '&type=analytics');

$data['logo'] = $this->url->link('extension/yandex/analytics/metrica|logo', 'user_token=' . $this->session->data['user_token']);
$data['find_ya_metrica'] = $this->url->link('extension/yandex/analytics/metrica|find_ya_metrica', 'user_token=' . $this->session->data['user_token']);

$data['has_settings'] = !!$this->model_setting_setting->getSetting('analytics_metrica');
$data['analytics_metrica_status'] = $this->model_setting_setting->getValue('analytics_metrica_status');
$data['analytics_metrica_code'] = $this->model_setting_setting->getValue('analytics_metrica_code');
$data['analytics_metrica_codes'] = json_decode($this->model_setting_setting->getValue('analytics_metrica_codes'), true);
$data['analytics_metrica_log'] = $this->model_setting_setting->getValue('analytics_metrica_log');
$data['analytics_metrica_debug'] = $this->model_setting_setting->getValue('analytics_metrica_debug');

$data['log'] = '';

$file = DIR_LOGS . 'log_yandex_metrica.log';

if (file_exists($file)) {
$size = filesize($file);

if ($size >= 3145728) {
$suffix = ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];

$i = 0;

while (($size / 1024) > 1) {
$size = $size / 1024;
$i++;
}

$data['error_warning'] = sprintf($this->language->get('error_warning'), basename($file), round(substr($size, 0, strpos($size, '.') + 4), 2) . $suffix[$i]);
} else {
$data['log'] = file_get_contents($file, FILE_USE_INCLUDE_PATH, null);
}
}

$data['user_token'] = $this->session->data['user_token'];

$data['header'] = $this->load->controller('common/header');
$data['column_left'] = $this->load->controller('common/column_left');
$data['footer'] = $this->load->controller('common/footer');

$this->response->setOutput($this->load->view('extension/yandex/analytics/metrica', $data));
}


public function save(): void
{
$this->load->language('extension/yandex/analytics/metrica');

$json = [];

if (!$this->user->hasPermission('modify', 'extension/yandex/analytics/metrica')) {
$json['error']['warning'] = $this->language->get('error_permission');
}

if (isset($this->request->post['analytics_metrica_codes'])) {
foreach ($this->request->post['analytics_metrica_codes'] as $row => $metrica) {
if (empty($metrica['code'])) {
$json['error']['metrica-' . $row . '-code'] = $this->language->get('error_metric_code');
}
}
}

if (!$json) {
$this->model_setting_setting->editSetting('analytics_metrica', $this->request->post);
$json['success'] = $this->language->get('text_success');
}

$this->response->addHeader('Content-Type: application/json');
$this->response->setOutput(json_encode($json));
}

public function logo(): void
{
$this->response->addHeader('Content-Type: image/svg+xml');

if ($this->config->get('config_admin_language') === 'ru-ru') {
$this->response->setOutput(file_get_contents(DIR_EXTENSION . 'yandex/admin/view/image/analytics/metrica/logo-ru.svg'));
} else {
$this->response->setOutput(file_get_contents(DIR_EXTENSION . 'yandex/admin/view/image/analytics/metrica/logo-en.svg'));
}
}

public function findMetrica()
{
$json = $this->model_extension_yandex_analytics_metrica->findMetrica();

$this->response->addHeader('Content-Type: application/json');
$this->response->setOutput(json_encode($json));
}

public function install()
{
$this->load->model('setting/event');

$this->model_setting_event->addEvent('yandex_metrica_checkout', '', 'catalog/controller/checkout/success/before', 'extension/yandex/analytics/metrica|checkout');
}

public function uninstall()
{
$this->load->model('setting/event');

$this->model_setting_event->deleteEventByCode('yandex_metrica_checkout');
}
}
79 changes: 79 additions & 0 deletions admin/language/en-gb/analytics/metrica.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
<?php
$_['heading_title'] = 'Yandex.Metrica';

// Text
$_['text_yes'] = 'Yes';
$_['text_no'] = 'No';
$_['text_enabled'] = 'Enabled';
$_['text_disabled'] = 'Disabled';
$_['text_loading'] = 'Loading...';
$_['text_extension'] = 'Extensions';
$_['text_success'] = 'Settings changed';
$_['text_edit'] = 'Module settings';
$_['text_signup'] = 'To get started, enter the relevant Yandex.Metrica tag numbers and the company information. The tag number is specified on the page "<a href="https://metrika.yandex.ru/list">My tags</a>" in Yandex.Metrica next to the site address.
You can create a new tag in the Yandex.Metrica interface at <a href="https://metrika.yandex.ru/">https://metrika.yandex.ru/</a>';
$_['text_default'] = 'By default';
$_['text_find_metric'] = 'Find metric';
$_['text_write_logs'] = 'Record logs';
$_['text_debug'] = 'Debug mode';
$_['text_logs'] = 'Logs';
$_['text_start_of_search_metric'] = 'Start of search';
$_['text_end_of_search_metric'] = 'End of search';
$_['text_metrics_found'] = 'The following metrics were found';
$_['text_metrics_not_found'] = 'Metrics not found';
$_['text_counter_number'] = 'Tag number';
$_['text_notify_module_version'] = 'New module version detected';
$_['text_instructions'] = <<<INSTRUCTIONS
<h2>Instructions for configuring the module</h2>
</br>
<h3>"Main" tab.</h3>
<p>The main settings for the module are here.</p>
<p><b>Status</b>: Enabling/Disabling the module.</p>
<p><b>Metrics</b>: Metric codes are added here, as well as the status of enabling/disabling Session Replay for metrics.</p>
</br>
<p>To add a metric, click "+".</p>
<p>Next, in the "Metric code" column, enter the metric code created on the site <a href="https://metrika.yandex.ru/">https://metrika.yandex.ru/</a></p>
<p>Also on this tab, you can enable and disable Session Replay in the Settings column.</p>
</br>
<h3>"Metric search" tab</h3>
<p>Here you can check whether a Yandex.Metrica tag is installed on your site. To do this, go to the "Metric search" tab and click "Find metric".</p>
</br>
<h3>"Logging" tab</h3>
<p>On this tab, module error logging is enabled and disabled. When this option is enabled, entries about errors that occur will appear here.</p>
</br>
<p>To save the module settings, click the blue "Save" button in the upper-right corner.</p>
INSTRUCTIONS;

// Tabs
$_['tab_metrics'] = 'Main';
$_['tab_metric_search'] = 'Metric search';
$_['tab_logging'] = 'Logging';
$_['tab_info'] = 'Instructions';

// Column
$_['column_metric_code'] = 'Metric code';
$_['column_settings'] = 'Settings';
$_['column_sort_order'] = 'Sort order';
$_['column_name'] = 'Name';
$_['column_selector'] = 'Selector';
$_['column_action'] = 'Action';


// Entry
$_['entry_code'] = 'Yandex.Metrica code';
$_['entry_metrics_list'] = 'Metrics';
$_['entry_status'] = 'Status';
$_['entry_webvisor'] = 'Session Replay';
$_['entry_clickmap'] = 'Click Map';
$_['entry_ecommerce'] = 'E-commerce';
$_['entry_tracking_the_hash'] = 'Hash tracking in the address bar';

// Error
$_['error_permission'] = 'You do not have the rights to manage this module';
$_['error_metric_code'] = 'Metric code missing';
$_['error_selector'] = 'Selector missing';
$_['error_selector_name'] = 'Name missing';
$_['error_selector_defined'] = 'This selector has already been defined';

// Button
$_['button_remove'] = 'Remove';
75 changes: 75 additions & 0 deletions admin/language/ru-ru/analytics/metrica.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
<?php
$_['heading_title'] = 'Яндекс.Метрика';

// Text
$_['text_yes'] = 'Да';
$_['text_no'] = 'Нет';
$_['text_enabled'] = 'Включено';
$_['text_disabled'] = 'Отключено';
$_['text_loading'] = 'Загрузка...';
$_['text_extension'] = 'Расширения';
$_['text_success'] = 'Настройки успешно изменены!';
$_['text_edit'] = 'Настройки модуля';
$_['text_signup'] = 'Для начала работы укажите номер счётчика Яндекс.Метрики. Номер счётчика можно найти на странице <a href="https://metrika.yandex.ru/list/" target="_blank">"Мои счетчики"</a> в Метрике рядом с адресом сайта.<br>
Если у вас еще нет счетчика Метрики, то создайте его на сайте <a href="https://metrika.yandex.ru/" target="_blank">Метрики</a>.<br>
Убедитесь, что у вас в настройках счетчика в Метрике включена опция «Электронная коммерция». Подробнее о том, как включить электронную коммерцию можно почитать в <a href="https://yandex.ru/support/metrica/ecommerce/enabling.html" target="_blank">Справке</a>.';
$_['text_default'] = 'По умолчанию';
$_['text_find_metric'] = 'Найти метрику';
$_['text_write_logs'] = 'Записывать логи';
$_['text_debug'] = 'Режим отладки';
$_['text_logs'] = 'Логи';
$_['text_start_of_search_metric'] = 'Начало поиска';
$_['text_end_of_search_metric'] = 'Конец поиска';
$_['text_metrics_found'] = 'Найдены следующие метрики';
$_['text_metrics_not_found'] = 'Метрики не найдены';
$_['text_counter_number'] = 'Номер счетчика';
$_['text_notify_module_version'] = 'Обнаружена новая версия модуля. Узнайте подробнее про установку обновления в <a href="https://yandex.ru/support/metrica/ecommerce/opencart.html#update" target="_blank">Справке Яндекс.Метрики</a>';
$_['text_instructions'] = <<<INSTRUCTIONS
<h3>Вкладка «Основное»</h3>
<p>Этот раздел содержит основные настройки модуля.<br>
В этом разделе вы сможете включить или выключить модуль, выбрав соответствующее значение в поле "Статус".<br>
В поле "Номер счетчика" вам необходимо указать ваш номер счетчика Метрики.</p>
<p>Модуль может помочь вам обнаружить уже установленный на сайте счетчик Метрики. Чтобы узнать его номер, перейдите на вкладку "Поиск метрики" и нажмите кнопку "Найти метрику"</p>
<p><span style="color:#cf2015">Внимание!</span> Убедитесь, что в OpenCart не активирован другой аналогичный модуль, устанавливающий счетчик Метрики. Для этого перейдите на страницу Расширения → Модификации и поищите модуль с фрагментом в названии: «Metrica» или «Metrika». Если такой модуль установлен, отключите его.</p>
<p>По умолчанию опция Вебвизор включена. Она позволяет записывать визиты посетителей, чтобы вы могли более полно анализировать статистику. Вы можете включить или отключить опцию Вебвизор для каждого из ваших счетчиков Метрики.</p>
<br>
<h3>Вкладка «Поиск Метрики»</h3>
<p>На этой вкладке вы можете проверить установлен ли на вашем сайте счетчик Метрики. Чтобы узнать его номер, перейдите на вкладку "Поиск метрики" и нажмите кнопку "Найти метрику".</p>
<br>
<h3>Вкладка «Логирование»</h3>
<p>Чтобы включить запись ошибок, которые происходят во время работы модуля, на вкладке "Логирование" установите переключатель в положение «Да».</p>
<p>Подробнее о настройке модуля можно прочитать в <a href="https://yandex.ru/support/metrica/ecommerce/opencart.html" target="_blank">Справке</a>.</p>
INSTRUCTIONS;

// Tabs
$_['tab_metrics'] = 'Основное';
$_['tab_metric_search'] = 'Поиск метрики';
$_['tab_logging'] = 'Логирование';
$_['tab_info'] = 'Инструкция';

// Column
$_['column_metric_code'] = 'Номер счетчика Метрики';
$_['column_settings'] = 'Настройки';
$_['column_sort_order'] = 'Порядок сортировки';
$_['column_name'] = 'Название';
$_['column_selector'] = 'Селектор';
$_['column_action'] = 'Действие';

// Entry
$_['entry_code'] = 'Код Яндекс.Метрика';
$_['entry_metrics_list'] = 'Метрики';
$_['entry_status'] = 'Статус';
$_['entry_webvisor'] = 'Вебвизор';
$_['entry_clickmap'] = 'Карта кликов';
$_['entry_ecommerce'] = 'Электронная коммерция';
$_['entry_tracking_the_hash'] = 'Отслеживание хеша в адресной строке';

// Error
$_['error_permission'] = 'У Вас нет прав для управления данным модулем!';
$_['error_metric_code'] = 'Отсутствует номер счетчика Метрики!';
$_['error_selector'] = 'Отсутсвует селектор!';
$_['error_selector_name'] = 'Отсутсвует название!';
$_['error_selector_defined'] = 'Такой селектор уже задан!';

// Button
$_['button_remove'] = 'Удалить';
58 changes: 58 additions & 0 deletions admin/model/analytics/metrica.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
<?php

namespace Opencart\Admin\Model\Extension\Yandex\Analytics;

class Metrica extends \Opencart\System\Engine\Model
{
public function hasUpdates(): bool
{
$this->load->model('setting/extension');

if (!empty($extension = $this->model_setting_extension->getInstallByCode('yandex')) && $latestVersion = $this->getLatestVersion())
return version_compare($extension['version'], $latestVersion) < 0;
else
return false;
}

protected function getLatestVersion(): ?string
{
if ($json = json_decode($this->file_get_contents_curl('https://api.github.com/repos/dima424658/oc-yandex-metrica/releases/latest'), true))
return $json['tag_name'];
else
return null;
}

public function findMetrica(): array
{
$count_of_metrik = 0;
$codes_metrik = '';
$page_code = $this->file_get_contents_curl(HTTP_CATALOG);
$status = str_contains($page_code, 'https://mc.yandex.ru/metrika/tag.js');

if ($status) {
$regexp = '/ym\((.+?), \"init\"/';
$count_of_metrik = preg_match_all($regexp, $page_code, $matches);
$codes_metrik = $matches[1];
}

return [
'success' => $status,
'count_of_metrik' => $count_of_metrik,
'codes_metrik' => $codes_metrik,
];
}

protected function file_get_contents_curl(string $url): string
{
if ($ch = curl_init()) {
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_USERAGENT, 'OpenCart');

if (($result = curl_exec($ch)) !== false)
return $result;
}

return '';
}
}
Loading

0 comments on commit 1ad5a19

Please sign in to comment.