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;
14 * Implements hook_help.
16 function simple_sitemap_help($route_name, RouteMatchInterface $route_match) {
17 return $route_name === 'help.page.simple_sitemap' ?
18 check_markup(file_get_contents(dirname(__FILE__) . "/README.md")) : NULL;
22 * Implements hook_form_alter.
24 * Adds sitemap settings to entity types that are supported via plugins.
26 function simple_sitemap_form_alter(&$form, FormStateInterface $form_state, $form_id) {
29 * @var Drupal\simple_sitemap\Form\FormHelper $f
31 $f = \Drupal::service('simple_sitemap.form_helper')->processForm($form_state);
32 if (!$f->alteringForm()) {
36 $form['simple_sitemap'] = [
38 '#group' => isset($form['additional_settings']) ? 'additional_settings' : 'advanced',
39 '#title' => t('Simple XML sitemap'),
40 '#description' => $f->getEntityCategory() == 'instance' ? t('Settings for this entity can be overridden here.') : '',
43 // Attach some js magic to forms.
44 // todo: JS not working on comment entity form, hence disabling.
45 if ($f->getEntityTypeId() != 'comment' || $f->getEntityCategory() != 'instance') {
46 $form['#attached']['library'][] = 'simple_sitemap/form';
49 // Only attach fieldset summary js to 'additional settings' vertical tabs.
50 if (isset($form['additional_settings'])) {
51 $form['#attached']['library'][] = 'simple_sitemap/fieldsetSummaries';
54 $f->displayEntitySettings($form['simple_sitemap'])
55 // todo: do not show setting when creating new bundle.
56 ->displayRegenerateNow($form['simple_sitemap']);
58 // Add submission handler.
59 if (isset($form['actions']['submit']['#submit'])) {
60 foreach (array_keys($form['actions']) as $action) {
61 if ($action != 'preview'
62 && isset($form['actions'][$action]['#type'])
63 && $form['actions'][$action]['#type'] === 'submit') {
64 $form['actions'][$action]['#submit'][] = 'simple_sitemap_entity_form_submit';
68 // Fix for account page rendering other submit handlers not usable.
70 $form['#submit'][] = 'simple_sitemap_entity_form_submit';
75 * Form submission handler called in hook_form_alter.
77 function simple_sitemap_entity_form_submit($form, FormStateInterface &$form_state) {
80 * @var Drupal\simple_sitemap\Form\FormHelper $f
82 $f = \Drupal::service('simple_sitemap.form_helper')->processForm($form_state);
84 $values = $form_state->getValues();
86 // Fix for values appearing in a sub array on a commerce product entity.
87 $values = isset($values['simple_sitemap']) ? $values['simple_sitemap'] : $values;
89 // Only make changes in DB if sitemap settings actually changed.
90 if ($f->valuesChanged($form, $values)) {
93 * @var \Drupal\simple_sitemap\Simplesitemap $generator
95 $generator = \Drupal::service('simple_sitemap.generator');
97 switch ($f->getEntityCategory()) {
100 $generator->setBundleSettings(
101 $f->getEntityTypeId(),
102 !empty($f->getBundleName()) ? $f->getBundleName() : $f->getFormEntityId(),
104 'index' => $values['simple_sitemap_index_content'],
105 'priority' => $values['simple_sitemap_priority']
111 $generator->setEntityInstanceSettings(
112 $f->getEntityTypeId(),
113 !empty($f->getInstanceId()) ? $f->getInstanceId() : $f->getFormEntityId(),
115 'index' => $values['simple_sitemap_index_content'],
116 'priority' => $values['simple_sitemap_priority']
122 // Regenerate sitemaps according to user setting.
123 if ($values['simple_sitemap_regenerate_now']) {
124 $generator->generateSitemap();
130 * Implements hook_cron.
132 function simple_sitemap_cron() {
135 * @var \Drupal\simple_sitemap\Simplesitemap $generator
137 $generator = \Drupal::service('simple_sitemap.generator');
138 if ($generator->getSetting('cron_generate')) {
139 $generator->generateSitemap('backend');
144 * Implements hook_entity_delete().
146 * Removes settings of the removed entity.
148 * @param \Drupal\Core\Entity\EntityInterface $entity
150 function simple_sitemap_entity_delete(EntityInterface $entity) {
153 * @var \Drupal\simple_sitemap\Simplesitemap $generator
155 $generator = \Drupal::service('simple_sitemap.generator');
156 $generator->removeEntityInstanceSettings(
157 $entity->getEntityTypeId(), $entity->id()
162 * Implements hook_entity_bundle_delete().
164 * Removes settings of the removed bundle.
166 function simple_sitemap_entity_bundle_delete($entity_type_id, $bundle) {
167 simple_sitemap_delete_bundle_config($entity_type_id, $bundle);
171 * Implements hook_menu_delete().
173 * Removes settings for the removed menu.
175 * @param \Drupal\system\MenuInterface $menu
177 function simple_sitemap_menu_delete(MenuInterface $menu) {
178 simple_sitemap_delete_bundle_config('menu_link_content', $menu->id());
182 * Helper function used by simple_sitemap_entity_bundle_delete() and
183 * simple_sitemap_menu_delete() hooks. This is needed, as menus are technically
186 * @param string $entity_type_id
187 * @param string $bundle
189 function simple_sitemap_delete_bundle_config($entity_type_id, $bundle) {
192 * @var \Drupal\simple_sitemap\Simplesitemap $generator
194 $generator = \Drupal::service('simple_sitemap.generator');
195 $deleted_bundle_settings = $generator->getBundleSettings($entity_type_id, $bundle);
196 if ($deleted_bundle_settings !== FALSE) {
198 // Delete bundle settings.
199 \Drupal::service('config.factory')->getEditable("simple_sitemap.bundle_settings.$entity_type_id.$bundle")->delete();
201 $message = "You may want to <a href='@url'>regenerate</a> your XML sitemap now.";
202 if ($generator->getSetting('cron_generate')) {
203 $message .= ' Otherwise the sitemap will be regenerated on the next cron run.';
205 drupal_set_message(t($message, ['@url' => $GLOBALS['base_url'] . '/admin/config/search/simplesitemap']));
210 * Implements hook_robotstxt().
212 function simple_sitemap_robotstxt() {
215 'Sitemap: ' . $GLOBALS['base_url'] . '/sitemap.xml',