You are here

function _term_merge_batch_process in Term Merge 7

Process batch function.

Trigger action 'term_merge_action' on each pair of term branch:term trunk.

Parameters

array $term_branch: An array of term tids to be merged, aka term branches

int $term_trunk: The tid of the term to merge term branches into, aka term trunk

array $merge_settings: Array of settings that control how merging should happen. Currently supported settings are:

  • term_branch_keep: (bool) Whether the term branches should not be deleted, also known as "merge only occurrences" option
  • merge_fields: (array) Array of field names whose values should be merged into the values of corresponding fields of term trunk (until each field's cardinality limit is reached)
  • keep_only_unique: (bool) Whether after merging within one field only unique taxonomy term references should be kept in other entities. If before merging your entity had 2 values in its taxonomy term reference field and one was pointing to term branch while another was pointing to term trunk, after merging you will end up having your entity referencing to the same term trunk twice. If you pass TRUE in this parameter, only a single reference will be stored in your entity after merging
  • redirect: (int) HTTP code for redirect from $term_branch to $term_trunk, 0 stands for the default redirect defined in Redirect module. Use constant TERM_MERGE_NO_REDIRECT to denote not creating any HTTP redirect. Note: this parameter requires Redirect module enabled, otherwise it will be disregarded
  • synonyms: (string) Optional field name of trunk term into which branch terms should be added as synonyms (until field's cardinality limit is reached). Note: this parameter requires Synonyms module enabled, otherwise it will be disregarded
  • step: (int) How many term branches to merge per script run in batch. If you are hitting time or memory limits, decrease this parameter

array $context: Drupal Batch API context array

2 string references to '_term_merge_batch_process'
term_merge in ./term_merge.module
Merge terms one into another using batch API.
term_merge_duplicates_form_submit in ./term_merge.pages.inc
Submit handler for 'term_merge_duplicates_form'.

File

./term_merge.batch.inc, line 47
Batch process callbacks for Term Merge module.

Code

function _term_merge_batch_process($term_branch, $term_trunk, $merge_settings, &$context) {

  // Initializing sandbox.
  if (!isset($context['sandbox']['current'])) {
    $context['sandbox']['current'] = 0;
  }

  // Populating $merge_settings with defaults.
  $merge_settings += array(
    'term_branch_keep' => FALSE,
    'merge_fields' => array(),
    'keep_only_unique' => TRUE,
    'redirect' => TERM_MERGE_NO_REDIRECT,
    'synonyms' => NULL,
    'step' => 40,
  );
  $total = count($term_branch);

  // To speed up the process we take advantage of taxonomy_term_load_multiple()
  // instead of just repeating calls to taxonomy_term_load().
  $till = min($total, $context['sandbox']['current'] + $merge_settings['step']);
  $length = $till - $context['sandbox']['current'];
  $term_branch = array_slice($term_branch, $context['sandbox']['current'], $length);
  $term_branch = array_values(taxonomy_term_load_multiple($term_branch));
  for ($i = 0; $i < $merge_settings['step'] && $context['sandbox']['current'] < $total; $i++) {
    actions_do('term_merge_action', $term_branch[$i], array(
      'term_trunk' => $term_trunk,
      'term_branch_keep' => $merge_settings['term_branch_keep'],
      'merge_fields' => $merge_settings['merge_fields'],
      'keep_only_unique' => $merge_settings['keep_only_unique'],
      'redirect' => $merge_settings['redirect'],
      'synonyms' => $merge_settings['synonyms'],
    ));
    $context['sandbox']['current']++;
  }
  if ($context['sandbox']['current'] != $total) {
    $context['finished'] = $context['sandbox']['current'] / $total;
    $term = $term_branch[$i - 1];
    $context['message'] = t('Merged up to @term', array(
      '@term' => $term->name,
    ));
  }
}