You are here

commerce.install in Commerce Core 7

Same filename and directory in other branches
  1. 8.2 commerce.install

File

commerce.install
View source
<?php

/**
 * Performs database updates and uninstallation cleanup for the Commerce module.
 */

/**
 * Implements hook_install().
 */
function commerce_install() {

  // Give commerce.module a higher weight than field.module so we can use
  // hook_system_info_alter() to override the dependencies it adds.
  $weight = db_select('system', 's')
    ->fields('s', array(
    'weight',
  ))
    ->condition('name', 'field', '=')
    ->execute()
    ->fetchField();
  db_update('system')
    ->fields(array(
    'weight' => $weight + 1,
  ))
    ->condition('name', 'commerce', '=')
    ->execute();
}

/**
 * Implements hook_uninstall().
 */
function commerce_uninstall() {
  variable_del('commerce_default_currency');
  variable_del('commerce_enabled_currencies');
  variable_del('commerce_password_length');
}

/**
 * Update Rules to use new prefixed parameter names and tokens.
 */
function commerce_update_7100() {
  drupal_flush_all_caches();

  // Loop over all defined Rules configurations.
  foreach (rules_config_load_multiple(FALSE) as $rule) {
    $events = FALSE;
    if ($rule instanceof RulesContainerPlugin) {
      if ($rule instanceof RulesReactionRule) {
        $events = $rule
          ->events();
      }
      _commerce_update_rule_container_tokens($rule, $events);
    }
    else {
      _commerce_update_rule_tokens($rule, $events);
    }
  }
  return t('Rules updated to match new parameter names and token names.');
}

/**
 * Iterates over a container's children to recursively find non-container
 * plugins whose parameters should be updated.
 */
function _commerce_update_rule_container_tokens($rule, $events) {
  foreach ($rule
    ->getIterator() as $child) {
    if ($child instanceof RulesContainerPlugin) {
      if ($rule instanceof RulesReactionRule) {
        $events = $rule
          ->events();
      }
      _commerce_update_rule_container_tokens($child, $events);
    }
    else {
      _commerce_update_rule_tokens($child, $events);
    }
  }
}

/**
 * Given a Rule configuration, iterates over its settings to update parameter
 * names to use the new prefixed names and parameter values to use the new
 * prefixed tokens that match the new event variable names.
 */
function _commerce_update_rule_tokens($rule, $events) {
  $save = FALSE;

  // Determine if this rule configuration requires parameters.
  $info = $rule
    ->info();
  if (!empty($info['parameter'])) {

    // Get the map of old parameter names to new parameter names.
    $map_parameters_old_new = _commerce_map_rules_parameters_old_new();
    $map_parameters_new_old = array_flip($map_parameters_old_new);

    // Iterate over the parameters of the configuration.
    foreach ($info['parameter'] as $parameter_key => $parameter_info) {

      // If the current parameter maps to an old parameter name...
      if (!empty($map_parameters_new_old[$parameter_key])) {
        $old_parameter = $map_parameters_new_old[$parameter_key];

        // Loop over the settings array.
        foreach ($rule->settings as $settings_key => $settings_value) {

          // Get the parameter name of the setting.
          $parts = explode(':', $settings_key, 2);

          // If it equals the old parameter name our current parameter maps to...
          if ($parts[0] == $old_parameter) {

            // Recreate the setting with the new parameter name.
            $new_settings_key = $parameter_key . ':' . $parts[1];
            $rule->settings[$new_settings_key] = $settings_value;

            // Unset the setting with the old parameter name.
            unset($rule->settings[$settings_key]);

            // Save the updated configuration.
            $save = TRUE;
          }
        }
      }
    }
  }

  // If this plugin was ultimately derived from a reaction rule with a set of
  // events...
  if (!empty($events)) {

    // Get the map of old data selector values to new data selector values.
    $map_selector_tokens = _commerce_map_rules_selector_tokens();
    $event_info = rules_fetch_data('event_info');

    // Loop over each event that this plugin's parent item uses.
    foreach ($events as $event) {

      // If the event has variables...
      if (!empty($event_info[$event]['variables'])) {

        // Loop over the variables on the event looking for any new Commerce
        // variable names...
        foreach ($event_info[$event]['variables'] as $variable_name => $variable_info) {

          // If the variable name matches one whose tokens need to be updated
          // in this plugin...
          if (in_array($variable_name, _commerce_event_entity_variables())) {

            // Loop over this plugin's settings looking for data selectors.
            foreach ($rule->settings as $settings_key => &$settings_value) {
              if (substr($settings_key, -7) == ':select') {

                // Break apart the selector value looking for tokens not using
                // the prefixed name.
                $parts = explode(':', $settings_value);

                // Only check the first part of the data selector, as anything
                // deeper is a property name that needn't be changed.
                $parts[0] = strtr($parts[0], '_', '-');

                // If the current part has been mapped to a new token name...
                if (!empty($map_selector_tokens[$parts[0]])) {

                  // Replace it now and mark this rule for saving.
                  $parts[0] = $map_selector_tokens[$parts[0]];
                  $settings_value = implode(':', $parts);
                  $save = TRUE;
                }
              }
              elseif (is_string($settings_value)) {

                // Otherwise this setting's value might contain a token that
                // needs to be updated.
                $changed_tokens = array();
                $value_tokens = array();
                foreach (token_scan($settings_value) as $token_type => $tokens) {
                  $value_tokens += array_values($tokens);
                }
                if (!empty($value_tokens)) {

                  // Loop over the tokens we found in the value looking for any
                  // that need updating.
                  foreach ($value_tokens as $value_token) {
                    $parts = explode(':', trim($value_token, '[]'));
                    $changed = FALSE;

                    // Consider each part of the token in turn, attempting to
                    // translate the part to a new value.
                    foreach ($parts as $index => &$part) {
                      if (!empty($map_selector_tokens[strtr($part, '_', '-')])) {
                        $part = $map_selector_tokens[strtr($part, '_', '-')];
                        $changed = TRUE;
                      }
                    }

                    // Because a part of this token changed, add it to our array
                    // of all changed tokens.
                    if ($changed) {
                      $changed_tokens[$value_token] = '[' . implode(':', $parts) . ']';
                    }
                  }
                }

                // Translate the settings value overall with changed tokens.
                if (!empty($changed_tokens)) {
                  $settings_value = strtr($settings_value, $changed_tokens);
                  $save = TRUE;
                }
              }
            }
          }
        }
      }
    }
  }

  // Save the rule configuration now if specified.
  if ($save) {
    $rule
      ->save();
  }
}

