You are here

public function ItemsImporter::refresh in Zircon Profile 8

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

Updates the feed items by triggering the import process.

This process can be slow and lengthy because it relies on network operations. Calling it on performance critical paths should be avoided.

Parameters

\Drupal\aggregator\FeedInterface $feed: The feed which items should be refreshed.

Return value

bool TRUE if there is new content for the feed FALSE otherwise.

Overrides ItemsImporterInterface::refresh

File

core/modules/aggregator/src/ItemsImporter.php, line 89
Contains \Drupal\aggregator\ItemsImporter.

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 dont have to instantiate new objects.
  $processor_instances = array();
  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 = 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.', array(
            '%title' => $feed
              ->label(),
            '%url' => $feed
              ->getUrl(),
          ));
        }
        $this->logger
          ->notice('There is new syndicated content from %site.', array(
          '%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;
}