You are here

domain_integration_rules.rules.inc in Domain Integration (Drupal 7) 7

Same filename and directory in other branches
  1. 8 modules/domain_integration_rules/domain_integration_rules.rules.inc

Domain Integration Rules.

File

modules/domain_integration_rules/domain_integration_rules.rules.inc
View source
<?php

/**
 * @file
 * Domain Integration Rules.
 */

/**
 * Implements hook_rules_condition_info().
 */
function domain_integration_rules_rules_condition_info() {
  $rules_conditions = array();
  $rules_conditions['list_intersect'] = array(
    'label' => t('List contains item in other list (array_intersect)'),
    'parameter' => array(
      'list_1' => array(
        'type' => 'list',
        'label' => t('List', array(), array(
          'context' => 'data_types',
        )),
        'restriction' => 'selector',
      ),
      'list_2' => array(
        'type' => 'list',
        'label' => t('List'),
        'description' => t('List that should contain at lease one item to check for.'),
      ),
    ),
    'group' => t('Domain Integration'),
    'base' => 'domain_integration_rules_rules_condition_list_intersect',
  );
  return $rules_conditions;
}

/**
 * Implements hook_rules_action_info().
 */
function domain_integration_rules_rules_action_info() {
  $rules_actions = array();
  $rules_actions['domain_integration_rules_rules_action_domain_node'] = array(
    'label' => t('Change node domain settings'),
    'parameter' => array(
      'node' => array(
        'type' => 'node',
        'label' => t('Node'),
        'restriction' => 'selector',
      ),
      'domain_node_settings' => array(
        'type' => 'list<text>',
        'label' => t('Domains'),
        'description' => 'New domain settings',
        'options list' => 'domain_integration_rules_rules_action_domains_options_list',
        'restriction' => 'input',
      ),
      'action' => array(
        'type' => 'text',
        'label' => t('Action'),
        'description' => t('Action to perform.'),
        'options list' => 'domain_integration_rules_rules_action_action_options_list',
        'restriction' => 'input',
      ),
    ),
    'group' => t('Domain Integration'),
    'base' => 'domain_integration_rules_rules_action_domain_node',
  );
  $rules_actions['domain_integration_rules_rules_action_domain_user'] = array(
    'label' => t('Change user domain settings'),
    'parameter' => array(
      'user' => array(
        'type' => 'user',
        'label' => t('User'),
        'restriction' => 'selector',
      ),
      'domain_user_settings' => array(
        'type' => 'list<text>',
        'label' => t('Domains'),
        'description' => 'New domain settings',
        'options list' => 'domain_integration_rules_rules_action_domains_options_list',
        'restriction' => 'input',
      ),
      'action' => array(
        'type' => 'text',
        'label' => t('Action'),
        'description' => t('Action to perform.'),
        'options list' => 'domain_integration_rules_rules_action_action_options_list',
        'restriction' => 'input',
      ),
    ),
    'group' => t('Domain Integration'),
    'base' => 'domain_integration_rules_rules_action_domain_user',
  );
  if (module_exists('domain_source')) {
    $rules_actions['domain_integration_rules_rules_action_domain_source_node'] = array(
      'label' => t('Change node source domain setting'),
      'parameter' => array(
        'node' => array(
          'type' => 'node',
          'label' => t('Node'),
          'restriction' => 'selector',
        ),
        'domain_source_node_settings' => array(
          'type' => 'list<text>',
          'label' => t('Domains'),
          'description' => 'New source domain setting',
          'options list' => 'domain_integration_rules_rules_action_domains_options_list',
          'restriction' => 'input',
        ),
      ),
      'group' => t('Domain Integration'),
      'base' => 'domain_integration_rules_rules_action_domain_source_node',
    );
  }
  return $rules_actions;
}

/**
 * Rules callback: condition list_intersect.
 *
 * @return boolean
 *   TRUE if both lists have an intersection (array_intersect).
 *
 * @param array $list_1
 * @param array $list_2
 */
function domain_integration_rules_rules_condition_list_intersect($list_1, $list_2, $settings, $state) {

  // 2 arrays are passed in. If they have any intersection return TRUE.
  $intersect = array_intersect($list_1, $list_2);
  if (!empty($intersect)) {
    return TRUE;
  }
  return FALSE;
}

