/web/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/LanguageItem.php

https://gitlab.com/mohamed_hussein/prodt · PHP · 156 lines · 83 code · 16 blank · 57 comment · 10 complexity · 0e68dc0f6d852ba22a903baa94decaab MD5 · raw file

  1. <?php
  2. namespace Drupal\Core\Field\Plugin\Field\FieldType;
  3. use Drupal\Core\Field\FieldDefinitionInterface;
  4. use Drupal\Core\Field\FieldStorageDefinitionInterface;
  5. use Drupal\Core\Field\FieldItemBase;
  6. use Drupal\Core\Language\LanguageInterface;
  7. use Drupal\Core\Session\AccountInterface;
  8. use Drupal\Core\TypedData\DataDefinition;
  9. use Drupal\Core\TypedData\DataReferenceDefinition;
  10. use Drupal\Core\TypedData\OptionsProviderInterface;
  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. * }
  26. * }
  27. * }
  28. * )
  29. */
  30. class LanguageItem extends FieldItemBase implements OptionsProviderInterface {
  31. /**
  32. * {@inheritdoc}
  33. */
  34. public static function propertyDefinitions(FieldStorageDefinitionInterface $field_definition) {
  35. $properties['value'] = DataDefinition::create('string')
  36. ->setLabel(t('Language code'))
  37. ->setRequired(TRUE);
  38. $properties['language'] = DataReferenceDefinition::create('language')
  39. ->setLabel(t('Language object'))
  40. ->setDescription(t('The referenced language'))
  41. // The language object is retrieved via the language code.
  42. ->setComputed(TRUE)
  43. ->setReadOnly(FALSE);
  44. return $properties;
  45. }
  46. /**
  47. * {@inheritdoc}
  48. */
  49. public static function schema(FieldStorageDefinitionInterface $field_definition) {
  50. return [
  51. 'columns' => [
  52. 'value' => [
  53. 'type' => 'varchar_ascii',
  54. 'length' => 12,
  55. ],
  56. ],
  57. ];
  58. }
  59. /**
  60. * {@inheritdoc}
  61. */
  62. public function setValue($values, $notify = TRUE) {
  63. // Treat the values as property value of the language property, if no array
  64. // is given as this handles language codes and objects.
  65. if (isset($values) && !is_array($values)) {
  66. $this->set('language', $values, $notify);
  67. }
  68. else {
  69. // Make sure that the 'language' property gets set as 'value'.
  70. if (isset($values['value']) && !isset($values['language'])) {
  71. $values['language'] = $values['value'];
  72. }
  73. parent::setValue($values, $notify);
  74. }
  75. }
  76. /**
  77. * {@inheritdoc}
  78. */
  79. public function applyDefaultValue($notify = TRUE) {
  80. // Default to the site's default language. When language module is enabled,
  81. // this behavior is configurable, see language_field_info_alter().
  82. $this->setValue(['value' => \Drupal::languageManager()->getDefaultLanguage()->getId()], $notify);
  83. return $this;
  84. }
  85. /**
  86. * {@inheritdoc}
  87. */
  88. public function onChange($property_name, $notify = TRUE) {
  89. // Make sure that the value and the language property stay in sync.
  90. if ($property_name == 'value') {
  91. $this->writePropertyValue('language', $this->value);
  92. }
  93. elseif ($property_name == 'language') {
  94. $this->writePropertyValue('value', $this->get('language')->getTargetIdentifier());
  95. }
  96. parent::onChange($property_name, $notify);
  97. }
  98. /**
  99. * {@inheritdoc}
  100. */
  101. public static function generateSampleValue(FieldDefinitionInterface $field_definition) {
  102. // Defer to the callback in the item definition as it can be overridden.
  103. $constraint = $field_definition->getItemDefinition()->getConstraint('ComplexData');
  104. if (isset($constraint['value']['AllowedValues']['callback'])) {
  105. $languages = call_user_func($constraint['value']['AllowedValues']['callback']);
  106. }
  107. else {
  108. $languages = array_keys(\Drupal::languageManager()->getLanguages(LanguageInterface::STATE_ALL));
  109. }
  110. $values['value'] = $languages[array_rand($languages)];
  111. return $values;
  112. }
  113. /**
  114. * {@inheritdoc}
  115. */
  116. public function getPossibleValues(AccountInterface $account = NULL) {
  117. return array_keys(\Drupal::languageManager()->getLanguages(LanguageInterface::STATE_ALL));
  118. }
  119. /**
  120. * {@inheritdoc}
  121. */
  122. public function getPossibleOptions(AccountInterface $account = NULL) {
  123. $languages = \Drupal::languageManager()->getLanguages(LanguageInterface::STATE_ALL);
  124. return array_map(function (LanguageInterface $language) {
  125. return $language->getName();
  126. }, $languages);
  127. }
  128. /**
  129. * {@inheritdoc}
  130. */
  131. public function getSettableValues(AccountInterface $account = NULL) {
  132. return $this->getPossibleValues($account);
  133. }
  134. /**
  135. * {@inheritdoc}
  136. */
  137. public function getSettableOptions(AccountInterface $account = NULL) {
  138. return $this->getPossibleValues($account);
  139. }
  140. }