View source
<?php
namespace Drupal\queue_ui\Form;
use Drupal\Core\Database\Database;
use Drupal\Core\Extension\ModuleHandler;
use Drupal\Core\Messenger\Messenger;
use Drupal\Core\Queue\QueueFactory;
use Drupal\Core\Queue\QueueInterface;
use Drupal\Core\Queue\QueueWorkerManager;
use Drupal\Core\Session\AccountInterface;
use Drupal\Core\State\StateInterface;
use Drupal\Core\TempStore\PrivateTempStoreFactory;
use Drupal\Core\Url;
use Drupal\queue_ui\QueueUIInterface;
use Drupal\queue_ui\QueueUIManager;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Drupal\Core\Form\FormBase;
use Drupal\Core\Form\FormStateInterface;
class OverviewForm extends FormBase {
protected $queueFactory;
protected $tempStoreFactory;
protected $currentUser;
protected $state;
protected $moduleHandler;
protected $dbConnection;
private $queueWorkerManager;
private $queueUIManager;
public function __construct(QueueFactory $queue_factory, PrivateTempStoreFactory $temp_store_factory, AccountInterface $current_user, StateInterface $state, ModuleHandler $module_handler, QueueWorkerManager $queueWorkerManager, QueueUIManager $queueUIManager, Messenger $messenger) {
$this->queueFactory = $queue_factory;
$this->tempStoreFactory = $temp_store_factory;
$this->currentUser = $current_user;
$this->state = $state;
$this->moduleHandler = $module_handler;
$this->dbConnection = Database::getConnection('default');
$this->queueWorkerManager = $queueWorkerManager;
$this->queueUIManager = $queueUIManager;
$this->messenger = $messenger;
}
public static function create(ContainerInterface $container) {
return new static($container
->get('queue'), $container
->get('tempstore.private'), $container
->get('current_user'), $container
->get('state'), $container
->get('module_handler'), $container
->get('plugin.manager.queue_worker'), $container
->get('plugin.manager.queue_ui'), $container
->get('messenger'));
}
public function getFormId() {
return 'queue_ui_overview_form';
}
public function buildForm(array $form, FormStateInterface $form_state) {
$form['top'] = [
'operation' => [
'#type' => 'select',
'#title' => $this
->t('Action'),
'#options' => [
'submitBatch' => $this
->t('Batch process'),
'submitRelease' => $this
->t('Remove leases'),
'submitClear' => $this
->t('Clear'),
],
],
'actions' => [
'#type' => 'container',
'#attributes' => [
'class' => [
'form-actions',
],
],
'apply' => [
'#type' => 'submit',
'#tableselect' => TRUE,
'#submit' => [
'::submitBulkForm',
],
'#value' => $this
->t('Apply to selected items'),
],
],
];
$form['queues'] = [
'#type' => 'table',
'#tableselect' => TRUE,
'#header' => [
'title' => $this
->t('Title'),
'items' => $this
->t('Number of items'),
'class' => $this
->t('Class'),
'cron' => $this
->t('Cron time limit (seconds)'),
'operations' => $this
->t('Operations'),
],
'#empty' => $this
->t('No queues defined'),
];
$queue_order_installed = $this->moduleHandler
->moduleExists('queue_order');
if ($queue_order_installed) {
$form['queues']['#tabledrag'] = [
[
'action' => 'order',
'relationship' => 'sibling',
'group' => 'queue-order-weight',
],
];
$form['queues']['#header']['weight'] = $this
->t('Weight');
$form['weight'] = [
'#type' => 'value',
];
}
$queues = $this->queueWorkerManager
->getDefinitions();
foreach ($queues as $name => $queue_definition) {
$queue = $this->queueFactory
->get($name);
$operations = [];
if ($queue_ui = $this->queueUIManager
->fromQueueName($name)) {
$operations['inspect'] = [
'title' => $this
->t('Inspect'),
'url' => Url::fromRoute('queue_ui.inspect', [
'queue_name' => $name,
]),
];
}
$row = [
'title' => [
'#markup' => (string) $queue_definition['title'],
],
'items' => [
'#markup' => $queue
->numberOfItems(),
],
'class' => [
'#markup' => $this->queueUIManager
->queueClassName($queue),
],
'cron' => [
'#type' => 'number',
'#title' => $this
->t('Cron Time'),
'#title_display' => 'hidden',
'#placeholder' => $this
->t('Cron disabled'),
'#value' => isset($queue_definition['cron']['time']) ? $queue_definition['cron']['time'] : '',
'#parents' => [],
'#name' => 'cron[' . $name . ']',
],
'operations' => [
'#type' => 'dropbutton',
'#links' => $operations,
],
];
if ($queue_order_installed) {
$weight = isset($queue_definition['weight']) ? $queue_definition['weight'] : 10;
$row['#attributes'] = [
'class' => [
'draggable',
],
];
$row['#weight'] = $weight;
$row['weight'] = [
'#type' => 'weight',
'#title' => $this
->t('Weight for @title', [
'@title' => $name,
]),
'#title_display' => 'invisible',
'#default_value' => $weight,
'#name' => 'weight[' . $name . ']',
'#attributes' => [
'class' => [
'queue-order-weight',
],
],
];
}
$form['queues'][$name] = $row;
}
$form['cron'] = [
'#type' => 'value',
];
$form['botton'] = [
'actions' => [
'#type' => 'container',
'#attributes' => [
'class' => [
'form-actions',
],
],
'apply' => [
'#type' => 'submit',
'#tableselect' => TRUE,
'#submit' => [
'::submitBulkForm',
],
'#value' => $this
->t('Apply to selected items'),
],
'save' => [
'#type' => 'submit',
'#value' => $this
->t('Save changes'),
],
],
];
return $form;
}
public function submitForm(array &$form, FormStateInterface $form_state) {
$form_state
->cleanValues();
foreach ($form_state
->getValue('cron') as $name => $time) {
$this->state
->set('queue_ui_cron_' . $name, $time);
}
if ($this->moduleHandler
->moduleExists('queue_order')) {
$order_config = $this
->configFactory()
->getEditable('queue_order.settings');
foreach ($form_state
->getValue('weight') as $name => $weight) {
$order_config
->set('order.' . $name, (int) $weight);
}
$order_config
->save();
}
$this->queueWorkerManager
->clearCachedDefinitions();
}
public function submitBulkForm(array &$form, FormStateInterface $form_state) {
if (in_array($form_state
->getValue('operation'), [
'submitBatch',
'submitRelease',
'submitClear',
])) {
$selected_queues = array_filter($form_state
->getValue('queues'));
if (!empty($selected_queues)) {
$this
->{$form_state
->getValue('operation')}($form_state, $selected_queues);
}
}
}
public function submitBatch(FormStateInterface $form_state, $queues) {
$batch = [
'title' => $this
->t('Processing queues'),
'operations' => [],
'finished' => [
'\\Drupal\\queue_ui\\QueueUIBatch',
'finish',
],
];
foreach ($queues as $queue_name) {
$batch['operations'][] = [
'\\Drupal\\queue_ui\\QueueUIBatch::step',
[
$queue_name,
],
];
}
batch_set($batch);
}
public function submitRelease(FormStateInterface $form_state, $queues) {
foreach ($queues as $queue_name) {
if ($queue_ui = $this->queueUIManager
->fromQueueName($queue_name)) {
$num_updated = $queue_ui
->releaseItems($queue_name);
$this->messenger
->addMessage($this
->t('@count lease reset in queue @name', [
'@count' => $num_updated,
'@name' => $queue_name,
]));
}
}
}
public function submitClear(FormStateInterface $form_state, $queues) {
$this->tempStoreFactory
->get('queue_ui_clear_queues')
->set($this->currentUser
->id(), $queues);
$form_state
->setRedirect('queue_ui.confirm_clear_form');
}
}