contacts-8.x-1.x-dev/src/Plugin/Field/FieldFormatter/StatusLogFormatter.php

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

namespace Drupal\contacts\Plugin\Field\FieldFormatter;

use Drupal\Component\Datetime\DateTimePlus;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\Core\Field\FieldDefinitionInterface;
use Drupal\Core\Field\FieldItemListInterface;
use Drupal\Core\Field\FormatterBase;
use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;

/**
 * Defines the 'status_log_list' field formatter.
 *
 * @FieldFormatter(
 *   id = "status_log_list",
 *   label = @Translation("Status Log (list)"),
 *   field_types = {
 *     "status_log"
 *   }
 * )
 */
class StatusLogFormatter extends FormatterBase implements ContainerFactoryPluginInterface {

  /**
   * Entity type manager.
   *
   * @var \Drupal\Core\Entity\EntityTypeManagerInterface
   */
  protected $entityTypeManager;

  /**
   * {@inheritdoc}
   */
  public function __construct(EntityTypeManagerInterface $entity_type_manager, $plugin_id, $plugin_definition, FieldDefinitionInterface $field_definition, array $settings, $label, $view_mode, array $third_party_settings) {
    parent::__construct($plugin_id, $plugin_definition, $field_definition, $settings, $label, $view_mode, $third_party_settings);
    $this->entityTypeManager = $entity_type_manager;
  }

  /**
   * {@inheritdoc}
   */
  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {

    return new static(
      $container->get('entity_type.manager'),
      $plugin_id,
      $plugin_definition,
      $configuration['field_definition'],
      $configuration['settings'],
      $configuration['label'],
      $configuration['view_mode'],
      $configuration['third_party_settings']
    );
  }

  /**
   * {@inheritdoc}
   */
  public function viewElements(FieldItemListInterface $items, $langcode) {
    $elements = [
      '#title' => $this->fieldDefinition->getLabel(),
      '#theme' => 'item_list',
      '#list_type' => 'ul',
      '#items' => [],
    ];

    $source_name = $this->fieldDefinition
      ->getFieldStorageDefinition()
      ->getSetting('source_field');
    $entity = $items->getEntity();
    $source = $entity->get($source_name);
    $source_definition = $source->getFieldDefinition()->getFieldStorageDefinition();
    $options_provider = $source_definition->getOptionsProvider($source_definition->getMainPropertyName(), $entity);
    $options = $options_provider ? $options_provider->getPossibleOptions() : [];

    foreach ($items as $delta => $item) {
      $values = $item->getValue();
      $user = $this->entityTypeManager->getStorage('user')
        ->load($values['uid']);
      $username = $user ?
        $user->label() :
        $this->t('Deleted [@uid]', ['@uid' => $values['uid']]);
      $elements['#items'][$delta] = $this->t('@time: Status was changed from %status_old to %status_new by @username.', [
        '%status_new' => $options[$values['value']] ?? $values['value'],
        '%status_old' => $options[$values['previous']] ?? $values['previous'],
        '@time' => DateTimePlus::createFromTimestamp($values['timestamp'])
          ->format('Y-m-d H:i:s'),
        '@username' => $username,
      ]);
    }

    return $elements;
  }

}

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

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