Simplesitemap.php 19.3 KB
Newer Older
1 2
<?php

Pawel G's avatar
Pawel G committed
3
namespace Drupal\simple_sitemap;
4

Pawel G's avatar
Pawel G committed
5 6 7
use Drupal\Core\Database\Connection;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\Core\Path\PathValidator;
Pawel G's avatar
Pawel G committed
8 9
use Drupal\Core\Config\ConfigFactory;
use Drupal\Core\Datetime\DateFormatter;
10
use Drupal\Component\Datetime\Time;
11

12
/**
Pawel G's avatar
Pawel G committed
13
 * Class Simplesitemap
Pawel G's avatar
Pawel G committed
14
 * @package Drupal\simple_sitemap
15 16 17
 */
class Simplesitemap {

Pawel G's avatar
Pawel G committed
18 19 20
  /**
   * @var \Drupal\simple_sitemap\SitemapGenerator
   */
21
  protected $sitemapGenerator;
Pawel G's avatar
Pawel G committed
22 23 24 25

  /**
   * @var \Drupal\simple_sitemap\EntityHelper
   */
26
  protected $entityHelper;
Pawel G's avatar
Pawel G committed
27 28 29 30

  /**
   * @var \Drupal\Core\Config\ConfigFactory
   */
31
  protected $configFactory;
Pawel G's avatar
Pawel G committed
32 33 34 35

  /**
   * @var \Drupal\Core\Database\Connection
   */
36
  protected $db;
Pawel G's avatar
Pawel G committed
37 38 39 40

  /**
   * @var \Drupal\Core\Entity\EntityTypeManagerInterface
   */
41
  protected $entityTypeManager;
Pawel G's avatar
Pawel G committed
42 43 44 45

  /**
   * @var \Drupal\Core\Path\PathValidator
   */
46
  protected $pathValidator;
Pawel G's avatar
Pawel G committed
47

48 49 50 51 52
  /**
   * @var \Drupal\Core\Datetime\DateFormatter
   */
  protected $dateFormatter;

53 54 55 56 57
  /**
   * @var \Drupal\Component\Datetime\Time
   */
  protected $time;

Pawel G's avatar
Pawel G committed
58 59 60
  /**
   * @var array
   */
61
  protected static $allowed_link_settings = [
62
    'entity' => ['index', 'priority', 'changefreq', 'include_images'],
63 64 65 66
    'custom' => ['priority', 'changefreq'],
  ];

  protected static $link_setting_defaults = [
67
    'index' => 1,
68
    'priority' => 0.5,
69
    'changefreq' => '',
70
    'include_images' => 0,
71
  ];
72

73 74
  /**
   * Simplesitemap constructor.
Pawel G's avatar
Pawel G committed
75
   * @param \Drupal\simple_sitemap\SitemapGenerator $sitemapGenerator
76
   * @param \Drupal\simple_sitemap\EntityHelper $entityHelper
Pawel G's avatar
Pawel G committed
77 78 79 80 81
   * @param \Drupal\Core\Config\ConfigFactory $configFactory
   * @param \Drupal\Core\Database\Connection $database
   * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entityTypeManager
   * @param \Drupal\Core\Path\PathValidator $pathValidator
   * @param \Drupal\Core\Datetime\DateFormatter $dateFormatter
82
   * @param \Drupal\Component\Datetime\Time $time
83
   */
84
  public function __construct(
Pawel G's avatar
Pawel G committed
85
    SitemapGenerator $sitemapGenerator,
86
    EntityHelper $entityHelper,
Pawel G's avatar
Pawel G committed
87
    ConfigFactory $configFactory,
Pawel G's avatar
Pawel G committed
88 89 90
    Connection $database,
    EntityTypeManagerInterface $entityTypeManager,
    PathValidator $pathValidator,
91 92
    DateFormatter $dateFormatter,
    Time $time
93 94
  ) {
    $this->sitemapGenerator = $sitemapGenerator;
95
    $this->entityHelper = $entityHelper;
Pawel G's avatar
Pawel G committed
96
    $this->configFactory = $configFactory;
97 98
    $this->db = $database;
    $this->entityTypeManager = $entityTypeManager;
99
    $this->pathValidator = $pathValidator;
100
    $this->dateFormatter = $dateFormatter;
101
    $this->time = $time;
102 103
  }

104
  /**
105 106
   * Returns a specific sitemap setting or a default value if setting does not
   * exist.
Pawel G's avatar
Pawel G committed
107
   *
108 109 110 111 112 113 114 115
   * @param string $name
   *   Name of the setting, like 'max_links'.
   *
   * @param mixed $default
   *   Value to be returned if the setting does not exist in the configuration.
   *
   * @return mixed
   *   The current setting from configuration or a default value.
Pawel G's avatar
Pawel G committed
116
   */
117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182
  public function getSetting($name, $default = FALSE) {
    $setting = $this->configFactory
      ->get('simple_sitemap.settings')
      ->get($name);
    return NULL !== $setting ? $setting : $default;
  }

