3 namespace Drupal\Core\Field\Plugin\Field\FieldType;
5 use Drupal\Core\Field\FieldDefinitionInterface;
6 use Drupal\Core\Field\FieldStorageDefinitionInterface;
7 use Drupal\Core\Field\FieldItemBase;
8 use Drupal\Core\Language\LanguageInterface;
9 use Drupal\Core\Session\AccountInterface;
10 use Drupal\Core\TypedData\DataDefinition;
11 use Drupal\Core\TypedData\DataReferenceDefinition;
12 use Drupal\Core\TypedData\OptionsProviderInterface;
15 * Defines the 'language' entity field item.
19 * label = @Translation("Language"),
20 * description = @Translation("An entity field referencing a language."),
21 * default_widget = "language_select",
22 * default_formatter = "language",
27 * "Length" = {"max" = 12}
33 class LanguageItem extends FieldItemBase implements OptionsProviderInterface {
38 public static function propertyDefinitions(FieldStorageDefinitionInterface $field_definition) {
39 $properties['value'] = DataDefinition::create('string')
40 ->setLabel(t('Language code'))
43 $properties['language'] = DataReferenceDefinition::create('language')
44 ->setLabel(t('Language object'))
45 ->setDescription(t('The referenced language'))
46 // The language object is retrieved via the language code.
56 public static function schema(FieldStorageDefinitionInterface $field_definition) {
60 'type' => 'varchar_ascii',
70 public function setValue($values, $notify = TRUE) {
71 // Treat the values as property value of the language property, if no array
72 // is given as this handles language codes and objects.
73 if (isset($values) && !is_array($values)) {
74 $this->set('language', $values, $notify);
77 // Make sure that the 'language' property gets set as 'value'.
78 if (isset($values['value']) && !isset($values['language'])) {
79 $values['language'] = $values['value'];
81 parent::setValue($values, $notify);
88 public function applyDefaultValue($notify = TRUE) {
89 // Default to the site's default language. When language module is enabled,
90 // this behavior is configurable, see language_field_info_alter().
91 $this->setValue(['value' => \Drupal::languageManager()->getDefaultLanguage()->getId()], $notify);
98 public function onChange($property_name, $notify = TRUE) {
99 // Make sure that the value and the language property stay in sync.
100 if ($property_name == 'value') {
101 $this->writePropertyValue('language', $this->value);
103 elseif ($property_name == 'language') {
104 $this->writePropertyValue('value', $this->get('language')->getTargetIdentifier());
106 parent::onChange($property_name, $notify);
112 public static function generateSampleValue(FieldDefinitionInterface $field_definition) {
113 // Defer to the callback in the item definition as it can be overridden.
114 $constraint = $field_definition->getItemDefinition()->getConstraint('ComplexData');
115 if (isset($constraint['value']['AllowedValues']['callback'])) {
116 $languages = call_user_func($constraint['value']['AllowedValues']['callback']);
119 $languages = array_keys(\Drupal::languageManager()->getLanguages(LanguageInterface::STATE_ALL));
121 $values['value'] = $languages[array_rand($languages)];
128 public function getPossibleValues(AccountInterface $account = NULL) {
129 return array_keys(\Drupal::languageManager()->getLanguages(LanguageInterface::STATE_ALL));
135 public function getPossibleOptions(AccountInterface $account = NULL) {
136 $languages = \Drupal::languageManager()->getLanguages(LanguageInterface::STATE_ALL);
137 return array_map(function (LanguageInterface $language) {
138 return $language->getName();
145 public function getSettableValues(AccountInterface $account = NULL) {
146 return $this->getPossibleValues($account);
152 public function getSettableOptions(AccountInterface $account = NULL) {
153 return $this->getPossibleValues($account);