You are here

class Feed in Drupal 10

Same name and namespace in other branches
  1. 8 core/modules/views/src/Plugin/views/display/Feed.php \Drupal\views\Plugin\views\display\Feed
  2. 9 core/modules/views/src/Plugin/views/display/Feed.php \Drupal\views\Plugin\views\display\Feed

The plugin that handles a feed, such as RSS or atom.

Plugin annotation


@ViewsDisplay(
  id = "feed",
  title = @Translation("Feed"),
  help = @Translation("Display the view as a feed, such as an RSS feed."),
  uses_route = TRUE,
  admin = @Translation("Feed"),
  returns_response = TRUE
)

Hierarchy

Expanded class hierarchy of Feed

Related topics

14 string references to 'Feed'
PreviewTest::testPreviewUI in core/modules/views_ui/tests/src/Functional/PreviewTest.php
Tests arguments in the preview form.
views.view.frontpage.yml in core/profiles/demo_umami/config/install/views.view.frontpage.yml
core/profiles/demo_umami/config/install/views.view.frontpage.yml
views.view.frontpage.yml in core/modules/node/config/optional/views.view.frontpage.yml
core/modules/node/config/optional/views.view.frontpage.yml
views.view.taxonomy_term.yml in core/profiles/demo_umami/config/install/views.view.taxonomy_term.yml
core/profiles/demo_umami/config/install/views.view.taxonomy_term.yml
views.view.taxonomy_term.yml in core/modules/taxonomy/config/optional/views.view.taxonomy_term.yml
core/modules/taxonomy/config/optional/views.view.taxonomy_term.yml

... See full list

File

core/modules/views/src/Plugin/views/display/Feed.php, line 30

Namespace

Drupal\views\Plugin\views\display
View source
class Feed extends PathPluginBase implements ResponseDisplayPluginInterface {

  /**
   * Whether the display allows the use of AJAX or not.
   *
   * @var bool
   */
  protected $ajaxEnabled = FALSE;

  /**
   * Whether the display allows the use of a pager or not.
   *
   * @var bool
   */
  protected $usesPager = FALSE;

  /**
   * The renderer.
   *
   * @var \Drupal\Core\Render\RendererInterface
   */
  protected $renderer;

  /**
   * Constructs a PathPluginBase object.
   *
   * @param array $configuration
   *   A configuration array containing information about the plugin instance.
   * @param string $plugin_id
   *   The plugin_id for the plugin instance.
   * @param mixed $plugin_definition
   *   The plugin implementation definition.
   * @param \Drupal\Core\Routing\RouteProviderInterface $route_provider
   *   The route provider.
   * @param \Drupal\Core\State\StateInterface $state
   *   The state key value store.
   * @param \Drupal\Core\Render\RendererInterface $renderer
   *   The renderer.
   */
  public function __construct(array $configuration, $plugin_id, $plugin_definition, RouteProviderInterface $route_provider, StateInterface $state, RendererInterface $renderer) {
    parent::__construct($configuration, $plugin_id, $plugin_definition, $route_provider, $state);
    $this->renderer = $renderer;
  }

