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

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

5
use Drupal\simple_sitemap\Form\FormHelper;
Pawel G's avatar
Pawel G committed
6 7 8
use Drupal\Core\Database\Connection;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\Core\Path\PathValidator;
Pawel G's avatar
Pawel G committed
9 10
use Drupal\Core\Config\ConfigFactory;
use Drupal\Core\Datetime\DateFormatter;
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

  /**
   * @var array
   */
51
  protected static $allowed_link_settings = [
52
    'entity' => ['index', 'priority'],
Pawel G's avatar
Pawel G committed
53
    'custom' => ['priority'],
54
  ];
55

56 57
  /**
   * Simplesitemap constructor.
Pawel G's avatar
Pawel G committed
58
   * @param \Drupal\simple_sitemap\SitemapGenerator $sitemapGenerator
59
   * @param \Drupal\simple_sitemap\EntityHelper $entityHelper
Pawel G's avatar
Pawel G committed
60 61 62 63 64
   * @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
65
   */
66
  public function __construct(
Pawel G's avatar
Pawel G committed
67
    SitemapGenerator $sitemapGenerator,
68
    EntityHelper $entityHelper,
Pawel G's avatar
Pawel G committed
69
    ConfigFactory $configFactory,
Pawel G's avatar
Pawel G committed
70 71 72
    Connection $database,
    EntityTypeManagerInterface $entityTypeManager,
    PathValidator $pathValidator,
73
    DateFormatter $dateFormatter
74 75
  ) {
    $this->sitemapGenerator = $sitemapGenerator;
76
    $this->entityHelper = $entityHelper;
Pawel G's avatar
Pawel G committed
77
    $this->configFactory = $configFactory;
78 79
    $this->db = $database;
    $this->entityTypeManager = $entityTypeManager;
80
    $this->pathValidator = $pathValidator;
81
    $this->dateFormatter = $dateFormatter;
82 83
  }

84
  /**
85 86
   * Returns a specific sitemap setting or a default value if setting does not
   * exist.
Pawel G's avatar
Pawel G committed
87
   *
88 89 90 91 92 93 94 95
   * @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
96
   */
97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 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
  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() {
163
    return $this->db
164
      ->query("SELECT id, sitemap_created FROM {simple_sitemap}")
165 166 167
      ->fetchAllAssoc('id');
  }

168 169 170 171 172 173 174 175 176
  /**
   * Fetches a single sitemap chunk by ID.
   *
   * @param int $id
   *   The chunk ID.
   *
   * @return object
   *   A sitemap chunk object.
   */
177
  protected function fetchSitemapChunk($id) {
178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198
    return $this->db->query('SELECT * FROM {simple_sitemap} WHERE id = :id',
      [':id' => $id])->fetchObject();
  }

  /**
   * Generates the sitemap for all languages and saves it to the db.
   *
   * @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
199 200
   * @param array $chunk_info
   *   Array containing chunk creation timestamps keyed by chunk ID.
201 202 203 204
   *
   * @return string
   *   The sitemap index.
   */
Pawel G's avatar
Pawel G committed
205
  protected function getSitemapIndex($chunk_info) {
206 207
    return $this->sitemapGenerator
      ->setGenerator($this)
Pawel G's avatar
Pawel G committed
208
      ->generateSitemapIndex($chunk_info);
209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226
  }

  /**
   * 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
        ->formatInterval(REQUEST_TIME - $chunks[SitemapGenerator::FIRST_CHUNK_INDEX]
            ->sitemap_created);
    }
    return FALSE;
  }

227 228
  /**
   * Enables sitemap support for an entity type. Enabled entity types show
229 230
   * sitemap settings on their bundle setting forms. If an enabled entity type
   * features bundles (e.g. 'node'), it needs to be set up with
231 232 233
   * setBundleSettings() as well.
   *
   * @param string $entity_type_id
Pawel G's avatar
Pawel G committed
234
   *   Entity type id like 'node'.
235
   *
Pawel G's avatar
Pawel G committed
236
   * @return $this
237 238
   */
  public function enableEntityType($entity_type_id) {
239 240 241 242
    $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);
243
    }
Pawel G's avatar
Pawel G committed
244
    return $this;