  /**
   * Stores a specific sitemap setting in configuration.
   *
   * @param string $name
   *   Setting name, like 'max_links'.
   * @param mixed $setting
   *   The setting to be saved.
   *
   * @return $this
   */
  public function saveSetting($name, $setting) {
    $this->configFactory->getEditable("simple_sitemap.settings")
      ->set($name, $setting)->save();
    return $this;
  }

  /**
   * Returns the whole sitemap, a requested sitemap chunk,
   * or the sitemap index file.
   *
   * @param int $chunk_id
   *
   * @return string|false
   *   If no sitemap id provided, either a sitemap index is returned, or the
   *   whole sitemap, if the amount of links does not exceed the max links
   *   setting. If a sitemap id is provided, a sitemap chunk is returned. False
   *   if sitemap is not retrievable from the database.
   */
  public function getSitemap($chunk_id = NULL) {
    $chunk_info = $this->fetchSitemapChunkInfo();

    if (NULL === $chunk_id || !isset($chunk_info[$chunk_id])) {

      if (count($chunk_info) > 1) {
        // Return sitemap index, if there are multiple sitemap chunks.
        return $this->getSitemapIndex($chunk_info);
      }
      else {
        // Return sitemap if there is only one chunk.
        return count($chunk_info) === 1
        && isset($chunk_info[SitemapGenerator::FIRST_CHUNK_INDEX])
          ? $this->fetchSitemapChunk(SitemapGenerator::FIRST_CHUNK_INDEX)
            ->sitemap_string
          : FALSE;
      }
    }
    else {
      // Return specific sitemap chunk.
      return $this->fetchSitemapChunk($chunk_id)->sitemap_string;
    }
  }

  /**
   * Fetches all sitemap chunk timestamps keyed by chunk ID.
   *
   * @return array
   *   An array containing chunk creation timestamps keyed by chunk ID.
   */
  protected function fetchSitemapChunkInfo() {
183
    return $this->db
184
      ->query("SELECT id, sitemap_created FROM {simple_sitemap}")
185 186 187
      ->fetchAllAssoc('id');
  }

188 189 190 191 192 193 194 195 196
  /**
   * Fetches a single sitemap chunk by ID.
   *
   * @param int $id
   *   The chunk ID.
   *
   * @return object
   *   A sitemap chunk object.
   */
197
  protected function fetchSitemapChunk($id) {
198 199 200 201 202
    return $this->db->query('SELECT * FROM {simple_sitemap} WHERE id = :id',
      [':id' => $id])->fetchObject();
  }

  /**
Pawel G's avatar
Pawel G committed
203
   * Generates the XML sitemap and saves it to the db.
204 205 206 207 208 209 210 211 212 213 214 215 216 217 218
   *
   * @param string $from
   *   Can be 'form', 'cron', 'drush' or 'nobatch'.
   *   This decides how the batch process is to be run.
   */
  public function generateSitemap($from = 'form') {
    $this->sitemapGenerator
      ->setGenerator($this)
      ->setGenerateFrom($from)
      ->startGeneration();
  }

  /**
   * Generates and returns the sitemap index as string.
   *
Pawel G's avatar
Pawel G committed
219 220
   * @param array $chunk_info
   *   Array containing chunk creation timestamps keyed by chunk ID.
221 222 223 224
   *
   * @return string
   *   The sitemap index.
   */
Pawel G's avatar
Pawel G committed
225
  protected function getSitemapIndex($chunk_info) {
226 227
    return $this->sitemapGenerator
      ->setGenerator($this)
Pawel G's avatar
Pawel G committed
228
      ->generateSitemapIndex($chunk_info);
229 230 231 232 233 234 235 236 237 238 239 240
  }

