<?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()); }