setka-8.x-1.0/src/Form/SettingsForm.php
src/Form/SettingsForm.php
<?php namespace Drupal\setka_editor\Form; use Drupal\Core\Asset\CssCollectionOptimizer; use Drupal\Core\Asset\JsCollectionOptimizer; use Drupal\Core\Asset\LibraryDiscovery; use Drupal\Core\Cache\Cache; use Drupal\Core\Cache\DatabaseBackend; use Drupal\Core\Config\ConfigFactoryInterface; use Drupal\Core\Config\ImmutableConfig; use Drupal\Core\File\FileSystem; use Drupal\Core\Form\ConfigFormBase; use Drupal\Core\Link; use Drupal\Core\Lock\LockBackendInterface; use Drupal\Core\Queue\QueueFactory; use Drupal\Core\State\State; use Drupal\Core\Url; use Drupal\setka_editor\SetkaEditorApi; use Drupal\setka_editor\SetkaEditorHelper; use Symfony\Component\DependencyInjection\ContainerInterface; use Symfony\Component\HttpFoundation\Request; use Drupal\Core\Form\FormStateInterface; /** * Defines a form that configures Setka Editor settings. */ class SettingsForm extends ConfigFormBase { /** * Setka Editor api service. * * @var \Drupal\setka_editor\SetkaEditorApi */ protected $editorApi; /** * Cache Discovery bin backend. * * @var \Drupal\Core\Cache\DatabaseBackend */ protected $cacheDiscovery; /** * Drupal CSS optimizer service. * * @var \Drupal\Core\Asset\CssCollectionOptimizer */ protected $cssOptimizer; /** * Drupal JS optimizer service. * * @var \Drupal\Core\Asset\JsCollectionOptimizer */ protected $jsOptimizer; /** * Drupal file_system service. * * @var \Drupal\Core\File\FileSystem */ protected $fileSystem; /** * Drupal state service. * * @var \Drupal\Core\State\State */ protected $state; /** * Drupal queue factory. * * @var \Drupal\Core\Queue\QueueFactory */ protected $queueFactory; /** * Library discovery service. * * @var \Drupal\Core\Asset\LibraryDiscovery */ protected $libraryDiscovery; /** * Lock service. * * @var \Drupal\Core\Lock\LockBackendInterface */ protected $lock; /** * {@inheritdoc} */ public function __construct(ConfigFactoryInterface $configFactory, SetkaEditorApi $editorApi, DatabaseBackend $cacheDiscovery, CssCollectionOptimizer $cssOptimizer, JsCollectionOptimizer $jsOptimizer, FileSystem $fileSystem, State $state, QueueFactory $queueFactory, LibraryDiscovery $libraryDiscovery, LockBackendInterface $lock) { parent::__construct($configFactory); $this->editorApi = $editorApi; $this->cacheDiscovery = $cacheDiscovery; $this->cssOptimizer = $cssOptimizer; $this->jsOptimizer = $jsOptimizer; $this->fileSystem = $fileSystem; $this->state = $state; $this->queueFactory = $queueFactory; $this->libraryDiscovery = $libraryDiscovery; $this->lock = $lock; } /** * {@inheritdoc} */ public static function create(ContainerInterface $container) { return new static( $container->get('config.factory'), $container->get('setka_editor.api'), $container->get('cache.discovery'), $container->get('asset.css.collection_optimizer'), $container->get('asset.js.collection_optimizer'), $container->get('file_system'), $container->get('state'), $container->get('queue'), $container->get('library.discovery'), $container->get('lock') ); } /** * {@inheritdoc} */ public function getFormId() { return 'setka_editor_admin_settings_form'; } /** * {@inheritdoc} */ protected function getEditableConfigNames() { return [ 'setka_editor.settings', ]; } /** * {@inheritdoc} */ public function buildForm(array $form, FormStateInterface $form_state, Request $request = NULL) { $form = parent::buildForm($form, $form_state); $config = $this->config('setka_editor.settings'); $setkaEditorVersion = $config->get('setka_editor_version'); if ($setkaEditorVersion) { $form['setka_license_description'] = [ '#markup' => '<div class="messages messages--status">' . $this->t('Current Setka Editor version: @version', ['@version' => $setkaEditorVersion]) . '</div>', ]; } else { $link = Link::fromTextAndUrl('https://editor.setka.io', Url::fromUri('https://editor.setka.io'))->toString(); $licenseDescription = $this->t('To activate Setka Editor you need to register at @link. After registration, you will receive a unique license key, which must be inserted in the box below. If you already have a license key, use it to activate it.', ['@link' => $link] ); $form['setka_license_description'] = [ '#markup' => '<p>' . $licenseDescription . '</p>', ]; } $form['setka_license_key'] = [ '#type' => 'textfield', '#title' => $this->t('License key'), '#default_value' => $config->get('setka_license_key'), '#empty_value' => '', '#maxlength' => 255, '#required' => FALSE, '#description' => $this->t('You may find the license key in your personal account.'), ]; $setkaUseCdn = $config->get('setka_use_cdn'); $setkaUseCdnDisabled = !SetkaEditorHelper::checkSetkaFolderPermissions($this->fileSystem); $form['setka_use_cdn'] = [ '#type' => 'checkbox', '#title' => $this->t('Use files from Setka CDN'), '#default_value' => $setkaUseCdn, '#disabled' => $setkaUseCdnDisabled, '#description' => $this->t('If option is checked module will use css/js files from setka.io cdn, otherwise files will be loaded on site.'), ]; return $form; } /** * {@inheritdoc} */ public function validateForm(array &$form, FormStateInterface $form_state) { parent::validateForm($form, $form_state); $setka_license_key = $form_state->getValue('setka_license_key'); if (!empty($setka_license_key)) { if (!$this->editorApi->getCurrentBuild($setka_license_key)) { $link = $this->getLinkGenerator()->generate('https://editor.setka.io/support', Url::fromUri('https://editor.setka.io/support')); $licenseText = $this->t('It seems that something went wrong. Contact customer support: @link.', ['@link' => $link] ); $form_state->setErrorByName('setka_license_key', $licenseText); } } } /** * {@inheritdoc} */ public function submitForm(array &$form, FormStateInterface $form_state) { $values = $form_state->getValues(); $originalLicenseKey = $this->config('setka_editor.settings')->get('setka_license_key'); $downloadFiles = (!$values['setka_use_cdn'] && SetkaEditorHelper::checkSetkaFolderPermissions($this->fileSystem)); if (!empty($values['setka_license_key'])) { if ($currentBuild = $this->editorApi->getCurrentBuild($values['setka_license_key'])) { $parsedValues = SetkaEditorHelper::parseStyleManagerData($currentBuild); $values = array_merge($values, $parsedValues); } } if (!empty($values['setka_editor_js_cdn']) && !empty($values['setka_editor_css_cdn']) && !empty($values['setka_company_css_cdn']) && !empty($values['setka_company_json_cdn'] && !empty($values['setka_public_js_cdn']))) { if (empty($originalLicenseKey) || ($originalLicenseKey != $values['setka_license_key'])) { $this->editorApi->pushSystemInfo($values['setka_license_key']); } if ($downloadFiles) { $queue = $this->queueFactory->get('update_setke_editor'); if (!$queue->numberOfItems()) { $queue->createQueue(); } $queue->createItem(['newSettings' => $values]); $this->getLogger('setka_editor')->info('Setka Editor config update: config update task added to queue.'); if ($this->lock->acquire('setka_editor_files_update')) { while ($newSettingsItem = $queue->claimItem()) { $newSettingsData = $newSettingsItem->data['newSettings']; SetkaEditorHelper::buildSetkaFilesUpdateTask($this->config('setka_editor.settings'), $this->state, $newSettingsData); $editableConfig = $this->configFactory->getEditable('setka_editor.settings'); if (isset($newSettingsData['setka_license_key'])) { $editableConfig->set('setka_license_key', $newSettingsData['setka_license_key']); } if (isset($newSettingsData['setka_use_cdn'])) { $editableConfig->set('setka_use_cdn', $newSettingsData['setka_use_cdn']); } $editableConfig ->set('setka_editor_version', $newSettingsData['setka_editor_version']) ->set('setka_editor_public_token', $newSettingsData['setka_editor_public_token']) ->set('setka_company_meta_data', $newSettingsData['setka_company_meta_data']) ->set('setka_editor_js_cdn', $newSettingsData['setka_editor_js_cdn']) ->set('setka_editor_css_cdn', $newSettingsData['setka_editor_css_cdn']) ->set('setka_company_css_cdn', $newSettingsData['setka_company_css_cdn']) ->set('setka_company_json_cdn', $newSettingsData['setka_company_json_cdn']) ->set('setka_public_js_cdn', $newSettingsData['setka_public_js_cdn']) ->save(); $this->libraryDiscovery->clearCachedDefinitions(); $this->configFactory->reset('setka_editor.settings'); SetkaEditorHelper::runSetkaFilesUpdateTask($this->state); $queue->deleteItem($newSettingsItem); } parent::submitForm($form, $form_state); $this->getLogger('setka_editor')->info('Setka Editor config update: successful update!'); foreach (Cache::getBins() as $cache_backend) { $cache_backend->deleteAll(); } $this->libraryDiscovery->clearCachedDefinitions(); $this->configFactory->reset('setka_editor.settings'); $this->cacheDiscovery->deleteAll(); $this->cssOptimizer->deleteAll(); $this->jsOptimizer->deleteAll(); _drupal_flush_css_js(); $this->lock->release('setka_editor_files_update'); } } else { $this->config('setka_editor.settings') ->set('setka_license_key', $values['setka_license_key']) ->set('setka_editor_version', $values['setka_editor_version']) ->set('setka_editor_public_token', $values['setka_editor_public_token']) ->set('setka_company_meta_data', $values['setka_company_meta_data']) ->set('setka_editor_js_cdn', $values['setka_editor_js_cdn']) ->set('setka_editor_css_cdn', $values['setka_editor_css_cdn']) ->set('setka_company_css_cdn', $values['setka_company_css_cdn']) ->set('setka_company_json_cdn', $values['setka_company_json_cdn']) ->set('setka_public_js_cdn', $values['setka_public_js_cdn']) ->set('setka_use_cdn', $values['setka_use_cdn']) ->save(); $this->state->setMultiple( [ 'setka_editor_js' => FALSE, 'setka_editor_css' => FALSE, 'setka_company_css' => FALSE, 'setka_company_json' => FALSE, 'setka_public_js' => FALSE, ] ); parent::submitForm($form, $form_state); foreach (Cache::getBins() as $cache_backend) { $cache_backend ->deleteAll(); } $this->libraryDiscovery->clearCachedDefinitions(); $this->configFactory->reset('setka_editor.settings'); $this->cacheDiscovery->deleteAll(); $this->cssOptimizer->deleteAll(); $this->jsOptimizer->deleteAll(); _drupal_flush_css_js(); } if (empty($originalLicenseKey)) { $this->messenger()->addMessage($this->t('Setka Editor license key activated successfully!')); } elseif ($originalLicenseKey != $values['setka_license_key']) { $this->messenger()->addMessage($this->t('Setka Editor license key updated successfully!')); } else { $this->messenger()->addMessage($this->t('Setka Editor configuration updated successfully!')); } } else { $this->config('setka_editor.settings')->delete()->save(); $this->config('setka_editor.settings') ->set('setka_license_key', $values['setka_license_key']) ->set('setka_use_cdn', $values['setka_use_cdn']) ->save(); } } /** * Returns CDN Setka Editor config value if local is empty. * * @param \Drupal\Core\Config\ImmutableConfig $config * Immutable config. * @param \Drupal\Core\State\State $state * Drupal state service. * @param string $confName * Config value name. * @param bool $libraryFormat * TRUE - returns library formatted array, FALSE - returns URL string. * @param bool $loadAsync * Load library asynchronously or not. * * @return string|null * Config value. */ public static function getConfigValue(ImmutableConfig $config, State $state, $confName, $libraryFormat = FALSE, $loadAsync = FALSE) { $attributes = []; if ($loadAsync) { $attributes = ['async' => TRUE]; } $setkaUseCdn = TRUE; if (\Drupal::lock()->lockMayBeAvailable('setka_editor_files_update')) { $setkaUseCdn = $config->get('setka_use_cdn'); } if (!$setkaUseCdn) { $confValue = $state->get($confName); if (empty($confValue)) { $confValue = $config->get($confName . '_cdn'); if (!empty($confValue) && $libraryFormat) { $confValue = [ $confValue => [ 'type' => 'external', 'scope' => 'header', 'attributes' => $attributes, ], ]; } } elseif ($libraryFormat) { $confValue = [$confValue => ['scope' => 'header', 'attributes' => $attributes]]; } } else { $confValue = $config->get($confName . '_cdn'); if (!empty($confValue) && $libraryFormat) { $confValue = [ $confValue => [ 'type' => 'external', 'scope' => 'header', 'attributes' => $attributes, ], ]; } } return $confValue; } }