  /**
   * Returns a 'time ago' string of last timestamp generation.
   *
   * @return string|false
   *   Formatted timestamp of last sitemap generation, otherwise FALSE.
   */
  public function getGeneratedAgo() {
    $chunks = $this->fetchSitemapChunkInfo();
    if (isset($chunks[SitemapGenerator::FIRST_CHUNK_INDEX]->sitemap_created)) {
      return $this->dateFormatter
241
        ->formatInterval($this->time->getRequestTime() - $chunks[SitemapGenerator::FIRST_CHUNK_INDEX]
242 243 244 245 246
            ->sitemap_created);
    }
    return FALSE;
  }

247 248
  /**
   * Enables sitemap support for an entity type. Enabled entity types show
249 250
   * sitemap settings on their bundle setting forms. If an enabled entity type
   * features bundles (e.g. 'node'), it needs to be set up with
251 252 253
   * setBundleSettings() as well.
   *
   * @param string $entity_type_id
Pawel G's avatar
Pawel G committed
254
   *   Entity type id like 'node'.
255
   *
Pawel G's avatar
Pawel G committed
256
   * @return $this
257 258
   */
  public function enableEntityType($entity_type_id) {
259 260 261 262
    $enabled_entity_types = $this->getSetting('enabled_entity_types');
    if (!in_array($entity_type_id, $enabled_entity_types)) {
      $enabled_entity_types[] = $entity_type_id;
      $this->saveSetting('enabled_entity_types', $enabled_entity_types);
263
    }
Pawel G's avatar
Pawel G committed
264
    return $this;
265 266 267 268 269 270 271 272
  }

  /**
   * Disables sitemap support for an entity type. Disabling support for an
   * entity type deletes its sitemap settings permanently and removes sitemap
   * settings from entity forms.
   *
   * @param string $entity_type_id
273
   *  Entity type id like 'node'.
274
   *
Pawel G's avatar
Pawel G committed
275
   * @return $this
276 277
   */
  public function disableEntityType($entity_type_id) {
278 279 280

    // Updating settings.
    $enabled_entity_types = $this->getSetting('enabled_entity_types');
281
    if (FALSE !== ($key = array_search($entity_type_id, $enabled_entity_types))) {
282
      unset ($enabled_entity_types[$key]);
283
      $this->saveSetting('enabled_entity_types', array_values($enabled_entity_types));
284 285 286
    }

    // Deleting inclusion settings.
287
    $config_names = $this->configFactory->listAll("simple_sitemap.bundle_settings.$entity_type_id.");
288 289
    foreach($config_names as $config_name) {
      $this->configFactory->getEditable($config_name)->delete();
290
    }
291 292 293

    // Deleting entity overrides.
    $this->removeEntityInstanceSettings($entity_type_id);
Pawel G's avatar
Pawel G committed
294
    return $this;
295 296 297
  }

