diff --git a/metatag_views/src/Controller/MetatagViewsController.php b/metatag_views/src/Controller/MetatagViewsController.php index aa052ef..e2d27a2 100644 --- a/metatag_views/src/Controller/MetatagViewsController.php +++ b/metatag_views/src/Controller/MetatagViewsController.php @@ -4,6 +4,7 @@ use Drupal\Core\Controller\ControllerBase; use Drupal\Core\Entity\EntityStorageInterface; +use Drupal\Core\Extension\ModuleHandlerInterface; use Drupal\Core\Url; use Drupal\metatag\MetatagManagerInterface; use Drupal\metatag_views\Plugin\views\display_extender\MetatagDisplayExtender; @@ -26,12 +27,16 @@ class MetatagViewsController extends ControllerBase { /** @var MetatagManagerInterface */ protected $metatagManager; + /** @var ModuleHandlerInterface */ + protected $moduleHandler; + /** @var array associative array of labels */ protected $viewLabels; - public function __construct(EntityStorageInterface $viewStorage, MetatagManagerInterface $metatagManager) { + public function __construct(EntityStorageInterface $viewStorage, MetatagManagerInterface $metatagManager, ModuleHandlerInterface $module_handler) { $this->viewStorage = $viewStorage; $this->metatagManager = $metatagManager; + $this->moduleHandler = $module_handler; // Generate the labels for views and displays. $this->labels = $this->getViewsAndDisplaysLabels(); @@ -43,7 +48,8 @@ public function __construct(EntityStorageInterface $viewStorage, MetatagManagerI public static function create(ContainerInterface $container) { return new static( $container->get('entity_type.manager')->getStorage('view'), - $container->get('metatag.manager') + $container->get('metatag.manager'), + $container->get('module_handler') ); } @@ -130,17 +136,21 @@ protected function buildViewDetails($view_id, $displays) { 'title' => t('Edit'), 'url' => Url::fromRoute('metatag_views.metatags.edit', $params), ], - 'translate' => [ - 'title' => t('Translate'), - 'url' => Url::fromRoute('metatag_views.metatags.translate_overview', $params), - ], - 'revert' => [ - 'title' => t('Revert'), - 'url' => Url::fromRoute('metatag_views.metatags.revert', $params), - ], ], ]; + if ($this->moduleHandler->moduleExists('config_translation')) { + $element[$display_id]['ops']['#links']['translate'] = [ + 'title' => t('Translate'), + 'url' => Url::fromRoute('metatag_views.metatags.translate_overview', $params), + ]; + } + + $element[$display_id]['ops']['#links']['revert'] = [ + 'title' => t('Revert'), + 'url' => Url::fromRoute('metatag_views.metatags.revert', $params), + ]; + // Build the rows for each of the metatag types. $element[$display_id]['details']['table'] = $this->buildDisplayDetailsTable($metatags); } diff --git a/metatag_views/src/Form/MetatagViewsEditForm.php b/metatag_views/src/Form/MetatagViewsEditForm.php index 4398c23..729064d 100644 --- a/metatag_views/src/Form/MetatagViewsEditForm.php +++ b/metatag_views/src/Form/MetatagViewsEditForm.php @@ -6,7 +6,7 @@ use Drupal\Core\Form\FormBase; use Drupal\Core\Form\FormStateInterface; use Drupal\metatag\MetatagManagerInterface; -use Drupal\metatag_views\MetatagViewsValuesCleanerTrait; +use Drupal\metatag\MetatagTagPluginManager; use Drupal\views\ViewEntityInterface; use Symfony\Component\DependencyInjection\ContainerInterface; @@ -17,16 +17,21 @@ */ class MetatagViewsEditForm extends FormBase { - use MetatagViewsValuesCleanerTrait; - /** - * Drupal\metatag\MetatagManager definition. + * The metatag manager. * - * @var \Drupal\metatag\MetatagManager + * @var \Drupal\metatag\MetatagManagerInterface */ protected $metatagManager; /** + * The plugin manager for metatag tags. + * + * @var \Drupal\metatag\MetatagTagPluginManager + */ + protected $metatagTagManager; + + /** * @var \Drupal\Core\Entity\EntityStorageInterface */ protected $viewsManager; @@ -45,13 +50,15 @@ class MetatagViewsEditForm extends FormBase { */ protected $view; - public function __construct(MetatagManagerInterface $metatag_manager, EntityTypeManagerInterface $entity_manager) { + public function __construct(MetatagTagPluginManager $metatag_plugin_manager, MetatagManagerInterface $metatag_manager, EntityTypeManagerInterface $entity_manager) { + $this->metatagTagManager = $metatag_plugin_manager; $this->metatagManager = $metatag_manager; $this->viewsManager = $entity_manager->getStorage('view'); } public static function create(ContainerInterface $container) { return new static( + $container->get('plugin.manager.metatag.tag'), $container->get('metatag.manager'), $container->get('entity_type.manager') ); @@ -154,9 +161,20 @@ public function submitForm(array &$form, FormStateInterface $form_state) { $view_name = $form_state->getValue('view'); list($view_id, $display_id) = explode(':', $view_name); - $metatags = $form_state->getValues(); + // Process submitted metatag values and remove empty tags. + $tag_values = []; + $metatags = $form_state->cleanValues()->getValues(); unset($metatags['view']); - $metatags = $this->clearMetatagViewsDisallowedValues($metatags); + foreach ($metatags as $tag_id => $tag_value) { + // Some plugins need to process form input before storing it. + // Hence, we set it and then get it. + $tag = $this->metatagTagManager->createInstance($tag_id); + $tag->setValue($tag_value); + if (!empty($tag->value())) { + $tag_values[$tag_id] = $tag->value(); + } + } + $metatags = $tag_values; /** @var ViewEntityInterface $view */ $view = $this->viewsManager->load($view_id); @@ -168,7 +186,7 @@ public function submitForm(array &$form, FormStateInterface $form_state) { // Set configuration values based on form submission. // This always edits the original language. $configuration = $this->configFactory()->getEditable($config_name); - if (empty($this->removeEmptyTags($metatags))) { + if (empty($metatags)) { $configuration->clear($config_path); } else { diff --git a/metatag_views/src/Form/MetatagViewsTranslationForm.php b/metatag_views/src/Form/MetatagViewsTranslationForm.php index bdc8868..90231d3 100644 --- a/metatag_views/src/Form/MetatagViewsTranslationForm.php +++ b/metatag_views/src/Form/MetatagViewsTranslationForm.php @@ -8,7 +8,6 @@ use Drupal\metatag\MetatagManagerInterface; use Drupal\metatag\MetatagTagPluginManager; use Drupal\metatag\MetatagToken; -use Drupal\metatag_views\MetatagViewsValuesCleanerTrait; use Drupal\views\ViewEntityInterface; use Symfony\Component\DependencyInjection\ContainerInterface; use Drupal\language\ConfigurableLanguageManagerInterface; @@ -20,8 +19,6 @@ */ class MetatagViewsTranslationForm extends FormBase { - use MetatagViewsValuesCleanerTrait; - /** * Drupal\metatag\MetatagManager definition. * @@ -43,6 +40,11 @@ class MetatagViewsTranslationForm extends FormBase { protected $tokenService; + /** + * The plugin manager for metatag tags. + * + * @var \Drupal\metatag\MetatagTagPluginManager + */ protected $tagPluginManager; /** @@ -52,8 +54,8 @@ class MetatagViewsTranslationForm extends FormBase { */ protected $view; - protected $view_id; - protected $display_id = 'default'; + protected $viewId; + protected $displayId = 'default'; /** * The language of the translation. @@ -113,7 +115,7 @@ public function getFormId() { */ protected function prepareValues() { $config_name = $this->view->getConfigDependencyName(); - $config_path = 'display.' . $this->display_id . '.display_options.display_extenders.metatag_display_extender.metatags'; + $config_path = 'display.' . $this->displayId . '.display_options.display_extenders.metatag_display_extender.metatags'; $configuration = \Drupal::service('config.factory')->get($config_name); $this->baseData = $configuration->getOriginal($config_path, FALSE); @@ -137,11 +139,11 @@ protected function prepareValues() { */ public function buildForm(array $form, FormStateInterface $form_state) { // Get the parameters from request. - $this->view_id = \Drupal::request()->get('view_id'); - $this->display_id = \Drupal::request()->get('display_id'); + $this->viewId = \Drupal::request()->get('view_id'); + $this->displayId = \Drupal::request()->get('display_id'); $langcode = \Drupal::request()->get('langcode'); - $this->view = $this->viewsManager->load($this->view_id); + $this->view = $this->viewsManager->load($this->viewId); $this->language = $this->languageManager->getLanguage($langcode); $this->sourceLanguage = $this->view->language(); @@ -151,7 +153,7 @@ public function buildForm(array $form, FormStateInterface $form_state) { $form['#title'] = $this->t('Edit @language translation for %view: %display metatags', [ '%view' => $this->view->label(), - '%display' => $this->view->getDisplay($this->display_id)['display_title'], + '%display' => $this->view->getDisplay($this->displayId)['display_title'], '@language' => $this->language->getName(), ]); @@ -171,9 +173,21 @@ public function buildForm(array $form, FormStateInterface $form_state) { * Add the translation form element for metatags available in the source. */ public function form(array $element, array $translated_values) { - $translated_values = $this->clearMetatagViewsDisallowedValues($translated_values); + // Process submitted metatag values and remove empty tags. + $tag_values = []; + foreach ($translated_values as $tag_id => $tag_value) { + // Some plugins need to process form input before storing it. + // Hence, we set it and then get it. + $tag = $this->tagPluginManager->createInstance($tag_id); + $tag->setValue($tag_value); + if (!empty($tag->value())) { + $tag_values[$tag_id] = $tag->value(); + } + } + $translated_values = $tag_values; + // Only offer form elements for tags present in the source language. - $source_values = $this->removeEmptyTags($this->baseData); + $source_values = array_filter($this->baseData); // Add the outer fieldset. $element += [ @@ -209,7 +223,7 @@ public function submitForm(array &$form, FormStateInterface $form_state) { $translated_values = array_combine(array_keys($values), array_column($values, 'translation')); $config_name = $this->view->getConfigDependencyName(); - $config_path = 'display.' . $this->display_id . '.display_options.display_extenders.metatag_display_extender.metatags'; + $config_path = 'display.' . $this->displayId . '.display_options.display_extenders.metatag_display_extender.metatags'; // Set configuration values based on form submission and source values. $base_config = $this->configFactory()->getEditable($config_name); @@ -217,7 +231,7 @@ public function submitForm(array &$form, FormStateInterface $form_state) { // Save the configuration values, if they are different from the source // values in the base configuration. Otherwise remove the override. - $source_values = $this->removeEmptyTags($base_config->get($config_path)); + $source_values = $base_config->get($config_path); if ($source_values !== $translated_values) { $config_translation->set($config_path, $translated_values); } @@ -236,8 +250,8 @@ public function submitForm(array &$form, FormStateInterface $form_state) { // Redirect back to the views list. $form_state->setRedirect('metatag_views.metatags.translate_overview', [ - 'view_id' => $this->view_id, - 'display_id' => $this->display_id, + 'view_id' => $this->viewId, + 'display_id' => $this->displayId, ]); drupal_set_message($this->t('Successfully updated @language translation.', [ diff --git a/metatag_views/src/MetatagViewsValuesCleanerTrait.php b/metatag_views/src/MetatagViewsValuesCleanerTrait.php deleted file mode 100644 index a13f8a2..0000000 --- a/metatag_views/src/MetatagViewsValuesCleanerTrait.php +++ /dev/null @@ -1,44 +0,0 @@ -metatagManager->sortedTags(); - - // Return only common elements. - $metatags = array_intersect_key($metatags, $tags); - - return $metatags; - } - - /** - * Removes tags that are empty. - */ - public function removeEmptyTags($metatags) { - $metatags = array_filter($metatags, function ($value) { - if (is_array($value)) { - return count(array_filter($value)) > 0; - } - else { - return $value !== ''; - } - }); - return $metatags; - } - -} diff --git a/metatag_views/tests/src/Functional/MetatagViewsBasicsTest.php b/metatag_views/tests/src/Functional/MetatagViewsBasicsTest.php index 3415896..324625f 100644 --- a/metatag_views/tests/src/Functional/MetatagViewsBasicsTest.php +++ b/metatag_views/tests/src/Functional/MetatagViewsBasicsTest.php @@ -134,6 +134,11 @@ public function testSiteStillWorks() { // Confirm what the page title looks like now. $this->assertTitle('Metatag title'); + + // Load the Metatag admin page to confirm it still works. + $this->drupalGet('admin/config/search/metatag'); + $this->assertResponse(200); + $this->assertText('Add default meta tags'); } }