You are here

variable.inc in GoogleTagManager 7

Same filename and directory in other branches
  1. 7.2 includes/variable.inc

Contains the variable definitions.

@author Jim Berry ("solotandem", http://drupal.org/user/240748)

File

includes/variable.inc
View source
<?php

/**
 * @file
 * Contains the variable definitions.
 *
 * @author Jim Berry ("solotandem", http://drupal.org/user/240748)
 */

/**
 * Implements hook_variable_group_info().
 */
function _google_tag_variable_group_info() {
  $groups['google_tag'] = array(
    'title' => t('Google Tag Manager'),
    'description' => t('Allows your website analytics to be managed using Google Tag Manager.'),
    'access' => 'administer google tag manager',
    'path' => array(
      'admin/config/system/google_tag',
    ),
  );
  return $groups;
}

/**
 * Implements hook_variable_info().
 */
function _google_tag_variable_info($options) {

  // Gather data.
  $groups = array(
    'general',
    'path',
    'role',
    'status',
    'advanced',
    'internal',
  );
  $common = array(
    'group' => 'google_tag',
    'localize' => TRUE,
    'multidomain' => TRUE,
  );

  // Build variables.
  $variables = array();
  foreach ($groups as $group) {
    $function = "_google_tag_variable_info_{$group}";
    $variables += $function($options);
  }
  foreach ($variables as $key => $variable) {
    $variables[$key] += $common;
  }
  return $variables;
}

/**
 * Implements hook_variable_info().
 */
function _google_tag_variable_info_general($options) {

  // Gather data.
  $args = array(
    '@path' => 'https://tagmanager.google.com/',
  );
  $description = t('The ID assigned by Google Tag Manager (GTM) for this website container. To get a container ID, <a href="@path">sign up for GTM</a> and create a container for your website.', $args, $options);

  // Build variables.
  $variables['google_tag_container_id'] = array(
    'type' => 'string',
    'title' => t('Container ID', array(), $options),
    'description' => $description,
    'default' => '',
    'validate callback' => '_google_tag_validate_container_id',
    'element' => array(
      '#attributes' => array(
        'placeholder' => array(
          'GTM-xxxxxx',
        ),
      ),
      '#size' => 12,
      '#maxlength' => 15,
      '#required' => TRUE,
    ),
  );
  return $variables;
}

/**
 * Implements hook_variable_info().
 */
function _google_tag_variable_info_path($options) {

  // Gather data.
  $args = array(
    '%blog' => 'blog',
    '%blog-wildcard' => 'blog/*',
    '%front' => '<front>',
  );
  $list_description = t('Enter one relative path per line using the "*" character as a wildcard. Example paths are: "%blog" for the blog page, "%blog-wildcard" for each individual blog, and "%front" for the front page.', $args, $options);

  // Build variables.
  $variables['google_tag_path_toggle'] = array(
    'type' => 'select',
    'title' => t('Add snippet on specific paths', array(), $options),
    'options' => array(
      GOOGLE_TAG_EXCLUDE_LISTED => t('All paths except the listed paths', array(), $options),
      GOOGLE_TAG_INCLUDE_LISTED => t('Only the listed paths', array(), $options),
    ),
    'default' => GOOGLE_TAG_EXCLUDE_LISTED,
  );
  $variables['google_tag_path_list'] = array(
    'type' => 'text',
    'title' => t('Listed paths', array(), $options),
    'description' => $list_description,
    'default' => GOOGLE_TAG_PATHS,
    'validate callback' => '_google_tag_validate_text',
    'element' => array(
      '#rows' => 10,
    ),
  );
  return $variables;
}

/**
 * Implements hook_variable_info().
 */
function _google_tag_variable_info_role($options) {
  global $language;

  // Gather data.
  // Set language code to default to prevent role names from being translated.
  // Use role name in default language as array key as this matches the values
  // attached to global user object (used when evaluating role condition). Set
  // display value to translated role name.
  // @todo This points out core would benefit from a $translate parameter to
  // user_roles() to indicate whether to translate the role names. This would be
  // used on the role and permission listing pages to consistently translate all
  // roles not just the anonymous and authenticated roles.
  $language_keep = $language->language;
  $language->language = 'en';
  $roles = user_roles();
  $language->language = $language_keep;
  foreach ($roles as $rid => $role) {

    // Set display value to translated role name.
    $roles[$role] = t($role);
    unset($roles[$rid]);
  }

  // Build variables.
  $variables['google_tag_role_toggle'] = array(
    'type' => 'select',
    'title' => t('Add snippet for specific roles', array(), $options),
    'options' => array(
      GOOGLE_TAG_EXCLUDE_LISTED => t('All roles except the selected roles', array(), $options),
      GOOGLE_TAG_INCLUDE_LISTED => t('Only the selected roles', array(), $options),
    ),
    'default' => GOOGLE_TAG_EXCLUDE_LISTED,
  );
  $variables['google_tag_role_list'] = array(
    'type' => 'options',
    'title' => t('Selected roles', array(), $options),
    'default' => array(),
    'options' => $roles,
  );
  return $variables;
}

/**
 * Implements hook_variable_info().
 */
function _google_tag_variable_info_status($options) {

  // Gather data.
  $args = array(
    '@path' => 'http://en.wikipedia.org/wiki/List_of_HTTP_status_codes',
  );
  $list_description = t('Enter one response status per line. For more information, refer to the <a href="@path">list of HTTP status codes</a>.', $args, $options);

  // Build variables.
  $variables['google_tag_status_toggle'] = array(
    'type' => 'select',
    'title' => t('Add snippet for specific statuses', array(), $options),
    'options' => array(
      GOOGLE_TAG_EXCLUDE_LISTED => t('All statuses except the listed statuses', array(), $options),
      GOOGLE_TAG_INCLUDE_LISTED => t('Only the listed statuses', array(), $options),
    ),
    'default' => GOOGLE_TAG_EXCLUDE_LISTED,
  );
  $variables['google_tag_status_list'] = array(
    'type' => 'text',
    'title' => t('Listed statuses', array(), $options),
    'description' => $list_description,
    'default' => GOOGLE_TAG_STATUSES,
    'validate callback' => '_google_tag_validate_text',
    'element' => array(
      '#rows' => 5,
    ),
  );
  return $variables;
}

/**
 * Implements hook_variable_info().
 */
function _google_tag_variable_info_advanced($options) {

  // Gather data.
  $args = array(
    '@path' => 'https://developers.google.com/tag-manager/devguide#security',
  );
  $description = t('The types of tags, triggers, and variables <strong>allowed</strong> on a page. Enter one class per line. For more information, refer to the <a href="@path">developer documentation</a>.', $args, $options);
  $args = array(
    '@path' => 'https://www.drupal.org/project/datalayer',
  );
  $markup = t('If the default data layer name is used, then enable the <a href="@path">data layer</a> module to manage the insertion of tags, triggers, and variables in one place. If a different module is used for this purpose, there may be some contamination and override of values from this and the other module.', $args, $options);
  $args = array(
    '@path' => 'https://tagmanager.google.com/#/admin',
  );
  $description2 = t('The environment ID to use with this website container. To get an environment ID, <a href="@path">select Environments</a>, create an environment, then click the "Get Snippet" action. The environment ID and token will be in the snippet.', $args, $options);

  // Build variables.
  $variables['google_tag_compact_snippet'] = array(
    'type' => 'boolean',
    'title' => t('Compact the JavaScript snippet', array(), $options),
    'description' => t('If checked, then the JavaScript snippet will be compacted to remove unnecessary whitespace. This is <strong>recommended on production sites</strong>. Leave unchecked to output a snippet that can be examined using a JavaScript debugger in the browser.', array(), $options),
    'default' => 1,
  );
  $variables['google_tag_include_file'] = array(
    'type' => 'boolean',
    'title' => t('Include the snippet as a file', array(), $options),
    'description' => t('If checked, then each JavaScript snippet will be included as a file. This is <strong>recommended</strong>. Leave unchecked to inline each snippet into the page. This only applies to data layer and script snippets.', array(), $options),
    'default' => 1,
  );
  $variables['google_tag_debug_output'] = array(
    'type' => 'boolean',
    'title' => t('Show debug output', array(), $options),
    'description' => t('If checked, then the result of each snippet insertion condition will be shown in the message area. Enable <strong>only for development</strong> purposes.', array(), $options),
    'default' => 0,
  );
  $disabled = !module_exists('datalayer');
  $variables['google_tag_data_layer'] = array(
    'type' => 'string',
    'title' => t('Data layer', array(), $options),
    'description' => t('The name of the data layer. Default value is "dataLayer". In most cases, use the default.', array(), $options),
    'default' => 'dataLayer',
    'validate callback' => '_google_tag_validate_data_layer',
    'element' => array(
      '#attributes' => array(
        'placeholder' => array(
          'dataLayer',
        ),
      ),
      '#required' => TRUE,
      '#prefix' => $disabled ? '<span>' . $markup . '</span>' : '',
    ),
  );
  $variables['google_tag_include_classes'] = array(
    'type' => 'boolean',
    'title' => t('Add classes to the data layer', array(), $options),
    'description' => t('If checked, then the listed classes will be added to the data layer.', array(), $options),
    'default' => 0,
    'validate callback' => '_google_tag_validate_listed_classes',
  );
  $variables['google_tag_whitelist_classes'] = array(
    'type' => 'text',
    'title' => t('White-listed classes', array(), $options),
    'description' => $description,
    'default' => GOOGLE_TAG_WHITELIST_CLASSES,
    'validate callback' => '_google_tag_validate_text',
    'element' => array(
      '#rows' => 5,
      '#states' => _google_tag_variable_states('google_tag_include_classes'),
    ),
  );
  $variables['google_tag_blacklist_classes'] = array(
    'type' => 'text',
    'title' => t('Black-listed classes', array(), $options),
    'description' => t('The types of tags, triggers, and variables <strong>forbidden</strong> on a page. Enter one class per line.', array(), $options),
    'default' => GOOGLE_TAG_BLACKLIST_CLASSES,
    'validate callback' => '_google_tag_validate_text',
    'element' => array(
      '#rows' => 5,
      '#states' => _google_tag_variable_states('google_tag_include_classes'),
    ),
  );
  $variables['google_tag_include_environment'] = array(
    'type' => 'boolean',
    'title' => t('Include an environment', array(), $options),
    'description' => t('If checked, then the applicable snippets will include the environment items below. Enable <strong>only for development</strong> purposes.', array(), $options),
    'default' => 0,
  );
  $variables['google_tag_environment_id'] = array(
    'type' => 'string',
    'title' => t('Environment ID', array(), $options),
    'description' => $description2,
    'default' => '',
    'validate callback' => '_google_tag_validate_environment_id',
    'element' => array(
      '#attributes' => array(
        'placeholder' => array(
          'env-x',
        ),
      ),
      '#size' => 10,
      '#maxlength' => 7,
      '#states' => _google_tag_variable_states('google_tag_include_environment'),
    ),
  );
  $variables['google_tag_environment_token'] = array(
    'type' => 'string',
    'title' => t('Environment token', array(), $options),
    'description' => t('The authentication token for this environment.', array(), $options),
    'default' => '',
    'element' => array(
      '#attributes' => array(
        'placeholder' => array(
          'xxxxxxxxxxxxxxxxxxxxxx',
        ),
      ),
      '#size' => 20,
      '#maxlength' => 25,
      '#states' => _google_tag_variable_states('google_tag_include_environment'),
    ),
  );
  return $variables;
}

/**
 * Implements hook_variable_info().
 */
function _google_tag_variable_info_internal($options) {

  // Gather data.
  $args = array(
    '@path' => 'admin/config/system/variable/realm/language/configure',
  );
  $markup = t('<strong>NOTE</strong>: If using the dataLayer module to insert these values and variable realms are in effect, then <a href="@path">check this item to be realm-specific</a>.', $args, $options);

  // Build variables.
  $visible = module_exists('datalayer') && module_exists('variable_realm');
  $variables['google_tag_data_layer_classes'] = array(
    'type' => 'properties',
    'title' => t('Data layer classes', array(), $options),
    'description' => t('The associative array of data layer classes. <strong>NOTE: If using the dataLayer module to insert these values and variable realms are in effect, then check this item.</strong>', array(), $options),
    'default' => array(),
    'element' => array(
      //       '#prefix' => $visible ? '<span>' . $markup . '</span>' : '',
      '#attributes' => array(
        'class' => array(
          'element-invisible',
        ),
      ),
    ),
  );
  return $variables;
}

/**
 * Returns states array for a form element.
 *
 * @param string $variable
 *   The name of the form element.
 *
 * @return array
 *   The states array.
 */
function _google_tag_variable_states($variable) {
  return array(
    'required' => array(
      ':input[name="' . $variable . '"]' => array(
        'checked' => TRUE,
      ),
    ),
    'invisible' => array(
      ':input[name="' . $variable . '"]' => array(
        'checked' => FALSE,
      ),
    ),
  );
}

/**
 * Element validation handler for google_tag_container_id.
 *
 * @todo This may suffice for all the elements as only the container_id has an
 *   error message. Error messages could be done for other elements by calling
 *   form_set_error('element[name]', $message).
 */
function _google_tag_validate_container_id($variable, $options, $element, $form, &$form_state) {

  // Use this routine as the variable realm form has nested values.
  $value = drupal_array_get_nested_value($form_state['values'], $element['#parents']);

  // Trim the text value.
  $value = trim($value);

  // Replace all types of dashes (n-dash, m-dash, minus) with a normal dash.
  $value = str_replace(array(
    '–',
    '—',
    '−',
  ), '-', $value);

  // Replace the text value.
  drupal_array_set_nested_value($form_state['values'], $element['#parents'], $value);
  if (!preg_match('/^GTM-\\w{4,}$/', $value)) {

    // @todo Is there a more specific regular expression that applies?
    // @todo Is there a way to "test the connection" to determine a valid ID for
    // a container? It may be valid but not the correct one for the website.
    return t('A valid container ID is case sensitive and formatted like GTM-xxxxxx.');
  }
}

/**
 * Element validation handler for google_tag_environment_id.
 */
function _google_tag_validate_environment_id($variable, $options, $element, $form, &$form_state) {

  // @todo This will not prevent checking 'include_environment' on an individual
  // variable edit form and never setting the 'environment_id'.
  $parents = $element['#parents'];
  array_pop($parents);
  $parents[] = 'google_tag_include_environment';
  $include_environment = drupal_array_get_nested_value($form_state['values'], $parents);
  $value = drupal_array_get_nested_value($form_state['values'], $element['#parents']);
  $value = trim($value);
  $value = str_replace(array(
    '–',
    '—',
    '−',
  ), '-', $value);
  drupal_array_set_nested_value($form_state['values'], $element['#parents'], $value);
  if ($include_environment && !preg_match('/^env-\\d{1,}$/', $value)) {
    return t('A valid environment ID is case sensitive and formatted like env-x.');
  }
}

/**
 * Element validation handler for google_tag_data_layer.
 */
function _google_tag_validate_data_layer($variable, $options, $element, $form, &$form_state) {
  $value = drupal_array_get_nested_value($form_state['values'], $element['#parents']);
  $value = trim($value);
  drupal_array_set_nested_value($form_state['values'], $element['#parents'], $value);
  return _google_tag_data_layer_verify($value);
}

/**
 * Element validation handler for google_tag_listed_classes.
 */
function _google_tag_validate_listed_classes($variable, $options, $element, $form, &$form_state) {
  if (!drupal_array_get_nested_value($form_state['values'], $element['#parents'])) {
    return;
  }
  $keys = array(
    'google_tag_whitelist_classes',
    'google_tag_blacklist_classes',
  );
  $variables = isset($form['#variable_edit_form']) ? $form['#variable_edit_form'] : array();
  $items = array_diff($keys, $variables);
  if (!empty($items)) {

    // Need both variables on form to validate.
    form_set_error('google_tag_include_classes', t('To validate listed classes, include the whitelist and blacklist variables in the realm variables.'));
    return;
  }
  $empty = TRUE;
  foreach ($keys as $key) {
    array_pop($element['#parents']);
    $element['#parents'][] = $key;
    $classes = drupal_array_get_nested_value($form_state['values'], $element['#parents']);
    google_tag_text_clean($classes);
    $empty &= empty($classes);
  }
  if ($empty) {
    form_set_error('google_tag_include_classes', t('Enter listed classes in at least one field, or uncheck the box.'));
    form_set_error('google_tag_whitelist_classes', '');
    form_set_error('google_tag_blacklist_classes', '');
  }
}

/**
 * Element validation handler for text values.
 */
function _google_tag_validate_text($variable, $options, $element, $form, &$form_state) {
  $value = drupal_array_get_nested_value($form_state['values'], $element['#parents']);
  google_tag_text_clean($value);
  drupal_array_set_nested_value($form_state['values'], $element['#parents'], $value);
}

Functions

Namesort descending Description
_google_tag_validate_container_id Element validation handler for google_tag_container_id.
_google_tag_validate_data_layer Element validation handler for google_tag_data_layer.
_google_tag_validate_environment_id Element validation handler for google_tag_environment_id.
_google_tag_validate_listed_classes Element validation handler for google_tag_listed_classes.
_google_tag_validate_text Element validation handler for text values.
_google_tag_variable_group_info Implements hook_variable_group_info().
_google_tag_variable_info Implements hook_variable_info().
_google_tag_variable_info_advanced Implements hook_variable_info().
_google_tag_variable_info_general Implements hook_variable_info().
_google_tag_variable_info_internal Implements hook_variable_info().
_google_tag_variable_info_path Implements hook_variable_info().
_google_tag_variable_info_role Implements hook_variable_info().
_google_tag_variable_info_status Implements hook_variable_info().
_google_tag_variable_states Returns states array for a form element.