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,
],
];
}
