dateFormatter = $date_formatter; $this->cssCollectionOptimizer = $css_collection_optimizer; $this->jsCollectionOptimizer = $js_collection_optimizer; $this->moduleHandler = $module_handler; } /** * {@inheritdoc} */ public static function create(ContainerInterface $container) { return new static( $container->get('config.factory'), $container->get('date.formatter'), $container->get('asset.css.collection_optimizer'), $container->get('asset.js.collection_optimizer'), $container->get('module_handler') ); } /** * {@inheritdoc} */ public function getFormId() { return 'system_performance_settings'; } /** * {@inheritdoc} */ protected function getEditableConfigNames() { return ['system.performance']; } /** * {@inheritdoc} */ public function buildForm(array $form, FormStateInterface $form_state) { $form['#attached']['library'][] = 'system/drupal.system'; $config = $this->config('system.performance'); $form['clear_cache'] = [ '#type' => 'details', '#title' => t('Clear cache'), '#open' => TRUE, ]; $form['clear_cache']['clear'] = [ '#type' => 'submit', '#value' => t('Clear all caches'), '#submit' => ['::submitCacheClear'], ]; $form['caching'] = [ '#type' => 'details', '#title' => t('Caching'), '#open' => TRUE, ]; // Identical options to the ones for block caching. // @see \Drupal\Core\Block\BlockBase::buildConfigurationForm() $period = [0, 60, 180, 300, 600, 900, 1800, 2700, 3600, 10800, 21600, 32400, 43200, 86400]; $period = array_map([$this->dateFormatter, 'formatInterval'], array_combine($period, $period)); $period[0] = '<' . t('no caching') . '>'; $form['caching']['page_cache_maximum_age'] = [ '#type' => 'select', '#title' => t('Browser and proxy cache maximum age'), '#default_value' => $config->get('cache.page.max_age'), '#options' => $period, '#description' => t('This is used as the value for max-age in Cache-Control headers.'), ]; $form['caching']['internal_page_cache'] = [ '#markup' => $this->t('Drupal provides an Internal Page Cache module that is recommended for small to medium-sized websites.', [':module_enable' => Url::fromRoute('system.modules_list')->toString()]), '#access' => !$this->moduleHandler->moduleExists('page_cache'), ]; $directory = 'public://'; $is_writable = is_dir($directory) && is_writable($directory); $disabled = !$is_writable; $disabled_message = ''; if (!$is_writable) { $disabled_message = ' ' . t('Set up the public files directory to make these optimizations available.', [':file-system' => $this->url('system.file_system_settings')]); } $form['bandwidth_optimization'] = [ '#type' => 'details', '#title' => t('Bandwidth optimization'), '#open' => TRUE, '#description' => t('External resources can be optimized automatically, which can reduce both the size and number of requests made to your website.') . $disabled_message, ]; $form['bandwidth_optimization']['preprocess_css'] = [ '#type' => 'checkbox', '#title' => t('Aggregate CSS files'), '#default_value' => $config->get('css.preprocess'), '#disabled' => $disabled, ]; $form['bandwidth_optimization']['preprocess_js'] = [ '#type' => 'checkbox', '#title' => t('Aggregate JavaScript files'), '#default_value' => $config->get('js.preprocess'), '#disabled' => $disabled, ]; return parent::buildForm($form, $form_state); } /** * {@inheritdoc} */ public function submitForm(array &$form, FormStateInterface $form_state) { $this->cssCollectionOptimizer->deleteAll(); $this->jsCollectionOptimizer->deleteAll(); $this->config('system.performance') ->set('cache.page.max_age', $form_state->getValue('page_cache_maximum_age')) ->set('css.preprocess', $form_state->getValue('preprocess_css')) ->set('js.preprocess', $form_state->getValue('preprocess_js')) ->save(); parent::submitForm($form, $form_state); } /** * Clears the caches. */ public function submitCacheClear(array &$form, FormStateInterface $form_state) { drupal_flush_all_caches(); $this->messenger()->addStatus($this->t('Caches cleared.')); } }