diff --git a/core/modules/aggregator/aggregator.module b/core/modules/aggregator/aggregator.module
index f7a908a..416571d 100644
--- a/core/modules/aggregator/aggregator.module
+++ b/core/modules/aggregator/aggregator.module
@@ -145,13 +145,6 @@ function aggregator_menu() {
'title' => 'Categories',
'route_name' => 'aggregator_categories',
);
- $items['aggregator/rss'] = array(
- 'title' => 'RSS feed',
- 'page callback' => 'aggregator_page_rss',
- 'access arguments' => array('access news feeds'),
- 'type' => MENU_CALLBACK,
- 'file' => 'aggregator.pages.inc',
- );
$items['aggregator/opml'] = array(
'title' => 'OPML feed',
'page callback' => 'aggregator_page_opml',
diff --git a/core/modules/aggregator/aggregator.pages.inc b/core/modules/aggregator/aggregator.pages.inc
index c524505..ca8ecad 100644
--- a/core/modules/aggregator/aggregator.pages.inc
+++ b/core/modules/aggregator/aggregator.pages.inc
@@ -319,85 +319,6 @@ function template_preprocess_aggregator_item(&$variables) {
}
/**
- * Page callback: Generates an RSS 0.92 feed of aggregator items or categories.
- *
- * @return string
- * An HTML formatted string.
- *
- * @see aggregator_menu()
- */
-function aggregator_page_rss() {
- $result = NULL;
- $rss_config = config('system.rss');
- // arg(2) is the passed cid, only select for that category.
- if (arg(2)) {
- $category = db_query('SELECT cid, title FROM {aggregator_category} WHERE cid = :cid', array(':cid' => arg(2)))->fetchObject();
- $result = db_query_range('SELECT i.*, f.title AS ftitle, f.link AS flink FROM {aggregator_category_item} c LEFT JOIN {aggregator_item} i ON c.iid = i.iid LEFT JOIN {aggregator_feed} f ON i.fid = f.fid WHERE cid = :cid ORDER BY timestamp DESC, i.iid DESC', 0, $rss_config->get('items.limit'), array(':cid' => $category->cid));
- }
- // Or, get the default aggregator items.
- else {
- $category = NULL;
- $result = db_query_range('SELECT i.*, f.title AS ftitle, f.link AS flink FROM {aggregator_item} i INNER JOIN {aggregator_feed} f ON i.fid = f.fid ORDER BY i.timestamp DESC, i.iid DESC', 0, $rss_config->get('items.limit'));
- }
-
- $feeds = $result->fetchAll();
- $aggregator_page_rss = array(
- '#theme' => 'aggregator_page_rss',
- '#feeds' => $feeds,
- '#category' => $category,
- );
- return drupal_render($aggregator_page_rss);
-}
-
-/**
- * Prints the RSS page for a feed.
- *
- * @param $variables
- * An associative array containing:
- * - feeds: An array of the feeds to theme.
- * - category: A common category, if any, for all the feeds.
- *
- * @return void
- *
- * @ingroup themeable
- */
-function theme_aggregator_page_rss($variables) {
- $feeds = $variables['feeds'];
- $category = $variables['category'];
-
- drupal_add_http_header('Content-Type', 'application/rss+xml; charset=utf-8');
-
- $items = '';
- $feed_length = config('system.rss')->get('items.view_mode');
- foreach ($feeds as $feed) {
- switch ($feed_length) {
- case 'teaser':
- $summary = text_summary($feed->description, NULL, config('aggregator.settings')->get('items.teaser_length'));
- if ($summary != $feed->description) {
- $summary .= '
' . t('read more') . "
\n";
- }
- $feed->description = $summary;
- break;
- case 'title':
- $feed->description = '';
- break;
- }
- $items .= format_rss_item($feed->ftitle . ': ' . $feed->title, $feed->link, $feed->description, array('pubDate' => date('r', $feed->timestamp)));
- }
-
- $site_name = config('system.site')->get('name');
- $url = url((isset($category) ? 'aggregator/categories/' . $category->cid : 'aggregator'), array('absolute' => TRUE));
- $description = isset($category) ? t('@site_name - aggregated feeds in category @title', array('@site_name' => $site_name, '@title' => $category->title)) : t('@site_name - aggregated feeds', array('@site_name' => $site_name));
-
- $output = "\n";
- $output .= "\n";
- $output .= format_rss_channel(t('@site_name aggregator', array('@site_name' => $site_name)), $url, $description, $items);
- $output .= "\n";
-
- print $output;
-}
-
-/**
* Page callback: Generates an OPML representation of all feeds.
*
* @param $cid
diff --git a/core/modules/aggregator/config/views.view.aggregator_rss_feed.yml b/core/modules/aggregator/config/views.view.aggregator_rss_feed.yml
new file mode 100644
index 0000000..8c1a5af
--- /dev/null
+++ b/core/modules/aggregator/config/views.view.aggregator_rss_feed.yml
@@ -0,0 +1,191 @@
+base_field: iid
+base_table: aggregator_item
+core: 8.x
+description: ''
+status: '1'
+display:
+ default:
+ display_plugin: default
+ id: default
+ display_title: Master
+ position: '1'
+ display_options:
+ access:
+ type: none
+ options: { }
+ cache:
+ type: none
+ options: { }
+ query:
+ type: views_query
+ options:
+ disable_sql_rewrite: '0'
+ distinct: '0'
+ slave: '0'
+ query_comment: ''
+ query_tags: { }
+ exposed_form:
+ type: basic
+ options:
+ submit_button: Apply
+ reset_button: '0'
+ reset_button_label: Reset
+ exposed_sorts_label: 'Sort by'
+ expose_sort_order: '1'
+ sort_asc_label: Asc
+ sort_desc_label: Desc
+ pager:
+ type: full
+ options:
+ items_per_page: '10'
+ offset: '0'
+ id: '0'
+ total_pages: ''
+ expose:
+ items_per_page: '0'
+ items_per_page_label: 'Items per page'
+ items_per_page_options: '5, 10, 20, 40, 60'
+ items_per_page_options_all: '0'
+ items_per_page_options_all_label: '- All -'
+ offset: '0'
+ offset_label: Offset
+ tags:
+ previous: '‹ previous'
+ next: 'next ›'
+ first: '« first'
+ last: 'last »'
+ quantity: '9'
+ style:
+ type: default
+ row:
+ type: 'entity:aggregator_item'
+ fields:
+ iid:
+ table: aggregator_item
+ field: iid
+ id: iid
+ relationship: none
+ group_type: group
+ admin_label: ''
+ label: 'Item ID'
+ exclude: '0'
+ alter:
+ alter_text: '0'
+ text: ''
+ make_link: '0'
+ path: ''
+ absolute: '0'
+ external: '0'
+ replace_spaces: '0'
+ path_case: none
+ trim_whitespace: '0'
+ alt: ''
+ rel: ''
+ link_class: ''
+ prefix: ''
+ suffix: ''
+ target: ''
+ nl2br: '0'
+ max_length: ''
+ word_boundary: '1'
+ ellipsis: '1'
+ more_link: '0'
+ more_link_text: ''
+ more_link_path: ''
+ strip_tags: '0'
+ trim: '0'
+ preserve_tags: ''
+ html: '0'
+ element_type: ''
+ element_class: ''
+ element_label_type: ''
+ element_label_class: ''
+ element_label_colon: '1'
+ element_wrapper_type: ''
+ element_wrapper_class: ''
+ element_default_classes: '1'
+ empty: ''
+ hide_empty: '0'
+ empty_zero: '0'
+ hide_alter_empty: '1'
+ set_precision: '0'
+ precision: '0'
+ decimal: .
+ separator: ','
+ format_plural: '0'
+ format_plural_singular: '1'
+ format_plural_plural: '@count'
+ prefix: ''
+ suffix: ''
+ filters: { }
+ sorts: { }
+ title: 'Aggregator RSS feed'
+ header: { }
+ footer: { }
+ empty: { }
+ relationships: { }
+ arguments: { }
+ feed_2:
+ display_plugin: feed
+ id: feed_2
+ display_title: 'Feed per category'
+ position: '2'
+ display_options:
+ path: aggregator/rss/%
+ display_description: ''
+ arguments:
+ cid:
+ id: cid
+ table: aggregator_category
+ field: cid
+ relationship: none
+ group_type: group
+ admin_label: ''
+ default_action: 'not found'
+ exception:
+ value: all
+ title_enable: '0'
+ title: All
+ title_enable: '0'
+ title: ''
+ breadcrumb_enable: '0'
+ breadcrumb: ''
+ default_argument_type: fixed
+ default_argument_options:
+ argument: ''
+ default_argument_skip_url: '0'
+ summary_options:
+ base_path: ''
+ count: '1'
+ items_per_page: '25'
+ override: '0'
+ summary:
+ sort_order: asc
+ number_of_records: '0'
+ format: default_summary
+ specify_validation: '0'
+ validate:
+ type: none
+ fail: 'not found'
+ validate_options: { }
+ break_phrase: '0'
+ not: '0'
+ plugin_id: aggregator_category_cid
+ defaults:
+ arguments: '0'
+ feed_1:
+ display_plugin: feed
+ id: feed_1
+ display_title: Feed
+ position: '2'
+ display_options:
+ path: aggregator/rss
+ display_description: ''
+ defaults:
+ arguments: '1'
+label: 'Aggregator RSS feed'
+module: views
+id: aggregator_rss_feed
+tag: aggregator
+uuid: 7dfa5cb7-2248-4d52-8c00-cd8e02d1e78e
+langcode: en