simple_sitemap.module 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236
  1. <?php
  2. /**
  3. * @file
  4. * Main module file containing hooks.
  5. */
  6. use Drupal\Core\Form\FormStateInterface;
  7. use Drupal\Core\Entity\EntityInterface;
  8. use Drupal\Core\Routing\RouteMatchInterface;
  9. use Drupal\system\MenuInterface;
  10. use Drupal\language\ConfigurableLanguageInterface;
  11. /**
  12. *Implements hook_help().
  13. *
  14. * @param $route_name
  15. * @param \Drupal\Core\Routing\RouteMatchInterface $route_match
  16. * @return \Drupal\Component\Render\MarkupInterface|null
  17. */
  18. function simple_sitemap_help($route_name, RouteMatchInterface $route_match) {
  19. return $route_name === 'help.page.simple_sitemap' ?
  20. check_markup(file_get_contents(dirname(__FILE__) . "/README.md")) : NULL;
  21. }
  22. /**
  23. * Implements hook_form_alter().
  24. *
  25. * Adds sitemap settings to entity types that are supported via plugins.
  26. *
  27. * @param $form
  28. * @param \Drupal\Core\Form\FormStateInterface $form_state
  29. * @param $form_id
  30. */
  31. function simple_sitemap_form_alter(&$form, FormStateInterface $form_state, $form_id) {
  32. /** @var Drupal\simple_sitemap\Form\FormHelper $f */
  33. $f = \Drupal::service('simple_sitemap.form_helper');
  34. if (!$f->processForm($form_state)) {
  35. return;
  36. }
  37. $form['simple_sitemap'] = [
  38. '#type' => 'details',
  39. '#group' => isset($form['additional_settings']) ? 'additional_settings' : 'advanced',
  40. '#title' => t('Simple XML sitemap'),
  41. '#description' => $f->getEntityCategory() === 'instance' ? t('Settings for this entity can be overridden here.') : '',
  42. '#weight' => 10,
  43. ];
  44. // Attach some js magic to forms.
  45. if ($f->getEntityCategory() !== 'instance') {
  46. $form['#attached']['library'][] = 'simple_sitemap/form';
  47. }
  48. // Only attach fieldset summary js to 'additional settings' vertical tabs.
  49. if (isset($form['additional_settings'])) {
  50. $form['#attached']['library'][] = 'simple_sitemap/fieldsetSummaries';
  51. }
  52. $f->displayEntitySettings($form['simple_sitemap'])
  53. // todo: do not show setting when creating new bundle.
  54. ->displayRegenerateNow($form['simple_sitemap']);
  55. // Add submission handler.
  56. if (isset($form['actions']['submit']['#submit'])) {
  57. foreach (array_keys($form['actions']) as $action) {
  58. if ($action !== 'preview'
  59. && isset($form['actions'][$action]['#type'])
  60. && $form['actions'][$action]['#type'] === 'submit') {
  61. $form['actions'][$action]['#submit'][] = 'simple_sitemap_entity_form_submit';
  62. }
  63. }
  64. }
  65. // Fix for account page rendering other submit handlers not usable.
  66. else {
  67. $form['#submit'][] = 'simple_sitemap_entity_form_submit';
  68. }
  69. }
  70. /**
  71. * Form submission handler called in hook_form_alter.
  72. *
  73. * @param $form
  74. * @param \Drupal\Core\Form\FormStateInterface $form_state
  75. */
  76. function simple_sitemap_entity_form_submit($form, FormStateInterface &$form_state) {
  77. /** @var Drupal\simple_sitemap\Form\FormHelper $f */
  78. $f = \Drupal::service('simple_sitemap.form_helper');
  79. if (!$f->processForm($form_state)) {
  80. return;
  81. }
  82. $values = $form_state->getValues();
  83. // Fix for values appearing in a sub array on a commerce product entity.
  84. $values = isset($values['simple_sitemap']) ? $values['simple_sitemap'] : $values;
  85. // Only make changes in DB if sitemap settings actually changed.
  86. if ($f->valuesChanged($form, $values)) {
  87. /** @var \Drupal\simple_sitemap\Simplesitemap $generator */
  88. $generator = \Drupal::service('simple_sitemap.generator');
  89. $settings = [
  90. 'index' => (bool) $values['simple_sitemap_index_content'],
  91. 'priority' => $values['simple_sitemap_priority'],
  92. 'changefreq' => $values['simple_sitemap_changefreq'],
  93. 'include_images' => (bool) $values['simple_sitemap_include_images'],
  94. ];
  95. // Deleting bundle settings for old bundle.
  96. // See SimplesitemapEntitiesForm::submitForm().
  97. // todo: This will not be necessary if "multiple variants pro bundle" is implemented.
  98. if (isset($form['simple_sitemap']['simple_sitemap_variant']['#default_value'])) {
  99. $old_variant = $form['simple_sitemap']['simple_sitemap_variant']['#default_value'];
  100. if ($old_variant !== $values['simple_sitemap_variant']) {
  101. $generator->setVariants($old_variant)->removeBundleSettings($f->getEntityTypeId(), $f->getBundleName());
  102. }
  103. }
  104. switch ($f->getEntityCategory()) {
  105. case 'bundle':
  106. $generator->setVariants($values['simple_sitemap_variant'])
  107. ->setBundleSettings($f->getEntityTypeId(),
  108. !empty($f->getBundleName()) ? $f->getBundleName() : $f->getFormEntityId(),
  109. $settings
  110. );
  111. break;
  112. case 'instance':
  113. $generator->setVariants($values['simple_sitemap_variant'])
  114. ->setEntityInstanceSettings($f->getEntityTypeId(),
  115. !empty($f->getInstanceId()) ? $f->getInstanceId() : $f->getFormEntityId(),
  116. $settings
  117. );
  118. break;
  119. }
  120. // Regenerate sitemaps according to user setting.
  121. if ($values['simple_sitemap_regenerate_now']) {
  122. $generator->rebuildQueue()->generateSitemap();
  123. }
  124. }
  125. }
  126. /**
  127. * Implements hook_cron().
  128. */
  129. function simple_sitemap_cron() {
  130. /** @var \Drupal\simple_sitemap\Simplesitemap $generator */
  131. $generator = \Drupal::service('simple_sitemap.generator');
  132. if ($generator->getSetting('cron_generate')) {
  133. $interval = (int) $generator->getSetting('cron_generate_interval', 0) * 60 * 60;
  134. $request_time = \Drupal::service('datetime.time')->getRequestTime();
  135. $generation_in_progress = $generator->getQueueWorker()->generationInProgress();
  136. $state = \Drupal::state();
  137. if ($interval === 0
  138. || $generation_in_progress
  139. || (($state->get('simple_sitemap.last_cron_generate', 0) + $interval) <= $request_time)) {
  140. if (!$generation_in_progress) {
  141. $state->set('simple_sitemap.last_cron_generate', $request_time);
  142. }
  143. $generator->generateSitemap('cron');
  144. }
  145. }
  146. }
  147. /**
  148. * Implements hook_ENTITY_TYPE_delete().
  149. *
  150. * When a language is removed from the system remove it also from settings.
  151. */
  152. function simple_sitemap_configurable_language_delete(ConfigurableLanguageInterface $language) {
  153. /** @var \Drupal\simple_sitemap\Simplesitemap $generator */
  154. $generator = \Drupal::service('simple_sitemap.generator');
  155. $excluded_languages = $generator->getSetting('excluded_languages');
  156. if (isset($excluded_languages[$language->id()])) {
  157. unset($excluded_languages[$language->id()]);
  158. $generator->saveSetting('excluded_languages', $excluded_languages);
  159. }
  160. }
  161. /**
  162. * Implements hook_entity_delete().
  163. *
  164. * Removes settings of the removed entity.
  165. *
  166. * @param \Drupal\Core\Entity\EntityInterface $entity
  167. */
  168. function simple_sitemap_entity_delete(EntityInterface $entity) {
  169. /** @var \Drupal\simple_sitemap\Simplesitemap $generator */
  170. $generator = \Drupal::service('simple_sitemap.generator');
  171. $generator->setVariants(TRUE)->removeEntityInstanceSettings(
  172. $entity->getEntityTypeId(), $entity->id()
  173. );
  174. }
  175. /**
  176. * Implements hook_entity_bundle_delete().
  177. *
  178. * Removes settings of the removed bundle.
  179. *
  180. * @param string $entity_type_id
  181. * @param string $bundle
  182. */
  183. function simple_sitemap_entity_bundle_delete($entity_type_id, $bundle) {
  184. /** @var \Drupal\simple_sitemap\Simplesitemap $generator */
  185. $generator = \Drupal::service('simple_sitemap.generator');
  186. $generator->setVariants(TRUE)->removeBundleSettings($entity_type_id, $bundle);
  187. }
  188. /**
  189. * Implements hook_menu_delete().
  190. *
  191. * Removes settings for the removed menu.
  192. *
  193. * @param \Drupal\system\MenuInterface $menu
  194. */
  195. function simple_sitemap_menu_delete(MenuInterface $menu) {
  196. /** @var \Drupal\simple_sitemap\Simplesitemap $generator */
  197. $generator = \Drupal::service('simple_sitemap.generator');
  198. $generator->setVariants(TRUE)->removeBundleSettings('menu_link_content', $menu->id());
  199. }