Yaffs site version 1.1
[yaffs-website] / web / modules / contrib / metatag / metatag_views / src / Form / MetatagViewsTranslationForm.php
1 <?php
2
3 namespace Drupal\metatag_views\Form;
4
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;
15
16 /**
17  * Class MetatagViewsEditForm.
18  *
19  * @package Drupal\metatag_views\Form
20  */
21 class MetatagViewsTranslationForm extends FormBase {
22
23   use MetatagViewsValuesCleanerTrait;
24
25   /**
26    * Drupal\metatag\MetatagManager definition.
27    *
28    * @var \Drupal\metatag\MetatagManager
29    */
30   protected $metatagManager;
31
32   /**
33    * The language manager.
34    *
35    * @var \Drupal\language\ConfigurableLanguageManagerInterface
36    */
37   protected $languageManager;
38
39   /**
40    * @var \Drupal\Core\Entity\EntityStorageInterface
41    */
42   protected $viewsManager;
43
44   protected $tokenService;
45
46   protected $tagPluginManager;
47
48   /**
49    * View entity object
50    *
51    * @var \Drupal\views\ViewEntityInterface
52    */
53   protected $view;
54
55   protected $view_id;
56   protected $display_id = 'default';
57
58   /**
59    * The language of the translation.
60    *
61    * @var \Drupal\Core\Language\LanguageInterface
62    */
63   protected $language;
64
65   /**
66    * The language of the translation source.
67    *
68    * @var \Drupal\Core\Language\LanguageInterface
69    */
70   protected $sourceLanguage;
71
72
73   /**
74    * An array of base language data.
75    *
76    * @var array
77    */
78   protected $baseData = [];
79
80   /**
81    * Constructor.
82    */
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;
89   }
90
91   /**
92    * {@inheritdoc}
93    */
94   public static function create(ContainerInterface $container) {
95     return new static(
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')
101     );
102   }
103
104   /**
105    * {@inheritdoc}
106    */
107   public function getFormId() {
108     return 'metatag_views_translate_form';
109   }
110
111   /**
112    * Gets the translated values while storing a copy of the original values.
113    */
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';
117
118     $configuration = \Drupal::service('config.factory')->get($config_name);
119     $this->baseData = $configuration->getOriginal($config_path, FALSE);
120
121     // Set the translation target language on the configuration factory.
122     $original_language = $this->languageManager->getConfigOverrideLanguage();
123     $this->languageManager->setConfigOverrideLanguage($this->language);
124
125     // Read in translated values.
126     $configuration = \Drupal::service('config.factory')->get($config_name);
127     $translated_values = $configuration->get($config_path);
128
129     // Set the configuration language back.
130     $this->languageManager->setConfigOverrideLanguage($original_language);
131
132     return $translated_values;
133   }
134
135   /**
136    * {@inheritdoc}
137    */
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');
143
144     $this->view = $this->viewsManager->load($this->view_id);
145     $this->language = $this->languageManager->getLanguage($langcode);
146     $this->sourceLanguage = $this->view->language();
147
148     // Get metatags from the view entity.
149     $form['#tree'] = TRUE;
150     $form['#attached']['library'][] = 'config_translation/drupal.config_translation.admin';
151
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(),
156     ]);
157
158     $form['metatags'] = $this->form($form, $this->prepareValues());
159     $form['metatags']['#title'] = t('Metatags');
160     $form['metatags']['#type'] = 'fieldset';
161
162     $form['submit'] = [
163       '#type' => 'submit',
164       '#value' => t('Submit'),
165     ];
166
167     return $form;
168   }
169
170   /**
171    * Add the translation form element for metatags available in the source.
172    */
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);
177
178     // Add the outer fieldset.
179     $element += [
180       '#type' => 'details',
181     ];
182     $element += $this->tokenService->tokenBrowser(['view']);
183
184     foreach ($source_values as $tag_id => $value) {
185       $tag = $this->tagPluginManager->createInstance($tag_id);
186       $tag->setValue($translated_values[$tag_id]);
187
188       $form_element = $tag->form($element);
189       $element[$tag_id] = [
190         '#theme' => 'config_translation_manage_form_element',
191         'source' => [
192           '#type' => 'item',
193           '#title' => $form_element['#title'],
194           '#markup' => $value,
195         ],
196         'translation' => $form_element,
197       ];
198     }
199
200     return $element;
201   }
202
203   /**
204    * {@inheritdoc}
205    */
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'));
210
211     $config_name = $this->view->getConfigDependencyName();
212     $config_path = 'display.' . $this->display_id . '.display_options.display_extenders.metatag_display_extender.metatags';
213
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);
217
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);
223     }
224     else {
225       $config_translation->clear($config_path);
226     }
227
228     // If no overrides, delete language specific configuration file.
229     $saved_config = $config_translation->get();
230     if (empty($saved_config)) {
231       $config_translation->delete();
232     }
233     else {
234       $config_translation->save();
235     }
236
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,
241     ]);
242
243     drupal_set_message($this->t('Successfully updated @language translation.', [
244       '@language' => $this->language->getName(),
245     ]));
246   }
247
248 }