triples_field-1.0.x-dev/src/Plugin/Field/FieldFormatter/Table.php

src/Plugin/Field/FieldFormatter/Table.php
<?php

namespace Drupal\triples_field\Plugin\Field\FieldFormatter;

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

/**
 * Plugin implementations for 'table' formatter.
 */
#[FieldFormatter(
  id: 'triples_field_table',
  label: new TranslatableMarkup('Table'),
  field_types: ['triples_field'],
)]
class Table extends Base {

  /**
   * {@inheritdoc}
   */
  public static function defaultSettings(): array {
    $default = [
      'number_column' => FALSE,
      'number_column_label' => '№',
    ];
    $configs = \Drupal::config('triples_field.settings');
    $subfields = array_keys($titles = $configs->get('fields'));
    foreach ($subfields as $subfield) {
      $default[$subfield . '_column_label'] = '';
    }
    return $default + parent::defaultSettings();
  }

  /**
   * {@inheritdoc}
   */
  public function settingsForm(array $form, FormStateInterface $form_state): array {
    $settings = $this->getSettings();
    $element['number_column'] = [
      '#type' => 'checkbox',
      '#title' => $this->t('Enable row number column'),
      '#default_value' => $settings['number_column'],
      '#attributes' => ['class' => [Html::getId('js-triples_field-number-column')]],
    ];
    $element['number_column_label'] = [
      '#type' => 'textfield',
      '#title' => $this->t('Number column label'),
      '#size' => 30,
      '#default_value' => $settings['number_column_label'],
      '#states' => [
        'visible' => ['.js-triples-field-number-column' => ['checked' => TRUE]],
      ],
    ];

    $configs = $this->configFactory->get('triples_field.settings');
    $subfields = array_keys($titles = $configs->get('fields'));
    foreach ($subfields as $subfield) {
      $element[$subfield . '_column_label'] = [
        '#type' => 'textfield',
        '#title' => $titles[$subfield],
        '#size' => 30,
        '#default_value' => $settings[$subfield . '_column_label'] ?: $this->getFieldSetting($subfield)['label'],
      ];
    }

    return $element + parent::settingsForm($form, $form_state);
  }

  /**
   * {@inheritdoc}
   */
  public function settingsSummary(): array {
    $settings = $this->getSettings();

    $summary[] = $this->t('Enable row number column: @number_column', ['@number_column' => $settings['number_column'] ? $this->t('yes') : $this->t('no')]);
    if ($settings['number_column']) {
      $summary[] = $this->t('Number column label: @number_column_label', ['@number_column_label' => $settings['number_column_label']]);
    }

    $configs = $this->configFactory->get('triples_field.settings');
    $subfields = array_keys($titles = $configs->get('fields'));
    foreach ($subfields as $subfield) {
      if ($settings[$subfield . '_column_label'] != '') {
        $summary[] = ucfirst($subfield) . ' ' .
          $this->t('column label: @column_label',
            ['@column_label' => $settings[$subfield . '_column_label']]
          );
      }
    }

    return array_merge($summary, parent::settingsSummary());
  }

  /**
   * {@inheritdoc}
   */
  public function viewElements(FieldItemListInterface $items, $langcode): array {
    $settings = $this->getSettings();

    $table = ['#type' => 'table'];

    // No other way to pass context to the theme.
    // @see triples_field_theme_suggestions_table_alter()
    $id = HTML::getId('triples_field');
    $table['#attributes'][$id . '--field-name'] = $items->getName();
    $table['#attributes']['class'][] = $id . '-table';

    $configs = $this->configFactory->get('triples_field.settings');
    $subfields = array_keys($titles = $configs->get('fields'));
    $header = [];
    if (!empty($settings['number_column'])) {
      $header = [$settings['number_column_label']];
    }
    foreach ($subfields as $subfield) {
      if (empty($settings['first_column_label'])) {
        $header = [];
        break;
      }
      $header[] = $settings[$subfield . '_column_label'];
    }
    if (!empty($header)) {
      $table['#header'] = $header;
    }

    $field_name = $items->getName();
    foreach ($items as $delta => $item) {
      $row = [];
      if ($settings['number_column']) {
        $row[]['#markup'] = $delta + 1;
      }

      foreach ($subfields as $subfield) {

        if ($settings[$subfield]['hidden']) {
          $row[]['#markup'] = '';
        }
        else {
          $label = '';
          if (!empty($settings[$subfield]) && !empty($settings[$subfield]["show_label"])) {
            $label = $settings[$subfield . '_column_label'];
          }
          $row[] = [
            '#theme' => 'triples_field_subfield',
            '#settings' => $settings,
            '#subfield' => $item->{$subfield},
            '#index' => $subfield,
            '#field_name' => $field_name,
            '#label' => $label,
          ];
        }
      }

      $table[$delta] = $row;
    }

    $element[0] = $table;

    return $element;
  }

}

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

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