Simplesitemap.php 17.8 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 11
use Drupal\Core\Entity\Query\QueryFactory;
use Drupal\Core\Config\ConfigFactory;
use Drupal\Core\Datetime\DateFormatter;
12

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

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

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

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

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

  /**
   * @var \Drupal\Core\Entity\Query\QueryFactory
   */
42
  protected $entityQuery;
Pawel G's avatar
Pawel G committed
43 44 45 46

  /**
   * @var \Drupal\Core\Entity\EntityTypeManagerInterface
   */
47
  protected $entityTypeManager;
Pawel G's avatar
Pawel G committed
48 49 50 51

  /**
   * @var \Drupal\Core\Path\PathValidator
   */
52
  protected $pathValidator;
Pawel G's avatar
Pawel G committed
53 54 55 56

  /**
   * @var array
   */
57
  protected static $allowed_link_settings = [
58
    'entity' => ['index', 'priority'],
Pawel G's avatar
Pawel G committed
59
    'custom' => ['priority'],
60
  ];
61

62 63
  /**
   * Simplesitemap constructor.
Pawel G's avatar
Pawel G committed
64
   * @param \Drupal\simple_sitemap\SitemapGenerator $sitemapGenerator
65
   * @param \Drupal\simple_sitemap\EntityHelper $entityHelper
Pawel G's avatar
Pawel G committed
66 67 68 69 70 71
   * @param \Drupal\Core\Config\ConfigFactory $configFactory
   * @param \Drupal\Core\Database\Connection $database
   * @param \Drupal\Core\Entity\Query\QueryFactory $entityQuery
   * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entityTypeManager
   * @param \Drupal\Core\Path\PathValidator $pathValidator
   * @param \Drupal\Core\Datetime\DateFormatter $dateFormatter
72
   */
73
  public function __construct(
Pawel G's avatar
Pawel G committed
74
    SitemapGenerator $sitemapGenerator,
75
    EntityHelper $entityHelper,
Pawel G's avatar
Pawel G committed
76
    ConfigFactory $configFactory,
Pawel G's avatar
Pawel G committed
77
    Connection $database,
Pawel G's avatar
Pawel G committed
78
    QueryFactory $entityQuery,
Pawel G's avatar
Pawel G committed
79 80
    EntityTypeManagerInterface $entityTypeManager,
    PathValidator $pathValidator,
81
    DateFormatter $dateFormatter
82 83
  ) {
    $this->sitemapGenerator = $sitemapGenerator;
84
    $this->entityHelper = $entityHelper;
Pawel G's avatar
Pawel G committed
85
    $this->configFactory = $configFactory;
86
    $this->db = $database;
87
    $this->entityQuery = $entityQuery;
88
    $this->entityTypeManager = $entityTypeManager;
89
    $this->pathValidator = $pathValidator;
90
    $this->dateFormatter = $dateFormatter;
91 92
  }

93
  /**
94
   * Fetches all sitemap chunks indexed by chunk ID.
Pawel G's avatar
Pawel G committed
95
   *
96
   * @return string
Pawel G's avatar
Pawel G committed
97
   */
98
  protected function fetchSitemapChunks() {
99
    return $this->db
100 101 102 103
      ->query("SELECT * FROM {simple_sitemap}")
      ->fetchAllAssoc('id');
  }

104 105
  /**
   * Enables sitemap support for an entity type. Enabled entity types show
106 107
   * sitemap settings on their bundle setting forms. If an enabled entity type
   * features bundles (e.g. 'node'), it needs to be set up with
108 109 110
   * setBundleSettings() as well.
   *
   * @param string $entity_type_id
Pawel G's avatar
Pawel G committed
111
   *   Entity type id like 'node'.
112
   *
Pawel G's avatar
Pawel G committed
113
   * @return $this
114 115
   */
  public function enableEntityType($entity_type_id) {
116 117 118 119
    $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);
120
    }
Pawel G's avatar
Pawel G committed
121
    return $this;
