Security update to Drupal 8.4.6
[yaffs-website] / web / core / modules / language / src / Form / ContentLanguageSettingsForm.php
1 <?php
2
3 namespace Drupal\language\Form;
4
5 use Drupal\Core\Entity\ContentEntityTypeInterface;
6 use Drupal\Core\Entity\EntityManagerInterface;
7 use Drupal\Core\Form\FormBase;
8 use Drupal\Core\Form\FormStateInterface;
9 use Drupal\language\Entity\ContentLanguageSettings;
10 use Symfony\Component\DependencyInjection\ContainerInterface;
11
12 /**
13  * Configure the content language settings for this site.
14  */
15 class ContentLanguageSettingsForm extends FormBase {
16
17   /**
18    * The entity manager.
19    *
20    * @var \Drupal\Core\Entity\EntityManagerInterface
21    */
22   protected $entityManager;
23
24   /**
25    * Constructs a ContentLanguageSettingsForm object.
26    *
27    * @param \Drupal\Core\Entity\EntityManagerInterface $entity_manager
28    *   The entity manager.
29    */
30   public function __construct(EntityManagerInterface $entity_manager) {
31     $this->entityManager = $entity_manager;
32   }
33
34   /**
35    * {@inheritdoc}
36    */
37   public static function create(ContainerInterface $container) {
38     return new static(
39       $container->get('entity.manager')
40     );
41   }
42
43   /**
44    * {@inheritdoc}
45    */
46   public function getFormId() {
47     return 'language_content_settings_form';
48   }
49
50   /**
51    * {@inheritdoc}
52    */
53   public function buildForm(array $form, FormStateInterface $form_state) {
54     $entity_types = $this->entityManager->getDefinitions();
55     $labels = [];
56     $default = [];
57
58     $bundles = $this->entityManager->getAllBundleInfo();
59     $language_configuration = [];
60     foreach ($entity_types as $entity_type_id => $entity_type) {
61       if (!$entity_type instanceof ContentEntityTypeInterface || !$entity_type->hasKey('langcode') || !isset($bundles[$entity_type_id])) {
62         continue;
63       }
64       $labels[$entity_type_id] = $entity_type->getLabel() ?: $entity_type_id;
65       $default[$entity_type_id] = FALSE;
66
67       // Check whether we have any custom setting.
68       foreach ($bundles[$entity_type_id] as $bundle => $bundle_info) {
69         $config = ContentLanguageSettings::loadByEntityTypeBundle($entity_type_id, $bundle);
70         if (!$config->isDefaultConfiguration()) {
71           $default[$entity_type_id] = $entity_type_id;
72         }
73         $language_configuration[$entity_type_id][$bundle] = $config;
74       }
75     }
76
77     asort($labels);
78
79     $form = [
80       '#labels' => $labels,
81       '#attached' => [
82         'library' => [
83           'language/drupal.language.admin',
84         ],
85       ],
86       '#attributes' => [
87         'class' => 'language-content-settings-form',
88       ],
89     ];
90
91     $form['entity_types'] = [
92       '#title' => $this->t('Custom language settings'),
93       '#type' => 'checkboxes',
94       '#options' => $labels,
95       '#default_value' => $default,
96     ];
97
98     $form['settings'] = ['#tree' => TRUE];
99
100     foreach ($labels as $entity_type_id => $label) {
101       $entity_type = $entity_types[$entity_type_id];
102
103       $form['settings'][$entity_type_id] = [
104         '#title' => $label,
105         '#type' => 'container',
106         '#entity_type' => $entity_type_id,
107         '#theme' => 'language_content_settings_table',
108         '#bundle_label' => $entity_type->getBundleLabel() ?: $label,
109         '#states' => [
110           'visible' => [
111             ':input[name="entity_types[' . $entity_type_id . ']"]' => ['checked' => TRUE],
112           ],
113         ],
114       ];
115
116       foreach ($bundles[$entity_type_id] as $bundle => $bundle_info) {
117         $form['settings'][$entity_type_id][$bundle]['settings'] = [
118           '#type' => 'item',
119           '#label' => $bundle_info['label'],
120           'language' => [
121             '#type' => 'language_configuration',
122             '#entity_information' => [
123               'entity_type' => $entity_type_id,
124               'bundle' => $bundle,
125             ],
126             '#default_value' => $language_configuration[$entity_type_id][$bundle],
127           ],
128         ];
129       }
130     }
131
132     $form['actions']['#type'] = 'actions';
133     $form['actions']['submit'] = [
134       '#type' => 'submit',
135       '#value' => $this->t('Save configuration'),
136       '#button_type' => 'primary',
137     ];
138
139     return $form;
140   }
141
142   /**
143    * {@inheritdoc}
144    */
145   public function submitForm(array &$form, FormStateInterface $form_state) {
146     $entity_types = $form_state->getValue('entity_types');
147     foreach ($form_state->getValue('settings') as $entity_type => $entity_settings) {
148       foreach ($entity_settings as $bundle => $bundle_settings) {
149         $config = ContentLanguageSettings::loadByEntityTypeBundle($entity_type, $bundle);
150         if (empty($entity_types[$entity_type])) {
151           $bundle_settings['settings']['language']['language_alterable'] = FALSE;
152         }
153         $config->setDefaultLangcode($bundle_settings['settings']['language']['langcode'])
154           ->setLanguageAlterable($bundle_settings['settings']['language']['language_alterable'])
155           ->save();
156       }
157     }
158     drupal_set_message($this->t('Settings successfully updated.'));
159   }
160
161 }