Drupal 8 Views Plugins (Part 2) : The display extender plugin
What is a views display extender
The display extender plugin allow to add additional options or configuration to a views regardless of the type of display (e.g. page, block, ..).
For example, if you wanted to allow site users to add certain metadata to the rendered output of every view display regardless of display type, you could provide this option as a display extender.
What we can do with it
We will see how we implement such a plugin, for the example, we will add some metadata (useless metatags as example) to the document head when the views is displayed.
We will call the display extender plugin HeadMetadata (id: head_metadata) and we will implement it in a module called views_head_metadata.
The implementation
Make our plugin discoverable
Views do not discover display extender plugins with a hook info as usual, for this particular type of plugin, views has a variable in his views.settings configuration object.
You need to add your plugin ID to the variable views.settings.display_extenders (that is a list).
To do so, I will recommend you to implement the hook_install (as well uninstall) in the module install file. To manipulate config object you can look at my previous notes on CMI.
Make the plugin class
As seen in the previous post on Drupal 8 plugins, you need to implement the class in the plugin type namespace, extend the base class for this type of plugin, and add the metadata annotation.
In the case of the display extender plugin, the namespace is Drupal\views_head_metadata\Plugin\views\display_extender, the base class is DisplayExtenderPluginBase, and the metadata annotation are defined in \Drupal\views\Annotation\ViewsDisplayExtender.
The display extender plugins methods are nearly the same that the display plugins, you can think of its like a set of methods to alter the display plugin.
The important methods to understand are :
- defineOptionsAlter(&$options) : Define an array of options your plugins will define and save. Sort of schema of your plugin.
- optionsSummary(&$categories, &$options) : To add a category (the section of the views admin interface) if you want to add one, and define your options settings (in wich category there are, and the value to display as the summary).
- buildOptionsForm(&$form, FormStateInterface $form_state) : Where you construct the form(s) for your plugin, of course linked with a validate and submit method.
Generate the metadata tags in the document head
Now that we have our settings added to every views display, we need to use those to generate the tags in the document head as promised.
To work on the views render we will use the hook for that : hook_views_pre_render($view) and the render array property #attached.
Implement that hook in the .module of our module views_head_metadata, let's see :