/**
 * Options list with actions (add, remove, replace)
 *
 * @return array $options_list
 */
function domain_integration_rules_rules_action_action_options_list() {
  $options_list = array(
    'add' => t('Add'),
    'remove' => t('Remove'),
    'replace' => t('Replace'),
  );
  return $options_list;
}

/**
 * Options list with domain targets (current domain, active domains + sendtoall for nodes)
 *
 * @return array $options_list
 */
function domain_integration_rules_rules_action_domains_options_list($conf, $param) {
  $options_list = array();

  // SendToAll if we are acting on nodes.
  if ($param == 'domain_node_settings') {
    $options_list['domain_site'] = t('Send to all');
  }

  // Current domain. It's calculated upon execution.
  $options_list['current'] = t('Current');

  // Add active domains.
  foreach (domain_domains() as $domain) {
    $options_list[$domain['machine_name']] = $domain['sitename'];
  }
  return $options_list;
}

/**
 * Rules Action Callback that changes domain settings for nodes.
 *
 * Note: domain assignment is required for nodes.
 */
function domain_integration_rules_rules_action_domain_node($node, $domain_node_settings_new, $action = 'replace') {

  // Extract 'SendToAll' setting.
  if (isset($domain_node_settings_new['domain_site'])) {
    $domain_site = TRUE;
    $new_domains = $domain_node_settings_new;
    unset($new_domains['domain_site']);
  }
  else {
    $domain_site = FALSE;
    $new_domains = $domain_node_settings_new;
  }

  // Normalize passed in domain settings (merges 'current').
  $new_domains = _domain_integration_rules_rules_settings_normalize_domains($new_domains);

  // Change domain settings for this node entity.
  switch ($action) {
    case 'replace':
      $node->domains = $new_domains;
      $node->domain_site = $domain_site;

      // Set error and stop processing this node if $node->domains is empty.
      if (empty($node->domains)) {
        $vars['@nid'] = $node->nid;
        drupal_set_message(t('Replacement of domain-settings for node with nid @nid failed. You cannot replace domain settings with "Send to all" only. You must at least choose one domain.', $vars), 'error');
        watchdog('domain_integration_rules', 'Replacement of domain-settings for node with nid @nid failed. You cannot replace domain settings with "Send to all" only. You must at least choose one domain.', $vars, WATCHDOG_ERROR);
        return;
      }
      break;
    case 'add':

      // Get current node's domains and merge with submitted.
      $current_domains = $node->domains;

      // Just add the arrays with domains together.
      $combined_domains = $current_domains + $new_domains;
      $node->domains = array_unique($combined_domains);

      // 'send to all affiliates'.
      $node->domain_site = $domain_site;
      break;
    case 'remove':

      // Get current node's domains and remove submitted.
      $current_domains = $node->domains;

      // Remove submitted domains from the current domains array.
      $subtracted_domains = array_diff_assoc($current_domains, $new_domains);
      $node->domains = array_unique($subtracted_domains);

      // Remove 'send to all affiliates' if TRUE. If nothing is passed, do
      // change this value.
      if ($domain_site === TRUE) {
        $node->domain_site = FALSE;
      }

      // Set error and stop processing this node if $node->domains is empty.
      if (empty($node->domains)) {
        $vars['@nid'] = $node->nid;
        drupal_set_message(t('Removal of domain-settings for node with nid @nid failed. You cannot have a node without assigned domains.', $vars), 'error');
        watchdog('domain_integration_rules', 'Removal of domain-settings for node with nid @nid failed. You cannot have a node without assigned domains.', $vars, WATCHDOG_ERROR);
        return;
      }
      break;
  }

  // Save new settings.
  domain_node_access_records($node);

  // Explicit save node to force all node access hooks to be called.
  node_save($node);
}

/**
 * Rules Action Callback that changes domain source setting for nodes.
 *
 * Note: domain assignment is required for nodes.
 */