  /**
Pawel G's avatar
Pawel G committed
298
   * Sets sitemap settings for a non-bundle entity type (e.g. user) or a bundle
299 300 301
   * of an entity type (e.g. page).
   *
   * @param string $entity_type_id
Pawel G's avatar
Pawel G committed
302
   *   Entity type id like 'node' the bundle belongs to.
303
   * @param string $bundle_name
Pawel G's avatar
Pawel G committed
304
   *   Name of the bundle. NULL if entity type has no bundles.
305
   * @param array $settings
Pawel G's avatar
Pawel G committed
306
   *   An array of sitemap settings for this bundle/entity type.
307
   *   Example: ['index' => TRUE, 'priority' => 0.5, 'changefreq' => 'never', 'include_images' => FALSE].
Pawel G's avatar
Pawel G committed
308 309
   *
   * @return $this
310 311
   *
   * @todo: enableEntityType automatically
312
   */
313
  public function setBundleSettings($entity_type_id, $bundle_name = NULL, $settings = []) {
314
    $bundle_name = empty($bundle_name) ? $entity_type_id : $bundle_name;
315

316 317 318 319 320
    $old_settings = $this->getBundleSettings($entity_type_id, $bundle_name);
    $settings = !empty($old_settings) ? array_merge($old_settings, $settings) : $this->supplementDefaultSettings('entity', $settings);

    $bundle_settings = $this->configFactory
      ->getEditable("simple_sitemap.bundle_settings.$entity_type_id.$bundle_name");
321
    foreach($settings as $setting_key => $setting) {
322
      if ($setting_key === 'index') {
323 324
        $setting = intval($setting);
      }
325
      $bundle_settings->set($setting_key, $setting);
326
    }
327
    $bundle_settings->save();
328 329

    // Delete entity overrides which are identical to new bundle setting.
Pawel G's avatar
Pawel G committed
330
    $sitemap_entity_types = $this->entityHelper->getSupportedEntityTypes();
331 332 333
    if (isset($sitemap_entity_types[$entity_type_id])) {
      $entity_type = $sitemap_entity_types[$entity_type_id];
      $keys = $entity_type->getKeys();
334 335

      // Menu fix.
336 337
      $keys['bundle'] = $entity_type_id == 'menu_link_content' ? 'menu_name' : $keys['bundle'];

338
      $query = $this->entityTypeManager->getStorage($entity_type_id)->getQuery();
339
      if (!$this->entityHelper->entityTypeIsAtomic($entity_type_id)) {
340
        $query->condition($keys['bundle'], $bundle_name);
341
      }
342 343 344 345 346 347 348 349 350
      $entity_ids = $query->execute();

      $query = $this->db->select('simple_sitemap_entity_overrides', 'o')
        ->fields('o', ['id', 'inclusion_settings'])
        ->condition('o.entity_type', $entity_type_id);
      if (!empty($entity_ids)) {
        $query->condition('o.entity_id', $entity_ids, 'IN');
      }

351
      $delete_instances = [];
352
      foreach($query->execute()->fetchAll() as $result) {
353 354 355
        $delete = TRUE;
        $instance_settings = unserialize($result->inclusion_settings);
        foreach ($instance_settings as $setting_key => $instance_setting) {
356
          if ($instance_setting != $settings[$setting_key]) {
357 358 359 360 361
            $delete = FALSE;
            break;
          }
        }
        if ($delete) {
362
          $delete_instances[] = $result->id;
363
        }
364
      }
365 366 367 368 369
      if (!empty($delete_instances)) {
        $this->db->delete('simple_sitemap_entity_overrides')
          ->condition('id', $delete_instances, 'IN')
          ->execute();
      }
370
    }
371 372 373
    else {
      //todo: log error
    }
Pawel G's avatar
Pawel G committed
374
    return $this;
375 376
  }

377
  /**
378 379
   * Gets sitemap settings for an entity bundle, a non-bundle entity type or for
   * all entity types and their bundles.
380
   *
381 382 383
   * @param string|null $entity_type_id
   *  If set to null, sitemap settings for all entity types and their bundles
   *  are fetched.
384 385 386
   * @param string|null $bundle_name
   *
   * @return array|false
Pawel G's avatar
Pawel G committed
387 388
   *  Array of sitemap settings for an entity bundle, a non-bundle entity type
   *  or for all entity types and their bundles.
389
   *  False if entity type does not exist.
390
   */
391
  public function getBundleSettings($entity_type_id = NULL, $bundle_name = NULL) {
392
    if (NULL !== $entity_type_id) {
393
      $bundle_name = empty($bundle_name) ? $entity_type_id : $bundle_name;
394
      $bundle_settings = $this->configFactory
395 396
        ->get("simple_sitemap.bundle_settings.$entity_type_id.$bundle_name")
        ->get();
397
      return !empty($bundle_settings) ? $bundle_settings : FALSE;
398
    }
399
    else {
400
      $config_names = $this->configFactory->listAll("simple_sitemap.bundle_settings.");
401
      $all_settings = [];
402 403
      foreach($config_names as $config_name) {
        $config_name_parts = explode('.', $config_name);
404
        $all_settings[$config_name_parts[2]][$config_name_parts[3]] = $this->configFactory->get($config_name)->get();
405 406 407 408 409 410
      }
      return $all_settings;
    }
  }

