3 namespace Drupal\metatag_views\Form;
5 use Drupal\Core\Entity\EntityTypeManagerInterface;
6 use Drupal\Core\Form\FormBase;
7 use Drupal\Core\Form\FormStateInterface;
8 use Drupal\metatag\MetatagManagerInterface;
9 use Drupal\metatag\MetatagTagPluginManager;
10 use Drupal\metatag\MetatagToken;
11 use Drupal\metatag_views\MetatagViewsValuesCleanerTrait;
12 use Drupal\views\ViewEntityInterface;
13 use Symfony\Component\DependencyInjection\ContainerInterface;
14 use Drupal\language\ConfigurableLanguageManagerInterface;
17 * Class MetatagViewsEditForm.
19 * @package Drupal\metatag_views\Form
21 class MetatagViewsTranslationForm extends FormBase {
23 use MetatagViewsValuesCleanerTrait;
26 * Drupal\metatag\MetatagManager definition.
28 * @var \Drupal\metatag\MetatagManager
30 protected $metatagManager;
33 * The language manager.
35 * @var \Drupal\language\ConfigurableLanguageManagerInterface
37 protected $languageManager;
40 * @var \Drupal\Core\Entity\EntityStorageInterface
42 protected $viewsManager;
44 protected $tokenService;
46 protected $tagPluginManager;
51 * @var \Drupal\views\ViewEntityInterface
56 protected $display_id = 'default';
59 * The language of the translation.
61 * @var \Drupal\Core\Language\LanguageInterface
66 * The language of the translation source.
68 * @var \Drupal\Core\Language\LanguageInterface
70 protected $sourceLanguage;
74 * An array of base language data.
78 protected $baseData = [];
83 public function __construct(MetatagManagerInterface $metatag_manager, EntityTypeManagerInterface $entity_manager, MetatagToken $token, MetatagTagPluginManager $tagPluginManager, ConfigurableLanguageManagerInterface $language_manager) {
84 $this->metatagManager = $metatag_manager;
85 $this->viewsManager = $entity_manager->getStorage('view');
86 $this->tokenService = $token;
87 $this->tagPluginManager = $tagPluginManager;
88 $this->languageManager = $language_manager;
94 public static function create(ContainerInterface $container) {
96 $container->get('metatag.manager'),
97 $container->get('entity_type.manager'),
98 $container->get('metatag.token'),
99 $container->get('plugin.manager.metatag.tag'),
100 $container->get('language_manager')
107 public function getFormId() {
108 return 'metatag_views_translate_form';
112 * Gets the translated values while storing a copy of the original values.
114 protected function prepareValues() {
115 $config_name = $this->view->getConfigDependencyName();
116 $config_path = 'display.' . $this->display_id . '.display_options.display_extenders.metatag_display_extender.metatags';
118 $configuration = \Drupal::service('config.factory')->get($config_name);
119 $this->baseData = $configuration->getOriginal($config_path, FALSE);
121 // Set the translation target language on the configuration factory.
122 $original_language = $this->languageManager->getConfigOverrideLanguage();
123 $this->languageManager->setConfigOverrideLanguage($this->language);
125 // Read in translated values.
126 $configuration = \Drupal::service('config.factory')->get($config_name);
127 $translated_values = $configuration->get($config_path);
129 // Set the configuration language back.
130 $this->languageManager->setConfigOverrideLanguage($original_language);
132 return $translated_values;
138 public function buildForm(array $form, FormStateInterface $form_state) {
139 // Get the parameters from request.
140 $this->view_id = \Drupal::request()->get('view_id');
141 $this->display_id = \Drupal::request()->get('display_id');
142 $langcode = \Drupal::request()->get('langcode');
144 $this->view = $this->viewsManager->load($this->view_id);
145 $this->language = $this->languageManager->getLanguage($langcode);
146 $this->sourceLanguage = $this->view->language();
148 // Get metatags from the view entity.
149 $form['#tree'] = TRUE;
150 $form['#attached']['library'][] = 'config_translation/drupal.config_translation.admin';
152 $form['#title'] = $this->t('Edit @language translation for %view: %display metatags', [
153 '%view' => $this->view->label(),
154 '%display' => $this->view->getDisplay($this->display_id)['display_title'],
155 '@language' => $this->language->getName(),
158 $form['metatags'] = $this->form($form, $this->prepareValues());
159 $form['metatags']['#title'] = t('Metatags');
160 $form['metatags']['#type'] = 'fieldset';
164 '#value' => t('Submit'),
171 * Add the translation form element for metatags available in the source.
173 public function form(array $element, array $translated_values) {
174 $translated_values = $this->clearMetatagViewsDisallowedValues($translated_values);
175 // Only offer form elements for tags present in the source language.
176 $source_values = $this->removeEmptyTags($this->baseData);
178 // Add the outer fieldset.
180 '#type' => 'details',
182 $element += $this->tokenService->tokenBrowser(['view']);
184 foreach ($source_values as $tag_id => $value) {
185 $tag = $this->tagPluginManager->createInstance($tag_id);
186 $tag->setValue($translated_values[$tag_id]);
188 $form_element = $tag->form($element);
189 $element[$tag_id] = [
190 '#theme' => 'config_translation_manage_form_element',
193 '#title' => $form_element['#title'],
196 'translation' => $form_element,
206 public function submitForm(array &$form, FormStateInterface $form_state) {
207 // Get the values of metatags.
208 $values = $form_state->getValue('metatags');
209 $translated_values = array_combine(array_keys($values), array_column($values, 'translation'));
211 $config_name = $this->view->getConfigDependencyName();
212 $config_path = 'display.' . $this->display_id . '.display_options.display_extenders.metatag_display_extender.metatags';
214 // Set configuration values based on form submission and source values.
215 $base_config = $this->configFactory()->getEditable($config_name);
216 $config_translation = $this->languageManager->getLanguageConfigOverride($this->language->getId(), $config_name);
218 // Save the configuration values, if they are different from the source
219 // values in the base configuration. Otherwise remove the override.
220 $source_values = $this->removeEmptyTags($base_config->get($config_path));
221 if ($source_values !== $translated_values) {
222 $config_translation->set($config_path, $translated_values);
225 $config_translation->clear($config_path);
228 // If no overrides, delete language specific configuration file.
229 $saved_config = $config_translation->get();
230 if (empty($saved_config)) {
231 $config_translation->delete();
234 $config_translation->save();
237 // Redirect back to the views list.
238 $form_state->setRedirect('metatag_views.metatags.translate_overview', [
239 'view_id' => $this->view_id,
240 'display_id' => $this->display_id,
243 drupal_set_message($this->t('Successfully updated @language translation.', [
244 '@language' => $this->language->getName(),