ultimate_table_field-1.0.0-alpha5/src/Plugin/Field/FieldFormatter/UltimateTableFieldFormatter.php

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

namespace Drupal\ultimate_table_field\Plugin\Field\FieldFormatter;

use Drupal\Core\Field\FieldItemListInterface;
use Drupal\Core\Field\FormatterBase;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Drupal\Core\Form\FormStateInterface;

/**
 * Plugin implementation of the ultimate table field widget.
 *
 * @FieldFormatter(
 *   id = "ultimate_table",
 *   label = @Translation("Ultimate table"),
 *   description = @Translation("Ultimate table default formatter."),
 *   field_types = {
 *     "ultimate_table"
 *   }
 * )
 */
class UltimateTableFieldFormatter extends FormatterBase {

  /**
   * Ultimate table cell field manager plugin.
   *
   * @var \Drupal\ultimate_table_field\UltimateTableCellFieldManager
   */
  protected $ultimateTableCellFieldManager;

  /**
   * Renderer service.
   *
   * @var \Drupal\Core\Render\RendererInterface
   */
  protected $renderer;

  /**
   * {@inheritDoc}
   */
  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
    $instance = parent::create($container, $configuration, $plugin_id, $plugin_definition);
    $instance->ultimateTableCellFieldManager = $container->get('plugin.manager.ultimate_table_cell_field');
    $instance->renderer = $container->get('renderer');
    return $instance;
  }

  /**
   * {@inheritdoc}
   */
  public static function defaultSettings() {
    return [
      'legend_position' => 'before',
      'table_theme' => 'default',
      'table_color' => '',
      'table_style' => [],
    ] + parent::defaultSettings();
  }

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

    $form['legend_position'] = [
      '#type' => 'select',
      '#title' => $this->t('Legend position'),
      '#options' => [
        'before' => $this->t('Before table'),
        'after' => $this->t('After table'),
      ],
      '#default_value' => $this->getSetting('legend_position'),
    ];

    $form['table_theme'] = [
      '#type' => 'select',
      '#title' => $this->t('Table color theme'),
      '#options' => [
        '' => $this->t('Default'),
        'black' => $this->t('Black'),
        'blue' => $this->t('Blue'),
        'brown' => $this->t('Brown'),
        'cyan' => $this->t('Cyan'),
        'gold' => $this->t('Golden'),
        'gray' => $this->t('Gray'),
        'green' => $this->t('Green'),
        'olive' => $this->t('Olive'),
        'orange' => $this->t('Orange'),
        'pink' => $this->t('Pink'),
        'purple' => $this->t('Purple'),
        'red' => $this->t('Red'),
        'silver' => $this->t('Silver'),
        'yellow' => $this->t('Yellow'),
      ],
      '#default_value' => $this->getSetting('table_theme'),
    ];

    $form['table_style'] = [
      '#type' => 'checkboxes',
      '#title' => $this->t('Table styles'),
      '#options' => [
        'striped-odd' => $this->t('Striped rows (odd)'),
        'striped-even' => $this->t('Striped rows (even)'),
        'filled-head' => $this->t('Filled header'),
        'row-hover' => $this->t('Row hover effect'),
        'side-filled' => $this->t('Side filled'),
      ],
      '#default_value' => $this->getSetting('table_style'),
    ];

    // Make striped-odd and striped-even mutually exclusive.
    $form['table_style']['striped-odd']['#states'] = [
      'disabled' => [
        ':input[name="fields[' . $this->fieldDefinition->getName() . '][settings_edit_form][settings][table_style][striped-even]"]' => ['checked' => TRUE],
      ],
    ];
    $form['table_style']['striped-even']['#states'] = [
      'disabled' => [
        ':input[name="fields[' . $this->fieldDefinition->getName() . '][settings_edit_form][settings][table_style][striped-odd]"]' => ['checked' => TRUE],
      ],
    ];

    return $form;
  }

  /**
   * {@inheritDoc}
   */
  public function viewElements(FieldItemListInterface $items, $langcode): array {
    $elements = [];
    foreach ($items as $item) {
      $values = $item->value;
      $columns = $values['columns'] ?? [];
      $rows = $values['rows'] ?? [];
      $legend = $values['legend'] ?? '';

      $element = [];

      // Add legend based on position setting.
      if ($legend && $this->getSetting('legend_position') === 'before') {
        $element['legend'] = [
          '#type' => 'markup',
          '#markup' => $legend,
        ];
      }

      // Format columns.
      foreach ($columns as &$column_items) {
        foreach ($column_items as &$cell_item) {
          $cell_field_instance = $this->ultimateTableCellFieldManager->createInstance($cell_item['type']);
          $cell_item = $cell_field_instance->cellFieldFormatter($cell_item);
        }
      }

      foreach ($columns as &$column) {
        $column = $this->renderer->renderInIsolation($column);
      }

      // Add table.
      foreach ($rows as &$row) {
        foreach ($row as $j => $items) {
          foreach ($items as &$cell_item) {
            $cell_field_instance = $this->ultimateTableCellFieldManager->createInstance($cell_item['type']);
            $cell_item = $cell_field_instance->cellFieldFormatter($cell_item);
          }
          $row[$j] = $this->renderer->renderInIsolation($items);
        }
      }

      // Add table element.
      $element['table'] = [
        '#type' => 'table',
        '#header' => $columns,
        '#rows' => $rows,
        '#empty' => t('No entries available'),
        '#attributes' => [
          'class' => $this->getTableClasses(),
        ],
        '#prefix' => '<div class="table-ultimate">',
        '#suffix' => '</div>',
        '#attached' => [
          'library' => ['ultimate_table_field/table-themes'],
        ],
      ];

      // Add legend after table if configured.
      if ($legend && $this->getSetting('legend_position') === 'after') {
        $element['legend'] = [
          '#type' => 'markup',
          '#markup' => $legend,
        ];
      }

      $elements[] = $element;
    }
    return $elements;
  }

  /**
   * Gets the CSS classes for the table.
   *
   * @return array
   *   An array of CSS classes.
   */
  protected function getTableClasses() {
    $classes = ['custom-bordered-table'];

    // Add color theme.
    if ($theme = $this->getSetting('table_theme')) {
      $classes[] = 'table-' . $theme;
    }

    // Add selected styles.
    $styles = array_filter($this->getSetting('table_style'));
    $classes = array_merge($classes, array_keys($styles));

    return $classes;
  }

  /**
   * {@inheritDoc}
   */
  public function settingsSummary() {
    $styles = array_filter($this->getSetting('table_style'));
    $theme = $this->getSetting('table_theme');
    $theme = empty($theme) ? $this->t('Default') : $theme;
    return [
      'Applied color: ' . $theme,
      'Applied style: ' . implode(', ', $styles),
    ];
  }

}

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

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