public function ItemsImporter::refresh in Drupal 9
Same name and namespace in other branches
- 8 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 84
Class
- ItemsImporter
- Defines an importer of aggregator items.
Namespace
Drupal\aggregatorCode
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 = 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;
}