ItemsImporter.php

Same filename and directory in other branches
  1. 8.9.x core/modules/aggregator/src/ItemsImporter.php

Namespace

Drupal\aggregator

File

core/modules/aggregator/src/ItemsImporter.php

View source
<?php

namespace Drupal\aggregator;

use Drupal\aggregator\Plugin\AggregatorPluginManager;
use Drupal\Component\Plugin\Exception\PluginException;
use Drupal\Core\Config\ConfigFactoryInterface;
use Psr\Log\LoggerInterface;

/**
 * Defines an importer of aggregator items.
 */
class ItemsImporter implements ItemsImporterInterface {
    
    /**
     * The aggregator fetcher manager.
     *
     * @var \Drupal\aggregator\Plugin\AggregatorPluginManager
     */
    protected $fetcherManager;
    
    /**
     * The aggregator processor manager.
     *
     * @var \Drupal\aggregator\Plugin\AggregatorPluginManager
     */
    protected $processorManager;
    
    /**
     * The aggregator parser manager.
     *
     * @var \Drupal\aggregator\Plugin\AggregatorPluginManager
     */
    protected $parserManager;
    
    /**
     * The aggregator.settings config object.
     *
     * @var \Drupal\Core\Config\Config
     */
    protected $config;
    
    /**
     * A logger instance.
     *
     * @var \Psr\Log\LoggerInterface
     */
    protected $logger;
    
    /**
     * Constructs an Importer object.
     *
     * @param \Drupal\Core\Config\ConfigFactoryInterface $config_factory
     *   The factory for configuration objects.
     * @param \Drupal\aggregator\Plugin\AggregatorPluginManager $fetcher_manager
     *   The aggregator fetcher plugin manager.
     * @param \Drupal\aggregator\Plugin\AggregatorPluginManager $parser_manager
     *   The aggregator parser plugin manager.
     * @param \Drupal\aggregator\Plugin\AggregatorPluginManager $processor_manager
     *   The aggregator processor plugin manager.
     * @param \Psr\Log\LoggerInterface $logger
     *   A logger instance.
     */
    public function __construct(ConfigFactoryInterface $config_factory, AggregatorPluginManager $fetcher_manager, AggregatorPluginManager $parser_manager, AggregatorPluginManager $processor_manager, LoggerInterface $logger) {
        $this->fetcherManager = $fetcher_manager;
        $this->processorManager = $processor_manager;
        $this->parserManager = $parser_manager;
        $this->config = $config_factory->get('aggregator.settings');
        $this->logger = $logger;
    }
    
    /**
     * {@inheritdoc}
     */
    public function delete(FeedInterface $feed) {
        foreach ($this->processorManager
            ->getDefinitions() as $id => $definition) {
            $this->processorManager
                ->createInstance($id)
                ->delete($feed);
        }
    }
    
    /**
     * {@inheritdoc}
     */
    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;
    }

}

Classes

Title Deprecated Summary
ItemsImporter Defines an importer of aggregator items.

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