21ef6ff5977a33f9ffb91819e25ecd08b198dd05
[yaffs-website] / web / core / modules / language / src / LanguageListBuilder.php
1 <?php
2
3 namespace Drupal\language;
4
5 use Drupal\Core\Config\ConfigFactoryInterface;
6 use Drupal\Core\Config\Entity\DraggableListBuilder;
7 use Drupal\Core\Entity\EntityInterface;
8 use Drupal\Core\Entity\EntityStorageInterface;
9 use Drupal\Core\Entity\EntityTypeInterface;
10 use Drupal\Core\Form\FormStateInterface;
11 use Drupal\Core\Language\LanguageManagerInterface;
12 use Drupal\Core\Messenger\MessengerInterface;
13 use Symfony\Component\DependencyInjection\ContainerInterface;
14
15 /**
16  * Defines a class to build a listing of language entities.
17  *
18  * @see \Drupal\language\Entity\ConfigurableLanguage
19  */
20 class LanguageListBuilder extends DraggableListBuilder {
21
22   /**
23    * {@inheritdoc}
24    */
25   protected $entitiesKey = 'languages';
26
27   /**
28    * The language manager.
29    *
30    * @var \Drupal\Core\Language\LanguageManagerInterface
31    */
32   protected $languageManager;
33
34   /**
35    * The configuration factory.
36    *
37    * @var \Drupal\Core\Config\ConfigFactoryInterface
38    */
39   protected $configFactory;
40
41   /**
42    * The messenger.
43    *
44    * @var \Drupal\Core\Messenger\MessengerInterface
45    */
46   protected $messenger;
47
48   /**
49    * {@inheritdoc}
50    */
51   public static function createInstance(ContainerInterface $container, EntityTypeInterface $entity_type) {
52     return new static(
53       $entity_type,
54       $container->get('entity.manager')->getStorage($entity_type->id()),
55       $container->get('language_manager'),
56       $container->get('config.factory'),
57       $container->get('messenger')
58     );
59   }
60
61   /**
62    * Constructs a new LanguageListBuilder object.
63    *
64    * @param \Drupal\Core\Entity\EntityTypeInterface $entity_type
65    *   The entity type definition.
66    * @param \Drupal\Core\Entity\EntityStorageInterface $storage
67    *   The entity storage handler class.
68    * @param \Drupal\Core\Language\LanguageManagerInterface $language_manager
69    *   The language manager.
70    * @param \Drupal\Core\Config\ConfigFactoryInterface $config_factory
71    *   The factory for configuration objects.
72    * @param \Drupal\Core\Messenger\MessengerInterface $messenger
73    *   The messenger.
74    */
75   public function __construct(EntityTypeInterface $entity_type, EntityStorageInterface $storage, LanguageManagerInterface $language_manager, ConfigFactoryInterface $config_factory, MessengerInterface $messenger) {
76     parent::__construct($entity_type, $storage);
77     $this->languageManager = $language_manager;
78     $this->configFactory = $config_factory;
79     $this->messenger = $messenger;
80   }
81
82   /**
83    * {@inheritdoc}
84    */
85   public function load() {
86     $entities = $this->storage->loadByProperties(['locked' => FALSE]);
87
88     // Sort the entities using the entity class's sort() method.
89     // See \Drupal\Core\Config\Entity\ConfigEntityBase::sort().
90     uasort($entities, [$this->entityType->getClass(), 'sort']);
91     return $entities;
92   }
93
94   /**
95    * {@inheritdoc}
96    */
97   public function getFormId() {
98     return 'language_admin_overview_form';
99   }
100
101   /**
102    * {@inheritdoc}
103    */
104   public function buildHeader() {
105     $header = [
106         'label' => t('Name'),
107         'default' => t('Default'),
108       ] + parent::buildHeader();
109     return $header;
110   }
111
112   /**
113    * {@inheritdoc}
114    */
115   public function buildRow(EntityInterface $entity) {
116     $row['label'] = $entity->label();
117     $row['default'] = [
118       '#type' => 'radio',
119       '#parents' => ['site_default_language'],
120       '#title' => t('Set @title as default', ['@title' => $entity->label()]),
121       '#title_display' => 'invisible',
122       '#return_value' => $entity->id(),
123       '#id' => 'edit-site-default-language-' . $entity->id(),
124     ];
125     // Mark the right language as default in the form.
126     if ($entity->id() == $this->languageManager->getDefaultLanguage()->getId()) {
127       $row['default']['#default_value'] = $entity->id();
128     }
129     return $row + parent::buildRow($entity);
130   }
131
132   /**
133    * {@inheritdoc}
134    */
135   public function buildForm(array $form, FormStateInterface $form_state) {
136     $form = parent::buildForm($form, $form_state);
137
138     $form[$this->entitiesKey]['#languages'] = $this->entities;
139     $form['actions']['submit']['#value'] = t('Save configuration');
140     return $form;
141   }
142
143   /**
144    * {@inheritdoc}
145    */
146   public function validateForm(array &$form, FormStateInterface $form_state) {
147     if (!isset($this->entities[$form_state->getValue('site_default_language')])) {
148       $form_state->setErrorByName('site_default_language', $this->t('Selected default language no longer exists.'));
149     }
150   }
151
152   /**
153    * {@inheritdoc}
154    */
155   public function submitForm(array &$form, FormStateInterface $form_state) {
156     parent::submitForm($form, $form_state);
157
158     // Save the default language if changed.
159     $new_id = $form_state->getValue('site_default_language');
160     if ($new_id != $this->languageManager->getDefaultLanguage()->getId()) {
161       $this->configFactory->getEditable('system.site')->set('default_langcode', $new_id)->save();
162       $this->languageManager->reset();
163     }
164
165     if ($this->languageManager instanceof ConfigurableLanguageManagerInterface) {
166       $this->languageManager->updateLockedLanguageWeights();
167     }
168
169     $this->messenger->addStatus($this->t('Configuration saved.'));
170     // Force the redirection to the page with the language we have just
171     // selected as default.
172     $form_state->setRedirectUrl($this->entities[$new_id]->urlInfo('collection', ['language' => $this->entities[$new_id]]));
173   }
174
175 }