Rss.php

Same filename in this branch
  1. 11.x core/modules/node/src/Plugin/views/row/Rss.php
  2. 11.x core/modules/comment/src/Plugin/views/row/Rss.php
Same filename and directory in other branches
  1. 9 core/modules/node/src/Plugin/views/row/Rss.php
  2. 9 core/modules/views/src/Plugin/views/style/Rss.php
  3. 9 core/modules/aggregator/src/Plugin/views/row/Rss.php
  4. 9 core/modules/comment/src/Plugin/views/row/Rss.php
  5. 8.9.x core/modules/node/src/Plugin/views/row/Rss.php
  6. 8.9.x core/modules/views/src/Plugin/views/style/Rss.php
  7. 8.9.x core/modules/aggregator/src/Plugin/views/row/Rss.php
  8. 8.9.x core/modules/comment/src/Plugin/views/row/Rss.php
  9. 10 core/modules/node/src/Plugin/views/row/Rss.php
  10. 10 core/modules/views/src/Plugin/views/style/Rss.php
  11. 10 core/modules/comment/src/Plugin/views/row/Rss.php

Namespace

Drupal\views\Plugin\views\style

File

core/modules/views/src/Plugin/views/style/Rss.php

View source
<?php

namespace Drupal\views\Plugin\views\style;

use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\StringTranslation\TranslatableMarkup;
use Drupal\Core\Url;
use Drupal\views\Attribute\ViewsStyle;

/**
 * Default style plugin to render an RSS feed.
 *
 * @ingroup views_style_plugins
 */
class Rss extends StylePluginBase {
    
    /**
     * The RSS namespaces.
     */
    public array $namespaces;
    
    /**
     * The channel elements.
     */
    // phpcs:ignore Drupal.NamingConventions.ValidVariableName.LowerCamelName
    public array $channel_elements;
    
    /**
     * {@inheritdoc}
     */
    protected $usesRowPlugin = TRUE;
    public function attachTo(array &$build, $display_id, Url $feed_url, $title) {
        $url_options = [];
        $input = $this->view
            ->getExposedInput();
        if ($input) {
            $url_options['query'] = $input;
        }
        $url_options['absolute'] = TRUE;
        $url = $feed_url->setOptions($url_options)
            ->toString();
        // Add the RSS icon to the view.
        $this->view->feedIcons[] = [
            '#theme' => 'feed_icon',
            '#url' => $url,
            '#title' => $title,
        ];
        // Attach a link to the RSS feed, which is an alternate representation.
        $build['#attached']['html_head_link'][][] = [
            'rel' => 'alternate',
            'type' => 'application/rss+xml',
            'title' => $title,
            'href' => $url,
        ];
    }
    protected function defineOptions() {
        $options = parent::defineOptions();
        $options['description'] = [
            'default' => '',
        ];
        return $options;
    }
    public function buildOptionsForm(&$form, FormStateInterface $form_state) {
        parent::buildOptionsForm($form, $form_state);
        $form['description'] = [
            '#type' => 'textfield',
            '#title' => $this->t('RSS description'),
            '#default_value' => $this->options['description'],
            '#description' => $this->t('This will appear in the RSS feed itself.'),
            '#maxlength' => 1024,
        ];
    }
    
    /**
     * Return an array of additional XHTML elements to add to the channel.
     *
     * @return array
     *   A render array.
     */
    protected function getChannelElements() {
        return [];
    }
    
    /**
     * Get RSS feed description.
     *
     * @return string
     *   The string containing the description with the tokens replaced.
     */
    public function getDescription() {
        $description = $this->options['description'];
        // Allow substitutions from the first row.
        $description = $this->tokenizeValue($description, 0);
        return $description;
    }
    public function render() {
        $rows = [];
        // This will be filled in by the row plugin and is used later on in the
        // theming output.
        $this->namespaces = [
            'xmlns:dc' => 'http://purl.org/dc/elements/1.1/',
        ];
        // Fetch any additional elements for the channel and merge in their
        // namespaces.
        $this->channel_elements = $this->getChannelElements();
        foreach ($this->channel_elements as $element) {
            if (isset($element['namespace'])) {
                $this->namespaces = array_merge($this->namespaces, $element['namespace']);
            }
        }
        foreach ($this->view->result as $row_index => $row) {
            $this->view->row_index = $row_index;
            $rows[] = $this->view->rowPlugin
                ->render($row);
        }
        $build = [
            '#theme' => $this->themeFunctions(),
            '#view' => $this->view,
            '#options' => $this->options,
            '#rows' => $rows,
            '#attached' => [
                'http_header' => [
                    [
                        'Content-Type',
                        'application/rss+xml; charset=utf-8',
                    ],
                ],
            ],
        ];
        unset($this->view->row_index);
        return $build;
    }

}

Classes

Title Deprecated Summary
Rss Default style plugin to render an RSS feed.

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