entityqueue_form_widget-2.0.0/entityqueue_form_widget.module

entityqueue_form_widget.module
<?php

/**
 * @file
 * Allows editors to add content to an entityqueue from the same add/edit form.
 */

use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Url;
use Drupal\Core\Link;
use Drupal\entityqueue\Entity\EntitySubqueue;

/**
 * Implements hook_form_node_form_alter().
 */
function entityqueue_form_widget_form_node_form_alter(&$form, FormStateInterface $form_state) {

  $node = $form_state->getFormObject()->getEntity();
  $entity_id = $node->id();

  // Works with entityqueue module version 8.x-1.0-alpha6 .
  $allowed_entityqueues = entity_qget_allowed_subque_list($node);

  // Check if there is any entityqueues to show/not show the widget.
  if (!empty($allowed_entityqueues)) {

    $url = Url::fromRoute('entity.entity_queue.collection');
    $form['entityqueue_form_widget'] = [
      '#type' => 'details',
      '#title' => t('Entityqueues settings'),
      '#group' => 'advanced',
      '#tree' => TRUE,
      '#weight' => 100,
      '#markup' => '<p>' . t('Choose from the available entityqueues below to push this content to. To reorder and manage each queue, please visit the @entityqueue_management_page', ['@entityqueue_management_page' => Link::fromTextAndUrl(t('Entityqueue management page'), $url)->toString()]) . '</p>',
    ];

    $form['entityqueue_form_widget']['entityqueues'] = [];
    foreach ($allowed_entityqueues as $allowed_entityqueue) {
      if (\Drupal::currentUser()->hasPermission('update ' . $allowed_entityqueue['id'] . ' entityqueue')
        || \Drupal::currentUser()->hasPermission('manipulate all entityqueues')) {

        $form['entityqueue_form_widget']['entityqueues'][$allowed_entityqueue['id']] = _prepare_checkbox($entity_id, $allowed_entityqueue);
      }
    }

    // Calling submit handler.
    foreach (array_keys($form['actions']) as $action) {
      if ($action != 'preview' && isset($form['actions'][$action]['#type']) && $form['actions'][$action]['#type'] === 'submit') {
        $form['actions'][$action]['#submit'][] = 'entityqueue_form_widget_form_node_form_submit';
      }
    }
  }
}

/**
 * Submit form function.
 *
 * @param object $form
 *   The Form.
 * @param Drupal\Core\Form\FormStateInterface $form_state
 *   The Form.
 */
function entityqueue_form_widget_form_node_form_submit($form, FormStateInterface $form_state) {
  $node = $form_state->getFormObject()->getEntity();
  if (!$form_state->isValueEmpty('entityqueue_form_widget')) {
    $values = $form_state->getValue('entityqueue_form_widget');

    // Initialize variables with default values.
    $publish_on_timestamp_value = null;

    // Check if the node has the 'publish_on' field.
    if ($node->hasField('publish_on') && $node->get('publish_on')->getValue()) {
      // Get publish on timestamp.
      $publish_on_timestamp_value = $node->get('publish_on')->getValue()[0]['value'];
    }

    // When Adding entity to all checked queues.
    // If the node was unpublished, do not attempt to add it to any entity queue.
    $eqs_machine_names = $node->isPublished() || isset($publish_on_timestamp_value) ? array_keys($values['entityqueues'], "1") : [];
    foreach ($eqs_machine_names as $eqs_machine_name) {
      $query = \Drupal::entityQuery('entity_subqueue')
        ->accessCheck(TRUE)
        ->condition('name', $eqs_machine_name);
      $result = $query->execute();
      /** @var Drupal\entityqueue\Entity\EntitySubqueue $subqueues */
      $subqueues = EntitySubqueue::loadMultiple($result);

      foreach ($subqueues as $subqueue) {
        if (!$subqueue->hasItem($node)) {
          $subqueue->addItem($node);
          $subqueue->save();
        }
      }
    }

    // When Removing entity from all un-checked queues.
    // If the node was unpublished, remove it from all enabled entity queues.
    $eqs_machine_names_delete = $node->isPublished() ? array_keys($values['entityqueues'], "0") : array_keys($values['entityqueues']);
    foreach ($eqs_machine_names_delete as $eqs_machine_name) {
      $entity_subqueue = \Drupal::entityTypeManager()
        ->getStorage('entity_subqueue')
        ->load($eqs_machine_name);

      if ($entity_subqueue->hasItem($node)) {
        $entity_subqueue->removeItem($node);
        $entity_subqueue->save();
      }
    }
  }
}