122 123 124 125 126 127 128 129
  }

  /**
   * 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
130
   *  Entity type id like 'node'.
131
   *
Pawel G's avatar
Pawel G committed
132
   * @return $this
133 134
   */
  public function disableEntityType($entity_type_id) {
135 136 137

    // Updating settings.
    $enabled_entity_types = $this->getSetting('enabled_entity_types');
138
    if (FALSE !== ($key = array_search($entity_type_id, $enabled_entity_types))) {
139
      unset ($enabled_entity_types[$key]);
140
      $this->saveSetting('enabled_entity_types', array_values($enabled_entity_types));
141 142 143 144 145 146
    }

    // 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();
147
    }
148 149 150

    // Deleting entity overrides.
    $this->removeEntityInstanceSettings($entity_type_id);
Pawel G's avatar
Pawel G committed
151
    return $this;
152 153 154
  }

  /**
Pawel G's avatar
Pawel G committed
155
   * Sets sitemap settings for a non-bundle entity type (e.g. user) or a bundle
156 157 158
   * of an entity type (e.g. page).
   *
   * @param string $entity_type_id
Pawel G's avatar
Pawel G committed
159
   *   Entity type id like 'node' the bundle belongs to.
160
   * @param string $bundle_name
Pawel G's avatar
Pawel G committed
161
   *   Name of the bundle. NULL if entity type has no bundles.
162
   * @param array $settings
Pawel G's avatar
Pawel G committed
163 164
   *   An array of sitemap settings for this bundle/entity type.
   *   Example: ['index' => TRUE, 'priority' => 0.5].
Pawel G's avatar
Pawel G committed
165 166
   *
   * @return $this
167 168
   */
  public function setBundleSettings($entity_type_id, $bundle_name = NULL, $settings) {
169

170
    $bundle_name = empty($bundle_name) ? $entity_type_id : $bundle_name;
171

172 173 174 175 176 177 178 179 180 181
    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()?
182 183

    // Delete entity overrides which are identical to new bundle setting.
184
    $sitemap_entity_types = $this->entityHelper->getSitemapEntityTypes();
185 186 187
    if (isset($sitemap_entity_types[$entity_type_id])) {
      $entity_type = $sitemap_entity_types[$entity_type_id];
      $keys = $entity_type->getKeys();
188 189

      // Menu fix.
190 191 192
      $keys['bundle'] = $entity_type_id == 'menu_link_content' ? 'menu_name' : $keys['bundle'];

      $query = $this->entityQuery->get($entity_type_id);
193
      if (!$this->entityHelper->entityTypeIsAtomic($entity_type_id)) {
194
        $query->condition($keys['bundle'], $bundle_name);
195
      }
196 197 198 199 200 201 202 203 204 205 206 207
      $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');
      }

208
      foreach($query->execute()->fetchAll() as $result) {
209 210 211 212 213 214 215 216 217 218 219 220 221
        $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();
        }
222 223
      }
    }
224 225 226
    else {
      //todo: log error
    }
Pawel G's avatar
Pawel G committed
227
    return $this;
228 229
  }

230
  /**
231 232
   * Gets sitemap settings for an entity bundle, a non-bundle entity type or for
   * all entity types and their bundles.
233
   *
234 235 236
   * @param string|null $entity_type_id
   *  If set to null, sitemap settings for all entity types and their bundles
   *  are fetched.
237 238 239
   * @param string|null $bundle_name
   *
   * @return array|false
Pawel G's avatar
Pawel G committed
240 241
   *  Array of sitemap settings for an entity bundle, a non-bundle entity type
   *  or for all entity types and their bundles.
242
   *  False if entity type does not exist.
243
   */
244
  public function getBundleSettings($entity_type_id = NULL, $bundle_name = NULL) {
245
    if (NULL !== $entity_type_id) {
246 247 248 249 250
      $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;
251
    }
252 253 254 255 256 257 258 259 260 261
    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;
262 263
  }

