Chris@0
|
1 <?php
|
Chris@0
|
2
|
Chris@0
|
3 namespace Drupal\language\Plugin\Condition;
|
Chris@0
|
4
|
Chris@0
|
5 use Drupal\Core\Condition\ConditionPluginBase;
|
Chris@0
|
6 use Drupal\Core\Form\FormStateInterface;
|
Chris@0
|
7 use Drupal\Core\Language\LanguageInterface;
|
Chris@0
|
8 use Drupal\Core\Language\LanguageManagerInterface;
|
Chris@0
|
9 use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
|
Chris@0
|
10 use Symfony\Component\DependencyInjection\ContainerInterface;
|
Chris@0
|
11
|
Chris@0
|
12 /**
|
Chris@0
|
13 * Provides a 'Language' condition.
|
Chris@0
|
14 *
|
Chris@0
|
15 * @Condition(
|
Chris@0
|
16 * id = "language",
|
Chris@0
|
17 * label = @Translation("Language"),
|
Chris@18
|
18 * context_definitions = {
|
Chris@0
|
19 * "language" = @ContextDefinition("language", label = @Translation("Language"))
|
Chris@0
|
20 * }
|
Chris@0
|
21 * )
|
Chris@0
|
22 */
|
Chris@0
|
23 class Language extends ConditionPluginBase implements ContainerFactoryPluginInterface {
|
Chris@0
|
24
|
Chris@0
|
25 /**
|
Chris@0
|
26 * The Language manager.
|
Chris@0
|
27 *
|
Chris@0
|
28 * @var \Drupal\Core\Language\LanguageManagerInterface
|
Chris@0
|
29 */
|
Chris@0
|
30 protected $languageManager;
|
Chris@0
|
31
|
Chris@0
|
32 /**
|
Chris@0
|
33 * Creates a new Language instance.
|
Chris@0
|
34 *
|
Chris@0
|
35 * @param \Drupal\Core\Language\LanguageManagerInterface $language_manager
|
Chris@0
|
36 * The language manager.
|
Chris@0
|
37 * @param array $configuration
|
Chris@0
|
38 * The plugin configuration, i.e. an array with configuration values keyed
|
Chris@0
|
39 * by configuration option name. The special key 'context' may be used to
|
Chris@0
|
40 * initialize the defined contexts by setting it to an array of context
|
Chris@0
|
41 * values keyed by context names.
|
Chris@0
|
42 * @param string $plugin_id
|
Chris@0
|
43 * The plugin_id for the plugin instance.
|
Chris@0
|
44 * @param mixed $plugin_definition
|
Chris@0
|
45 * The plugin implementation definition.
|
Chris@0
|
46 */
|
Chris@0
|
47 public function __construct(LanguageManagerInterface $language_manager, array $configuration, $plugin_id, $plugin_definition) {
|
Chris@0
|
48 parent::__construct($configuration, $plugin_id, $plugin_definition);
|
Chris@0
|
49 $this->languageManager = $language_manager;
|
Chris@0
|
50 }
|
Chris@0
|
51
|
Chris@0
|
52 /**
|
Chris@0
|
53 * {@inheritdoc}
|
Chris@0
|
54 */
|
Chris@0
|
55 public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
|
Chris@0
|
56 return new static(
|
Chris@0
|
57 $container->get('language_manager'),
|
Chris@0
|
58 $configuration,
|
Chris@0
|
59 $plugin_id,
|
Chris@0
|
60 $plugin_definition
|
Chris@0
|
61 );
|
Chris@0
|
62 }
|
Chris@0
|
63
|
Chris@0
|
64 /**
|
Chris@0
|
65 * {@inheritdoc}
|
Chris@0
|
66 */
|
Chris@0
|
67 public function buildConfigurationForm(array $form, FormStateInterface $form_state) {
|
Chris@0
|
68 if ($this->languageManager->isMultilingual()) {
|
Chris@0
|
69 // Fetch languages.
|
Chris@0
|
70 $languages = $this->languageManager->getLanguages();
|
Chris@0
|
71 $langcodes_options = [];
|
Chris@0
|
72 foreach ($languages as $language) {
|
Chris@0
|
73 $langcodes_options[$language->getId()] = $language->getName();
|
Chris@0
|
74 }
|
Chris@0
|
75 $form['langcodes'] = [
|
Chris@0
|
76 '#type' => 'checkboxes',
|
Chris@0
|
77 '#title' => $this->t('Language selection'),
|
Chris@0
|
78 '#default_value' => $this->configuration['langcodes'],
|
Chris@0
|
79 '#options' => $langcodes_options,
|
Chris@0
|
80 '#description' => $this->t('Select languages to enforce. If none are selected, all languages will be allowed.'),
|
Chris@0
|
81 ];
|
Chris@0
|
82 }
|
Chris@0
|
83 else {
|
Chris@0
|
84 $form['langcodes'] = [
|
Chris@0
|
85 '#type' => 'value',
|
Chris@0
|
86 '#default_value' => $this->configuration['langcodes'],
|
Chris@0
|
87 ];
|
Chris@0
|
88 }
|
Chris@0
|
89 return parent::buildConfigurationForm($form, $form_state);
|
Chris@0
|
90 }
|
Chris@0
|
91
|
Chris@0
|
92 /**
|
Chris@0
|
93 * {@inheritdoc}
|
Chris@0
|
94 */
|
Chris@0
|
95 public function submitConfigurationForm(array &$form, FormStateInterface $form_state) {
|
Chris@0
|
96 $this->configuration['langcodes'] = array_filter($form_state->getValue('langcodes'));
|
Chris@0
|
97 parent::submitConfigurationForm($form, $form_state);
|
Chris@0
|
98 }
|
Chris@0
|
99
|
Chris@0
|
100 /**
|
Chris@0
|
101 * {@inheritdoc}
|
Chris@0
|
102 */
|
Chris@0
|
103 public function summary() {
|
Chris@0
|
104 $language_list = $this->languageManager->getLanguages(LanguageInterface::STATE_ALL);
|
Chris@0
|
105 $selected = $this->configuration['langcodes'];
|
Chris@0
|
106 // Reduce the language list to an array of language names.
|
Chris@0
|
107 $language_names = array_reduce($language_list, function (&$result, $item) use ($selected) {
|
Chris@0
|
108 // If the current item of the $language_list array is one of the selected
|
Chris@0
|
109 // languages, add it to the $results array.
|
Chris@0
|
110 if (!empty($selected[$item->getId()])) {
|
Chris@0
|
111 $result[$item->getId()] = $item->getName();
|
Chris@0
|
112 }
|
Chris@0
|
113 return $result;
|
Chris@0
|
114 }, []);
|
Chris@0
|
115
|
Chris@0
|
116 // If we have more than one language selected, separate them by commas.
|
Chris@0
|
117 if (count($this->configuration['langcodes']) > 1) {
|
Chris@0
|
118 $languages = implode(', ', $language_names);
|
Chris@0
|
119 }
|
Chris@0
|
120 else {
|
Chris@0
|
121 // If we have just one language just grab the only present value.
|
Chris@0
|
122 $languages = array_pop($language_names);
|
Chris@0
|
123 }
|
Chris@0
|
124 if (!empty($this->configuration['negate'])) {
|
Chris@0
|
125 return t('The language is not @languages.', ['@languages' => $languages]);
|
Chris@0
|
126 }
|
Chris@0
|
127 return t('The language is @languages.', ['@languages' => $languages]);
|
Chris@0
|
128 }
|
Chris@0
|
129
|
Chris@0
|
130 /**
|
Chris@0
|
131 * {@inheritdoc}
|
Chris@0
|
132 */
|
Chris@0
|
133 public function evaluate() {
|
Chris@0
|
134 if (empty($this->configuration['langcodes']) && !$this->isNegated()) {
|
Chris@0
|
135 return TRUE;
|
Chris@0
|
136 }
|
Chris@0
|
137
|
Chris@0
|
138 $language = $this->getContextValue('language');
|
Chris@0
|
139 // Language visibility settings.
|
Chris@0
|
140 return !empty($this->configuration['langcodes'][$language->getId()]);
|
Chris@0
|
141 }
|
Chris@0
|
142
|
Chris@0
|
143 /**
|
Chris@0
|
144 * {@inheritdoc}
|
Chris@0
|
145 */
|
Chris@0
|
146 public function defaultConfiguration() {
|
Chris@0
|
147 return ['langcodes' => []] + parent::defaultConfiguration();
|
Chris@0
|
148 }
|
Chris@0
|
149
|
Chris@0
|
150 }
|