/**
 * Get allowed sub queue for entityqueues list.
 *
 * Used to show module home page content.
 *
 * @param object $node
 *   A node.
 *
 * @return array
 *   List of allowed sub-queue
 */
function entity_qget_allowed_subque_list($node) {
  $allowed_entityqueues = [];
  /** @var Drupal\entityqueue\Entity\EntitySubqueue $subqueues */
  $subqueues = EntitySubqueue::loadMultiple();

  if (count($subqueues) > 0) {
    foreach ($subqueues as $subqueue) {
      $queue = $subqueue->getQueue();
      if (isset($queue)) {
        $queue_settings = $queue->getEntitySettings();
        $target_bundles = [];

        if (isset($queue_settings)
           && isset($queue_settings['handler_settings'])
           && isset($queue_settings['handler_settings']['target_bundles'])
           && !empty($queue_settings['handler_settings']['target_bundles'])) {
          $target_bundles = $queue_settings['handler_settings']['target_bundles'];
        }

        if ($queue_settings['target_type'] == $node->getEntityTypeId()
          && (empty($target_bundles) ||  in_array($node->bundle(), $target_bundles))) {

          $id = $subqueue->id();
          $allowed_entityqueues[$id]['id'] = $id;
          $allowed_entityqueues[$id]['act_as_queue_status'] = $queue->getActAsQueue();
        }
      }
    }
  }

  return $allowed_entityqueues;
}

/**
 * Prepare a checkbox for allowed entityqueue.
 *
 * @param int $entity_id
 *   Entity ID.
 * @param string $allowed_entityqueue
 *   Name of the allowed entityqueue.
 *
 * @return array
 *   Values needed to render a checkbox.
 */
function _prepare_checkbox($entity_id, $allowed_entityqueue) {
  // Get all checked queues for this entity.
  $query_checked_queues = \Drupal::database()->select('entity_subqueue__items')
    ->distinct()
    ->condition('items_target_id', $entity_id);
  $query_checked_queues->addField('entity_subqueue__items', 'entity_id');
  $result_checked_queues = array_keys($query_checked_queues->execute()
    ->fetchAllAssoc('entity_id'));

  $entity_subqueue = \Drupal::entityTypeManager()
    ->getStorage('entity_subqueue')
    ->load($allowed_entityqueue['id']);

  $number_of_items = count($entity_subqueue->get('items')->getValue());

  $queue_details = $entity_subqueue->getQueue();
  $max_size = $queue_details->getMaximumSize();
  $max_size = ($max_size == '0' ? 'unlimited' : $max_size);

  $checked_flag = 0;
  if (in_array($allowed_entityqueue['id'], $result_checked_queues)) {
    $checked_flag = 1;
  }

  $queue = $entity_subqueue->getQueue();
  if ($queue->getHandler() == 'multiple') {
    $title = $entity_subqueue->label() . ' (' . $queue->label() . ')';
  }
  else {
    $title = $entity_subqueue->label();
  }

  $checkbox_status = FALSE;
  if (($number_of_items >= $max_size)
    && $checked_flag == 0
    && !$allowed_entityqueue['act_as_queue_status']
    && ($max_size != 0 || $max_size != NULL)) {
    $checkbox_status = TRUE;
  }

  return [
    '#type' => 'checkbox',
    '#title' => t('@queue_title <i>(@number_of_items out of @$max_size items)</i>', [
      '@queue_title' => $title,
      '@number_of_items' => $number_of_items,
      '@$max_size' => $max_size,
    ]),
    '#default_value' => $checked_flag,
    '#id' => $allowed_entityqueue['id'],
    '#attributes' => [
      'disabled' => $checkbox_status,
    ],
  ];
}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc