SimplesitemapManager.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316
  1. <?php
  2. namespace Drupal\simple_sitemap;
  3. use Drupal\Core\Config\ConfigFactory;
  4. use Drupal\Core\Database\Connection;
  5. use Drupal\simple_sitemap\Plugin\simple_sitemap\SitemapType\SitemapTypeBase;
  6. use Drupal\simple_sitemap\Plugin\simple_sitemap\SitemapType\SitemapTypeManager;
  7. use Drupal\simple_sitemap\Plugin\simple_sitemap\SitemapGenerator\SitemapGeneratorBase;
  8. use Drupal\simple_sitemap\Plugin\simple_sitemap\SitemapGenerator\SitemapGeneratorManager;
  9. use Drupal\simple_sitemap\Plugin\simple_sitemap\UrlGenerator\UrlGeneratorBase;
  10. use Drupal\simple_sitemap\Plugin\simple_sitemap\UrlGenerator\UrlGeneratorManager;
  11. /**
  12. * Class SimplesitemapManager
  13. * @package Drupal\simple_sitemap
  14. */
  15. class SimplesitemapManager {
  16. const DEFAULT_SITEMAP_TYPE = 'default_hreflang';
  17. const DEFAULT_SITEMAP_GENERATOR = 'default';
  18. /**
  19. * @var \Drupal\Core\Config\ConfigFactory
  20. */
  21. protected $configFactory;
  22. /**
  23. * @var \Drupal\Core\Database\Connection
  24. */
  25. protected $db;
  26. /**
  27. * @var \Drupal\simple_sitemap\Plugin\simple_sitemap\SitemapType\SitemapTypeManager
  28. */
  29. protected $sitemapTypeManager;
  30. /**
  31. * @var \Drupal\simple_sitemap\Plugin\simple_sitemap\UrlGenerator\UrlGeneratorManager
  32. */
  33. protected $urlGeneratorManager;
  34. /**
  35. * @var \Drupal\simple_sitemap\Plugin\simple_sitemap\SitemapGenerator\SitemapGeneratorManager
  36. */
  37. protected $sitemapGeneratorManager;
  38. /**
  39. * @var \Drupal\simple_sitemap\SimplesitemapSettings
  40. */
  41. protected $settings;
  42. /**
  43. * @var SitemapTypeBase[] $sitemapTypes
  44. */
  45. protected $sitemapTypes = [];
  46. /**
  47. * @var UrlGeneratorBase[] $urlGenerators
  48. */
  49. protected $urlGenerators = [];
  50. /**
  51. * @var SitemapGeneratorBase[] $sitemapGenerators
  52. */
  53. protected $sitemapGenerators = [];
  54. /**
  55. * SimplesitemapManager constructor.
  56. * @param \Drupal\Core\Config\ConfigFactory $config_factory
  57. * @param \Drupal\Core\Database\Connection $database
  58. * @param \Drupal\simple_sitemap\Plugin\simple_sitemap\SitemapType\SitemapTypeManager $sitemap_type_manager
  59. * @param \Drupal\simple_sitemap\Plugin\simple_sitemap\UrlGenerator\UrlGeneratorManager $url_generator_manager
  60. * @param \Drupal\simple_sitemap\Plugin\simple_sitemap\SitemapGenerator\SitemapGeneratorManager $sitemap_generator_manager
  61. * @param \Drupal\simple_sitemap\SimplesitemapSettings $settings
  62. */
  63. public function __construct(
  64. ConfigFactory $config_factory,
  65. Connection $database,
  66. SitemapTypeManager $sitemap_type_manager,
  67. UrlGeneratorManager $url_generator_manager,
  68. SitemapGeneratorManager $sitemap_generator_manager,
  69. SimplesitemapSettings $settings
  70. ) {
  71. $this->configFactory = $config_factory;
  72. $this->db = $database;
  73. $this->sitemapTypeManager = $sitemap_type_manager;
  74. $this->urlGeneratorManager = $url_generator_manager;
  75. $this->sitemapGeneratorManager = $sitemap_generator_manager;
  76. $this->settings = $settings;
  77. }
  78. /**
  79. * @param string $sitemap_generator_id
  80. * @return \Drupal\simple_sitemap\Plugin\simple_sitemap\SitemapGenerator\SitemapGeneratorBase
  81. * @throws \Drupal\Component\Plugin\Exception\PluginException
  82. */
  83. public function getSitemapGenerator($sitemap_generator_id) {
  84. if (!isset($this->sitemapGenerators[$sitemap_generator_id])) {
  85. $this->sitemapGenerators[$sitemap_generator_id]
  86. = $this->sitemapGeneratorManager->createInstance($sitemap_generator_id);
  87. }
  88. return $this->sitemapGenerators[$sitemap_generator_id];
  89. }
  90. /**
  91. * @param string $url_generator_id
  92. * @return \Drupal\simple_sitemap\Plugin\simple_sitemap\UrlGenerator\UrlGeneratorBase
  93. * @throws \Drupal\Component\Plugin\Exception\PluginException
  94. */
  95. public function getUrlGenerator($url_generator_id) {
  96. if (!isset($this->urlGenerators[$url_generator_id])) {
  97. $this->urlGenerators[$url_generator_id]
  98. = $this->urlGeneratorManager->createInstance($url_generator_id);
  99. }
  100. return $this->urlGenerators[$url_generator_id];
  101. }
  102. /**
  103. * @return \Drupal\simple_sitemap\Plugin\simple_sitemap\SitemapType\SitemapTypeBase[]
  104. */
  105. public function getSitemapTypes() {
  106. if (empty($this->sitemapTypes)) {
  107. $this->sitemapTypes = $this->sitemapTypeManager->getDefinitions();
  108. }
  109. return $this->sitemapTypes;
  110. }
  111. /**
  112. * @param string|null $sitemap_type
  113. * @param bool $attach_type_info
  114. * @return array
  115. */
  116. public function getSitemapVariants($sitemap_type = NULL, $attach_type_info = TRUE) {
  117. if (NULL === $sitemap_type) {
  118. $variants = [];
  119. foreach ($this->configFactory->listAll('simple_sitemap.variants.') as $config_name) {
  120. $config_name_parts = explode('.', $config_name);
  121. $saved_variants = $this->configFactory->get($config_name)->get('variants');
  122. $saved_variants = $attach_type_info ? $this->attachSitemapTypeToVariants($saved_variants, $config_name_parts[2]) : $saved_variants;
  123. $variants = array_merge($variants, (is_array($saved_variants) ? $saved_variants : []));
  124. }
  125. }
  126. else {
  127. $variants = $this->configFactory->get("simple_sitemap.variants.$sitemap_type")->get('variants');
  128. $variants = is_array($variants) ? $variants : [];
  129. $variants = $attach_type_info ? $this->attachSitemapTypeToVariants($variants, $sitemap_type) : $variants;
  130. }
  131. array_multisort(array_column($variants, "weight"), SORT_ASC, $variants);
  132. return $variants;
  133. }
  134. /**
  135. * @param array $variants
  136. * @param string $type
  137. * @return array
  138. */
  139. protected function attachSitemapTypeToVariants(array $variants, $type) {
  140. return array_map(function($variant) use ($type) { return $variant + ['type' => $type]; }, $variants);
  141. }
  142. /**
  143. * @param array $variants
  144. * @return array
  145. */
  146. protected function detachSitemapTypeFromVariants(array $variants) {
  147. return array_map(function($variant) { unset($variant['type']); return $variant; }, $variants);
  148. }
  149. /**
  150. * @param string $name
  151. * @param array $definition
  152. * @return $this
  153. * @throws \Drupal\Component\Plugin\Exception\PluginException
  154. */
  155. public function addSitemapVariant($name, $definition = []) {
  156. $all_variants = $this->getSitemapVariants();
  157. if (isset($all_variants[$name])) {
  158. $old_variant = $all_variants[$name];
  159. if (!empty($definition['type']) && $old_variant['type'] !== $definition['type']) {
  160. $this->removeSitemapVariants($name);
  161. unset($old_variant);
  162. }
  163. else {
  164. unset($old_variant['type']);
  165. }
  166. }
  167. if (!isset($old_variant) && empty($definition['label'])) {
  168. $definition['label'] = (string) $name;
  169. }
  170. if (!isset($old_variant) && empty($definition['type'])) {
  171. $definition['type'] = self::DEFAULT_SITEMAP_TYPE;
  172. }
  173. if (isset($definition['weight'])) {
  174. $definition['weight'] = (int) $definition['weight'];
  175. }
  176. elseif (!isset($old_variant)) {
  177. $definition['weight'] = 0;
  178. }
  179. if (isset($old_variant)) {
  180. $definition = $definition + $old_variant;
  181. }
  182. $variants = array_merge($this->getSitemapVariants($definition['type'], FALSE), [$name => ['label' => $definition['label'], 'weight' => $definition['weight']]]);
  183. $this->configFactory->getEditable('simple_sitemap.variants.' . $definition['type'])
  184. ->set('variants', $variants)
  185. ->save();
  186. return $this;
  187. }
  188. /**
  189. * @param null|array|string $variant_names
  190. * Limit removal by specific variants.
  191. *
  192. * @return $this
  193. *
  194. * @throws \Drupal\Component\Plugin\Exception\PluginException
  195. */
  196. public function removeSitemap($variant_names = NULL) {
  197. if (NULL === $variant_names || !empty((array) $variant_names)) {
  198. $saved_variants = $this->getSitemapVariants();
  199. $remove_variants = NULL === $variant_names
  200. ? $saved_variants
  201. : array_intersect_key($saved_variants, array_flip((array) $variant_names));
  202. if (!empty($remove_variants)) {
  203. $type_definitions = $this->getSitemapTypes();
  204. foreach ($remove_variants as $variant_name => $variant_definition) {
  205. $this->getSitemapGenerator($type_definitions[$variant_definition['type']]['sitemapGenerator'])
  206. ->setSitemapVariant($variant_name)
  207. ->remove();
  208. }
  209. }
  210. }
  211. return $this;
  212. }
  213. /**
  214. * @param null|array|string $variant_names
  215. * Limit removal by specific variants.
  216. *
  217. * @return $this
  218. *
  219. * @throws \Drupal\Component\Plugin\Exception\PluginException
  220. */
  221. public function removeSitemapVariants($variant_names = NULL) {
  222. if (NULL === $variant_names || !empty((array) $variant_names)) {
  223. // Remove sitemap instances.
  224. $this->removeSitemap($variant_names);
  225. if (NULL === $variant_names) {
  226. // Remove all variants and their bundle settings.
  227. foreach(['variants', 'bundle_settings', 'custom_links'] as $config_name_part) {
  228. foreach ($this->configFactory->listAll("simple_sitemap.$config_name_part.") as $config_name) {
  229. $this->configFactory->getEditable($config_name)->delete();
  230. }
  231. }
  232. }
  233. else {
  234. // Remove bundle settings for specific variants.
  235. foreach ((array) $variant_names as $variant_name) {
  236. foreach ($this->configFactory->listAll("simple_sitemap.bundle_settings.$variant_name.") as $config_name) {
  237. $this->configFactory->getEditable($config_name)->delete();
  238. }
  239. }
  240. // Remove custom links for specific variants.
  241. foreach ((array) $variant_names as $variant_name) {
  242. foreach ($this->configFactory->listAll("simple_sitemap.custom_links.$variant_name") as $config_name) {
  243. $this->configFactory->getEditable($config_name)->delete();
  244. }
  245. }
  246. // Remove specific variants from configuration.
  247. $remove_variants = [];
  248. $variants = $this->getSitemapVariants();
  249. foreach ((array) $variant_names as $variant_name) {
  250. if (isset($variants[$variant_name])) {
  251. $remove_variants[$variants[$variant_name]['type']][$variant_name] = $variant_name;
  252. }
  253. }
  254. foreach ($remove_variants as $type => $variants_per_type) {
  255. $this->configFactory->getEditable("simple_sitemap.variants.$type")
  256. ->set('variants', array_diff_key($this->getSitemapVariants($type, FALSE), $variants_per_type))
  257. ->save();
  258. }
  259. }
  260. // Remove bundle setting overrides for entities.
  261. $query = $this->db->delete('simple_sitemap_entity_overrides');
  262. if (NULL !== $variant_names) {
  263. $query->condition('type', (array) $variant_names, 'IN');
  264. }
  265. $query->execute();
  266. // Remove default variant setting.
  267. if (NULL === $variant_names
  268. || in_array($this->settings->getSetting('default_variant', ''), (array) $variant_names)) {
  269. $this->settings->saveSetting('default_variant', '');
  270. }
  271. }
  272. return $this;
  273. }
  274. }