datafield-1.x-dev/src/Plugin/Field/FieldWidget/DataField.php

src/Plugin/Field/FieldWidget/DataField.php
<?php

namespace Drupal\datafield\Plugin\Field\FieldWidget;

use Drupal\Component\Utility\Html;
use Drupal\Core\Field\Attribute\FieldWidget;
use Drupal\Core\Field\FieldItemListInterface;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\StringTranslation\TranslatableMarkup;

/**
 * Plugin implementation of the 'data_field' widget.
 */
#[FieldWidget(
  id: 'data_field_widget',
  label: new TranslatableMarkup('Data Field'),
  field_types: ['data_field'],
)]
class DataField extends Base {

  /**
   * {@inheritdoc}
   */
  public function settingsForm(array $form, FormStateInterface $form_state): array {
    $elements = parent::settingsForm($form, $form_state);
    $settings = $this->getSettings();
    $size = 12;
    $columns = range(1, $size);
    foreach ($elements["widget_settings"] as $subfield => &$widget_setting) {
      $widget_setting['col'] = [
        '#type' => 'select',
        '#title' => $this->t('Column width'),
        '#options' => array_combine($columns, $columns),
        '#empty_option' => $this->t('Auto-layout columns'),
        '#description' => $this->t('Bootstrap grid system'),
        '#default_value' => $settings['widget_settings'][$subfield]['col'] ?? '',
      ];
    }
    return $elements;
  }

  /**
   * {@inheritdoc}
   */
  public function formElement(FieldItemListInterface $items, $delta, array $element, array &$form, FormStateInterface $form_state) {
    $field_settings = $this->getFieldSettings();
    $storage = $this->getFormElement($items, $delta, $element, $form, $form_state);
    $settings = $this->getSettings();
    $widget = [
      '#theme_wrappers' => ['container', 'form_element'],
      '#attributes' => ['class' => [Html::getId('data_field-elements'), 'row']],
      '#attached' => [
        'library' => ['datafield/widget'],
      ],
      '#type' => 'fieldset',
      '#base_type' => 'data_field',
    ];
    if ($settings['inline']) {
      $widget['#attributes']['class'][] = Html::getId('data_field-widget-inline');
    }
    foreach ($storage[$delta] as $subfield => $item) {
      if ($subfield == 'remove_button') {
        continue;
      }
      $settingWidget = $settings["widget_settings"][$subfield];
      $widget[$subfield] = $item;
      $widget_type = $item['#type'];
      $label_display = $settingWidget['label_display'] ?? 'hidden';
      $widget[$subfield]["#wrapper_attributes"]["class"][] = !empty($settingWidget["col"]) ? 'col-' . $settingWidget["col"] : 'col';
      unset($widget[$subfield]["#title_display"]);
      $label = $field_settings["field_settings"][$subfield]['label'];
      if ($label_display != 'hidden' && parent::isLabelSupported($widget_type)) {
        $widget[$subfield]['#title'] = $label;
        if ($label_display == 'invisible') {
          $widget[$subfield]['#title_display'] = 'invisible';
        }
        elseif ($label_display == 'inline') {
          $widget[$subfield]['#label_attributes']['class'][] = 'col-3';
          $widget[$subfield]['#title_display'] = 'inline';
          $widget[$subfield]['#wrapper_attributes']['class'][] = 'row';
          $widget[$subfield]['#wrapper_attributes']['class'][] = 'container-inline';
        }
      }
    }

    return $element + $widget;
  }

}

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

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