convertcontacts-8.x-1.0/convertcontacts.module
convertcontacts.module
<?php
/**
* @file
* Drupal Module: ConvertContacts.
*
* Adds the required Javascript to all your Drupal pages to allow tracking by
* the ConvertContacts package.
*
* @author: ReachLocal <https://www.drupal.org/user/3405578>
*/
use Drupal\Core\Routing\RouteMatchInterface;
use Drupal\Component\Utility\Unicode;
/**
* Define default path exclusion list to remove tracking from admin pages.
*/
define('CONVERTCONTACTS_PAGES', "/admin\n/admin/*\n/batch\n/node/*\n/node/*/*\n/user/*\n/user/*/*");
/**
* Implements hook_help().
*/
function convertcontacts_help($route_name, RouteMatchInterface $route_match) {
switch ($route_name) {
// Main module help for the facebook_pixel module.
case 'help.page.convertcontacts':
return t('<a href="@convertcontacts">ConvertContacts</a> offers lead & call tracking, lead notifications & nurturing, ROI reports, analytics & insights, and mobile app & alerts.', array('@convertcontacts' => 'http://www.reachlocal.com'));
default:
}
}
/**
* Convert site_id from 'fc62c28f-3f38-4812-85c3-b3fe1329dba8' to '555/6e6/569/cfc4c23ac7e7ab663b58748.js';
* Return '//cdn.rlets.com/capture_configs/fc6/2c2/8f3/f38481285c3b3fe1329dba8.js'
*/
function convertcontacts_code_snippet_src($reachlocal_tracking_id) {
$site_id = array();
array_push($site_id, (substr($reachlocal_tracking_id, 0, 8)));
array_push($site_id, (substr($reachlocal_tracking_id, 9, 4)));
array_push($site_id, (substr($reachlocal_tracking_id, 14, 4)));
array_push($site_id, (substr($reachlocal_tracking_id, 19, 4)));
array_push($site_id, (substr($reachlocal_tracking_id, 24, 12)));
$flattened_site_id = implode("",$site_id);
$snippet_src = array();
array_push($snippet_src, '//cdn.rlets.com/capture_configs/');
array_push($snippet_src, (substr($flattened_site_id, 0, 3)));
array_push($snippet_src, '/');
array_push($snippet_src, (substr($flattened_site_id, 3, 3)));
array_push($snippet_src, '/');
array_push($snippet_src, (substr($flattened_site_id, 6, 3)));
array_push($snippet_src, '/');
array_push($snippet_src, (substr($flattened_site_id, 9, 23)));
array_push($snippet_src, '.js');
return implode('', $snippet_src);
}
/**
* Implements hook_page_attachments().
*/
function convertcontacts_page_attachments(array &$page){
$config = \Drupal::config('convertcontacts.convertcontactsconfig');
$id = $config->get('convertcontacts_id');
if (preg_match('/^[A-Z0-9]{8}(-[A-Z0-9]{4}){3}-[A-Z0-9]{12}$/i', $id) && _convertcontacts_visibility_pages()) {
// Attach tracker code.
$page['#attached']['library'][] = 'convertcontacts/mms';
}
}
/**
* Determine which pages should run the Capture Code.
*
* Based on visibility setting this function returns TRUE if Capture
* code should be added to the current page, otherwise FALSE.
*/
function _convertcontacts_visibility_pages() {
static $page_match;
$config = \Drupal::config('convertcontacts.convertcontactsconfig');
$visibility = $config->get('convertcontacts_visibility_pages');
$setting_pages = CONVERTCONTACTS_PAGES;
// Match path if necessary.
if (!empty($setting_pages)) {
// Convert path to lowercase. This allows comparison of the same path
// with different case. Ex: /Page, /page, /PAGE.
$pages = Unicode::strtolower($setting_pages);
if ($visibility < 2) {
// Convert the Drupal path to lowercase.
$path = Unicode::strtolower(\Drupal::service('path.alias_manager')->getAliasByPath(\Drupal::service('path.current')->getPath()));
// Compare the lowercase internal and lowercase path alias (if any).
$page_match = \Drupal::service('path.matcher')->matchPath($path, $pages);
if ($path != \Drupal::service('path.current')->getPath()) {
$page_match = $page_match || \Drupal::service('path.matcher')->matchPath($_GET['q'], $pages);
}
// When $visibility has a value of 0, the tracking code is displayed on
// all pages except those listed in $pages. When set to 1, it
// is displayed only on those pages listed in $pages.
$page_match = !($visibility xor $page_match);
}
elseif (\Drupal::moduleHandler()->moduleExists('php')) {
$page_match = php_eval($setting_pages);
}
else {
$page_match = FALSE;
}
}
else {
$page_match = TRUE;
}
return $page_match;
}
/**
* Delete cached files and directory.
*/
function convertcontacts_clear_js_cache() {
$path = 'public://convertcontacts';
if (file_prepare_directory($path)) {
file_scan_directory($path, '/.*/', array('callback' => 'file_unmanaged_delete'));
drupal_rmdir($path);
// Change query-strings on css/js files to enforce reload for all users.
_drupal_flush_css_js();
watchdog('convertcontacts', 'Local cache has been purged.', array(), WATCHDOG_INFO);
}
}
/**
* Implements hook_library_info_alter().
*
* Override the script js in convertcontacts.libraries.info with the site id for the reachcode snippet.
*/
function convertcontacts_library_info_alter(array &$libraries, $module) {
$config = \Drupal::config('convertcontacts.convertcontactsconfig');
$id = $config->get('convertcontacts_id');
$snippet = convertcontacts_code_snippet_src($id);
$libraries['mms']['js'] = array($snippet=>array('type'=>'external', 'attributes'=>array('async'=>'async')));
}
