diff --git a/core/config/schema/core.entity.schema.yml b/core/config/schema/core.entity.schema.yml index f6442f7..46099cd 100644 --- a/core/config/schema/core.entity.schema.yml +++ b/core/config/schema/core.entity.schema.yml @@ -232,6 +232,13 @@ field.formatter.settings.string: type: boolean label: 'Link to the entity' +field.formatter.settings.language: + type: field.formatter.settings.string + mapping: + native_name: + type: boolean + label: 'Display in native language' + field.formatter.settings.number_decimal: type: mapping label: 'Number decimal display format settings' diff --git a/core/lib/Drupal/Core/Field/Plugin/Field/FieldFormatter/LanguageFormatter.php b/core/lib/Drupal/Core/Field/Plugin/Field/FieldFormatter/LanguageFormatter.php index d936b89..20b23a2 100644 --- a/core/lib/Drupal/Core/Field/Plugin/Field/FieldFormatter/LanguageFormatter.php +++ b/core/lib/Drupal/Core/Field/Plugin/Field/FieldFormatter/LanguageFormatter.php @@ -8,8 +8,9 @@ namespace Drupal\Core\Field\Plugin\Field\FieldFormatter; use Drupal\Component\Utility\String; -use Drupal\Core\Field\FormatterBase; +use Drupal\Core\Field\FieldItemInterface; use Drupal\Core\Field\FieldItemListInterface; +use Drupal\Core\Form\FormStateInterface; /** * Plugin implementation of the 'language' formatter. @@ -22,19 +23,52 @@ * } * ) */ -class LanguageFormatter extends FormatterBase { +class LanguageFormatter extends StringFormatter { /** * {@inheritdoc} */ - public function viewElements(FieldItemListInterface $items) { - $elements = array(); + public static function defaultSettings() { + $settings = parent::defaultSettings(); + $settings['native_name'] = FALSE; + return $settings; + } - foreach ($items as $delta => $item) { - $elements[$delta] = array('#markup' => $item->language ? String::checkPlain($item->language->getName()) : ''); + /** + * {@inheritdoc} + */ + public function settingsForm(array $form, FormStateInterface $form_state) { + $form = parent::settingsForm($form, $form_state); + $form['native_name'] = array( + '#title' => $this->t('Display in native language'), + '#type' => 'checkbox', + '#default_value' => $this->getSetting('native_name'), + ); + return $form; + } + + /** + * {@inheritdoc} + */ + public function settingsSummary() { + $summary = parent::settingsSummary(); + if ($this->getSetting('native_name')) { + $additional_summary = $this->t('Displayed in native name'); + if (!empty($summary['#markup'])) { + $summary['#markup'] .= '; ' . $additional_summary; + } + else { + $summary['#markup'] = $additional_summary; + } } + } - return $elements; + /** + * {@inheritdoc} + */ + protected function viewValue(FieldItemInterface $item) { + $languages = $languages = $this->getSetting('native_name') ? \Drupal::languageManager()->getNativeLanguages() : \Drupal::languageManager()->getLanguages(); + return $item->language ? String::checkPlain($languages[$item->language->getId()]->getName()) : ''; } } diff --git a/core/lib/Drupal/Core/Field/Plugin/Field/FieldFormatter/StringFormatter.php b/core/lib/Drupal/Core/Field/Plugin/Field/FieldFormatter/StringFormatter.php index ec9b79d..5949528 100644 --- a/core/lib/Drupal/Core/Field/Plugin/Field/FieldFormatter/StringFormatter.php +++ b/core/lib/Drupal/Core/Field/Plugin/Field/FieldFormatter/StringFormatter.php @@ -10,6 +10,7 @@ use Drupal\Component\Utility\String; use Drupal\Core\Entity\EntityManagerInterface; use Drupal\Core\Field\FieldDefinitionInterface; +use Drupal\Core\Field\FieldItemInterface; use Drupal\Core\Field\FormatterBase; use Drupal\Core\Field\FieldItemListInterface; use Drupal\Core\Form\FormStateInterface; @@ -127,7 +128,7 @@ public function viewElements(FieldItemListInterface $items) { foreach ($items as $delta => $item) { // The text value has no text format assigned to it, so the user input // should equal the output, including newlines. - $string = nl2br(String::checkPlain($item->value)); + $string = $this->viewValue($item); if ($url) { $elements[$delta] = [ @@ -144,4 +145,17 @@ public function viewElements(FieldItemListInterface $items) { return $elements; } + /** + * Generate the output appropriate for one field item. + * + * @param \Drupal\Core\Field\FieldItemInterface $item + * One field item. + * + * @return string + * The textual output generated. + */ + protected function viewValue(FieldItemInterface $item) { + return nl2br(String::checkPlain($item->value)); + } + } diff --git a/core/modules/field/config/schema/field.views.schema.yml b/core/modules/field/config/schema/field.views.schema.yml index 56d852d..9c625f5 100644 --- a/core/modules/field/config/schema/field.views.schema.yml +++ b/core/modules/field/config/schema/field.views.schema.yml @@ -18,7 +18,7 @@ views.argument.field_list_string: views.field.field: type: views_field - label: 'Log event message' + label: 'Views field field handler' mapping: click_sort_column: type: string @@ -27,11 +27,8 @@ views.field.field: type: string label: 'Formatter' settings: - type: sequence + type: field.formatter.settings.[%parent.type] label: 'Settings' - sequence: - - type: string - label: 'Setting' group_column: type: string label: 'Group by column' diff --git a/core/modules/node/config/install/views.view.archive.yml b/core/modules/node/config/install/views.view.archive.yml index 047d062..4b089a4 100644 --- a/core/modules/node/config/install/views.view.archive.yml +++ b/core/modules/node/config/install/views.view.archive.yml @@ -146,7 +146,7 @@ display: default_group: All default_group_multiple: { } group_items: { } - plugin_id: language + plugin_id: field entity_type: node entity_field: langcode style: diff --git a/core/modules/node/config/install/views.view.content.yml b/core/modules/node/config/install/views.view.content.yml index 2a44101..70a9b24 100644 --- a/core/modules/node/config/install/views.view.content.yml +++ b/core/modules/node/config/install/views.view.content.yml @@ -452,7 +452,7 @@ display: default_group: All default_group_multiple: { } group_items: { } - plugin_id: language + plugin_id: field entity_type: node entity_field: langcode sorts: { } diff --git a/core/modules/node/config/install/views.view.content_recent.yml b/core/modules/node/config/install/views.view.content_recent.yml index 9456436..e72372d 100644 --- a/core/modules/node/config/install/views.view.content_recent.yml +++ b/core/modules/node/config/install/views.view.content_recent.yml @@ -391,7 +391,7 @@ display: default_group: All default_group_multiple: { } group_items: { } - plugin_id: language + plugin_id: field entity_type: node entity_field: langcode sorts: diff --git a/core/modules/node/config/install/views.view.frontpage.yml b/core/modules/node/config/install/views.view.frontpage.yml index b5d02e9..0e349df 100644 --- a/core/modules/node/config/install/views.view.frontpage.yml +++ b/core/modules/node/config/install/views.view.frontpage.yml @@ -154,7 +154,7 @@ display: default_group: All default_group_multiple: { } group_items: { } - plugin_id: language + plugin_id: field entity_type: node entity_field: langcode pager: diff --git a/core/modules/node/config/install/views.view.glossary.yml b/core/modules/node/config/install/views.view.glossary.yml index 1625bdd..fc07b6b 100644 --- a/core/modules/node/config/install/views.view.glossary.yml +++ b/core/modules/node/config/install/views.view.glossary.yml @@ -346,7 +346,7 @@ display: default_group: All default_group_multiple: { } group_items: { } - plugin_id: language + plugin_id: field entity_type: node entity_field: langcode attachment_1: diff --git a/core/modules/node/src/Tests/Views/NodeLanguageTest.php b/core/modules/node/src/Tests/Views/NodeLanguageTest.php index e3ddd8b..a7c9228 100644 --- a/core/modules/node/src/Tests/Views/NodeLanguageTest.php +++ b/core/modules/node/src/Tests/Views/NodeLanguageTest.php @@ -235,7 +235,7 @@ public function testNativeLanguageField() { // Modify test view to display native language names and set translations. $config = \Drupal::config('views.view.test_language'); - $config->set('display.default.display_options.fields.langcode.native_language', TRUE); + $config->set('display.default.display_options.fields.langcode.settings.native_name', TRUE); $config->save(); \Drupal::languageManager()->getLanguageConfigOverride('fr', 'language.entity.fr')->set('label', 'Français')->save(); \Drupal::languageManager()->getLanguageConfigOverride('es', 'language.entity.es')->set('label', 'Español')->save(); diff --git a/core/modules/node/tests/modules/node_test_views/test_views/views.view.test_language.yml b/core/modules/node/tests/modules/node_test_views/test_views/views.view.test_language.yml index 82c4c79..8490cb3 100644 --- a/core/modules/node/tests/modules/node_test_views/test_views/views.view.test_language.yml +++ b/core/modules/node/tests/modules/node_test_views/test_views/views.view.test_language.yml @@ -159,10 +159,11 @@ display: hide_empty: false empty_zero: false hide_alter_empty: true - native_language: false - plugin_id: language + plugin_id: field entity_type: node entity_field: langcode + settings: + native_name: false filters: status: value: true @@ -222,8 +223,7 @@ display: default_group: All default_group_multiple: { } group_items: { } - plugin_id: language - entity_type: node + pluplugin_id: field entity_type: node entity_field: langcode sorts: langcode: diff --git a/core/modules/taxonomy/config/install/views.view.taxonomy_term.yml b/core/modules/taxonomy/config/install/views.view.taxonomy_term.yml index 15f80ec..6cd04c5 100644 --- a/core/modules/taxonomy/config/install/views.view.taxonomy_term.yml +++ b/core/modules/taxonomy/config/install/views.view.taxonomy_term.yml @@ -167,7 +167,7 @@ display: default_group: All default_group_multiple: { } group_items: { } - plugin_id: language + plugin_id: field entity_type: node entity_field: langcode status: diff --git a/core/modules/views/config/schema/views.field.schema.yml b/core/modules/views/config/schema/views.field.schema.yml index 8a28f38..595461b 100644 --- a/core/modules/views/config/schema/views.field.schema.yml +++ b/core/modules/views/config/schema/views.field.schema.yml @@ -174,11 +174,3 @@ views.field.url: views.field.xss: type: views_field label: 'Xss' - -views.field.language: - type: views_field - label: 'Language' - mapping: - native_language: - type: boolean - label: 'Display in native language' diff --git a/core/modules/views/src/EntityViewsData.php b/core/modules/views/src/EntityViewsData.php index cb30422..91ad27c 100644 --- a/core/modules/views/src/EntityViewsData.php +++ b/core/modules/views/src/EntityViewsData.php @@ -300,7 +300,7 @@ protected function mapSingleFieldViewsData($table, $field_name, $field_type, $co break; case 'language': - $views_field['field']['id'] = 'language'; + $views_field['field']['id'] = 'field'; $views_field['argument']['id'] = 'language'; $views_field['filter']['id'] = 'language'; $views_field['sort']['id'] = 'standard';