5 * Main module file containing hooks.
8 use Drupal\Core\Form\FormStateInterface;
9 use Drupal\Core\Entity\EntityInterface;
10 use Drupal\Core\Routing\RouteMatchInterface;
11 use Drupal\system\MenuInterface;
12 use Drupal\language\ConfigurableLanguageInterface;
15 *Implements hook_help.
18 * @param \Drupal\Core\Routing\RouteMatchInterface $route_match
19 * @return \Drupal\Component\Render\MarkupInterface|null
21 function simple_sitemap_help($route_name, RouteMatchInterface $route_match) {
22 return $route_name === 'help.page.simple_sitemap' ?
23 check_markup(file_get_contents(dirname(__FILE__) . "/README.md")) : NULL;
27 * Implements hook_form_alter.
29 * Adds sitemap settings to entity types that are supported via plugins.
32 * @param \Drupal\Core\Form\FormStateInterface $form_state
35 function simple_sitemap_form_alter(&$form, FormStateInterface $form_state, $form_id) {
38 * @var Drupal\simple_sitemap\Form\FormHelper $f
40 $f = \Drupal::service('simple_sitemap.form_helper');
41 if (!$f->processForm($form_state)) {
45 $form['simple_sitemap'] = [
47 '#group' => isset($form['additional_settings']) ? 'additional_settings' : 'advanced',
48 '#title' => t('Simple XML sitemap'),
49 '#description' => $f->getEntityCategory() === 'instance' ? t('Settings for this entity can be overridden here.') : '',
52 // Attach some js magic to forms.
53 // todo: JS not working on comment entity form, hence disabling.
54 if ($f->getEntityTypeId() !== 'comment' || $f->getEntityCategory() !== 'instance') {
55 $form['#attached']['library'][] = 'simple_sitemap/form';
58 // Only attach fieldset summary js to 'additional settings' vertical tabs.
59 if (isset($form['additional_settings'])) {
60 $form['#attached']['library'][] = 'simple_sitemap/fieldsetSummaries';
63 $f->displayEntitySettings($form['simple_sitemap'])
64 // todo: do not show setting when creating new bundle.
65 ->displayRegenerateNow($form['simple_sitemap']);
67 // Add submission handler.
68 if (isset($form['actions']['submit']['#submit'])) {
69 foreach (array_keys($form['actions']) as $action) {
70 if ($action !== 'preview'
71 && isset($form['actions'][$action]['#type'])
72 && $form['actions'][$action]['#type'] === 'submit') {
73 $form['actions'][$action]['#submit'][] = 'simple_sitemap_entity_form_submit';
77 // Fix for account page rendering other submit handlers not usable.
79 $form['#submit'][] = 'simple_sitemap_entity_form_submit';
84 * Form submission handler called in hook_form_alter.
87 * @param \Drupal\Core\Form\FormStateInterface $form_state
89 function simple_sitemap_entity_form_submit($form, FormStateInterface &$form_state) {
92 * @var Drupal\simple_sitemap\Form\FormHelper $f
94 $f = \Drupal::service('simple_sitemap.form_helper');
95 if (!$f->processForm($form_state)) {
99 $values = $form_state->getValues();
101 // Fix for values appearing in a sub array on a commerce product entity.
102 $values = isset($values['simple_sitemap']) ? $values['simple_sitemap'] : $values;
104 // Only make changes in DB if sitemap settings actually changed.
105 if ($f->valuesChanged($form, $values)) {
108 * @var \Drupal\simple_sitemap\Simplesitemap $generator
110 $generator = \Drupal::service('simple_sitemap.generator');
113 'index' => $values['simple_sitemap_index_content'],
114 'priority' => $values['simple_sitemap_priority'],
115 'changefreq' => $values['simple_sitemap_changefreq'],
116 'include_images' => $values['simple_sitemap_include_images'],
119 switch ($f->getEntityCategory()) {
122 $generator->setBundleSettings(
123 $f->getEntityTypeId(),
124 !empty($f->getBundleName()) ? $f->getBundleName() : $f->getFormEntityId(),
130 $generator->setEntityInstanceSettings(
131 $f->getEntityTypeId(),
132 !empty($f->getInstanceId()) ? $f->getInstanceId() : $f->getFormEntityId(),
138 // Regenerate sitemaps according to user setting.
139 if ($values['simple_sitemap_regenerate_now']) {
140 $generator->generateSitemap();
146 * Implements hook_cron.
148 function simple_sitemap_cron() {
151 * @var \Drupal\simple_sitemap\Simplesitemap $generator
153 $generator = \Drupal::service('simple_sitemap.generator');
154 if ($generator->getSetting('cron_generate')) {
155 $interval = (int) $generator->getSetting('cron_generate_interval', 0) * 60 * 60;
156 $requestTime = \Drupal::service('datetime.time')->getRequestTime();
157 if ($interval === 0 || ((\Drupal::state()->get('simple_sitemap.last_cron_generate', 0) + $interval) <= $requestTime)) {
158 \Drupal::state()->set('simple_sitemap.last_cron_generate', $requestTime);
159 $generator->generateSitemap('backend');
165 * Implements hook_ENTITY_TYPE_delete().
167 * When a language is removed from the system remove it also from settings.
169 function simple_sitemap_configurable_language_delete(ConfigurableLanguageInterface $language) {
172 * @var \Drupal\simple_sitemap\Simplesitemap $generator
174 $generator = \Drupal::service('simple_sitemap.generator');
175 $excluded_languages = $generator->getSetting('excluded_languages');
176 if (isset($excluded_languages[$language->id()])) {
177 unset($excluded_languages[$language->id()]);
178 $generator->saveSetting('excluded_languages', $excluded_languages);
183 * Implements hook_entity_delete().
185 * Removes settings of the removed entity.
187 * @param \Drupal\Core\Entity\EntityInterface $entity
189 function simple_sitemap_entity_delete(EntityInterface $entity) {
192 * @var \Drupal\simple_sitemap\Simplesitemap $generator
194 $generator = \Drupal::service('simple_sitemap.generator');
195 $generator->removeEntityInstanceSettings(
196 $entity->getEntityTypeId(), $entity->id()
201 * Implements hook_entity_bundle_delete().
203 * Removes settings of the removed bundle.
205 * @param string $entity_type_id
206 * @param string $bundle
208 function simple_sitemap_entity_bundle_delete($entity_type_id, $bundle) {
209 simple_sitemap_delete_bundle_config($entity_type_id, $bundle);
213 * Implements hook_menu_delete().
215 * Removes settings for the removed menu.
217 * @param \Drupal\system\MenuInterface $menu
219 function simple_sitemap_menu_delete(MenuInterface $menu) {
220 simple_sitemap_delete_bundle_config('menu_link_content', $menu->id());
224 * Helper function used by simple_sitemap_entity_bundle_delete() and
225 * simple_sitemap_menu_delete() hooks. This is needed, as menus are technically
228 * @param string $entity_type_id
229 * @param string $bundle
231 function simple_sitemap_delete_bundle_config($entity_type_id, $bundle) {
234 * @var \Drupal\simple_sitemap\Simplesitemap $generator
236 $generator = \Drupal::service('simple_sitemap.generator');
237 $deleted_bundle_settings = $generator->getBundleSettings($entity_type_id, $bundle);
238 if ($deleted_bundle_settings !== FALSE) {
240 // Delete bundle settings.
241 \Drupal::service('config.factory')->getEditable("simple_sitemap.bundle_settings.$entity_type_id.$bundle")->delete();
243 $message = 'You may want to <a href="@url">regenerate</a> your XML sitemap now.';
244 if ($generator->getSetting('cron_generate')) {
245 $message .= ' Otherwise the sitemap will be regenerated during a future cron run.';
247 drupal_set_message(t($message, ['@url' => $GLOBALS['base_url'] . '/admin/config/search/simplesitemap']));
252 * Implements hook_robotstxt().
254 function simple_sitemap_robotstxt() {
257 'Sitemap: ' . $GLOBALS['base_url'] . '/sitemap.xml', //todo: Use base URL setting?