123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236 |
- <?php
- /**
- * @file
- * Main module file containing hooks.
- */
- use Drupal\Core\Form\FormStateInterface;
- use Drupal\Core\Entity\EntityInterface;
- use Drupal\Core\Routing\RouteMatchInterface;
- use Drupal\system\MenuInterface;
- use Drupal\language\ConfigurableLanguageInterface;
- /**
- *Implements hook_help().
- *
- * @param $route_name
- * @param \Drupal\Core\Routing\RouteMatchInterface $route_match
- * @return \Drupal\Component\Render\MarkupInterface|null
- */
- function simple_sitemap_help($route_name, RouteMatchInterface $route_match) {
- return $route_name === 'help.page.simple_sitemap' ?
- check_markup(file_get_contents(dirname(__FILE__) . "/README.md")) : NULL;
- }
- /**
- * Implements hook_form_alter().
- *
- * Adds sitemap settings to entity types that are supported via plugins.
- *
- * @param $form
- * @param \Drupal\Core\Form\FormStateInterface $form_state
- * @param $form_id
- */
- function simple_sitemap_form_alter(&$form, FormStateInterface $form_state, $form_id) {
- /** @var Drupal\simple_sitemap\Form\FormHelper $f */
- $f = \Drupal::service('simple_sitemap.form_helper');
- if (!$f->processForm($form_state)) {
- return;
- }
- $form['simple_sitemap'] = [
- '#type' => 'details',
- '#group' => isset($form['additional_settings']) ? 'additional_settings' : 'advanced',
- '#title' => t('Simple XML sitemap'),
- '#description' => $f->getEntityCategory() === 'instance' ? t('Settings for this entity can be overridden here.') : '',
- '#weight' => 10,
- ];
- // Attach some js magic to forms.
- if ($f->getEntityCategory() !== 'instance') {
- $form['#attached']['library'][] = 'simple_sitemap/form';
- }
- // Only attach fieldset summary js to 'additional settings' vertical tabs.
- if (isset($form['additional_settings'])) {
- $form['#attached']['library'][] = 'simple_sitemap/fieldsetSummaries';
- }
- $f->displayEntitySettings($form['simple_sitemap'])
- // todo: do not show setting when creating new bundle.
- ->displayRegenerateNow($form['simple_sitemap']);
- // Add submission handler.
- if (isset($form['actions']['submit']['#submit'])) {
- foreach (array_keys($form['actions']) as $action) {
- if ($action !== 'preview'
- && isset($form['actions'][$action]['#type'])
- && $form['actions'][$action]['#type'] === 'submit') {
- $form['actions'][$action]['#submit'][] = 'simple_sitemap_entity_form_submit';
- }
- }
- }
- // Fix for account page rendering other submit handlers not usable.
- else {
- $form['#submit'][] = 'simple_sitemap_entity_form_submit';
- }
- }
- /**
- * Form submission handler called in hook_form_alter.
- *
- * @param $form
- * @param \Drupal\Core\Form\FormStateInterface $form_state
- */
- function simple_sitemap_entity_form_submit($form, FormStateInterface &$form_state) {
- /** @var Drupal\simple_sitemap\Form\FormHelper $f */
- $f = \Drupal::service('simple_sitemap.form_helper');
- if (!$f->processForm($form_state)) {
- return;
- }
- $values = $form_state->getValues();
- // Fix for values appearing in a sub array on a commerce product entity.
- $values = isset($values['simple_sitemap']) ? $values['simple_sitemap'] : $values;
- // Only make changes in DB if sitemap settings actually changed.
- if ($f->valuesChanged($form, $values)) {
- /** @var \Drupal\simple_sitemap\Simplesitemap $generator */
- $generator = \Drupal::service('simple_sitemap.generator');
- $settings = [
- 'index' => (bool) $values['simple_sitemap_index_content'],
- 'priority' => $values['simple_sitemap_priority'],
- 'changefreq' => $values['simple_sitemap_changefreq'],
- 'include_images' => (bool) $values['simple_sitemap_include_images'],
- ];
- // Deleting bundle settings for old bundle.
- // See SimplesitemapEntitiesForm::submitForm().
- // todo: This will not be necessary if "multiple variants pro bundle" is implemented.
- if (isset($form['simple_sitemap']['simple_sitemap_variant']['#default_value'])) {
- $old_variant = $form['simple_sitemap']['simple_sitemap_variant']['#default_value'];
- if ($old_variant !== $values['simple_sitemap_variant']) {
- $generator->setVariants($old_variant)->removeBundleSettings($f->getEntityTypeId(), $f->getBundleName());
- }
- }
- switch ($f->getEntityCategory()) {
- case 'bundle':
- $generator->setVariants($values['simple_sitemap_variant'])
- ->setBundleSettings($f->getEntityTypeId(),
- !empty($f->getBundleName()) ? $f->getBundleName() : $f->getFormEntityId(),
- $settings
- );
- break;
- case 'instance':
- $generator->setVariants($values['simple_sitemap_variant'])
- ->setEntityInstanceSettings($f->getEntityTypeId(),
- !empty($f->getInstanceId()) ? $f->getInstanceId() : $f->getFormEntityId(),
- $settings
- );
- break;
- }
- // Regenerate sitemaps according to user setting.
- if ($values['simple_sitemap_regenerate_now']) {
- $generator->rebuildQueue()->generateSitemap();
- }
- }
- }
- /**
- * Implements hook_cron().
- */
- function simple_sitemap_cron() {
- /** @var \Drupal\simple_sitemap\Simplesitemap $generator */
- $generator = \Drupal::service('simple_sitemap.generator');
- if ($generator->getSetting('cron_generate')) {
- $interval = (int) $generator->getSetting('cron_generate_interval', 0) * 60 * 60;
- $request_time = \Drupal::service('datetime.time')->getRequestTime();
- $generation_in_progress = $generator->getQueueWorker()->generationInProgress();
- $state = \Drupal::state();
- if ($interval === 0
- || $generation_in_progress
- || (($state->get('simple_sitemap.last_cron_generate', 0) + $interval) <= $request_time)) {
- if (!$generation_in_progress) {
- $state->set('simple_sitemap.last_cron_generate', $request_time);
- }
- $generator->generateSitemap('cron');
- }
- }
- }
- /**
- * Implements hook_ENTITY_TYPE_delete().
- *
- * When a language is removed from the system remove it also from settings.
- */
- function simple_sitemap_configurable_language_delete(ConfigurableLanguageInterface $language) {
- /** @var \Drupal\simple_sitemap\Simplesitemap $generator */
- $generator = \Drupal::service('simple_sitemap.generator');
- $excluded_languages = $generator->getSetting('excluded_languages');
- if (isset($excluded_languages[$language->id()])) {
- unset($excluded_languages[$language->id()]);
- $generator->saveSetting('excluded_languages', $excluded_languages);
- }
- }
- /**
- * Implements hook_entity_delete().
- *
- * Removes settings of the removed entity.
- *
- * @param \Drupal\Core\Entity\EntityInterface $entity
- */
- function simple_sitemap_entity_delete(EntityInterface $entity) {
- /** @var \Drupal\simple_sitemap\Simplesitemap $generator */
- $generator = \Drupal::service('simple_sitemap.generator');
- $generator->setVariants(TRUE)->removeEntityInstanceSettings(
- $entity->getEntityTypeId(), $entity->id()
- );
- }
- /**
- * Implements hook_entity_bundle_delete().
- *
- * Removes settings of the removed bundle.
- *
- * @param string $entity_type_id
- * @param string $bundle
- */
- function simple_sitemap_entity_bundle_delete($entity_type_id, $bundle) {
- /** @var \Drupal\simple_sitemap\Simplesitemap $generator */
- $generator = \Drupal::service('simple_sitemap.generator');
- $generator->setVariants(TRUE)->removeBundleSettings($entity_type_id, $bundle);
- }
- /**
- * Implements hook_menu_delete().
- *
- * Removes settings for the removed menu.
- *
- * @param \Drupal\system\MenuInterface $menu
- */
- function simple_sitemap_menu_delete(MenuInterface $menu) {
- /** @var \Drupal\simple_sitemap\Simplesitemap $generator */
- $generator = \Drupal::service('simple_sitemap.generator');
- $generator->setVariants(TRUE)->removeBundleSettings('menu_link_content', $menu->id());
- }
|