Updated to Drupal 8.5. Core Media not yet in use.
[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 Symfony\Component\DependencyInjection\ContainerInterface;
12 use Drupal\language\ConfigurableLanguageManagerInterface;
13 use Drupal\metatag_views\MetatagViewsValuesCleanerTrait;
14
15 /**
16  * Class MetatagViewsEditForm.
17  *
18  * @package Drupal\metatag_views\Form
19  */
20 class MetatagViewsTranslationForm extends FormBase {
21
22   use MetatagViewsValuesCleanerTrait;
23
24   /**
25    * Drupal\metatag\MetatagManager definition.
26    *
27    * @var \Drupal\metatag\MetatagManager
28    */
29   protected $metatagManager;
30
31   /**
32    * The language manager.
33    *
34    * @var \Drupal\language\ConfigurableLanguageManagerInterface
35    */
36   protected $languageManager;
37
38   /**
39    * @var \Drupal\Core\Entity\EntityStorageInterface
40    */
41   protected $viewsManager;
42
43   /**
44    * @var \Drupal\metatag\MetatagToken
45    */
46   protected $tokenService;
47
48   /**
49    * @var \Drupal\metatag\MetatagTagPluginManager
50    */
51   protected $tagPluginManager;
52
53   /**
54    * View entity object.
55    *
56    * @var \Drupal\views\ViewEntityInterface
57    */
58   protected $view;
59
60   /**
61    * @var string
62    */
63   protected $viewId;
64
65   /**
66    * @var string
67    */
68   protected $displayId = 'default';
69
70   /**
71    * The language of the translation.
72    *
73    * @var \Drupal\Core\Language\LanguageInterface
74    */
75   protected $language;
76
77   /**
78    * The language of the translation source.
79    *
80    * @var \Drupal\Core\Language\LanguageInterface
81    */
82   protected $sourceLanguage;
83
84   /**
85    * An array of base language data.
86    *
87    * @var array
88    */
89   protected $baseData = [];
90
91   /**
92    * {@inheritdoc}
93    */
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;
100   }
101
102   /**
103    * {@inheritdoc}
104    */
105   public static function create(ContainerInterface $container) {
106     return new static(
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')
112     );
113   }
114
115   /**
116    * {@inheritdoc}
117    */
118   public function getFormId() {
119     return 'metatag_views_translate_form';
120   }
121
122   /**
123    * Gets the translated values while storing a copy of the original values.
124    */
125   protected function prepareValues() {
126     $config_name = $this->view->getConfigDependencyName();
127     $config_path = 'display.' . $this->displayId . '.display_options.display_extenders.metatag_display_extender.metatags';
128
129     $configuration = \Drupal::service('config.factory')->get($config_name);
130     $this->baseData = $configuration->getOriginal($config_path, FALSE);
131
132     // Set the translation target language on the configuration factory.
133     $original_language = $this->languageManager->getConfigOverrideLanguage();
134     $this->languageManager->setConfigOverrideLanguage($this->language);
135
136     // Read in translated values.
137     $configuration = \Drupal::service('config.factory')->get($config_name);
138     $translated_values = $configuration->get($config_path);
139
140     // Set the configuration language back.
141     $this->languageManager->setConfigOverrideLanguage($original_language);
142
143     return $translated_values;
144   }
145
146   /**
147    * {@inheritdoc}
148    */
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');
154
155     $this->view = $this->viewsManager->load($this->viewId);
156     $this->language = $this->languageManager->getLanguage($langcode);
157     $this->sourceLanguage = $this->view->language();
158
159     // Get meta tags from the view entity.
160     $form['#tree'] = TRUE;
161     $form['#attached']['library'][] = 'config_translation/drupal.config_translation.admin';
162
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(),
167     ]);
168
169     $form['metatags'] = $this->form($form, $this->prepareValues());
170     $form['metatags']['#title'] = t('Metatags');
171     $form['metatags']['#type'] = 'fieldset';
172
173     $form['submit'] = [
174       '#type' => 'submit',
175       '#value' => t('Submit'),
176     ];
177
178     return $form;
179   }
180
181   /**
182    * Add the translation form element for meta tags available in the source.
183    */
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);
188
189     // Add the outer fieldset.
190     $element += [
191       '#type' => 'details',
192     ];
193     $element += $this->tokenService->tokenBrowser(['view']);
194
195     foreach ($source_values as $tag_id => $value) {
196       $tag = $this->tagPluginManager->createInstance($tag_id);
197       $tag->setValue($translated_values[$tag_id]);
198
199       $form_element = $tag->form($element);
200       $element[$tag_id] = [
201         '#theme' => 'config_translation_manage_form_element',
202         'source' => [
203           '#type' => 'item',
204           '#title' => $form_element['#title'],
205           '#markup' => $value,
206         ],
207         'translation' => $form_element,
208       ];
209     }
210
211     return $element;
212   }
213
214   /**
215    * {@inheritdoc}
216    */
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'));
221
222     $config_name = $this->view->getConfigDependencyName();
223     $config_path = 'display.' . $this->displayId . '.display_options.display_extenders.metatag_display_extender.metatags';
224
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);
228
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);
234     }
235     else {
236       $config_translation->clear($config_path);
237     }
238
239     // If no overrides, delete language specific configuration file.
240     $saved_config = $config_translation->get();
241     if (empty($saved_config)) {
242       $config_translation->delete();
243     }
244     else {
245       $config_translation->save();
246     }
247
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,
252     ]);
253
254     drupal_set_message($this->t('Successfully updated @language translation.', [
255       '@language' => $this->language->getName(),
256     ]));
257   }
258
259 }