You are here

function smartqueue_taxonomy_nodequeue_subqueues in Nodequeue 7.3

Same name and namespace in other branches
  1. 5.2 smartqueue.module \smartqueue_taxonomy_nodequeue_subqueues()
  2. 6.2 smartqueue.module \smartqueue_taxonomy_nodequeue_subqueues()
  3. 7.2 modules/smartqueue/smartqueue.module \smartqueue_taxonomy_nodequeue_subqueues()

Implements hook_nodequeue_subqueues().

Returns list of references for subqueues that can host a given node.

File

./smartqueue.module, line 101

Code

function smartqueue_taxonomy_nodequeue_subqueues(&$queue, $node) {
  $field_names = array();

  // Check if at least one supported field exists in node and load
  // selected tids.
  foreach (explode('-', $queue->reference) as $field_name) {

    // Save tids.
    if ($field_values = field_get_items('node', $node, $field_name)) {
      $field_names[$field_name] = array();
      foreach ($field_values as $field_value) {
        $field_names[$field_name][] = $field_value['tid'];
      }
    }
  }
  if (!empty($field_names) && $queue->use_parents) {

    // Replace taxonomy IDs with their parents'.
    foreach ($field_names as $field_name => &$tids) {
      $tids = smartqueue_taxonomy_get_parents($tids);
    }
  }

  // Forbid NO terms being set, but allow
  // various non-terms to be set.
  $empty = TRUE;
  foreach ($field_names as $field_name => $tids) {
    if (!empty($tids)) {
      $empty = FALSE;
    }
    if (!count($field_names[$field_name])) {
      $field_names[$field_name][] = 0;
    }
  }
  if ($empty) {
    return;
  }

  // Build reference strings for all subqueues.
  $references = smartqueue_build_string(array_filter($field_names));

  // We're returning an array of references for efficiency, but we also have
  // to check to see if the references we've generated exist. If they don't,
  // we have to create them.
  $exists = array();
  $subqueues = nodequeue_load_subqueues_by_reference(array(
    $queue->name => $references,
  ));
  foreach ($subqueues as $subqueue) {
    $exists[$subqueue->reference] = TRUE;
  }

  // Create subqueues if needed.
  foreach ($references as $reference) {
    if (empty($exists[$reference])) {
      nodequeue_add_subqueue($queue, smartqueue_taxonomy_nodequeue_subqueue_title($queue, $reference), $reference);
    }
  }
  return $references;
}