Version 1
[yaffs-website] / web / core / lib / Drupal / Core / Field / Plugin / Field / FieldType / LanguageItem.php
1 <?php
2
3 namespace Drupal\Core\Field\Plugin\Field\FieldType;
4
5 use Drupal\Core\Field\FieldStorageDefinitionInterface;
6 use Drupal\Core\Field\FieldItemBase;
7 use Drupal\Core\Language\LanguageInterface;
8 use Drupal\Core\TypedData\DataDefinition;
9 use Drupal\Core\TypedData\DataReferenceDefinition;
10
11 /**
12  * Defines the 'language' entity field item.
13  *
14  * @FieldType(
15  *   id = "language",
16  *   label = @Translation("Language"),
17  *   description = @Translation("An entity field referencing a language."),
18  *   default_widget = "language_select",
19  *   default_formatter = "language",
20  *   no_ui = TRUE,
21  *   constraints = {
22  *     "ComplexData" = {
23  *       "value" = {
24  *         "Length" = {"max" = 12},
25  *         "AllowedValues" = {"callback" = "\Drupal\Core\Field\Plugin\Field\FieldType\LanguageItem::getAllowedLanguageCodes" }
26  *       }
27  *     }
28  *   }
29  * )
30  *
31  * @todo Define the AllowedValues constraint via an options provider once
32  *   https://www.drupal.org/node/2329937 is completed.
33  */
34 class LanguageItem extends FieldItemBase {
35
36   /**
37    * {@inheritdoc}
38    */
39   public static function propertyDefinitions(FieldStorageDefinitionInterface $field_definition) {
40     $properties['value'] = DataDefinition::create('string')
41       ->setLabel(t('Language code'))
42       ->setRequired(TRUE);
43
44     $properties['language'] = DataReferenceDefinition::create('language')
45       ->setLabel(t('Language object'))
46       ->setDescription(t('The referenced language'))
47       // The language object is retrieved via the language code.
48       ->setComputed(TRUE)
49       ->setReadOnly(FALSE);
50
51     return $properties;
52   }
53
54   /**
55    * Defines allowed language codes for the field's AllowedValues constraint.
56    *
57    * @return string[]
58    *   The allowed values.
59    */
60   public static function getAllowedLanguageCodes() {
61     return array_keys(\Drupal::languageManager()->getLanguages(LanguageInterface::STATE_ALL));
62   }
63
64   /**
65    * {@inheritdoc}
66    */
67   public static function schema(FieldStorageDefinitionInterface $field_definition) {
68     return [
69       'columns' => [
70         'value' => [
71           'type' => 'varchar_ascii',
72           'length' => 12,
73         ],
74       ],
75     ];
76   }
77
78   /**
79    * {@inheritdoc}
80    */
81   public function setValue($values, $notify = TRUE) {
82     // Treat the values as property value of the language property, if no array
83     // is given as this handles language codes and objects.
84     if (isset($values) && !is_array($values)) {
85       $this->set('language', $values, $notify);
86     }
87     else {
88       // Make sure that the 'language' property gets set as 'value'.
89       if (isset($values['value']) && !isset($values['language'])) {
90         $values['language'] = $values['value'];
91       }
92       parent::setValue($values, $notify);
93     }
94   }
95
96   /**
97    * {@inheritdoc}
98    */
99   public function applyDefaultValue($notify = TRUE) {
100     // Default to the site's default language. When language module is enabled,
101     // this behavior is configurable, see language_field_info_alter().
102     $this->setValue(['value' => \Drupal::languageManager()->getDefaultLanguage()->getId()], $notify);
103     return $this;
104   }
105
106   /**
107    * {@inheritdoc}
108    */
109   public function onChange($property_name, $notify = TRUE) {
110     // Make sure that the value and the language property stay in sync.
111     if ($property_name == 'value') {
112       $this->writePropertyValue('language', $this->value);
113     }
114     elseif ($property_name == 'language') {
115       $this->writePropertyValue('value', $this->get('language')->getTargetIdentifier());
116     }
117     parent::onChange($property_name, $notify);
118   }
119
120 }