Pawel G's avatar
Pawel G committed
264 265 266
  /**
   * Overrides entity bundle/entity type sitemap settings for a single entity.
   *
Pawel G's avatar
Pawel G committed
267 268 269
   * @param string $entity_type_id
   * @param int $id
   * @param array $settings
Pawel G's avatar
Pawel G committed
270
   *
Pawel G's avatar
Pawel G committed
271 272
   * @return $this
   */
273
  public function setEntityInstanceSettings($entity_type_id, $id, $settings) {
274

275
    $entity = $this->entityTypeManager->getStorage($entity_type_id)->load($id);
276
    $bundle_name = $this->entityHelper->getEntityInstanceBundleName($entity);
277 278 279 280 281
    $bundle_settings = $this->configFactory
      ->get("simple_sitemap.bundle_settings.$entity_type_id.$bundle_name")
      ->get();

    if (!empty($bundle_settings)) {
282 283 284 285

      // Check if overrides are different from bundle setting before saving.
      $override = FALSE;
      foreach ($settings as $key => $setting) {
286
        if ($setting != $bundle_settings[$key]) {
287 288 289 290
          $override = TRUE;
          break;
        }
      }
Pawel G's avatar
Pawel G committed
291 292
      // Save overrides for this entity if something is different.
      if ($override) {
293 294 295 296 297 298 299 300 301 302
        $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();
303
      }
Pawel G's avatar
Pawel G committed
304 305
      // Else unset override.
      else {
306
        $this->removeEntityInstanceSettings($entity_type_id, $id);
307
      }
308 309 310
    }
    else {
      //todo: log error
311
    }
Pawel G's avatar
Pawel G committed
312
    return $this;
313 314
  }

Pawel G's avatar
Pawel G committed
315
  /**
316
   * Gets sitemap settings for an entity instance which overrides the sitemap
317
   * settings of its bundle, or bundle settings, if they are not overridden.
Pawel G's avatar
Pawel G committed
318
   *
Pawel G's avatar
Pawel G committed
319
   * @param string $entity_type_id
320
   * @param int $id
Pawel G's avatar
Pawel G committed
321
   *
322
   * @return array|false
Pawel G's avatar
Pawel G committed
323
   */
324 325 326 327 328 329 330 331 332 333 334 335
  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 {
336 337 338 339 340 341
      $entity = $this->entityTypeManager->getStorage($entity_type_id)
        ->load($id);
      return $this->getBundleSettings(
        $entity_type_id,
        $this->entityHelper->getEntityInstanceBundleName($entity)
      );
342 343 344
    }
  }

345 346 347 348 349 350 351 352 353 354 355 356
  /**
   * 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);
357
    if (NULL !== $entity_ids) {
358 359 360 361 362 363 364
      $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
365 366 367 368
  /**
   * Checks if an entity bundle (or a non-bundle entity type) is set to be
   * indexed in the sitemap settings.
   *
369 370
   * @param string $entity_type_id
   * @param string|null $bundle_name
Pawel G's avatar
Pawel G committed
371
   *
Pawel G's avatar
Pawel G committed
372 373
   * @return bool
   */
374
  public function bundleIsIndexed($entity_type_id, $bundle_name = NULL) {
375 376 377 378
    $settings = $this->getBundleSettings($entity_type_id, $bundle_name);
    return !empty($settings['index']);
  }

Pawel G's avatar
Pawel G committed
379 380 381
  /**
   * Checks if an entity type is enabled in the sitemap settings.
   *
382
   * @param string $entity_type_id
Pawel G's avatar
Pawel G committed
383
   *
Pawel G's avatar
Pawel G committed
384 385
   * @return bool
   */
386
  public function entityTypeIsEnabled($entity_type_id) {
387
    return in_array($entity_type_id, $this->getSetting('enabled_entity_types', []));
388 389
  }

Pawel G's avatar
Pawel G committed
390
  /**
391
   * Stores a custom path along with its sitemap settings to configuration.
Pawel G's avatar
Pawel G committed
392
   *
Pawel G's avatar
Pawel G committed
393 394
   * @param string $path
   * @param array $settings
Pawel G's avatar
Pawel G committed
395
   *
Pawel G's avatar
Pawel G committed
396
   * @return $this
Pawel G's avatar
Pawel G committed
397
   */
