setka-8.x-1.0/setka_editor.module
setka_editor.module
<?php /** * @file * Main Setka Editor module file. */ use Drupal\Core\Cache\Cache; use Drupal\Core\Entity\EntityInterface; use Drupal\Core\Form\FormStateInterface; use Drupal\Core\Link; use Drupal\Core\Url; use Drupal\file\Entity\File; use Drupal\setka_editor\Form\SettingsForm; use Drupal\setka_editor\SetkaEditorHelper; /** * Implements hook_cron(). */ function setka_editor_cron() { $config = \Drupal::config('setka_editor.settings'); $setkaUseCdn = $config->get('setka_use_cdn'); $setkaEditorLicense = $config->get('setka_license_key'); if ($setkaEditorLicense && !$setkaUseCdn) { $editorApi = \Drupal::service('setka_editor.api'); try { if (!SetkaEditorHelper::checkSetkaFolderPermissions(\Drupal::service('file_system'))) { throw new \Exception('Setka files directory is not writable!'); } if ($currentBuild = $editorApi->getCurrentBuild($setkaEditorLicense)) { $values = SetkaEditorHelper::parseStyleManagerData($currentBuild); $editorJsCdn = !empty($values['setka_editor_js_cdn']); $editorCssCdn = !empty($values['setka_editor_css_cdn']); $companyCssCdn = !empty($values['setka_company_css_cdn']); $companyJsonCdn = !empty($values['setka_company_json_cdn']); $publicJsCdn = !empty($values['setka_public_js_cdn']); if (!($editorJsCdn && $editorCssCdn && $companyCssCdn && $companyJsonCdn && $publicJsCdn)) { throw new \Exception('Setka Editor config update by cron error: required response data does not exist!'); } $queue = \Drupal::queue('update_setke_editor'); if (!$queue->numberOfItems()) { $queue->createQueue(); } $queue->createItem(['newSettings' => $values]); $lock = \Drupal::lock(); if ($lock->acquire('setka_editor_files_update')) { $configFactory = \Drupal::configFactory(); $state = \Drupal::state(); while ($newSettingsItem = $queue->claimItem()) { $newSettingsData = $newSettingsItem->data['newSettings']; SetkaEditorHelper::buildSetkaFilesUpdateTask($config, $state, $newSettingsData); $configFactory->getEditable('setka_editor.settings') ->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(); \Drupal::service('library.discovery')->clearCachedDefinitions(); $configFactory->reset('setka_editor.settings'); SetkaEditorHelper::runSetkaFilesUpdateTask($state); $queue->deleteItem($newSettingsItem); } foreach (Cache::getBins() as $cache_backend) { $cache_backend->deleteAll(); } \Drupal::service('library.discovery')->clearCachedDefinitions(); $configFactory->reset('setka_editor.settings'); \Drupal::service('cache.discovery')->deleteAll(); \Drupal::service('asset.css.collection_optimizer')->deleteAll(); \Drupal::service('asset.js.collection_optimizer')->deleteAll(); _drupal_flush_css_js(); $lock->release('setka_editor_files_update'); } } } catch (\Exception $e) { watchdog_exception('setka_editor', $e); } } } /** * Implements hook_theme(). */ function setka_editor_theme($existing, $type, $theme, $path) { return [ 'setka_editor_formatter' => [ 'variables' => [ 'editor_content' => '', 'typekit_id' => '', ], ], ]; } /** * Implements hook_library_info_build(). */ function setka_editor_library_info_build() { $libraries = []; $config = \Drupal::config('setka_editor.settings'); $logger = \Drupal::logger('setka_editor'); $state = \Drupal::state(); $messenger = \Drupal::messenger(); $setka_editor_license = $config->get('setka_license_key'); if (!empty($setka_editor_license)) { $setka_editor_js = SettingsForm::getConfigValue($config, $state, 'setka_editor_js', TRUE); $setka_editor_css = SettingsForm::getConfigValue($config, $state, 'setka_editor_css', TRUE); if (!empty($setka_editor_js) && !empty($setka_editor_css)) { $libraries['setka-editor'] = [ 'js' => $setka_editor_js, 'css' => [ 'base' => $setka_editor_css, ], ]; } else { $logger->warning("Can't add 'setka-editor' library. Please check your Setka editor license key."); $messenger->addWarning("Can't add 'setka-editor' library. Please check your Setka editor license key."); } $setka_styles_css = SettingsForm::getConfigValue($config, $state, 'setka_company_css', TRUE); if (!empty($setka_styles_css)) { $libraries['setka-styles'] = [ 'css' => [ 'base' => $setka_styles_css, ], ]; } else { $logger->warning("Can't add 'setka-styles' library. Please check your Setka editor license key."); $messenger->addWarning("Can't add 'setka-styles' library. Please check your Setka editor license key."); } $setka_public_js = SettingsForm::getConfigValue($config, $state, 'setka_public_js', TRUE, TRUE); if (!empty($setka_public_js)) { $libraries['setka-public-js'] = [ 'js' => $setka_public_js, ]; } else { $logger->warning("Can't add 'setka-public-js' library. Please check your Setka editor license key."); $messenger->addWarning("Can't add 'setka-public-js' library. Please check your Setka editor license key."); } } return $libraries; } /** * Implements hook_library_info_alter(). */ function setka_editor_library_info_alter(&$libraries, $extension) { if ($extension == 'setka_editor') { $state = \Drupal::getContainer()->get('state'); $setkaEditorFilesUpdate = !\Drupal::lock()->lockMayBeAvailable('setka_editor_files_update'); $config = \Drupal::config('setka_editor.settings'); if ($setkaEditorFilesUpdate) { if (!empty($libraries['setka-editor']['js'])) { $url = key($libraries['setka-editor']['js']); $options = $libraries['setka-editor']['js'][$url]; if ($cdnUrl = $config->get('setka_editor_js_cdn')) { $libraries['setka-editor']['js'] = [ $cdnUrl => $options, ]; } } if (!empty($libraries['setka-editor']['css']['base'])) { $url = key($libraries['setka-editor']['css']['base']); $options = $libraries['setka-editor']['css']['base'][$url]; if ($cdnUrl = $config->get('setka_editor_css_cdn')) { $libraries['setka-editor']['css']['base'] = [ $cdnUrl => $options, ]; } } if (!empty($libraries['setka-styles']['css']['base'])) { $url = key($libraries['setka-styles']['css']['base']); $options = $libraries['setka-styles']['css']['base'][$url]; if ($cdnUrl = $config->get('setka_company_css_cdn')) { $libraries['setka-styles']['css']['base'] = [ $cdnUrl => $options, ]; } } if (!empty($libraries['setka-public-js']['js'])) { $url = key($libraries['setka-public-js']['js']); $options = $libraries['setka-public-js']['js'][$url]; if ($cdnUrl = $config->get('setka_public_js_cdn')) { $libraries['setka-public-js']['js'] = [ $cdnUrl => $options, ]; } } } else { if (!empty($libraries['setka-editor'])) { $setka_editor_js = SettingsForm::getConfigValue($config, $state, 'setka_editor_js', TRUE); $setka_editor_css = SettingsForm::getConfigValue($config, $state, 'setka_editor_css', TRUE); if (!empty($setka_editor_js) && !empty($setka_editor_css)) { $libraries['setka-editor'] = [ 'js' => $setka_editor_js, 'css' => [ 'base' => $setka_editor_css, ], ]; } } if (!empty($libraries['setka-styles'])) { $setka_styles_css = SettingsForm::getConfigValue($config, $state, 'setka_company_css', TRUE); if (!empty($setka_styles_css)) { $libraries['setka-styles'] = [ 'css' => [ 'base' => $setka_styles_css, ], ]; } } if (!empty($libraries['setka-public-js'])) { $setka_public_js = SettingsForm::getConfigValue($config, $state, 'setka_public_js', TRUE, TRUE); if (!empty($setka_public_js)) { $libraries['setka-public-js'] = [ 'js' => $setka_public_js, ]; } } } } } /** * Implements hook_entity_insert(). */ function setka_editor_entity_insert(EntityInterface $entity) { $entityType = $entity->getEntityType()->id(); $entityId = $entity->id(); // $setkaEditorUuid needs to put session entity uuid from setka editor field // to know which images to attach to entity. // See \Drupal\setka_Editor\Validate\SetkaEditorValidate::validate method. $setkaEditorUuid = &drupal_static('setkaEditorUuid'); /** @var \Drupal\Core\TempStore\PrivateTempStore $store */ $store = \Drupal::service('user.private_tempstore')->get('setka_editor'); $setkaEditorImages = $store->get('setka_editor_images') ?? []; if ($setkaEditorUuid && !empty($setkaEditorImages[$setkaEditorUuid])) { /** @var \Drupal\file\FileUsage\DatabaseFileUsageBackend $file_usage */ $file_usage = \Drupal::service('file.usage'); $entityImages = File::loadMultiple($setkaEditorImages[$setkaEditorUuid]); foreach ($entityImages as $imageFile) { $file_usage->add($imageFile, 'setka_editor', $entityType, $entityId); } unset($setkaEditorImages[$setkaEditorUuid]); $store->set('setka_editor_images', $setkaEditorImages); } } /** * Implements hook_form_FORM_ID_alter(). */ function setka_editor_form_field_config_edit_form_alter(&$form, FormStateInterface $form_state, $form_id) { if ($form['default_value']['widget'][0]['#setka_editor_widget']) { $form['default_value']['widget'][0]['#type'] = 'hidden'; $form['default_value']['widget'][0]['#default_value'] = ''; $link = Link::fromTextAndUrl('Setka Editor Style Manager', Url::fromUri(SetkaEditorHelper::SETKA_EDITOR_DOMAIN))->toString(); $form['default_value']['widget'][0]['#suffix'] = '<b>' . t('The default settings of Setka Editor must be managed on the @link pages.', ['@link' => $link]) . '</b>'; } }