function ItemsImporter::refresh

Same name in other branches
  1. 8.9.x core/modules/aggregator/src/ItemsImporter.php \Drupal\aggregator\ItemsImporter::refresh()

Overrides ItemsImporterInterface::refresh

File

core/modules/aggregator/src/ItemsImporter.php, line 84

Class

ItemsImporter
Defines an importer of aggregator items.

Namespace

Drupal\aggregator

Code

public function refresh(FeedInterface $feed) {
    // Store feed URL to track changes.
    $feed_url = $feed->getUrl();
    // Fetch the feed.
    try {
        $success = $this->fetcherManager
            ->createInstance($this->config
            ->get('fetcher'))
            ->fetch($feed);
    } catch (PluginException $e) {
        $success = FALSE;
        watchdog_exception('aggregator', $e);
    }
    // Store instances in an array so we don't have to instantiate new objects.
    $processor_instances = [];
    foreach ($this->config
        ->get('processors') as $processor) {
        try {
            $processor_instances[$processor] = $this->processorManager
                ->createInstance($processor);
        } catch (PluginException $e) {
            watchdog_exception('aggregator', $e);
        }
    }
    // We store the hash of feed data in the database. When refreshing a
    // feed we compare stored hash and new hash calculated from downloaded
    // data. If both are equal we say that feed is not updated.
    $hash = $success ? hash('sha256', $feed->source_string) : '';
    $has_new_content = $success && $feed->getHash() != $hash;
    if ($has_new_content) {
        // Parse the feed.
        try {
            if ($this->parserManager
                ->createInstance($this->config
                ->get('parser'))
                ->parse($feed)) {
                if (!$feed->getWebsiteUrl()) {
                    $feed->setWebsiteUrl($feed->getUrl());
                }
                $feed->setHash($hash);
                // Update feed with parsed data.
                $feed->save();
                // Log if feed URL has changed.
                if ($feed->getUrl() != $feed_url) {
                    $this->logger
                        ->notice('Updated URL for feed %title to %url.', [
                        '%title' => $feed->label(),
                        '%url' => $feed->getUrl(),
                    ]);
                }
                $this->logger
                    ->notice('There is new syndicated content from %site.', [
                    '%site' => $feed->label(),
                ]);
                // If there are items on the feed, let enabled processors process them.
                if (!empty($feed->items)) {
                    foreach ($processor_instances as $instance) {
                        $instance->process($feed);
                    }
                }
            }
        } catch (PluginException $e) {
            watchdog_exception('aggregator', $e);
        }
    }
    // Processing is done, call postProcess on enabled processors.
    foreach ($processor_instances as $instance) {
        $instance->postProcess($feed);
    }
    return $has_new_content;
}

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.