  /**
   * {@inheritdoc}
   */
  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
    return new static($configuration, $plugin_id, $plugin_definition, $container
      ->get('router.route_provider'), $container
      ->get('state'), $container
      ->get('renderer'));
  }

  /**
   * {@inheritdoc}
   */
  public function getType() {
    return 'feed';
  }

  /**
   * {@inheritdoc}
   */
  public static function buildResponse($view_id, $display_id, array $args = []) {
    $build = static::buildBasicRenderable($view_id, $display_id, $args);

    // Set up an empty response, so for example RSS can set the proper
    // Content-Type header.
    $response = new CacheableResponse('', 200);
    $build['#response'] = $response;

    /** @var \Drupal\Core\Render\RendererInterface $renderer */
    $renderer = \Drupal::service('renderer');
    $output = (string) $renderer
      ->renderRoot($build);
    if (empty($output)) {
      throw new NotFoundHttpException();
    }
    $response
      ->setContent($output);
    $cache_metadata = CacheableMetadata::createFromRenderArray($build);
    $response
      ->addCacheableDependency($cache_metadata);
    return $response;
  }

  /**
   * {@inheritdoc}
   */
  public function execute() {
    parent::execute();
    return $this->view
      ->render();
  }

  /**
   * {@inheritdoc}
   */
  public function preview() {
    $output = $this->view
      ->render();
    if (!empty($this->view->live_preview)) {
      $output = [
        '#prefix' => '<pre>',
        '#plain_text' => $this->renderer
          ->renderRoot($output),
        '#suffix' => '</pre>',
      ];
    }
    return $output;
  }

  /**
   * {@inheritdoc}
   */
  public function render() {
    $build = $this->view->style_plugin
      ->render($this->view->result);
    $this
      ->applyDisplayCacheabilityMetadata($build);
    return $build;
  }

  /**
   * {@inheritdoc}
   */
  public function defaultableSections($section = NULL) {
    $sections = parent::defaultableSections($section);
    if (in_array($section, [
      'style',
      'row',
    ])) {
      return FALSE;
    }

    // Tell views our sitename_title option belongs in the title section.
    if ($section == 'title') {
      $sections[] = 'sitename_title';
    }
    elseif (!$section) {
      $sections['title'][] = 'sitename_title';
    }
    return $sections;
  }

  /**
   * {@inheritdoc}
   */
  protected function defineOptions() {
    $options = parent::defineOptions();
    $options['displays'] = [
      'default' => [],
    ];

    // Overrides for standard stuff.
    $options['style']['contains']['type']['default'] = 'rss';
    $options['style']['contains']['options']['default'] = [
      'description' => '',
    ];
    $options['sitename_title']['default'] = FALSE;
    $options['row']['contains']['type']['default'] = 'rss_fields';
    $options['defaults']['default']['style'] = FALSE;
    $options['defaults']['default']['row'] = FALSE;
    return $options;
  }

  /**
   * {@inheritdoc}
   */
  public function newDisplay() {
    parent::newDisplay();

    // Set the default row style. Ideally this would be part of the option
    // definition, but in this case it's dependent on the view's base table,
    // which we don't know until init().
    if (empty($this->options['row']['type']) || $this->options['row']['type'] === 'rss_fields') {
      $row_plugins = Views::fetchPluginNames('row', $this
        ->getType(), [
        $this->view->storage
          ->get('base_table'),
      ]);
      $default_row_plugin = key($row_plugins);
      $options = $this
        ->getOption('row');
      $options['type'] = $default_row_plugin;
      $this
        ->setOption('row', $options);
    }
  }

  /**
   * {@inheritdoc}
   */
  public function optionsSummary(&$categories, &$options) {
    parent::optionsSummary($categories, $options);

    // Since we're childing off the 'path' type, we'll still *call* our
    // category 'page' but let's override it so it says feed settings.
    $categories['page'] = [
      'title' => $this
        ->t('Feed settings'),
      'column' => 'second',
      'build' => [
        '#weight' => -10,
      ],
    ];
    if ($this
      ->getOption('sitename_title')) {
      $options['title']['value'] = $this
        ->t('Using the site name');
    }
    $displays = array_filter($this
      ->getOption('displays'));
    if (count($displays) > 1) {
      $attach_to = $this
        ->t('Multiple displays');
    }
    elseif (count($displays) == 1) {
      $display = array_shift($displays);
      $displays = $this->view->storage
        ->get('display');
      if (!empty($displays[$display])) {
        $attach_to = $displays[$display]['display_title'];
      }
    }
    if (!isset($attach_to)) {
      $attach_to = $this
        ->t('None');
    }
    $options['displays'] = [
      'category' => 'page',
      'title' => $this
        ->t('Attach to'),
      'value' => $attach_to,
    ];
  }

  /**
   * {@inheritdoc}
   */
  public function buildOptionsForm(&$form, FormStateInterface $form_state) {

    // It is very important to call the parent function here.
    parent::buildOptionsForm($form, $form_state);
    switch ($form_state
      ->get('section')) {
      case 'title':
        $title = $form['title'];

        // A little juggling to move the 'title' field beyond our checkbox.
        unset($form['title']);
        $form['sitename_title'] = [
          '#type' => 'checkbox',
          '#title' => $this
            ->t('Use the site name for the title'),
          '#default_value' => $this
            ->getOption('sitename_title'),
        ];
        $form['title'] = $title;
        $form['title']['#states'] = [
          'visible' => [
            ':input[name="sitename_title"]' => [
              'checked' => FALSE,
            ],
          ],
        ];
        break;
      case 'displays':
        $form['#title'] .= $this
          ->t('Attach to');
        $displays = [];
        foreach ($this->view->storage
          ->get('display') as $display_id => $display) {

          // @todo The display plugin should have display_title and id as well.
          if ($this->view->displayHandlers
            ->has($display_id) && $this->view->displayHandlers
            ->get($display_id)
            ->acceptAttachments()) {
            $displays[$display_id] = $display['display_title'];
          }
        }
        $form['displays'] = [
          '#title' => $this
            ->t('Displays'),
          '#type' => 'checkboxes',
          '#description' => $this
            ->t('The feed icon will be available only to the selected displays.'),
          '#options' => array_map('\\Drupal\\Component\\Utility\\Html::escape', $displays),
          '#default_value' => $this
            ->getOption('displays'),
        ];
        break;
      case 'path':
        $form['path']['#description'] = $this
          ->t('This view will be displayed by visiting this path on your site. It is recommended that the path be something like "path/%/%/feed" or "path/%/%/rss.xml", putting one % in the path for each contextual filter you have defined in the view.');
    }
  }

  /**
   * {@inheritdoc}
   */
  public function submitOptionsForm(&$form, FormStateInterface $form_state) {
    parent::submitOptionsForm($form, $form_state);
    $section = $form_state
      ->get('section');
    switch ($section) {
      case 'title':
        $this
          ->setOption('sitename_title', $form_state
          ->getValue('sitename_title'));
        break;
      case 'displays':
        $this
          ->setOption($section, $form_state
          ->getValue($section));
        break;
    }
  }

  /**
   * {@inheritdoc}
   */
  public function attachTo(ViewExecutable $clone, $display_id, array &$build) {
    $displays = $this
      ->getOption('displays');
    if (empty($displays[$display_id])) {
      return;
    }

    // Defer to the feed style; it may put in meta information, and/or
    // attach a feed icon.
    $clone
      ->setArguments($this->view->args);
    $clone
      ->setDisplay($this->display['id']);
    $clone
      ->buildTitle();
    if ($plugin = $clone->display_handler
      ->getPlugin('style')) {
      $plugin
        ->attachTo($build, $display_id, $clone
        ->getUrl(), $clone
        ->getTitle());
      foreach ($clone->feedIcons as $feed_icon) {
        $this->view->feedIcons[] = $feed_icon;
      }
    }

    // Clean up.
    $clone
      ->destroy();
    unset($clone);
  }

  /**
   * {@inheritdoc}
   */
  public function usesLinkDisplay() {
    return TRUE;
  }

}

