You are here

auto_entityqueue.module in Auto Entityqueue 7

Same filename and directory in other branches
  1. 8 auto_entityqueue.module

Automatically adds entities to entityqueues.

File

auto_entityqueue.module
View source
<?php

/**
 * @file
 * Automatically adds entities to entityqueues.
 */

/**
 * Implements hook_form_FORM_ID_alter().
 */
function auto_entityqueue_form_ctools_export_ui_edit_item_form_alter(&$form, &$form_state, $form_id) {

  // Check for entityqueue.
  if (!isset($form_state['plugin']['module']) || $form_state['plugin']['module'] != 'entityqueue') {
    return;
  }

  // Get reference to queue.
  $queue =& $form_state['item'];

  // Add a checkbox field.
  $form['settings']['entityreference_field']['auto_add'] = array(
    '#title' => t('Automatically add entities to queue.'),
    '#type' => 'checkbox',
    '#default_value' => isset($queue->settings['auto_add']) ? $queue->settings['auto_add'] : FALSE,
    '#description' => t('New entities of selected types will be automatically added to the queue.'),
  );
}

/**
 * Implements hook_entity_insert().
 */
function auto_entityqueue_entity_insert($entity, $type) {

  // Check for entity type.
  if (!isset($entity->type)) {
    return;
  }

  // Get entityqueues for this type.
  $queues = auto_entityqueue_get_queues_by_type_and_bundle($type, $entity->type);
  if (count($queues)) {

    // Add entity to each queues.
    foreach ($queues as $queue) {
      auto_entityqueue_add_entity_to_queue($entity, $queue);
    }
  }
}

/**
 * Helper function to add an entity to a queue.
 *
 * @param $entity
 *  The entity object.
 * @param $queue
 *  The entityqueue object.
 */
function auto_entityqueue_add_entity_to_queue($entity, $queue) {

  // Get the target field name.
  $field_name = _entityqueue_get_target_field_name($queue->target_type);

  // Get the entity id.
  $entity_wrapper = entity_metadata_wrapper($queue->target_type, $entity);
  $entity_id = $entity_wrapper
    ->getIdentifier();

  // Get subqueues.
  $subqueues = auto_entityqueue_get_subqueues_for_queue($queue->name);
  if (count($subqueues)) {

    // Add to each subqueue.
    foreach ($subqueues as $subqueue) {
      $wrapper = entity_metadata_wrapper('entityqueue_subqueue', $subqueue);
      $wrapper->{$field_name}[] = $entity_id;
      $wrapper
        ->save();
    }
  }
}

/**
 * Loads multiple queues with a specific target type and bundle.
 *
 * @param string $target_type
 *   An entity type (e.g. 'node', 'comment', 'user').
 * @param string $bundle
 *   An entity bundle (e.g. 'page', 'article').
 *
 * @return array
 *   An array of EntityQueue objects, keyed by queue name.
 */
function auto_entityqueue_get_queues_by_type_and_bundle($target_type, $bundle) {
  $target_queues = array();
  $queues = entityqueue_queue_load_by_target_type($target_type);
  foreach ($queues as $queue) {
    if (in_array($bundle, $queue->settings['target_bundles']) && $queue->settings['auto_add'] && !isset($queue->disabled)) {
      $target_queues[$queue->name] = $queue;
    }
  }
  return $target_queues;
}

/**
 * Returns subqueues for an entityqueue.
 *
 * @param string $name
 *  The entityqueue name.
 *
 * @return array.
 *  An array of subqueues.
 */
function auto_entityqueue_get_subqueues_for_queue($name) {
  $subqueues = array();
  $query = new EntityFieldQuery();
  $query
    ->entityCondition('entity_type', 'entityqueue_subqueue')
    ->entityCondition('bundle', $name);
  $result = $query
    ->execute();
  if (!empty($result['entityqueue_subqueue'])) {
    foreach ($result['entityqueue_subqueue'] as $entityqueue_subqueue) {
      $subqueues[] = entityqueue_subqueue_load($entityqueue_subqueue->subqueue_id);
    }
  }
  return $subqueues;
}

Functions

Namesort descending Description
auto_entityqueue_add_entity_to_queue Helper function to add an entity to a queue.
auto_entityqueue_entity_insert Implements hook_entity_insert().
auto_entityqueue_form_ctools_export_ui_edit_item_form_alter Implements hook_form_FORM_ID_alter().
auto_entityqueue_get_queues_by_type_and_bundle Loads multiple queues with a specific target type and bundle.
auto_entityqueue_get_subqueues_for_queue Returns subqueues for an entityqueue.