398
  public function addCustomLink($path, $settings) {
Pawel G's avatar
Pawel G committed
399 400 401 402 403 404 405 406
    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
407

408
    $custom_links = $this->getCustomLinks();
Pawel G's avatar
Pawel G committed
409
    foreach ($custom_links as $key => $link) {
410 411 412 413 414 415 416
      if ($link['path'] == $path) {
        $link_key = $key;
        break;
      }
    }
    $link_key = isset($link_key) ? $link_key : count($custom_links);
    $custom_links[$link_key]['path'] = $path;
417 418
    $this->addLinkSettings('custom', $settings, $custom_links[$link_key]); //todo: dirty
    $this->configFactory->getEditable("simple_sitemap.custom")
419
      ->set('links', $custom_links)->save();
Pawel G's avatar
Pawel G committed
420
    return $this;
421 422
  }

423 424 425
  /**
   *
   */
426
  protected function addLinkSettings($type, $settings, &$target) {
427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451
    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')
452
      ->get('links');
453
    return $custom_links !== NULL ? $custom_links : [];
454 455
  }

Pawel G's avatar
Pawel G committed
456 457 458
  /**
   * Returns settings for a custom path added to the sitemap settings.
   *
Pawel G's avatar
Pawel G committed
459
   * @param string $path
Pawel G's avatar
Pawel G committed
460
   *
Pawel G's avatar
Pawel G committed
461
   * @return array|false
Pawel G's avatar
Pawel G committed
462
   */
463
  public function getCustomLink($path) {
464
    foreach ($this->getCustomLinks() as $key => $link) {
465
      if ($link['path'] == $path) {
466
        return $link;
467 468 469 470 471
      }
    }
    return FALSE;
  }

Pawel G's avatar
Pawel G committed
472 473 474
  /**
   * Removes a custom path from the sitemap settings.
   *
Pawel G's avatar
Pawel G committed
475
   * @param string $path
Pawel G's avatar
Pawel G committed
476
   *
Pawel G's avatar
Pawel G committed
477 478
   * @return $this
   */
479
  public function removeCustomLink($path) {
480
    $custom_links = $this->getCustomLinks();
Pawel G's avatar
Pawel G committed
481
    foreach ($custom_links as $key => $link) {
482 483 484
      if ($link['path'] == $path) {
        unset($custom_links[$key]);
        $custom_links = array_values($custom_links);
485
        $this->configFactory->getEditable("simple_sitemap.custom")
486
          ->set('links', $custom_links)->save();
487
        break;
488 489
      }
    }
Pawel G's avatar
Pawel G committed
490
    return $this;
491 492
  }

Pawel G's avatar
Pawel G committed
493 494
  /**
   * Removes all custom paths from the sitemap settings.
Pawel G's avatar
Pawel G committed
495 496
   *
   * @return $this
Pawel G's avatar
Pawel G committed
497
   */
498
  public function removeCustomLinks() {
499
    $this->configFactory->getEditable("simple_sitemap.custom")
500
      ->set('links', [])->save();
Pawel G's avatar
Pawel G committed
501
    return $this;
502 503
  }

504 505 506 507
  /**
   * Returns the whole sitemap, a requested sitemap chunk,
   * or the sitemap index file.
   *
Pawel G's avatar
Pawel G committed
508
   * @param int $chunk_id
509
   *
Pawel G's avatar
Pawel G committed
510
   * @return string|false
Pawel G's avatar
Pawel G committed
511 512 513 514
   *   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.
515
   */