/**
 * Maps old action and condition parameter names to new prefixed names.
 */
function _commerce_map_rules_parameters_old_new() {
  return array(
    'order' => 'commerce_order',
    'order_unchanged' => 'commerce_order_unchanged',
    'product' => 'commerce_product',
    'product_unchanged' => 'commerce_product_unchanged',
    'line_item' => 'commerce_line_item',
    'line_item_unchanged' => 'commerce_line_item_unchanged',
    'customer_profile' => 'commerce_customer_profile',
    'customer_profile_unchanged' => 'commerce_customer_profile_unchanged',
    'payment_transaction' => 'commerce_payment_transaction',
    'payment_transaction_unchanged' => 'commerce_payment_transaction_unchanged',
  );
}

/**
 * Returns an array of newly prefixed Commerce entity event variable names.
 */
function _commerce_event_entity_variables() {
  return array(
    'commerce_order',
    'commerce_order_unchanged',
    'commerce_product',
    'commerce_product_unchanged',
    'commerce_line_item',
    'commerce_line_item_unchanged',
    'commerce_customer_profile',
    'commerce_customer_profile_unchanged',
    'commerce_payment_transaction',
    'commerce_payment_transaction_unchanged',
  );
}

/**
 * Maps old data selector values for event variables to new prefixed values.
 */
function _commerce_map_rules_selector_tokens() {
  return array(
    'order' => 'commerce-order',
    'order-unchanged' => 'commerce-order-unchanged',
    'product' => 'commerce-product',
    'product-unchanged' => 'commerce-product-unchanged',
    'line-item' => 'commerce-line-item',
    'line-item-unchanged' => 'commerce-line-item-unchanged',
    'customer' => 'commerce-customer-profile',
    'customer-unchanged' => 'commerce-customer-unchanged',
    'transaction' => 'commerce-payment-transaction',
    'transaction-unchanged' => 'commerce-transaction-unchanged',
  );
}

/**
 * Utility function: rename a set of permissions.
 */
function commerce_update_rename_permissions($map) {

  // Easy part: rename the permissions in {role_permission}.
  foreach ($map as $old_name => $new_name) {
    db_update('role_permission')
      ->fields(array(
      'permission' => $new_name,
    ))
      ->condition('permission', $old_name)
      ->execute();
  }

  // Trickier: rename the permission for the in-database Views.
  foreach (views_get_all_views() as $view) {
    if ($view->type == t('Default')) {
      continue;
    }
    $save_view = FALSE;
    foreach ($view->display as $display_name => $display) {
      if (!empty($display->display_options['access']['type']) && $display->display_options['access']['type'] == 'perm') {
        $permission_name = $display->display_options['access']['perm'];
        if (isset($map[$permission_name])) {
          $display->display_options['access']['perm'] = $map[$permission_name];
          $save_view = TRUE;
        }
      }
    }
    if ($save_view) {
      $view
        ->save();
    }
  }
}

/**
 * Clear the cache of currency data so it can be rebuilt to include new
 * formatting parameters.
 */
function commerce_update_7101() {
  cache_clear_all('commerce_currencies:', 'cache', TRUE);
  return t('Cached currency data has been deleted and will be rebuilt to include new formatting parameters.');
}

/**
 * Give commerce.module a higher weight than field.module so we can use
 * hook_system_info_alter() to remove the dependencies it adds.
 */
function commerce_update_7102() {
  $weight = db_select('system', 's')
    ->fields('s', array(
    'weight',
  ))
    ->condition('name', 'field', '=')
    ->execute()
    ->fetchField();
  db_update('system')
    ->fields(array(
    'weight' => $weight + 1,
  ))
    ->condition('name', 'commerce', '=')
    ->execute();
  return t('The module weight for Commerce has been increased.');
}

Functions

Namesort descending Description
commerce_install Implements hook_install().
commerce_uninstall Implements hook_uninstall().
commerce_update_7100 Update Rules to use new prefixed parameter names and tokens.
commerce_update_7101 Clear the cache of currency data so it can be rebuilt to include new formatting parameters.
commerce_update_7102 Give commerce.module a higher weight than field.module so we can use hook_system_info_alter() to remove the dependencies it adds.
commerce_update_rename_permissions Utility function: rename a set of permissions.
_commerce_event_entity_variables Returns an array of newly prefixed Commerce entity event variable names.
_commerce_map_rules_parameters_old_new Maps old action and condition parameter names to new prefixed names.
_commerce_map_rules_selector_tokens Maps old data selector values for event variables to new prefixed values.
_commerce_update_rule_container_tokens Iterates over a container's children to recursively find non-container plugins whose parameters should be updated.
_commerce_update_rule_tokens Given a Rule configuration, iterates over its settings to update parameter names to use the new prefixed names and parameter values to use the new prefixed tokens that match the new event variable names.