  /**
411 412
   * Supplements all missing link setting with default values.
   *
413 414 415 416 417 418 419
   * @param string $type
   * @param array $settings
   * @return array
   */
  protected function supplementDefaultSettings($type, $settings) {
    foreach(self::$allowed_link_settings[$type] as $allowed_link_setting) {
      if (!isset($settings[$allowed_link_setting])
420
        && isset(self::$link_setting_defaults[$allowed_link_setting])) {
421
        $settings[$allowed_link_setting] = self::$link_setting_defaults[$allowed_link_setting];
422 423
      }
    }
424
    return $settings;
425 426
  }

Pawel G's avatar
Pawel G committed
427 428 429
  /**
   * Overrides entity bundle/entity type sitemap settings for a single entity.
   *
Pawel G's avatar
Pawel G committed
430 431 432
   * @param string $entity_type_id
   * @param int $id
   * @param array $settings
Pawel G's avatar
Pawel G committed
433
   *
Pawel G's avatar
Pawel G committed
434 435
   * @return $this
   */
436
  public function setEntityInstanceSettings($entity_type_id, $id, $settings) {
437
    $entity = $this->entityTypeManager->getStorage($entity_type_id)->load($id);
438 439 440
    $bundle_settings = $this->getBundleSettings(
      $entity_type_id, $this->entityHelper->getEntityInstanceBundleName($entity)
    );
441
    if (!empty($bundle_settings)) {
442 443 444 445

      // Check if overrides are different from bundle setting before saving.
      $override = FALSE;
      foreach ($settings as $key => $setting) {
446
        if (!isset($bundle_settings[$key]) || $setting != $bundle_settings[$key]) {
447 448 449 450
          $override = TRUE;
          break;
        }
      }
Pawel G's avatar
Pawel G committed
451 452
      // Save overrides for this entity if something is different.
      if ($override) {
453 454 455 456 457 458 459
        $this->db->merge('simple_sitemap_entity_overrides')
          ->key([
            'entity_type' => $entity_type_id,
            'entity_id' => $id])
          ->fields([
            'entity_type' => $entity_type_id,
            'entity_id' => $id,
460
            'inclusion_settings' => serialize(array_merge($bundle_settings, $settings)),])
461
          ->execute();
462
      }
Pawel G's avatar
Pawel G committed
463 464
      // Else unset override.
      else {
465
        $this->removeEntityInstanceSettings($entity_type_id, $id);
466
      }
467 468 469
    }
    else {
      //todo: log error
470
    }
Pawel G's avatar
Pawel G committed
471
    return $this;
472 473
  }

Pawel G's avatar
Pawel G committed
474
  /**
475
   * Gets sitemap settings for an entity instance which overrides the sitemap
476
   * settings of its bundle, or bundle settings, if they are not overridden.
Pawel G's avatar
Pawel G committed
477
   *
Pawel G's avatar
Pawel G committed
478
   * @param string $entity_type_id
479
   * @param int $id
Pawel G's avatar
Pawel G committed
480
   *
481
   * @return array|false
Pawel G's avatar
Pawel G committed
482
   */
483 484 485 486 487 488 489 490 491
  public function getEntityInstanceSettings($entity_type_id, $id) {
    $results = $this->db->select('simple_sitemap_entity_overrides', 'o')
      ->fields('o', ['inclusion_settings'])
      ->condition('o.entity_type', $entity_type_id)
      ->condition('o.entity_id', $id)
      ->execute()
      ->fetchField();

    if (!empty($results)) {
492
      return unserialize($results);
493 494
    }
    else {
495 496 497 498 499 500
      $entity = $this->entityTypeManager->getStorage($entity_type_id)
        ->load($id);
      return $this->getBundleSettings(
        $entity_type_id,
        $this->entityHelper->getEntityInstanceBundleName($entity)
      );
501 502 503
    }
  }

504 505 506 507 508 509 510 511 512 513 514 515
  /**
   * Removes sitemap settings for an entity that overrides the sitemap settings
   * of its bundle.
   *
   * @param string $entity_type_id
   * @param string|null $entity_ids
   *
   * @return $this
   */
  public function removeEntityInstanceSettings($entity_type_id, $entity_ids = NULL) {
    $query = $this->db->delete('simple_sitemap_entity_overrides')
      ->condition('entity_type', $entity_type_id);
516
    if (NULL !== $entity_ids) {
517 518 519 520 521 522 523
      $entity_ids = !is_array($entity_ids) ? [$entity_ids] : $entity_ids;
      $query->condition('entity_id', $entity_ids, 'IN');
    }
    $query->execute();
    return $this;
  }

Pawel G's avatar
Pawel G committed
524 525 526 527
  /**
   * Checks if an entity bundle (or a non-bundle entity type) is set to be
   * indexed in the sitemap settings.
   *
528 529
   * @param string $entity_type_id
   * @param string|null $bundle_name
Pawel G's avatar
Pawel G committed
530
   *
Pawel G's avatar
Pawel G committed
531 532
   * @return bool
   */
533
  public function bundleIsIndexed($entity_type_id, $bundle_name = NULL) {
534 535 536 537
    $settings = $this->getBundleSettings($entity_type_id, $bundle_name);
    return !empty($settings['index']);
  }

Pawel G's avatar
Pawel G committed
538 539 540
  /**
   * Checks if an entity type is enabled in the sitemap settings.
   *
541
   * @param string $entity_type_id
Pawel G's avatar
Pawel G committed
542
   *
Pawel G's avatar
Pawel G committed
543 544
   * @return bool
   */
545
  public function entityTypeIsEnabled($entity_type_id) {
546
    return in_array($entity_type_id, $this->getSetting('enabled_entity_types', []));
547 548
  }

Pawel G's avatar
Pawel G committed
549
  /**
550
   * Stores a custom path along with its sitemap settings to configuration.
Pawel G's avatar
Pawel G committed
551
   *
Pawel G's avatar
Pawel G committed
552 553
   * @param string $path
   * @param array $settings
Pawel G's avatar
Pawel G committed
554
   *
Pawel G's avatar
Pawel G committed
555
   * @return $this
556 557
   *
   * @todo Validate $settings and throw exceptions
Pawel G's avatar
Pawel G committed
558
   */
559
  public function addCustomLink($path, $settings = []) {
Pawel G's avatar
Pawel G committed
560 561 562 563 564 565 566 567
    if (!$this->pathValidator->isValid($path)) {
      // todo: log error.
      return $this;
    }
    if ($path[0] != '/') {
      // todo: log error.
      return $this;
    }
Pawel G's avatar
Pawel G committed
568

569
    $custom_links = $this->getCustomLinks(FALSE);
Pawel G's avatar
Pawel G committed
570
    foreach ($custom_links as $key => $link) {
571
      if ($link['path'] === $path) {
572 573 574 575 576
        $link_key = $key;
        break;
      }
    }
    $link_key = isset($link_key) ? $link_key : count($custom_links);
577
    $custom_links[$link_key] = ['path' => $path] + $settings;
578
    $this->configFactory->getEditable("simple_sitemap.custom")
579
      ->set('links', $custom_links)->save();
Pawel G's avatar
Pawel G committed
580
    return $this;
581 582
  }

583 584 585
  /**
   * Returns an array of custom paths and their sitemap settings.
   *
586
   * @param bool $supplement_default_settings
587 588
   * @return array
   */
589
  public function getCustomLinks($supplement_default_settings = TRUE) {
590 591
    $custom_links = $this->configFactory
      ->get('simple_sitemap.custom')
592
      ->get('links');
593 594 595 596 597 598 599

    if ($supplement_default_settings) {
      foreach ($custom_links as $i => $link_settings) {
        $custom_links[$i] = $this->supplementDefaultSettings('custom', $link_settings);
      }
    }

600
    return $custom_links !== NULL ? $custom_links : [];
601 602
  }

Pawel G's avatar
Pawel G committed
603 604 605
  /**
   * Returns settings for a custom path added to the sitemap settings.
   *
Pawel G's avatar
Pawel G committed
606
   * @param string $path
Pawel G's avatar
Pawel G committed
607
   *
Pawel G's avatar
Pawel G committed
608
   * @return array|false
Pawel G's avatar
Pawel G committed
609
   */
610
  public function getCustomLink($path) {
611
    foreach ($this->getCustomLinks() as $key => $link) {
612
      if ($link['path'] === $path) {
613
        return $link;
614 615 616 617 618
      }
    }
    return FALSE;
  }

Pawel G's avatar
Pawel G committed
619 620 621
  /**
   * Removes a custom path from the sitemap settings.
   *
Pawel G's avatar
Pawel G committed
622
   * @param string $path
Pawel G's avatar
Pawel G committed
623
   *
Pawel G's avatar
Pawel G committed
624 625
   * @return $this
   */
626
  public function removeCustomLink($path) {
627
    $custom_links = $this->getCustomLinks(FALSE);
Pawel G's avatar
Pawel G committed
628
    foreach ($custom_links as $key => $link) {
629
      if ($link['path'] === $path) {
630 631
        unset($custom_links[$key]);
        $custom_links = array_values($custom_links);
632
        $this->configFactory->getEditable("simple_sitemap.custom")
633
          ->set('links', $custom_links)->save();
634
        break;
635 636
      }
    }
Pawel G's avatar
Pawel G committed
637
    return $this;
638 639
  }

Pawel G's avatar
Pawel G committed
640 641
  /**
   * Removes all custom paths from the sitemap settings.
Pawel G's avatar
Pawel G committed
642 643
   *
   * @return $this
Pawel G's avatar
Pawel G committed
644
   */
645
  public function removeCustomLinks() {
646
    $this->configFactory->getEditable("simple_sitemap.custom")
647
      ->set('links', [])->save();
Pawel G's avatar
Pawel G committed
648
    return $this;
649
  }
650
}