245 246 247 248 249 250 251 252
  }

  /**
   * 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
253
   *  Entity type id like 'node'.
254
   *
Pawel G's avatar
Pawel G committed
255
   * @return $this
256 257
   */
  public function disableEntityType($entity_type_id) {
258 259 260

    // Updating settings.
    $enabled_entity_types = $this->getSetting('enabled_entity_types');
261
    if (FALSE !== ($key = array_search($entity_type_id, $enabled_entity_types))) {
262
      unset ($enabled_entity_types[$key]);
263
      $this->saveSetting('enabled_entity_types', array_values($enabled_entity_types));
264 265 266 267 268 269
    }

    // Deleting inclusion settings.
    $config_names = $this->configFactory->listAll("simple_sitemap.bundle_settings.$entity_type_id");
    foreach($config_names as $config_name) {
      $this->configFactory->getEditable($config_name)->delete();
270
    }
271 272 273

    // Deleting entity overrides.
    $this->removeEntityInstanceSettings($entity_type_id);
Pawel G's avatar
Pawel G committed
274
    return $this;
275 276 277
  }

  /**
Pawel G's avatar
Pawel G committed
278
   * Sets sitemap settings for a non-bundle entity type (e.g. user) or a bundle
279 280 281
   * of an entity type (e.g. page).
   *
   * @param string $entity_type_id
Pawel G's avatar
Pawel G committed
282
   *   Entity type id like 'node' the bundle belongs to.
283
   * @param string $bundle_name
Pawel G's avatar
Pawel G committed
284
   *   Name of the bundle. NULL if entity type has no bundles.
285
   * @param array $settings
Pawel G's avatar
Pawel G committed
286 287
   *   An array of sitemap settings for this bundle/entity type.
   *   Example: ['index' => TRUE, 'priority' => 0.5].
Pawel G's avatar
Pawel G committed
288 289
   *
   * @return $this
290 291
   */
  public function setBundleSettings($entity_type_id, $bundle_name = NULL, $settings) {
292

293
    $bundle_name = empty($bundle_name) ? $entity_type_id : $bundle_name;
294

295 296 297 298 299 300 301 302 303 304
    foreach($settings as $setting_key => $setting) {
      if ($setting_key == 'index') {
        $setting = intval($setting);
      }
      $this->configFactory
        ->getEditable("simple_sitemap.bundle_settings.$entity_type_id.$bundle_name")
        ->set($setting_key, $setting)
        ->save();
    }
    //todo: Use addLinkSettings()?
305 306

    // Delete entity overrides which are identical to new bundle setting.
Pawel G's avatar
Pawel G committed
307
    $sitemap_entity_types = $this->entityHelper->getSupportedEntityTypes();
308 309 310
    if (isset($sitemap_entity_types[$entity_type_id])) {
      $entity_type = $sitemap_entity_types[$entity_type_id];
      $keys = $entity_type->getKeys();
311 312

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

315
      $query = $this->entityTypeManager->getStorage($entity_type_id)->getQuery();
316
      if (!$this->entityHelper->entityTypeIsAtomic($entity_type_id)) {
317
        $query->condition($keys['bundle'], $bundle_name);
318
      }
319 320 321 322 323 324 325 326 327 328 329 330
      $entity_ids = $query->execute();

      $bundle_settings = $this->configFactory
        ->get("simple_sitemap.bundle_settings.$entity_type_id.$bundle_name");

      $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');
      }

331
      foreach($query->execute()->fetchAll() as $result) {
332 333 334 335 336 337 338 339 340 341 342 343 344
        $delete = TRUE;
        $instance_settings = unserialize($result->inclusion_settings);
        foreach ($instance_settings as $setting_key => $instance_setting) {
          if ($instance_setting != $bundle_settings->get($setting_key)) {
            $delete = FALSE;
            break;
          }
        }
        if ($delete) {
          $this->db->delete('simple_sitemap_entity_overrides')
            ->condition('id', $result->id)
            ->execute();
        }
345 346
      }
    }
347 348 349
    else {
      //todo: log error
    }
Pawel G's avatar
Pawel G committed
350
    return $this;
351 352
  }

353
  /**
354 355
   * Gets sitemap settings for an entity bundle, a non-bundle entity type or for
   * all entity types and their bundles.
356
   *
357 358 359
   * @param string|null $entity_type_id
   *  If set to null, sitemap settings for all entity types and their bundles
   *  are fetched.
360 361 362
   * @param string|null $bundle_name
   *
   * @return array|false
Pawel G's avatar
Pawel G committed
363 364
   *  Array of sitemap settings for an entity bundle, a non-bundle entity type
   *  or for all entity types and their bundles.
365
   *  False if entity type does not exist.
366
   */
