custom_elements-8.x-2.x-dev/modules/custom_elements_extra_formatters/src/Plugin/CustomElementsFieldFormatter/TableFieldCeFormatter.php

modules/custom_elements_extra_formatters/src/Plugin/CustomElementsFieldFormatter/TableFieldCeFormatter.php
<?php

namespace Drupal\custom_elements_extra_formatters\Plugin\CustomElementsFieldFormatter;

use Drupal\Component\Serialization\Json;
use Drupal\Core\Field\FieldItemListInterface;
use Drupal\Core\Form\FormStateInterface;
use Drupal\custom_elements\CustomElement;
use Drupal\custom_elements\CustomElementsFieldFormatterBase;

/**
 * Implementation of the 'tablefield' custom element formatter plugin.
 *
 * @CustomElementsFieldFormatter(
 *   id = "ce_tablefield",
 *   label = @Translation("Tablefield data"),
 *   Field_types = {
 *     "tablefield"
 *   }
 * )
 */
class TableFieldCeFormatter extends CustomElementsFieldFormatterBase {

  /**
   * {@inheritdoc}
   */
  public function build(FieldItemListInterface $items, CustomElement $custom_element, $langcode = NULL) {
    $value = $this->getFieldItemListValue($items);
    $cardinality = $items->getFieldDefinition()->getFieldStorageDefinition()->getCardinality();
    if ($cardinality === 1) {
      $value = $value[0];
      $element = [
        'settings' => [
          'row_header' => $this->getSetting('row_header') ?? 0,
          'column_header' => $this->getSetting('column_header') ?? 0,
        ],
      ] + $value;
    }
    else {
      $element = [
        'data' => $value,
        'settings' => [
          'row_header' => $this->getSetting('row_header') ?? 0,
          'column_header' => $this->getSetting('column_header') ?? 0,
        ],
      ];
    }
    if ($this->isSlot()) {
      $custom_element->addSlot($this->getName(), Json::encode($element));
    }
    else {
      $custom_element->setAttribute($this->getName(), $element);
    }
  }

  /**
   * {@inheritdoc}
   */
  public function buildConfigurationForm(array $form, FormStateInterface $form_state) {
    $form['row_header'] = [
      '#type' => 'checkbox',
      '#title' => $this->t('First row as a table header'),
      '#default_value' => $this->getSetting('row_header'),
    ];
    $form['column_header'] = [
      '#type' => 'checkbox',
      '#title' => $this->t('First column as a table header'),
      '#default_value' => $this->getSetting('column_header'),
    ];

    return $form;
  }

  /**
   * {@inheritdoc}
   */
  public function submitConfigurationForm(array &$form, FormStateInterface $form_state) {
    $this->configuration['row_header'] = $form_state->getValue('row_header');
    $this->configuration['column_header'] = $form_state->getValue('column_header');
  }

  /**
   * Returns value for the given field.
   *
   * This is a separate method, for easier extension by child classes.
   *
   * @param \Drupal\Core\Field\FieldItemListInterface $items
   *   The field to process.
   *
   * @return array
   *   The field's value(s).
   */
  protected function getFieldItemListValue(FieldItemListInterface $items): array {
    $value = [];
    foreach ($items->getValue() as $delta => $table) {
      $caption = $table['caption'] ?? NULL;
      unset($table['value']['caption']);
      $data = $table['value'];
      usort($data, function ($a, $b) {
        $aweight = $a['weight'] ?? 0;
        $bweight = $b['weight'] ?? 0;
        return $aweight - $bweight;
      });
      $value[$delta] = [
        'caption' => $caption,
        'value' => array_map(function ($v) {
          unset($v['weight']);
          return $v;
        }, $data),
      ];
    }
    return $value;
  }

}

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

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