translation_views-8.x-1.x-dev/src/Plugin/views/field/TranslationModerationState.php

src/Plugin/views/field/TranslationModerationState.php
<?php

namespace Drupal\translation_views\Plugin\views\field;

use Drupal\content_moderation\ModerationInformationInterface;
use Drupal\content_translation\ContentTranslationManager;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Language\LanguageManagerInterface;
use Drupal\views\Plugin\views\field\FieldPluginBase;
use Drupal\views\ResultRow;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Drupal\translation_views\TranslationViewsTargetLanguage as TargetLanguage;

/**
 * Provides a field that adds moderation state.
 *
 * @ingroup views_field_handlers
 *
 * @ViewsField("translation_moderation_state")
 */
class TranslationModerationState extends FieldPluginBase {

  use TargetLanguage;

  /**
   * The moderation information service.
   *
   * @var \Drupal\content_moderation\ModerationInformationInterface
   */
  protected $moderationInfo;
  /**
   * Entity type manager.
   *
   * @var \Drupal\Core\Entity\EntityTypeManagerInterface
   */
  protected $entityTypeManager;

  /**
   * {@inheritdoc}
   */
  public function __construct(
    array $configuration,
    $plugin_id,
    $plugin_definition,
    ModerationInformationInterface $moderation_info,
    LanguageManagerInterface $language_manager,
    EntityTypeManagerInterface $entity_type_manager
  ) {
    parent::__construct($configuration, $plugin_id, $plugin_definition);

    $this->moderationInfo    = $moderation_info;
    $this->languageManager   = $language_manager;
    $this->entityTypeManager = $entity_type_manager;
  }

  /**
   * {@inheritdoc}
   */
  public static function create(
    ContainerInterface $container,
    array $configuration,
    $plugin_id,
    $plugin_definition
  ) {
    return new static(
      $configuration, $plugin_id, $plugin_definition,
      $container->get('content_moderation.moderation_information'),
      $container->get('language_manager'),
      $container->get('entity_type.manager')
    );
  }

  /**
   * {@inheritdoc}
   */
  protected function defineOptions() {
    $options = parent::defineOptions();
    $options['display_name'] = ['default' => TRUE];
    return $options;
  }

  /**
   * {@inheritdoc}
   */
  public function buildOptionsForm(&$form, FormStateInterface $form_state) {
    $default_value = 'state';
    $states = [
      'state' => $this->t('Moderation State'),
      'name'  => $this->t('Machine Name'),
    ];
    if (!empty($this->options['display_name'])) {
      $default_value = $this->options['display_name'];
    }
    $form['display_name'] = [
      '#type'          => 'select',
      '#title'         => $this->t('Formatter'),
      '#options'       => $states,
      '#required'      => TRUE,
      '#default_value' => $default_value,
    ];
    parent::buildOptionsForm($form, $form_state);
  }

  /**
   * {@inheritdoc}
   */
  public function query() {

  }

  /**
   * {@inheritdoc}
   */
  public function clickSortable() {
    return FALSE;
  }

  /**
   * {@inheritdoc}
   */
  public function render(ResultRow $values) {
    if ($values->_entity->id()) {
      /** @var \Drupal\Core\Entity\ContentEntityStorageInterface $storage */
      $entityTypeId             = $values->_entity->getEntityTypeId();
      $storage                  = $this->entityTypeManager->getStorage($entityTypeId);
      $entity                   = $storage->load($values->_entity->id());
      $target_langcode          = $this->getTargetLangcode();
      $pending_revision_enabled = ContentTranslationManager::isPendingRevisionSupportEnabled($entityTypeId);

      if (empty($target_langcode) || $target_langcode == '***LANGUAGE_site_default***') {
        $target_langcode = $this->languageManager->getCurrentLanguage()->getId();
      }

      $translation_has_revision = $storage->getLatestTranslationAffectedRevisionId($values->_entity->id(), $target_langcode);
      if ($entity && $pending_revision_enabled && $target_langcode && $translation_has_revision) {
        $latest_revision = $storage->loadRevision($translation_has_revision);
        if ($entity && $latest_revision->hasTranslation($target_langcode)) {
          $workflow          = $this->moderationInfo->getWorkflowForEntity($latest_revision);
          $translation       = $latest_revision->getTranslation($target_langcode);
          $translation_state = $translation->moderation_state->value;

          if (!empty($this->options['display_name']) && $workflow !== NULL) {
            if ($this->options['display_name'] == 'state') {
              $translation_label = $workflow->getTypePlugin()
                ->getState($translation_state)
                ->label();
              $values->{$this->field_alias} = $translation_label ? $translation_label : NULL;
            }
            else {
              $values->{$this->field_alias} = $translation_state ? $translation_state : NULL;
            }
          }
        }
      }
    }

    return parent::render($values);
  }

}

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

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