367
  public function getBundleSettings($entity_type_id = NULL, $bundle_name = NULL) {
368
    if (NULL !== $entity_type_id) {
369 370 371 372 373
      $bundle_name = empty($bundle_name) ? $entity_type_id : $bundle_name;
      $settings = $this->configFactory
        ->get("simple_sitemap.bundle_settings.$entity_type_id.$bundle_name")
        ->get();
      $bundle_settings = !empty($settings) ? $settings : FALSE;
374
    }
375 376 377 378 379 380 381 382 383 384
    else {
      $config_names = $this->configFactory->listAll("simple_sitemap.bundle_settings");
      $bundle_settings = [];
      foreach($config_names as $config_name) {
        $config_name_parts = explode('.', $config_name);
        $bundle_settings[$config_name_parts[2]][$config_name_parts[3]]
          = $this->configFactory->get($config_name)->get();
      }
    }
    return $bundle_settings;
385 386
  }

Pawel G's avatar
Pawel G committed
387 388 389
  /**
   * Overrides entity bundle/entity type sitemap settings for a single entity.
   *
Pawel G's avatar
Pawel G committed
390 391 392
   * @param string $entity_type_id
   * @param int $id
   * @param array $settings
Pawel G's avatar
Pawel G committed
393
   *
Pawel G's avatar
Pawel G committed
394 395
   * @return $this
   */
396
  public function setEntityInstanceSettings($entity_type_id, $id, $settings) {
397

398
    $entity = $this->entityTypeManager->getStorage($entity_type_id)->load($id);
399
    $bundle_name = $this->entityHelper->getEntityInstanceBundleName($entity);
400 401 402 403 404
    $bundle_settings = $this->configFactory
      ->get("simple_sitemap.bundle_settings.$entity_type_id.$bundle_name")
      ->get();

    if (!empty($bundle_settings)) {
405 406 407 408

      // Check if overrides are different from bundle setting before saving.
      $override = FALSE;
      foreach ($settings as $key => $setting) {
409
        if ($setting != $bundle_settings[$key]) {
410 411 412 413
          $override = TRUE;
          break;
        }
      }
Pawel G's avatar
Pawel G committed
414 415
      // Save overrides for this entity if something is different.
      if ($override) {
416 417 418 419 420 421 422 423 424 425
        $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,
            'inclusion_settings' => serialize($settings),
          ])
          ->execute();
426
      }
Pawel G's avatar
Pawel G committed
427 428
      // Else unset override.
      else {
429
        $this->removeEntityInstanceSettings($entity_type_id, $id);
430
      }
431 432 433
    }
    else {
      //todo: log error
434
    }
Pawel G's avatar
Pawel G committed
435
    return $this;
436 437
  }

Pawel G's avatar
Pawel G committed
438
  /**
439
   * Gets sitemap settings for an entity instance which overrides the sitemap
440
   * settings of its bundle, or bundle settings, if they are not overridden.
Pawel G's avatar
Pawel G committed
441
   *
Pawel G's avatar
Pawel G committed
442
   * @param string $entity_type_id
443
   * @param int $id
Pawel G's avatar
Pawel G committed
444
   *
445
   * @return array|false
Pawel G's avatar
Pawel G committed
446
   */
447 448 449 450 451 452 453 454 455 456 457 458
  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)) {
      return unserialize($results);
    }
    else {
459 460 461 462 463 464
      $entity = $this->entityTypeManager->getStorage($entity_type_id)
        ->load($id);
      return $this->getBundleSettings(
        $entity_type_id,
        $this->entityHelper->getEntityInstanceBundleName($entity)
      );
465 466 467
    }
  }

468 469 470 471 472 473 474 475 476 477 478 479
  /**
   * 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);
480
    if (NULL !== $entity_ids) {
481 482 483 484 485 486 487
      $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
488 489 490 491
  /**
   * Checks if an entity bundle (or a non-bundle entity type) is set to be
   * indexed in the sitemap settings.
   *
492 493
   * @param string $entity_type_id
   * @param string|null $bundle_name
Pawel G's avatar
Pawel G committed
494
   *
Pawel G's avatar
Pawel G committed
495 496
   * @return bool
   */
497
  public function bundleIsIndexed($entity_type_id, $bundle_name = NULL) {
498 499 500 501
    $settings = $this->getBundleSettings($entity_type_id, $bundle_name);
    return !empty($settings['index']);
  }

