View source
<?php
namespace Drupal\scheduler\Form;
use Drupal\Core\Config\ConfigFactoryInterface;
use Drupal\Core\Extension\ModuleHandlerInterface;
use Drupal\Core\Form\ConfigFormBase;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Url;
use Drupal\scheduler\SchedulerManager;
use Symfony\Component\DependencyInjection\ContainerInterface;
class SchedulerCronForm extends ConfigFormBase {
protected $moduleHandler;
protected $schedulerManager;
public function __construct(ConfigFactoryInterface $config_factory, ModuleHandlerInterface $module_handler, SchedulerManager $scheduler_manager) {
parent::__construct($config_factory);
$this->moduleHandler = $module_handler;
$this->schedulerManager = $scheduler_manager;
}
public static function create(ContainerInterface $container) {
return new static($container
->get('config.factory'), $container
->get('module_handler'), $container
->get('scheduler.manager'));
}
public function getFormId() {
return 'scheduler_cron_form';
}
protected function getEditableConfigNames() {
return [
'scheduler.settings',
];
}
public function buildForm(array $form, FormStateInterface $form_state) {
$config = $this
->config('scheduler.settings');
$form['cron_settings'] = [
'#type' => 'fieldset',
'#title' => $this
->t('Lightweight cron settings'),
];
$form['cron_settings']['lightweight_log'] = [
'#type' => 'checkbox',
'#title' => $this
->t('Log every activation and completion message.'),
'#default_value' => $config
->get('log'),
'#description' => $this
->t('When this option is checked, Scheduler will write an entry to the log every time the lightweight cron process is started and completed. This is useful during set up and testing, but can result in a large number of log entries. Any actions performed during the lightweight cron run will always be logged regardless of this setting.'),
];
$form['cron_settings']['lightweight_access_key'] = [
'#type' => 'textfield',
'#title' => $this
->t('Lightweight cron access key'),
'#default_value' => $config
->get('lightweight_cron_access_key'),
'#required' => TRUE,
'#size' => 25,
'#description' => $this
->t("Similar to Drupal's cron key this acts as a security token to prevent unauthorised calls to scheduler/cron. The key should be passed as scheduler/cron/{access key}"),
];
$form['cron_settings']['create_key'][] = [
'#type' => 'submit',
'#value' => $this
->t('Generate new random key'),
'#submit' => [
'::generateRandomKey',
],
'#validate' => [],
];
$form['buttons']['submit_cron'][] = [
'#type' => 'submit',
'#prefix' => $this
->t("You can test Scheduler's lightweight cron process interactively"),
'#value' => $this
->t("Run Scheduler's lightweight cron now"),
'#submit' => [
'::runLightweightCron',
],
'#validate' => [],
];
return parent::buildForm($form, $form_state);
}
public function submitForm(array &$form, FormStateInterface $form_state) {
$config = $this
->config('scheduler.settings');
$config
->set('log', $form_state
->getValue('lightweight_log'));
$config
->set('lightweight_cron_access_key', $form_state
->getValue('lightweight_access_key'));
$config
->save();
parent::submitForm($form, $form_state);
}
public function generateRandomKey(array &$form, FormStateInterface $form_state) {
$config = $this
->config('scheduler.settings');
$config
->set('lightweight_cron_access_key', substr(md5(rand()), 0, 20));
$config
->save();
parent::submitForm($form, $form_state);
}
public function runLightweightCron(array &$form, FormStateInterface $form_state) {
$this->schedulerManager
->runLightweightCron([
'admin_form' => TRUE,
]);
if ($this->moduleHandler
->moduleExists('dblog')) {
$url = Url::fromRoute('dblog.overview')
->toString();
$message = $this
->t('Lightweight cron run completed. See the <a href="@url">log</a> for details.', [
'@url' => $url,
]);
}
else {
$message = $this
->t('Lightweight cron run completed.');
}
$this
->messenger()
->addMessage($message);
}
}