fc0c7a39074fef6591aa54b3a41811ec7125ab5c
[yaffs-website] / web / modules / contrib / simple_sitemap / simple_sitemap.module
1 <?php
2
3 /**
4  * @file
5  * Main module file containing hooks.
6  */
7
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;
13
14 /**
15  *Implements hook_help.
16  *
17  * @param $route_name
18  * @param \Drupal\Core\Routing\RouteMatchInterface $route_match
19  * @return \Drupal\Component\Render\MarkupInterface|null
20  */
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;
24 }
25
26 /**
27  * Implements hook_form_alter.
28  *
29  * Adds sitemap settings to entity types that are supported via plugins.
30  *
31  * @param $form
32  * @param \Drupal\Core\Form\FormStateInterface $form_state
33  * @param $form_id
34  */
35 function simple_sitemap_form_alter(&$form, FormStateInterface $form_state, $form_id) {
36
37   /**
38    * @var Drupal\simple_sitemap\Form\FormHelper $f
39    */
40   $f = \Drupal::service('simple_sitemap.form_helper');
41   if (!$f->processForm($form_state)) {
42     return;
43   }
44
45   $form['simple_sitemap'] = [
46     '#type' => 'details',
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.') : '',
50   ];
51
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';
56   }
57
58   // Only attach fieldset summary js to 'additional settings' vertical tabs.
59   if (isset($form['additional_settings'])) {
60     $form['#attached']['library'][] = 'simple_sitemap/fieldsetSummaries';
61   }
62
63   $f->displayEntitySettings($form['simple_sitemap'])
64   // todo: do not show setting when creating new bundle.
65     ->displayRegenerateNow($form['simple_sitemap']);
66
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';
74       }
75     }
76   }
77   // Fix for account page rendering other submit handlers not usable.
78   else {
79     $form['#submit'][] = 'simple_sitemap_entity_form_submit';
80   }
81 }
82
83 /**
84  * Form submission handler called in hook_form_alter.
85  *
86  * @param $form
87  * @param \Drupal\Core\Form\FormStateInterface $form_state
88  */
89 function simple_sitemap_entity_form_submit($form, FormStateInterface &$form_state) {
90
91   /**
92    * @var Drupal\simple_sitemap\Form\FormHelper $f
93    */
94   $f = \Drupal::service('simple_sitemap.form_helper');
95   if (!$f->processForm($form_state)) {
96     return;
97   }
98
99   $values = $form_state->getValues();
100
101   // Fix for values appearing in a sub array on a commerce product entity.
102   $values = isset($values['simple_sitemap']) ? $values['simple_sitemap'] : $values;
103
104   // Only make changes in DB if sitemap settings actually changed.
105   if ($f->valuesChanged($form, $values)) {
106
107     /**
108      * @var \Drupal\simple_sitemap\Simplesitemap $generator
109      */
110     $generator = \Drupal::service('simple_sitemap.generator');
111
112     $settings = [
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'],
117     ];
118
119     switch ($f->getEntityCategory()) {
120
121       case 'bundle':
122         $generator->setBundleSettings(
123           $f->getEntityTypeId(),
124           !empty($f->getBundleName()) ? $f->getBundleName() : $f->getFormEntityId(),
125           $settings
126         );
127         break;
128
129       case 'instance':
130         $generator->setEntityInstanceSettings(
131           $f->getEntityTypeId(),
132           !empty($f->getInstanceId()) ? $f->getInstanceId() : $f->getFormEntityId(),
133           $settings
134         );
135         break;
136     }
137
138     // Regenerate sitemaps according to user setting.
139     if ($values['simple_sitemap_regenerate_now']) {
140       $generator->generateSitemap();
141     }
142   }
143 }
144
145 /**
146  * Implements hook_cron.
147  */
148 function simple_sitemap_cron() {
149
150   /**
151    * @var \Drupal\simple_sitemap\Simplesitemap $generator
152    */
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');
160     }
161   }
162 }
163
164 /**
165  * Implements hook_ENTITY_TYPE_delete().
166  *
167  * When a language is removed from the system remove it also from settings.
168  */
169 function simple_sitemap_configurable_language_delete(ConfigurableLanguageInterface $language) {
170
171   /**
172    * @var \Drupal\simple_sitemap\Simplesitemap $generator
173    */
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);
179   }
180 }
181
182 /**
183  * Implements hook_entity_delete().
184  *
185  * Removes settings of the removed entity.
186  *
187  * @param \Drupal\Core\Entity\EntityInterface $entity
188  */
189 function simple_sitemap_entity_delete(EntityInterface $entity) {
190
191   /**
192    * @var \Drupal\simple_sitemap\Simplesitemap $generator
193    */
194   $generator = \Drupal::service('simple_sitemap.generator');
195   $generator->removeEntityInstanceSettings(
196     $entity->getEntityTypeId(), $entity->id()
197   );
198 }
199
200 /**
201  * Implements hook_entity_bundle_delete().
202  *
203  * Removes settings of the removed bundle.
204  *
205  * @param string $entity_type_id
206  * @param string $bundle
207  */
208 function simple_sitemap_entity_bundle_delete($entity_type_id, $bundle) {
209   simple_sitemap_delete_bundle_config($entity_type_id, $bundle);
210 }
211
212 /**
213  * Implements hook_menu_delete().
214  *
215  * Removes settings for the removed menu.
216  *
217  * @param \Drupal\system\MenuInterface $menu
218  */
219 function simple_sitemap_menu_delete(MenuInterface $menu) {
220   simple_sitemap_delete_bundle_config('menu_link_content', $menu->id());
221 }
222
223 /**
224  * Helper function used by simple_sitemap_entity_bundle_delete() and
225  * simple_sitemap_menu_delete() hooks. This is needed, as menus are technically
226  * not bundles.
227  *
228  * @param string $entity_type_id
229  * @param string $bundle
230  */
231 function simple_sitemap_delete_bundle_config($entity_type_id, $bundle) {
232
233   /**
234    * @var \Drupal\simple_sitemap\Simplesitemap $generator
235    */
236   $generator = \Drupal::service('simple_sitemap.generator');
237   $deleted_bundle_settings = $generator->getBundleSettings($entity_type_id, $bundle);
238   if ($deleted_bundle_settings !== FALSE) {
239
240     // Delete bundle settings.
241     \Drupal::service('config.factory')->getEditable("simple_sitemap.bundle_settings.$entity_type_id.$bundle")->delete();
242
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.';
246     }
247     drupal_set_message(t($message, ['@url' => $GLOBALS['base_url'] . '/admin/config/search/simplesitemap']));
248   }
249 }
250
251 /**
252  * Implements hook_robotstxt().
253  */
254 function simple_sitemap_robotstxt() {
255   return [
256     '# XML sitemap',
257     'Sitemap: ' . $GLOBALS['base_url'] . '/sitemap.xml', //todo: Use base URL setting?
258   ];
259 }