/** * {@inheritdoc} */ public function fetch(FeedInterface $feed) { $request = $this->httpClient->createRequest('GET', $feed->getUrl()); $feed->source_string = FALSE; // Generate conditional GET headers. if ($feed->getEtag()) { $request->addHeader('If-None-Match', $feed->getEtag()); } if ($feed->getLastModified()) { $request->addHeader('If-Modified-Since', gmdate(DateTimePlus::RFC7231, $feed->getLastModified())); } try { $response = $this->httpClient->send($request); // In case of a 304 Not Modified, there is no new content, so return // FALSE. if ($response->getStatusCode() == 304) { return FALSE; } $feed->source_string = $response->getBody(TRUE); $feed->setEtag($response->getHeader('ETag')); $feed->setLastModified(strtotime($response->getHeader('Last-Modified'))); $feed->http_headers = $response->getHeaders(); // Update the feed URL in case of a 301 redirect. if ($response->getEffectiveUrl() != $feed->getUrl()) { $feed->setUrl($response->getEffectiveUrl()); } return TRUE; } catch (RequestException $e) { watchdog('aggregator', 'The feed from %site seems to be broken because of error "%error".', array('%site' => $feed->label(), '%error' => $e->getMessage()), WATCHDOG_WARNING); drupal_set_message(t('The feed from %site seems to be broken because of error "%error".', array('%site' => $feed->label(), '%error' => $e->getMessage())), 'warning'); return FALSE; } }
/** * {@inheritdoc} */ public function fetch(FeedInterface $feed) { if ($feed->label() == 'Do not fetch') { return FALSE; } return parent::fetch($feed); }
/** * {@inheritdoc} */ public function getFeedDuplicates(FeedInterface $feed) { $query = \Drupal::entityQuery('aggregator_feed'); $or_condition = $query->orConditionGroup()->condition('title', $feed->label())->condition('url', $feed->getUrl()); $query->condition($or_condition); if ($feed->id()) { $query->condition('fid', $feed->id(), '<>'); } return $this->loadMultiple($query->execute()); }
/** * {@inheritdoc} */ public function parse(FeedInterface $feed) { // Set our bridge extension manager to Zend Feed. Reader::setExtensionManager(\Drupal::service('feed.bridge.reader')); try { $channel = Reader::importString($feed->source_string); } catch (ExceptionInterface $e) { watchdog_exception('aggregator', $e); drupal_set_message(t('The feed from %site seems to be broken because of error "%error".', array('%site' => $feed->label(), '%error' => $e->getMessage())), 'error'); return FALSE; } $feed->setWebsiteUrl($channel->getLink()); $feed->setDescription($channel->getDescription()); if ($image = $channel->getImage()) { $feed->setImage($image['uri']); } // Initialize items array. $feed->items = array(); foreach ($channel as $item) { // Reset the parsed item. $parsed_item = array(); // Move the values to an array as expected by processors. $parsed_item['title'] = $item->getTitle(); $parsed_item['guid'] = $item->getId(); $parsed_item['link'] = $item->getLink(); $parsed_item['description'] = $item->getDescription(); $parsed_item['author'] = ''; if ($author = $item->getAuthor()) { $parsed_item['author'] = $author['name']; } $parsed_item['timestamp'] = ''; if ($date = $item->getDateModified()) { $parsed_item['timestamp'] = $date->getTimestamp(); } // Store on $feed object. This is where processors will look for parsed items. $feed->items[] = $parsed_item; } return TRUE; }
/** * {@inheritdoc} */ public function delete(FeedInterface $feed) { if ($items = $this->itemStorage->loadByFeed($feed->id())) { $this->itemStorage->delete($items); } // @todo This should be moved out to caller with a different message maybe. drupal_set_message(t('The news items from %site have been deleted.', array('%site' => $feed->label()))); }
/** * Confirms an item removal from a feed. * * @param \Drupal\aggregator\FeedInterface $feed * Feed object representing the feed. */ public function deleteFeedItems(FeedInterface $feed) { $this->drupalPostForm('admin/config/services/aggregator/delete/' . $feed->id(), array(), t('Delete items')); $this->assertRaw(t('The news items from %title have been deleted.', array('%title' => $feed->label())), 'Feed items deleted.'); }
/** * Route title callback. * * @param \Drupal\aggregator\FeedInterface $aggregator_feed * The aggregator feed. * * @return string * The feed label. */ public function feedTitle(FeedInterface $aggregator_feed) { return Xss::filter($aggregator_feed->label()); }
/** * {@inheritdoc} */ public function fetch(FeedInterface $feed) { $request = new Request('GET', $feed->getUrl()); $feed->source_string = FALSE; // Generate conditional GET headers. if ($feed->getEtag()) { $request = $request->withAddedHeader('If-None-Match', $feed->getEtag()); } if ($feed->getLastModified()) { $request = $request->withAddedHeader('If-Modified-Since', gmdate(DateTimePlus::RFC7231, $feed->getLastModified())); } try { /** @var \Psr\Http\Message\UriInterface $actual_uri */ $actual_uri = NULL; $response = $this->httpClientFactory->fromOptions(['allow_redirects' => ['on_redirect' => function (RequestInterface $request, ResponseInterface $response, UriInterface $uri) use(&$actual_uri) { $actual_uri = (string) $uri; }]])->send($request); // In case of a 304 Not Modified, there is no new content, so return // FALSE. if ($response->getStatusCode() == 304) { return FALSE; } $feed->source_string = (string) $response->getBody(); if ($response->hasHeader('ETag')) { $feed->setEtag($response->getHeaderLine('ETag')); } if ($response->hasHeader('Last-Modified')) { $feed->setLastModified(strtotime($response->getHeaderLine('Last-Modified'))); } $feed->http_headers = $response->getHeaders(); // Update the feed URL in case of a 301 redirect. if ($actual_uri && $actual_uri !== $feed->getUrl()) { $feed->setUrl($actual_uri); } return TRUE; } catch (RequestException $e) { $this->logger->warning('The feed from %site seems to be broken because of error "%error".', array('%site' => $feed->label(), '%error' => $e->getMessage())); drupal_set_message(t('The feed from %site seems to be broken because of error "%error".', array('%site' => $feed->label(), '%error' => $e->getMessage())), 'warning'); return FALSE; } }
/** * Route title callback. * * @param \Drupal\aggregator\FeedInterface $aggregator_feed * The aggregator feed. * * @return array * The feed label as a render array. */ public function feedTitle(FeedInterface $aggregator_feed) { return ['#markup' => $aggregator_feed->label(), '#allowed_tags' => Xss::getHtmlTagList()]; }
/** * Route title callback. * * @param \Drupal\aggregator\FeedInterface $aggregator_feed * The aggregator feed. * * @return string * The feed label. */ public function feedTitle(FeedInterface $aggregator_feed) { return SafeMarkup::xssFilter($aggregator_feed->label()); }