ui_icons-1.0.x-dev/modules/ui_icons_field/src/Plugin/Field/FieldWidget/IconWidget.php

modules/ui_icons_field/src/Plugin/Field/FieldWidget/IconWidget.php
<?php

declare(strict_types=1);

namespace Drupal\ui_icons_field\Plugin\Field\FieldWidget;

use Drupal\Core\Field\Attribute\FieldWidget;
use Drupal\Core\Field\FieldItemListInterface;
use Drupal\Core\Field\WidgetBase;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
use Drupal\Core\StringTranslation\TranslatableMarkup;
use Drupal\Core\Theme\Icon\IconDefinitionInterface;
use Drupal\ui_icons_field\IconFieldTrait;
use Drupal\ui_icons\IconSearch;

/**
 * Plugin implementation of the 'icon_widget' widget.
 */
#[FieldWidget(
  id: 'icon_widget',
  label: new TranslatableMarkup('Icon'),
  field_types: ['ui_icon'],
)]
class IconWidget extends WidgetBase implements ContainerFactoryPluginInterface {

  use IconFieldTrait;

  /**
   * {@inheritdoc}
   */
  public static function defaultSettings(): array {
    return [
      'icon_selector' => 'icon_autocomplete',
      'result_format' => 'list',
      'max_result' => IconSearch::SEARCH_RESULT,
    ] + parent::defaultSettings();
  }

  /**
   * {@inheritdoc}
   */
  public function settingsForm(array $form, FormStateInterface $form_state): array {
    $element = [];

    $element['icon_selector'] = [
      '#type' => 'select',
      '#title' => $this->t('Icon selector'),
      '#options' => $this->getPickerOptions(),
      '#default_value' => $this->getSetting('icon_selector'),
    ];

    $element['result_format'] = [
      '#type' => 'select',
      '#title' => $this->t('Result format'),
      '#options' => $this->getAutocompleteFormat(),
      '#default_value' => $this->getSetting('result_format'),
      '#states' => [
        'visible' => [
          ':input[name="fields[' . $this->fieldDefinition->getName() . '][settings_edit_form][settings][icon_selector]"]' => ['value' => 'icon_autocomplete'],
        ],
      ],
    ];

    $element['max_result'] = [
      '#type' => 'number',
      '#min' => 2,
      '#max' => IconSearch::SEARCH_RESULT_MAX,
      '#title' => $this->t('Maximum results'),
      '#default_value' => $this->getSetting('max_result'),
    ];

    return $element;
  }

  /**
   * {@inheritdoc}
   */
  public function settingsSummary(): array {
    $summary = [];

    $icon_selector = $this->getSetting('icon_selector');
    $result_format = $this->getSetting('result_format');
    $summary[] = $this->t('Selector: @type', ['@type' => $this->getPickerOptions()[$icon_selector] ?? '']);
    if ($icon_selector === 'icon_autocomplete') {
      $summary[] = $this->t('Result format: @format', ['@format' => $this->getAutocompleteFormat()[$result_format] ?? 'list']);
    }
    $summary[] = $this->t('Max results: @results', ['@results' => $this->getSetting('max_result')]);

    return $summary;
  }

  /**
   * {@inheritdoc}
   */
  public function formElement(FieldItemListInterface $items, $delta, array $element, array &$form, FormStateInterface $form_state): array {
    $cardinality = $this->fieldDefinition->getFieldStorageDefinition()->getCardinality();

    /** @var \Drupal\Core\Field\FieldItemInterface $item */
    $item = $items[$delta];

    $icon_selector = $this->getSetting('icon_selector');
    $allowed_icon_pack = array_filter($this->fieldDefinition->getSetting('allowed_icon_pack') ?? []);
    $element['value'] = [
      '#type' => $icon_selector,
      '#title' => $cardinality === 1 ? $this->fieldDefinition->getLabel() : $this->t('Icon'),
      '#allowed_icon_pack' => $allowed_icon_pack,
      '#required' => $element['#required'] ?? FALSE,
      '#show_settings' => FALSE,
      '#default_value' => NULL,
      '#max_result' => $this->getSetting('max_result'),
    ];

    if ($icon_selector === 'icon_autocomplete') {
      $element['value']['#result_format'] = $this->getSetting('result_format');
    }

    if ($item && $item->target_id) {
      $element['value']['#default_value'] = $item->target_id;
    }

    return $element;
  }

  /**
   * {@inheritdoc}
   */
  public function massageFormValues(array $values, array $form, FormStateInterface $form_state): array {
    // Only store the icon ID from the FormElement result.
    // @todo #return_id by default?
    foreach ($values as &$item) {
      if (empty($item['value']['icon']) || !$item['value']['icon'] instanceof IconDefinitionInterface) {
        unset($item['value']);
        continue;
      }

      $icon = $item['value']['icon'];
      $item['target_id'] = $icon->getId();
      unset($item['value']);
    }

    return $values;
  }

}

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

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