3 namespace Drupal\metatag_views\Controller;
5 use Drupal\Core\Controller\ControllerBase;
6 use Drupal\Core\Entity\EntityStorageInterface;
8 use Drupal\metatag\MetatagManagerInterface;
9 use Drupal\metatag_views\Plugin\views\display_extender\MetatagDisplayExtender;
10 use Drupal\views\Plugin\views\display\DisplayPluginInterface;
11 use Drupal\views\Plugin\views\display_extender\DisplayExtenderPluginBase;
12 use Drupal\views\ViewEntityInterface;
13 use Drupal\views\ViewExecutable;
14 use Drupal\views\Views;
15 use Symfony\Component\DependencyInjection\ContainerInterface;
18 * Class MetatagViewsController
19 * @package Drupal\metatag_views\Controller
21 class MetatagViewsController extends ControllerBase {
23 /** @var EntityStorageInterface */
24 protected $viewStorage;
26 /** @var MetatagManagerInterface */
27 protected $metatagManager;
29 /** @var array associative array of labels */
30 protected $viewLabels;
32 public function __construct(EntityStorageInterface $viewStorage, MetatagManagerInterface $metatagManager) {
33 $this->viewStorage = $viewStorage;
34 $this->metatagManager = $metatagManager;
36 // Generate the labels for views and displays.
37 $this->labels = $this->getViewsAndDisplaysLabels();
43 public static function create(ContainerInterface $container) {
45 $container->get('entity_type.manager')->getStorage('view'),
46 $container->get('metatag.manager')
51 * Get metatags for all of the views / displays that have them set.
54 * List of tags grouped by view and display.
56 public static function getTaggedViews() {
58 foreach (Views::getEnabledViews() as $view_id => $view) {
59 $displays = $view->get('display');
60 foreach (array_keys($displays) as $display_id) {
61 if ($tags = metatag_get_view_tags($view_id, $display_id)) {
62 $tagged_views[$view_id][$display_id] = $tags;
70 * Main controller function. Generates the renderable array for views
75 public function listViews() {
78 $elements['header'] = [
79 '#markup' => '<p>' . t("To view a list of displays with meta tags set up, click on a view name. To view a summary of meta tags configuration for a particular display, click on the display name. If you need to set metatags for a specific view, choose Add views meta tags. Reverting the meta tags removes the specific configuration and falls back to defaults.") . '</p>',
82 // Iterate over the values and build the whole UI.
83 // 1. Top level is a collapsible fieldset with a view name (details)
84 // 2. Inside each fieldset we have 2 columns -> Display and Operations.
85 // Display contains point 3.
86 // Operations contain edit and revert
87 // 3. In each display there is a table that has 2 columns: tag name and tag
89 $tagged_views = $this->getTaggedViews();
90 foreach ($tagged_views as $view_id => $displays) {
91 $elements[$view_id] = [
93 '#title' => $this->t($this->viewLabels[$view_id]['#label']),
94 'details' => $this->buildViewDetails($view_id, $displays),
102 * Builds the second "level" of the UI - table with display fieldset and operations.
108 protected function buildViewDetails($view_id, $displays) {
111 '#collapsible' => TRUE,
112 '#header' => [$this->t('Display'), $this->t('Operations')],
115 foreach ($displays as $display_id => $metatags) {
116 $metatags = array_filter($metatags);
118 $element[$display_id]['details'] = [
119 '#type' => 'details',
120 '#title' => $this->viewLabels[$view_id][$display_id],
123 $params = ['view_id' => $view_id, 'display_id' => $display_id];
125 // Generate the operations.
126 $element[$display_id]['ops'] = [
127 '#type' => 'operations',
130 'title' => t('Edit'),
131 'url' => Url::fromRoute('metatag_views.metatags.edit', $params),
134 'title' => t('Translate'),
135 'url' => Url::fromRoute('metatag_views.metatags.translate_overview', $params),
138 'title' => t('Revert'),
139 'url' => Url::fromRoute('metatag_views.metatags.revert', $params),
144 // Build the rows for each of the metatag types.
145 $element[$display_id]['details']['table'] = $this->buildDisplayDetailsTable($metatags);
152 * Build the table with metatags values summary.
157 protected function buildDisplayDetailsTable($tags) {
163 foreach ($tags as $tag_name => $tag_value) {
164 // This is for the case where we have a subarray.
165 $tag_value = $this->prepareTagValue($tag_value);
170 $element[$i]['tag_name'] = [
172 '#markup' => $tag_name,
175 $element[$i]['tag_value'] = [
177 '#markup' => $tag_value,
186 * Massage the tag value. Returns an imploded string for metatags that
187 * are nested (ex. robots).
192 protected function prepareTagValue($value) {
193 if (is_array($value)) {
194 $value = implode(', ', array_filter($value));
201 * Gets label values for the views and their displays.
203 protected function getViewsAndDisplaysLabels() {
204 /** @var ViewEntityInterface[] $views */
205 $views = $this->viewStorage->loadByProperties(['status' => 1]);
209 foreach ($views as $view_id => $view) {
210 $displays = $view->get('display');
211 $labels[$view_id]['#label'] = $view->label();
212 foreach (array_keys($displays) as $display_id) {
213 $labels[$view_id][$display_id] = $displays[$display_id]['display_title'];
217 $this->viewLabels = $labels;