name-8.x-1.x-dev/src/Traits/NameAdditionalPreferredTrait.php

src/Traits/NameAdditionalPreferredTrait.php
<?php

namespace Drupal\name\Traits;

use Drupal\Core\Form\FormStateInterface;

/**
 * Name form for preferred and alternative settings trait.
 */
trait NameAdditionalPreferredTrait {

  /**
   * Gets the default settings for alternative and preferred fields.
   *
   * @return array
   *   Default settings.
   */
  protected static function getDefaultAdditionalPreferredSettings() {
    return [
      "preferred_field_reference" => "",
      "preferred_field_reference_separator" => ", ",
      "alternative_field_reference" => "",
      "alternative_field_reference_separator" => ", ",
    ];
  }

  /**
   * Returns a form for the default settings defined above.
   *
   * @param array $form
   *   The form where the settings form is being included in.
   * @param \Drupal\Core\Form\FormStateInterface $form_state
   *   The form state of the (entire) configuration form.
   *
   * @return array
   *   The form definition for the field settings.
   */
  protected function getNameAdditionalPreferredSettingsForm(array &$form, FormStateInterface $form_state) {
    $elements = [];
    $elements['preferred_field_reference'] = [
      '#type' => 'select',
      '#title' => $this->t('Preferred component source'),
      '#default_value' => $this->getSetting('preferred_field_reference'),
      '#empty_option' => $this->getEmptyOption(),
      '#options' => $this->getAdditionalSources(),
      '#description' => $this->t('A data source to use as the preferred given name within the name formats. A common use-case would be for a users nickname.<br>i.e. "q" and "v", plus the conditional "p", "d" and "D" name format options.'),
    ];
    $elements['preferred_field_reference_separator'] = [
      '#type' => 'textfield',
      '#title' => $this->t('Preferred component source multivalue separator'),
      '#default_value' => $this->getSetting('preferred_field_reference_separator'),
      '#description' => $this->t('Used to separate multi-value items in an inline list.'),
      '#states' => [
        'invisible' => [
          ':input[name$="[preferred_field_reference]"]' => ['value' => ''],
        ],
      ],
    ];

    $elements['alternative_field_reference'] = [
      '#type' => 'select',
      '#title' => $this->t('Alternative component source'),
      '#default_value' => $this->getSetting('alternative_field_reference'),
      '#empty_option' => $this->getEmptyOption(),
      '#options' => $this->getAdditionalSources(),
      '#description' => $this->t('A data source to use as the alternative component within the name formats. Possible use-cases include; providing a custom fully formatted name alternative to use in citations; a separate field for a users accreditation / post-nominal letters.<br>i.e. "a" and "A" name format options.'),
    ];
    $elements['alternative_field_reference_separator'] = [
      '#type' => 'textfield',
      '#title' => $this->t('Alternative component source multivalue separator'),
      '#default_value' => $this->getSetting('alternative_field_reference_separator'),
      '#description' => $this->t('Used to separate multi-value items in an inline list.'),
      '#states' => [
        'invisible' => [
          ':input[name$="[alternative_field_reference]"]' => ['value' => ''],
        ],
      ],
    ];

    return $elements;
  }

  /**
   * The preferred and alternative settings to the summary.
   *
   * @param array $summary
   *   The summary array to add the settings to.
   */
  protected function settingsNameAdditionalPreferredSummary(&$summary) {
    if ($type = $this->getSetting('preferred_field_reference')) {
      $targets = $this->getAdditionalSources();
      $summary[] = $this->t('Preferred: @label', [
        '@label' => empty($targets[$type]) ? t('-- invalid --') : $targets[$type],
      ]);
    }
    elseif (!$this->getTraitUsageIsField()) {
      if ($type = $this->fieldDefinition->getSetting('preferred_field_reference')) {
        $targets = $this->getAdditionalSources();
        $summary[] = $this->t('Preferred: field default (@label)', [
          '@label' => empty($targets[$type]) ? t('-- invalid --') : $targets[$type],
        ]);
      }
      else {
        $summary[] = $this->t('Preferred: field default (-- none --)');
      }
    }
    if ($type = $this->getSetting('alternative_field_reference')) {
      $targets = $this->getAdditionalSources();
      $summary[] = $this->t('Alternative: @label', [
        '@label' => empty($targets[$type]) ? t('-- invalid --') : $targets[$type],
      ]);
    }
    elseif (!$this->getTraitUsageIsField()) {
      if ($type = $this->fieldDefinition->getSetting('alternative_field_reference')) {
        $targets = $this->getAdditionalSources();
        $summary[] = $this->t('Alternative: field default (@label)', [
          '@label' => empty($targets[$type]) ? t('-- invalid --') : $targets[$type],
        ]);
      }
      else {
        $summary[] = $this->t('Alternative: field default (-- none --)');
      }
    }
  }

  /**
   * Helper function to find attached fields to use as alternative sources.
   *
   * Currently field items do not support dependencies injected.
   *
   * To refactor once https://www.drupal.org/node/2053415 gets in.
   *
   * @return array
   *   The discovered additional sources.
   */
  protected function getAdditionalSources() {
    if (!isset($this->entityTypeManager)) {
      $this->entityTypeManager = \Drupal::service('entity_type.manager');
    }
    if (!isset($this->entityFieldManager)) {
      $this->entityFieldManager = \Drupal::service('entity_field.manager');
    }

    $field_definition = $this->getFieldDefinition();
    $entity_type_id = $field_definition->getTargetEntityTypeId();
    $entity_type = $this->entityTypeManager
      ->getStorage($entity_type_id)
      ->getEntityType();
    $bundle = $field_definition->getTargetBundle();
    $entity_type_label = $entity_type->getBundleLabel();
    if (!$entity_type_label) {
      $entity_type_label = $entity_type->getLabel();
    }
    $sources = [
      '_self' => $this->t('@label label', ['@label' => $entity_type_label]),
    ];
    if ($entity_type_id == 'user') {
      $sources['_self_property_name'] = $this->t('@label login name', ['@label' => $entity_type_label]);
    }
    $fields = $this->entityFieldManager->getFieldDefinitions($entity_type_id, $bundle);
    foreach ($fields as $field_name => $field) {
      if (!$field->getFieldStorageDefinition()->isBaseField() && $field_name != $field_definition->getName()) {
        $sources[$field->getName()] = $field->getLabel();
      }
    }
    return $sources;
  }

  /**
   * Returns the empty option for the select list.
   */
  protected function getEmptyOption() {
    if ($this->getTraitUsageIsField()) {
      return $this->t('-- none --');
    }
    else {
      return $this->t('-- field default --');
    }
  }

  /**
   * Helper function to determine if the trait is being used in a field.
   */
  protected function getTraitUsageIsField() {
    return is_subclass_of($this, 'Drupal\Core\Field\FieldItemBase');
  }

}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc