admincss-8.x-2.2/src/Form/AdminCssEditor.php
src/Form/AdminCssEditor.php
<?php
namespace Drupal\admincss\Form;
use Drupal\Core\Asset\AssetCollectionOptimizerInterface;
use Drupal\Core\Cache\CacheTagsInvalidatorInterface;
use Drupal\Core\Config\ConfigFactoryInterface;
use Drupal\Core\File\Exception\FileException;
use Drupal\Core\File\FileSystemInterface;
use Drupal\Core\Form\ConfigFormBase;
use Drupal\Core\Form\FormStateInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
/**
* Admin CSS editor form.
*/
class AdminCssEditor extends ConfigFormBase {
/**
* The file system.
*
* @var \Drupal\Core\File\FileSystemInterface
*/
protected $fileSystem;
/**
* The cache tag invalidator.
*
* @var \Drupal\Core\Cache\CacheTagsInvalidatorInterface
*/
protected $cacheTagsInvalidator;
/**
* The CSS asset collection optimizer service.
*
* @var \Drupal\Core\Asset\AssetCollectionOptimizerInterface
*/
protected $cssCollectionOptimizer;
/**
* The JavaScript asset collection optimizer service.
*
* @var \Drupal\Core\Asset\AssetCollectionOptimizerInterface
*/
protected $jsCollectionOptimizer;
/**
* Constructs a PerformanceForm object.
*
* @param \Drupal\Core\Config\ConfigFactoryInterface $config_factory
* The factory for configuration objects.
* @param \Drupal\Core\File\FileSystemInterface $file_system
* The file system.
* @param \Drupal\Core\Cache\CacheTagsInvalidatorInterface $cache_tags_invalidator
* The cache tags invalidator service.
* @param \Drupal\Core\Asset\AssetCollectionOptimizerInterface $css_collection_optimizer
* The CSS asset collection optimizer service.
* @param \Drupal\Core\Asset\AssetCollectionOptimizerInterface $js_collection_optimizer
* The JavaScript asset collection optimizer service.
*/
public function __construct(
ConfigFactoryInterface $config_factory,
FileSystemInterface $file_system,
CacheTagsInvalidatorInterface $cache_tags_invalidator,
AssetCollectionOptimizerInterface $css_collection_optimizer,
AssetCollectionOptimizerInterface $js_collection_optimizer
) {
parent::__construct($config_factory);
$this->fileSystem = $file_system;
$this->cacheTagsInvalidator = $cache_tags_invalidator;
$this->cssCollectionOptimizer = $css_collection_optimizer;
$this->jsCollectionOptimizer = $js_collection_optimizer;
}
/**
* {@inheritdoc}
*/
public static function create(ContainerInterface $container) {
return new static(
$container->get('config.factory'),
$container->get('file_system'),
$container->get('cache_tags.invalidator'),
$container->get('asset.css.collection_optimizer'),
$container->get('asset.js.collection_optimizer')
);
}
/**
* {@inheritdoc}
*/
public function getFormId() {
return 'admincss_config_form';
}
/**
* {@inheritdoc}
*/
public function getEditableConfigNames() {
return [
'admincss.settings',
];
}
/**
* {@inheritdoc}
*/
public function buildForm(array $form, FormStateInterface $form_state) {
$form['custom_css'] = [
'#prefix' => '<div class="admincss-ace-editor">',
'#suffix' => '</div>',
'#type' => 'textarea',
'#title' => $this->t('Custom CSS'),
'#description' => $this->t('The custom CSS code.'),
'#default_value' => $this->config('admincss.settings')->get('custom_css'),
'#rows' => 10,
'#attributes' => [
'class' => [
'admincss__editor',
'admincss__custom-css',
],
'data-ace-mode' => 'css',
],
];
$form['#attached']['library'][] = 'admincss/admincss.editor';
return parent::buildForm($form, $form_state);
}
/**
* {@inheritdoc}
*/
public function submitForm(array &$form, FormStateInterface $form_state) {
$config = $this->config('admincss.settings');
$custom_css = $form_state->getValue('custom_css');
$config->set('custom_css', $custom_css);
$config->save();
$changed = FALSE;
$destination_uri = 'public://admin-style.css';
if (empty($custom_css)) {
// Empty CSS, delete the file.
try {
$this->fileSystem->delete($destination_uri);
$changed = TRUE;
}
catch (FileException $e) {
// Ignore and continue.
}
}
elseif (\Drupal::service('file.repository')->writeData($custom_css, $destination_uri, FileSystemInterface::EXISTS_REPLACE)) {
$changed = TRUE;
}
if ($changed) {
// Flush the css/js asset cache.
$this->flushAssetCache();
}
else {
$this->messenger()->addWarning($this->t('Failed to successfully write the changes to disk.'));
}
parent::submitForm($form, $form_state);
}
/**
* Flush the asset cache.
*
* @see drupal_flush_all_caches()
*/
protected function flushAssetCache() {
if ($this->config('system.performance')->get('css.preprocess')) {
/*
* CSS aggregation is enabled.
* Clear the asset resolver cache typically used for storing the
* aggregated files.
* @see \Drupal\Core\Asset\AssetResolver::getCssAssets
* @see \Drupal\Core\Asset\AssetResolver::getJsAssets
*
* The invalidation call might be potentially expensive to run.
* Drupal should add an AssetResolver asset specific tag.
*
* An alternative is to disable preprocessing on the admincss asset.
* But you lose the various optimizations Drupal provides.
*/
$this->cacheTagsInvalidator->invalidateTags(['library_info']);
// Delete the optimized CSS and JS asset file caches.
$this->cssCollectionOptimizer->deleteAll();
$this->jsCollectionOptimizer->deleteAll();
}
else {
// Regenerate the dummy query string.
_drupal_flush_css_js();
}
}
}
