3 namespace Drupal\Core\Field\Plugin\Field\FieldType;
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;
12 * Defines the 'language' entity field item.
16 * label = @Translation("Language"),
17 * description = @Translation("An entity field referencing a language."),
18 * default_widget = "language_select",
19 * default_formatter = "language",
24 * "Length" = {"max" = 12},
25 * "AllowedValues" = {"callback" = "\Drupal\Core\Field\Plugin\Field\FieldType\LanguageItem::getAllowedLanguageCodes" }
31 * @todo Define the AllowedValues constraint via an options provider once
32 * https://www.drupal.org/node/2329937 is completed.
34 class LanguageItem extends FieldItemBase {
39 public static function propertyDefinitions(FieldStorageDefinitionInterface $field_definition) {
40 $properties['value'] = DataDefinition::create('string')
41 ->setLabel(t('Language code'))
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.
55 * Defines allowed language codes for the field's AllowedValues constraint.
60 public static function getAllowedLanguageCodes() {
61 return array_keys(\Drupal::languageManager()->getLanguages(LanguageInterface::STATE_ALL));
67 public static function schema(FieldStorageDefinitionInterface $field_definition) {
71 'type' => 'varchar_ascii',
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);
88 // Make sure that the 'language' property gets set as 'value'.
89 if (isset($values['value']) && !isset($values['language'])) {
90 $values['language'] = $values['value'];
92 parent::setValue($values, $notify);
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);
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);
114 elseif ($property_name == 'language') {
115 $this->writePropertyValue('value', $this->get('language')->getTargetIdentifier());
117 parent::onChange($property_name, $notify);