View source
<?php
namespace Drupal\warmer\Form;
use Drupal\Core\Form\FormBase;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Routing\RouteProviderInterface;
use Drupal\Core\Url;
use Drupal\warmer\HookImplementations;
use Drupal\warmer\Plugin\WarmerPluginBase;
use Drupal\warmer\Plugin\WarmerPluginManager;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\Routing\Exception\RouteNotFoundException;
final class EnqueueForm extends FormBase {
private $warmerManager;
private $queueManager;
private $routeProvider;
public static function create(ContainerInterface $container) {
$form_object = parent::create($container);
$form_object
->setWarmerManager($container
->get('plugin.manager.warmer'));
$form_object
->setQueueManager($container
->get('warmer.queue_manager'));
$form_object
->setMessenger($container
->get('messenger'));
$form_object
->setRouteProvider($container
->get('router.route_provider'));
return $form_object;
}
public function setWarmerManager(WarmerPluginManager $warmer_manager) {
$this->warmerManager = $warmer_manager;
}
public function setQueueManager($queue_manager) {
$this->queueManager = $queue_manager;
}
public function setRouteProvider(RouteProviderInterface $route_provider) {
$this->routeProvider = $route_provider;
}
public function getFormId() {
return 'warmer.enqueue';
}
public function buildForm(array $form, FormStateInterface $form_state) {
$form['help'] = [
'#type' => 'item',
'#description' => $this
->t('This page allows you to enqueue cache warming operations manually. This will put the cache warming operations in a queue. If you want to actually execute them right away you can force processing the queue. A good way to do that is by installing the <a href=":url">Queue UI</a> module or using Drush. This module will provide a UI to process an entire queue.', [
':url' => 'https://www.drupal.org/project/queue_ui',
]),
];
$options = array_map(function (array $definition) {
return [
'title' => $definition['label'],
'description' => $definition['description'],
];
}, $this->warmerManager
->getDefinitions());
$header = [
'title' => $this
->t('Warmer'),
'description' => $this
->t('Description'),
];
$form['warmers'] = [
'#type' => 'tableselect',
'#header' => $header,
'#options' => $options,
'#empty' => $this
->t('No warmers available. Enable the Entity Warmer submodule, or try installing extending modules like JSON:API Boost.'),
];
$form['submit'] = [
'#type' => 'submit',
'#value' => $this
->t('Warm Caches'),
'#button_type' => 'primary',
];
try {
$this->routeProvider
->getRouteByName('queue_ui.overview_form');
$form['queues'] = [
'#type' => 'link',
'#title' => $this
->t('List of queues'),
'#url' => Url::fromRoute('queue_ui.overview_form'),
];
} catch (RouteNotFoundException $e) {
}
return $form;
}
public function submitForm(array &$form, FormStateInterface $form_state) {
$warmer_ids = $form_state
->getValue('warmers');
$warmers = $this->warmerManager
->getWarmers($warmer_ids);
$count_list = array_map(function (WarmerPluginBase $warmer) {
$count = 0;
$ids = [
NULL,
];
while ($ids = $warmer
->buildIdsBatch(end($ids))) {
$this->queueManager
->enqueueBatch(HookImplementations::class . '::warmBatch', $ids, $warmer);
$count += count($ids);
}
return $count;
}, $warmers);
$total = array_sum($count_list);
$this->messenger
->addStatus($this
->t('@total items enqueued for cache warming.', [
'@total' => $total,
]));
}
}