function domain_integration_rules_rules_action_domain_source_node($node, $domain_node_settings_new) {

  // If action from rule, then load domain by ID.
  if (!is_numeric($domain_node_settings_new)) {
    $domain_node_settings_new = domain_load_domain_id(reset($domain_node_settings_new));
  }

  // Set error and stop processing if something wrong.
  if (!$domain_node_settings_new) {
    watchdog('domain_integration_rules', 'Domain ID is not exist.', WATCHDOG_ERROR);
    return;
  }

  // Add source domain in publish.
  $node->domains[$domain_node_settings_new] = $domain_node_settings_new;

  // Change source domain.
  $node->domain_source = $domain_node_settings_new;

  // Save new settings.
  domain_node_access_records($node);

  // Explicit save node to force all node access hooks to be called.
  node_save($node);
}

/**
 * Rules Action Callback that changes domain settings for users.
 *
 * Note: domain assignment is optional for users.
 */
function domain_integration_rules_rules_action_domain_user($user, $domain_user_settings_new, $action = 'replace') {

  // Prevent action on user 0 (anonymous) user if it's passed in.
  if (!$user->uid) {
    return;
  }

  // Normalize passed in domain settings (merges 'current').
  $new_domains = _domain_integration_rules_rules_settings_normalize_domains($domain_user_settings_new);

  // Change domain settings for this user entity.
  switch ($action) {
    case 'replace':
      $edit['domain_user'] = $new_domains;
      break;
    case 'add':

      // Get current user's domains and merge with submitted.
      $current_domains = is_array($user->domain_user) ? $user->domain_user : array();

      // Just add the arrays with domains together.
      $combined_domains = $current_domains + $new_domains;
      $edit['domain_user'] = array_unique($combined_domains);
      break;
    case 'remove':

      // Get current node's domains and remove submitted.
      $current_domains = $user->domain_user;

      // Remove submitted domains from the current domains array.
      $subtracted_domains = array_diff_assoc($current_domains, $new_domains);
      $edit['domain_user'] = array_unique($subtracted_domains);
      break;
    default:
      $edit['domain_user'] = is_array($user->domain_user) ? $user->domain_user : array();
  }

  // Save new settings.
  // Function domain_user_save expects a third argument ($catalog), but it is
  // not used. Set it to a zero value here to prevent notices.
  $user->domain_user = $edit['domain_user'];
  domain_user_save($edit, $user, 0);
}

/**
 * Returns a normalized list of domain_id's
 *
 * @param array $rules_domain_settings
 *   - An array with machine_names of domains.
 *   - Also accepts machine_name 'current' that will be replaced by the current
 *   domain.
 *
 * @return array
 *   - An array with domain_id's as keys and values that can be directly passed
 *   to domain functions 'domain_user_save' and 'domain_node_access_records'.
 *   - If the key '
 */
function _domain_integration_rules_rules_settings_normalize_domains($rules_domain_settings = array()) {

  // Load Domain-ID's and merge 'current' if passed in.
  foreach ($rules_domain_settings as $domain_machinename => &$value) {
    if ($domain_machinename == 'current') {
      $current_domain = domain_get_domain();
      $value = $current_domain['domain_id'];
    }
    else {
      $value = domain_load_domain_id($domain_machinename);
    }
  }

  // Move values to keys and drop duplicates.
  $rules_domain_settings = array_combine($rules_domain_settings, $rules_domain_settings);
  return $rules_domain_settings;
}

Functions

Namesort descending Description
domain_integration_rules_rules_action_action_options_list Options list with actions (add, remove, replace)
domain_integration_rules_rules_action_domains_options_list Options list with domain targets (current domain, active domains + sendtoall for nodes)
domain_integration_rules_rules_action_domain_node Rules Action Callback that changes domain settings for nodes.
domain_integration_rules_rules_action_domain_source_node Rules Action Callback that changes domain source setting for nodes.
domain_integration_rules_rules_action_domain_user Rules Action Callback that changes domain settings for users.
domain_integration_rules_rules_action_info Implements hook_rules_action_info().
domain_integration_rules_rules_condition_info Implements hook_rules_condition_info().
domain_integration_rules_rules_condition_list_intersect Rules callback: condition list_intersect.
_domain_integration_rules_rules_settings_normalize_domains Returns a normalized list of domain_id's