You are here

function _remove_duplicates_get_tableselect_output in Remove Duplicates 7

Get a tableselect data output.

Parameters

string $node_type_machine_name: The fetched node type.

string $node_field_machine_name: The {field} used to find duplicates.

bool $prioritize_published_nodes: If TRUE, the last published node in a set of duplicate nodes will be kept. Otherwise, the first node in a set of duplicate nodes will be kept.

bool $case_sensitive: If TRUE, duplicates detection is case sensitive Otherwise, duplicates detection is case insensitive.

Return value

array An array with 2 keys : #element A datastructure to use with custom tableselect form element. #proceed A boolean indicating whether or not duplicates were found.

1 call to _remove_duplicates_get_tableselect_output()
remove_duplicates_build_confirm_settings_form in ./remove_duplicates.module
Form constructor for the module settings confirmation page (Step 2/2).

File

./remove_duplicates.module, line 1550
Remove duplicate nodes according to node fields or Custom fields.

Code

function _remove_duplicates_get_tableselect_output($node_type_machine_name, $node_field_machine_name, $prioritize_published_nodes, $case_sensitive) {
  $node_types = node_type_get_names();
  $node_types_fields = _remove_duplicates_get_node_types_fields();
  $duplicate_node_groups = _remove_duplicates_get_duplicate_node_groups($node_type_machine_name, $node_field_machine_name, $case_sensitive);
  if (is_array($duplicate_node_groups)) {
    if (isset($duplicate_node_groups['count']) && is_array($duplicate_node_groups['count'])) {
      $count_nodes = array_key_exists('nodes', $duplicate_node_groups['count']) ? $duplicate_node_groups['count']['nodes'] : 0;
      $count_node_groups = array_key_exists('node_groups', $duplicate_node_groups['count']) ? $duplicate_node_groups['count']['node_groups'] : 0;
      watchdog('remove_duplicates', 'Search - Found duplicate nodes : [@count_nodes] | node groups : [@count_node_groups]', array(
        '@count_nodes' => $count_nodes,
        '@count_node_groups' => $count_node_groups,
      ), WATCHDOG_INFO);
      watchdog('remove_duplicates', 'Search - Duplicate nodes to remove estimate : [@nodes_to_remove_estimate]', array(
        '@nodes_to_remove_estimate' => $count_nodes - $count_node_groups,
      ), WATCHDOG_INFO);
    }
    if (isset($duplicate_node_groups['data']) && is_array($duplicate_node_groups['data']) && count($duplicate_node_groups['data'])) {

      // Outputs a data structure to use with
      // Remove Duplicates specific tableselect.
      // Default duplicate node group table header.
      $duplicate_node_group_table_header = array(
        'remove' => t('remove'),
        'title' => t('title'),
        'author' => t('author'),
        'status' => t('published'),
        'updated' => t('updated'),
        'created' => t('created'),
      );

      // Construction of duplicate node group tables.
      $duplicate_node_group_tables = array();

      // Construction of duplicate node group tables title.
      $duplicate_node_group_tables['#header'] = array(
        array(
          'header' => TRUE,
          'data' => t('Found Duplicates'),
          'colspan' => count($duplicate_node_group_table_header),
        ),
      );

      // Construction of duplicate node group tables.
      $duplicate_node_group_tables['#tables'] = array();
      foreach ($duplicate_node_groups['data'] as $duplicate_node_group) {

        // Construction of duplicate node group table.
        $duplicate_node_group_table = array();

        // Construction of duplicate node group table header.
        $duplicate_node_group_table['#header'] = array();

        // Defining the duplicate group header prefix.
        $node_group_title = $node_group_field_name = $node_group_field_value = NULL;
        if (is_array($duplicate_node_group) && count($duplicate_node_group)) {
          $field_common_name = _remove_duplicates_get_field_common_name($node_field_machine_name);
          $node_group_field_value = array();
          foreach ($duplicate_node_group as $duplicate_node) {
            if (is_object($duplicate_node) && !empty($duplicate_node->{$field_common_name})) {
              $node_group_field_value[(string) $duplicate_node->{$field_common_name}] = (string) $duplicate_node->{$field_common_name};
            }
          }
          $or = t('or');
          $node_group_field_name = (string) $node_types_fields[$node_type_machine_name][$node_field_machine_name];
          $node_group_field_value = '"' . implode('" ' . $or . ' "', $node_group_field_value) . '"';
          $node_group_title = t('Where "@nodetypefield" is', array(
            '@nodetypefield' => $node_group_field_name,
          ));
        }
        $duplicate_node_group_table['#header']['#prefix'] = array(
          array(
            'header' => TRUE,
            'data' => $node_group_title,
          ),
          array(
            'data' => $node_group_field_value,
            'colspan' => count($duplicate_node_group_table_header) - 1,
          ),
        );

        // Defining the duplicate group header root.
        $duplicate_node_group_table['#header']['#root'] = $duplicate_node_group_table_header;

        // Defining the default kept node among duplicates.
        $keep_node_nid = $keep_node_status = NULL;
        foreach ($duplicate_node_group as $duplicate_node) {

          // Defaults to keeping the first node in the group.
          if (empty($keep_node_nid)) {
            $keep_node_nid = $duplicate_node->nid;
            $keep_node_status = $duplicate_node->status;
          }

          // Defining the node which is going to be kept among duplicates.
          if (isset($keep_node_nid)) {

            // If "Keep at least one published node." is checked
            // keeping the first published node in the group.
            if ($prioritize_published_nodes) {
              if ($duplicate_node->status && !$keep_node_status) {
                $keep_node_nid = $duplicate_node->nid;
                $keep_node_status = $duplicate_node->status;
              }
            }
          }
        }
        reset($duplicate_node_group);

        // Defining the duplicate group options.
        $duplicate_node_group_table['#value'] = array();
        $duplicate_node_group_table['#options'] = array();
        $duplicate_node_group_table['#default_value'] = array();
        foreach ($duplicate_node_group as $duplicate_node) {
          $duplicate_node_group_table['#options'][$duplicate_node->nid] = array();

          // Data for 'remove' column :
          $duplicate_node_group_table['#value'][$duplicate_node->nid] = $duplicate_node->nid;
          if (isset($keep_node_nid) && $keep_node_nid == $duplicate_node->nid) {
            $duplicate_node_group_table['#options'][$duplicate_node->nid]['remove'] = '<span style="color:red;">' . t('No') . '</span>';
          }
          else {
            $duplicate_node_group_table['#default_value'][$duplicate_node->nid] = $duplicate_node->nid;
            $duplicate_node_group_table['#options'][$duplicate_node->nid]['remove'] = '<span style="color:green;">' . t('Yes') . '</span>';
          }

          // Data for 'title' column :
          $duplicate_node_group_table['#options'][$duplicate_node->nid]['title'] = l($duplicate_node->title, 'node/' . $duplicate_node->nid, array(
            'attributes' => array(
              'onclick' => 'window.open(this.href,parseInt(Math.random()*1000));return false;',
            ),
          ));

          // Data for 'author' column :
          $duplicate_node_group_table['#options'][$duplicate_node->nid]['author'] = $duplicate_node->name;

          // Data for 'status' column :
          if ($duplicate_node->status) {
            $duplicate_node_group_table['#options'][$duplicate_node->nid]['status'] = '<span style="color:black;">' . t('Yes') . '</span>';
          }
          else {
            $duplicate_node_group_table['#options'][$duplicate_node->nid]['status'] = '<span style="color:gray;">' . t('No') . '</span>';
          }

          // Data for 'updated' column :
          $duplicate_node_group_table['#options'][$duplicate_node->nid]['updated'] = format_date($duplicate_node->changed);

          // Data for 'created' column :
          $duplicate_node_group_table['#options'][$duplicate_node->nid]['created'] = format_date($duplicate_node->created);

          // End of duplicate node group options construction.
        }
        $duplicate_node_group_tables['#tables'][] = $duplicate_node_group_table;
      }

      // Custom table select element output to use with forms.
      $output = array(
        '#proceed' => TRUE,
        '#element' => array(
          '#title' => t('Results'),
          '#type' => 'remove_duplicates_tableselect',
          '#options' => $duplicate_node_group_tables,
        ),
      );
      return $output;
    }
  }
  watchdog('remove_duplicates', 'Search - No duplicates found for node [@node_type_machine_name] according to field [@node_field_machine_name]', array(
    '@node_type_machine_name' => $node_type_machine_name,
    '@node_field_machine_name' => $node_field_machine_name,
  ), WATCHDOG_INFO);

  // Outputs a no duplicates found message.
  $text_output = t('No duplicates for node type "@nodetype" according to field "@nodetypefield".', array(
    '@nodetype' => (string) $node_types[$node_type_machine_name],
    '@nodetypefield' => (string) $node_types_fields[$node_type_machine_name][$node_field_machine_name],
  ));
  $html_output = '<div class="description"><p><span style="font-weight:bold;color:red;">' . $text_output . '</span></p></div>';
  $output = array(
    '#proceed' => FALSE,
    '#element' => array(
      '#type' => 'item',
      '#title' => t('Results'),
      '#markup' => $html_output,
    ),
  );
  return $output;
}