Pawel G's avatar
Pawel G committed
516 517
  public function getSitemap($chunk_id = NULL) {
    $chunks = $this->fetchSitemapChunks();
518
    if (NULL === $chunk_id || !isset($chunks[$chunk_id])) {
519 520

      // Return sitemap index, if there are multiple sitemap chunks.
Pawel G's avatar
Pawel G committed
521 522
      if (count($chunks) > 1) {
        return $this->getSitemapIndex($chunks);
523
      }
Pawel G's avatar
Pawel G committed
524 525
      // Return sitemap if there is only one chunk.
      else {
Pawel G's avatar
Pawel G committed
526 527
        if (isset($chunks[1])) {
          return $chunks[1]->sitemap_string;
528 529
        }
        return FALSE;
530 531
      }
    }
Pawel G's avatar
Pawel G committed
532 533
    // Return specific sitemap chunk.
    else {
Pawel G's avatar
Pawel G committed
534
      return $chunks[$chunk_id]->sitemap_string;
535
    }
536 537
  }

538 539
  /**
   * Generates the sitemap for all languages and saves it to the db.
540 541
   *
   * @param string $from
Pawel G's avatar
Pawel G committed
542 543
   *   Can be 'form', 'cron', 'drush' or 'nobatch'.
   *   This decides how the batch process is to be run.
544
   */
545
  public function generateSitemap($from = 'form') {
546 547 548 549
    $this->sitemapGenerator
      ->setGenerator($this)
      ->setGenerateFrom($from)
      ->startGeneration();
550 551
  }

552
  /**
553 554
   * Generates and returns the sitemap index as string.
   *
Pawel G's avatar
Pawel G committed
555
   * @param array $chunks
Pawel G's avatar
Pawel G committed
556
   *   Sitemap chunks which to generate the index from.
557
   *
558
   * @return string
Pawel G's avatar
Pawel G committed
559
   *   The sitemap index.
560
   */
561
  protected function getSitemapIndex($chunks) {
562 563
    return $this->sitemapGenerator
      ->setGenerator($this)
Pawel G's avatar
Pawel G committed
564
      ->generateSitemapIndex($chunks);
Pawel G's avatar
Pawel G committed
565 566
  }

567
  /**
568 569
   * Returns a specific sitemap setting or a default value if setting does not
   * exist.
570 571
   *
   * @param string $name
Pawel G's avatar
Pawel G committed
572
   *   Name of the setting, like 'max_links'.
573
   *
574
   * @param mixed $default
Pawel G's avatar
Pawel G committed
575
   *   Value to be returned if the setting does not exist in the configuration.
576
   *
577
   * @return mixed
578
   *   The current setting from configuration or a default value.
579
   */
580
  public function getSetting($name, $default = FALSE) {
581 582 583
    $setting = $this->configFactory
      ->get('simple_sitemap.settings')
      ->get($name);
584
    return NULL !== $setting ? $setting : $default;
585
  }
586

587
  /**
588
   * Stores a specific sitemap setting in configuration.
589
   *
Pawel G's avatar
Pawel G committed
590
   * @param string $name
Pawel G's avatar
Pawel G committed
591
   *   Setting name, like 'max_links'.
Pawel G's avatar
Pawel G committed
592
   * @param mixed $setting
Pawel G's avatar
Pawel G committed
593
   *   The setting to be saved.
Pawel G's avatar
Pawel G committed
594 595
   *
   * @return $this
596
   */
597
  public function saveSetting($name, $setting) {
598 599
    $this->configFactory->getEditable("simple_sitemap.settings")
      ->set($name, $setting)->save();
Pawel G's avatar
Pawel G committed
600
    return $this;
601
  }
602

Pawel G's avatar
Pawel G committed
603 604
  /**
   * Returns a 'time ago' string of last timestamp generation.
605
   *
Pawel G's avatar
Pawel G committed
606
   * @return string|false
Pawel G's avatar
Pawel G committed
607
   *   Formatted timestamp of last sitemap generation, otherwise FALSE.
Pawel G's avatar
Pawel G committed
608
   */
609
  public function getGeneratedAgo() {
610
    $chunks = $this->fetchSitemapChunks();
Pawel G's avatar
Pawel G committed
611
    if (isset($chunks[1]->sitemap_created)) {
612
      return $this->dateFormatter
613
        ->formatInterval(REQUEST_TIME - $chunks[1]->sitemap_created);
614 615 616
    }
    return FALSE;
  }
617
}