Members

Namesort descending Modifiers Type Description Overrides
DisplayPluginInterface::acceptAttachments public function Determines whether this display can use attachments.
DisplayPluginInterface::access public function Determines if the user has access to this display of the view.
DisplayPluginInterface::ajaxEnabled public function Whether the display is actually using AJAX or not.
DisplayPluginInterface::buildBasicRenderable public static function Builds a basic render array which can be properly render cached. 1
DisplayPluginInterface::buildRenderable public function Builds a renderable array of the view.
DisplayPluginInterface::calculateCacheMetadata public function Calculates the display's cache metadata by inspecting each handler/plugin.
DisplayPluginInterface::destroy public function Destroys the display's components and the display itself.
DisplayPluginInterface::displaysExposed public function Determines if this display should display the exposed filters widgets. 1
DisplayPluginInterface::elementPreRender public function #pre_render callback for view display rendering.
DisplayPluginInterface::getArgumentsTokens public function Returns to tokens for arguments.
DisplayPluginInterface::getArgumentText public function Provides help text for the arguments. 1
DisplayPluginInterface::getAttachedDisplays public function Find out all displays which are attached to this display.
DisplayPluginInterface::getCacheMetadata public function Gets the cache metadata.
DisplayPluginInterface::getExtenders public function Gets the display extenders.
DisplayPluginInterface::getFieldLabels public function Retrieves a list of fields for the current display.
DisplayPluginInterface::getHandler public function Get the handler object for a single handler.
DisplayPluginInterface::getHandlers public function Get a full array of handlers for $type. This caches them.
DisplayPluginInterface::getLinkDisplay public function Returns the ID of the display to use when making links.
DisplayPluginInterface::getOption public function Gets an option, from this display or the default display.
DisplayPluginInterface::getPagerText public function Provides help text for pagers. 1
DisplayPluginInterface::getPlugin public function Get the instance of a plugin, for example style or row.
DisplayPluginInterface::getRoutedDisplay public function Points to the display which can be linked by this display.
DisplayPluginInterface::getSpecialBlocks public function Provides the block system with any exposed widget blocks for this display.
DisplayPluginInterface::getUrl public function Returns a URL to $this display or its configured linked display.
DisplayPluginInterface::initDisplay public function Initializes the display plugin. 1
DisplayPluginInterface::isDefaultDisplay public function Determines if this display is the 'default' display.
DisplayPluginInterface::isDefaulted public function Determines if an option is set to use the default or current display.
DisplayPluginInterface::isEnabled public function Whether the display is enabled.
DisplayPluginInterface::isIdentifierUnique public function Checks if the provided identifier is unique.
DisplayPluginInterface::isMoreEnabled public function Whether the display is using the 'more' link or not.
DisplayPluginInterface::isPagerEnabled public function Whether the display is using a pager or not.
DisplayPluginInterface::mergeDefaults public function Merges default values for all plugin types.
DisplayPluginInterface::optionLink public function Returns a link to a section of a form.
DisplayPluginInterface::optionsOverride public function If override/revert was clicked, perform the proper toggle.
DisplayPluginInterface::outputIsEmpty public function Is the output of the view empty.
DisplayPluginInterface::overrideOption public function Set an option and force it to be an override.
DisplayPluginInterface::preExecute public function Sets up any variables on the view prior to execution.
DisplayPluginInterface::query public function Injects anything into the query that the display handler needs.
DisplayPluginInterface::renderArea public function Renders one of the available areas.
DisplayPluginInterface::renderFilters public function Does nothing (obsolete function).
DisplayPluginInterface::renderMoreLink public function Renders the 'more' link.
DisplayPluginInterface::renderPager public function Checks to see if the display plugins support pager rendering.
DisplayPluginInterface::setOption public function Sets an option, on this display or the default display.
DisplayPluginInterface::setOverride public function Flip the override setting for the given section.
DisplayPluginInterface::useGroupBy public function Does the display have groupby enabled?
DisplayPluginInterface::useMoreAlways public function Should the enabled display more link be shown when no more items?
DisplayPluginInterface::useMoreText public function Does the display have custom link text?
DisplayPluginInterface::usesAJAX public function Whether the display allows the use of AJAX or not.
DisplayPluginInterface::usesAreas public function Returns whether the display can use areas.
DisplayPluginInterface::usesAttachments public function Returns whether the display can use attachments.
DisplayPluginInterface::usesExposed public function Determines if this display uses exposed filters. 1
DisplayPluginInterface::usesExposedFormInBlock public function Checks to see if the display can put the exposed form in a block.
DisplayPluginInterface::usesFields public function Determines if the display's style uses fields.
DisplayPluginInterface::usesMore public function Whether the display allows the use of a 'more' link or not.
DisplayPluginInterface::usesPager public function Whether the display allows the use of a pager or not.
DisplayPluginInterface::viewExposedFormBlocks public function Renders the exposed form as block.
Feed::$ajaxEnabled protected property Whether the display allows the use of AJAX or not.
Feed::$renderer protected property The renderer.
Feed::$usesPager protected property Whether the display allows the use of a pager or not.
Feed::attachTo public function Allows displays to attach to other views. Overrides DisplayPluginInterface::attachTo
Feed::buildOptionsForm public function Provides the default form for setting options. Overrides PathPluginBase::buildOptionsForm
Feed::buildResponse public static function Builds up a response with the rendered view as content. Overrides ResponseDisplayPluginInterface::buildResponse
Feed::create public static function Overrides PathPluginBase::create
Feed::defaultableSections public function Lists the 'defaultable' sections and what items each section contains. Overrides DisplayPluginInterface::defaultableSections
Feed::defineOptions protected function Overrides \Drupal\views\Plugin\views\display\DisplayPluginBase:defineOptions(). Overrides PathPluginBase::defineOptions
Feed::execute public function Executes the view and returns data in the format required. Overrides PathPluginBase::execute
Feed::getType public function Returns the display type that this display requires. Overrides DisplayPluginInterface::getType
Feed::newDisplay public function Reacts on adding a display. Overrides DisplayPluginInterface::newDisplay
Feed::optionsSummary public function Provides the default summary for options in the views UI. Overrides PathPluginBase::optionsSummary
Feed::preview public function Renders the display for the purposes of a live preview. Overrides DisplayPluginInterface::preview
Feed::render public function Renders this display. Overrides DisplayPluginInterface::render
Feed::submitOptionsForm public function Performs any necessary changes to the form values prior to storage. Overrides PathPluginBase::submitOptionsForm
Feed::usesLinkDisplay public function Checks to see if the display has some need to link to another display. Overrides DisplayPluginInterface::usesLinkDisplay
Feed::__construct public function Constructs a PathPluginBase object. Overrides PathPluginBase::__construct
PathPluginBase::$routeProvider protected property The route provider.
PathPluginBase::$state protected property The state key value store.
PathPluginBase::alterRoutes public function Alters a collection of routes and replaces definitions to the view. Overrides DisplayRouterInterface::alterRoutes
PathPluginBase::collectRoutes public function Adds the route entry of a view to the collection. Overrides DisplayRouterInterface::collectRoutes 1
PathPluginBase::getAlteredRouteNames public function Returns the list of routes overridden by Views. Overrides DisplayRouterInterface::getAlteredRouteNames
PathPluginBase::getMenuLinks public function Gets menu links, if this display provides some. Overrides DisplayMenuInterface::getMenuLinks
PathPluginBase::getPath public function Returns the base path to use for this display. Overrides DisplayPluginInterface::getPath
PathPluginBase::getRoute protected function Generates a route entry for a given view and display. 1
PathPluginBase::getRouteName public function Returns the route name for the display. Overrides DisplayRouterInterface::getRouteName
PathPluginBase::getUrlInfo public function Generates a URL to this display. Overrides DisplayRouterInterface::getUrlInfo
PathPluginBase::hasPath public function Checks to see if the display has a 'path' field. Overrides DisplayPluginInterface::hasPath
PathPluginBase::isDefaultTabPath protected function Determines if this display's path is a default tab.
PathPluginBase::overrideApplies protected function Determines whether the view overrides the given route. 1
PathPluginBase::overrideAppliesPathAndMethod protected function Determines whether an override for the path and method should happen.
PathPluginBase::remove public function Reacts on deleting a display. Overrides DisplayPluginInterface::remove
PathPluginBase::validate public function Make sure the display and all associated handlers are valid. Overrides DisplayPluginInterface::validate 1
PathPluginBase::validateOptionsForm public function Validates the options form. Overrides DisplayPluginInterface::validateOptionsForm 1
PathPluginBase::validatePath protected function Validates the path of the display.