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 Symfony\Component\DependencyInjection\ContainerInterface;
12 use Drupal\language\ConfigurableLanguageManagerInterface;
13 use Drupal\metatag_views\MetatagViewsValuesCleanerTrait;
16 * Class MetatagViewsEditForm.
18 * @package Drupal\metatag_views\Form
20 class MetatagViewsTranslationForm extends FormBase {
22 use MetatagViewsValuesCleanerTrait;
25 * Drupal\metatag\MetatagManager definition.
27 * @var \Drupal\metatag\MetatagManager
29 protected $metatagManager;
32 * The language manager.
34 * @var \Drupal\language\ConfigurableLanguageManagerInterface
36 protected $languageManager;
39 * @var \Drupal\Core\Entity\EntityStorageInterface
41 protected $viewsManager;
44 * @var \Drupal\metatag\MetatagToken
46 protected $tokenService;
49 * @var \Drupal\metatag\MetatagTagPluginManager
51 protected $tagPluginManager;
56 * @var \Drupal\views\ViewEntityInterface
68 protected $displayId = 'default';
71 * The language of the translation.
73 * @var \Drupal\Core\Language\LanguageInterface
78 * The language of the translation source.
80 * @var \Drupal\Core\Language\LanguageInterface
82 protected $sourceLanguage;
85 * An array of base language data.
89 protected $baseData = [];
94 public function __construct(MetatagManagerInterface $metatag_manager, EntityTypeManagerInterface $entity_manager, MetatagToken $token, MetatagTagPluginManager $tagPluginManager, ConfigurableLanguageManagerInterface $language_manager) {
95 $this->metatagManager = $metatag_manager;
96 $this->viewsManager = $entity_manager->getStorage('view');
97 $this->tokenService = $token;
98 $this->tagPluginManager = $tagPluginManager;
99 $this->languageManager = $language_manager;
105 public static function create(ContainerInterface $container) {
107 $container->get('metatag.manager'),
108 $container->get('entity_type.manager'),
109 $container->get('metatag.token'),
110 $container->get('plugin.manager.metatag.tag'),
111 $container->get('language_manager')
118 public function getFormId() {
119 return 'metatag_views_translate_form';
123 * Gets the translated values while storing a copy of the original values.
125 protected function prepareValues() {
126 $config_name = $this->view->getConfigDependencyName();
127 $config_path = 'display.' . $this->displayId . '.display_options.display_extenders.metatag_display_extender.metatags';
129 $configuration = \Drupal::service('config.factory')->get($config_name);
130 $this->baseData = $configuration->getOriginal($config_path, FALSE);
132 // Set the translation target language on the configuration factory.
133 $original_language = $this->languageManager->getConfigOverrideLanguage();
134 $this->languageManager->setConfigOverrideLanguage($this->language);
136 // Read in translated values.
137 $configuration = \Drupal::service('config.factory')->get($config_name);
138 $translated_values = $configuration->get($config_path);
140 // Set the configuration language back.
141 $this->languageManager->setConfigOverrideLanguage($original_language);
143 return $translated_values;
149 public function buildForm(array $form, FormStateInterface $form_state) {
150 // Get the parameters from request.
151 $this->viewId = \Drupal::request()->get('view_id');
152 $this->displayId = \Drupal::request()->get('display_id');
153 $langcode = \Drupal::request()->get('langcode');
155 $this->view = $this->viewsManager->load($this->viewId);
156 $this->language = $this->languageManager->getLanguage($langcode);
157 $this->sourceLanguage = $this->view->language();
159 // Get meta tags from the view entity.
160 $form['#tree'] = TRUE;
161 $form['#attached']['library'][] = 'config_translation/drupal.config_translation.admin';
163 $form['#title'] = $this->t('Edit @language translation for %view: %display metatags', [
164 '%view' => $this->view->label(),
165 '%display' => $this->view->getDisplay($this->displayId)['display_title'],
166 '@language' => $this->language->getName(),
169 $form['metatags'] = $this->form($form, $this->prepareValues());
170 $form['metatags']['#title'] = t('Metatags');
171 $form['metatags']['#type'] = 'fieldset';
175 '#value' => t('Submit'),
182 * Add the translation form element for meta tags available in the source.
184 public function form(array $element, array $translated_values) {
185 $translated_values = $this->clearMetatagViewsDisallowedValues($translated_values);
186 // Only offer form elements for tags present in the source language.
187 $source_values = $this->removeEmptyTags($this->baseData);
189 // Add the outer fieldset.
191 '#type' => 'details',
193 $element += $this->tokenService->tokenBrowser(['view']);
195 foreach ($source_values as $tag_id => $value) {
196 $tag = $this->tagPluginManager->createInstance($tag_id);
197 $tag->setValue($translated_values[$tag_id]);
199 $form_element = $tag->form($element);
200 $element[$tag_id] = [
201 '#theme' => 'config_translation_manage_form_element',
204 '#title' => $form_element['#title'],
207 'translation' => $form_element,
217 public function submitForm(array &$form, FormStateInterface $form_state) {
218 // Get the values of metatags.
219 $values = $form_state->getValue('metatags');
220 $translated_values = array_combine(array_keys($values), array_column($values, 'translation'));
222 $config_name = $this->view->getConfigDependencyName();
223 $config_path = 'display.' . $this->displayId . '.display_options.display_extenders.metatag_display_extender.metatags';
225 // Set configuration values based on form submission and source values.
226 $base_config = $this->configFactory()->getEditable($config_name);
227 $config_translation = $this->languageManager->getLanguageConfigOverride($this->language->getId(), $config_name);
229 // Save the configuration values, if they are different from the source
230 // values in the base configuration. Otherwise remove the override.
231 $source_values = $this->removeEmptyTags($base_config->get($config_path));
232 if ($source_values !== $translated_values) {
233 $config_translation->set($config_path, $translated_values);
236 $config_translation->clear($config_path);
239 // If no overrides, delete language specific configuration file.
240 $saved_config = $config_translation->get();
241 if (empty($saved_config)) {
242 $config_translation->delete();
245 $config_translation->save();
248 // Redirect back to the views list.
249 $form_state->setRedirect('metatag_views.metatags.translate_overview', [
250 'view_id' => $this->viewId,
251 'display_id' => $this->displayId,
254 drupal_set_message($this->t('Successfully updated @language translation.', [
255 '@language' => $this->language->getName(),