Pawel G's avatar
Pawel G committed
502 503 504
  /**
   * Checks if an entity type is enabled in the sitemap settings.
   *
505
   * @param string $entity_type_id
Pawel G's avatar
Pawel G committed
506
   *
Pawel G's avatar
Pawel G committed
507 508
   * @return bool
   */
509
  public function entityTypeIsEnabled($entity_type_id) {
510
    return in_array($entity_type_id, $this->getSetting('enabled_entity_types', []));
511 512
  }

Pawel G's avatar
Pawel G committed
513
  /**
514
   * Stores a custom path along with its sitemap settings to configuration.
Pawel G's avatar
Pawel G committed
515
   *
Pawel G's avatar
Pawel G committed
516 517
   * @param string $path
   * @param array $settings
Pawel G's avatar
Pawel G committed
518
   *
Pawel G's avatar
Pawel G committed
519
   * @return $this
Pawel G's avatar
Pawel G committed
520
   */
521
  public function addCustomLink($path, $settings) {
Pawel G's avatar
Pawel G committed
522 523 524 525 526 527 528 529
    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
530

531
    $custom_links = $this->getCustomLinks();
Pawel G's avatar
Pawel G committed
532
    foreach ($custom_links as $key => $link) {
533 534 535 536 537 538 539
      if ($link['path'] == $path) {
        $link_key = $key;
        break;
      }
    }
    $link_key = isset($link_key) ? $link_key : count($custom_links);
    $custom_links[$link_key]['path'] = $path;
540 541
    $this->addLinkSettings('custom', $settings, $custom_links[$link_key]); //todo: dirty
    $this->configFactory->getEditable("simple_sitemap.custom")
542
      ->set('links', $custom_links)->save();
Pawel G's avatar
Pawel G committed
543
    return $this;
544 545
  }

546 547 548
  /**
   *
   */
549
  protected function addLinkSettings($type, $settings, &$target) {
550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574
    foreach ($settings as $setting_key => $setting) {
      if (in_array($setting_key, self::$allowed_link_settings[$type])) {
        switch ($setting_key) {
          case 'priority':
            if (!FormHelper::isValidPriority($setting)) {
              // todo: log error.
              continue;
            }
            break;

          // todo: add index check.
        }
        $target[$setting_key] = $setting;
      }
    }
  }

  /**
   * Returns an array of custom paths and their sitemap settings.
   *
   * @return array
   */
  public function getCustomLinks() {
    $custom_links = $this->configFactory
      ->get('simple_sitemap.custom')
575
      ->get('links');
576
    return $custom_links !== NULL ? $custom_links : [];
577 578
  }

Pawel G's avatar
Pawel G committed
579 580 581
  /**
   * Returns settings for a custom path added to the sitemap settings.
   *
Pawel G's avatar
Pawel G committed
582
   * @param string $path
Pawel G's avatar
Pawel G committed
583
   *
Pawel G's avatar
Pawel G committed
584
   * @return array|false
Pawel G's avatar
Pawel G committed
585
   */
586
  public function getCustomLink($path) {
587
    foreach ($this->getCustomLinks() as $key => $link) {
588
      if ($link['path'] == $path) {
589
        return $link;
590 591 592 593 594
      }
    }
    return FALSE;
  }

Pawel G's avatar
Pawel G committed
595 596 597
  /**
   * Removes a custom path from the sitemap settings.
   *
Pawel G's avatar
Pawel G committed
598
   * @param string $path
Pawel G's avatar
Pawel G committed
599
   *
Pawel G's avatar
Pawel G committed
600 601
   * @return $this
   */
602
  public function removeCustomLink($path) {
603
    $custom_links = $this->getCustomLinks();
Pawel G's avatar
Pawel G committed
604
    foreach ($custom_links as $key => $link) {
605 606 607
      if ($link['path'] == $path) {
        unset($custom_links[$key]);
        $custom_links = array_values($custom_links);
608
        $this->configFactory->getEditable("simple_sitemap.custom")
609
          ->set('links', $custom_links)->save();
610
        break;
611 612
      }
    }
Pawel G's avatar
Pawel G committed
613
    return $this;
614 615
  }

Pawel G's avatar
Pawel G committed
616 617
  /**
   * Removes all custom paths from the sitemap settings.
Pawel G's avatar
Pawel G committed
618 619
   *
   * @return $this
Pawel G's avatar
Pawel G committed
620
   */
621
  public function removeCustomLinks() {
622
    $this->configFactory->getEditable("simple_sitemap.custom")
623
      ->set('links', [])->save();
Pawel G's avatar
Pawel G committed
624
    return $this;
625
  }
626
}