wxt_library-8.x-1.21/src/Plugin/Condition/PanelsTitle.php

src/Plugin/Condition/PanelsTitle.php
<?php

namespace Drupal\wxt_library\Plugin\Condition;

use Drupal\Core\Condition\ConditionPluginBase;
use Drupal\Core\Entity\EntityDisplayRepositoryInterface;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\HttpFoundation\RequestStack;
use Drupal\layout_builder_st\Entity\LayoutBuilderEntityViewDisplay;

/**
 * Provides a 'Layout Builder Title' condition.
 *
 * @Condition(
 *   id = "panels_title",
 *   label = @Translation("Layout Builder Title"),
 *   context_definitions = {
 *     "node" = @ContextDefinition("entity:node", label = @Translation("Current Node"), required = FALSE),
 *     "taxonomy_term" = @ContextDefinition("entity:taxonomy_term", label = @Translation("Current Taxonomy Term"), required = FALSE),
 *   }
 * )
 */
class PanelsTitle extends ConditionPluginBase implements ContainerFactoryPluginInterface {

  /**
   * The request stack.
   *
   * @var \Symfony\Component\HttpFoundation\RequestStack
   */
  protected $requestStack;

  /**
   * The entity display repository.
   *
   * @var \Drupal\Core\Entity\EntityDisplayRepositoryInterface
   */
  protected $entityDisplayRepository;

  /**
   * Constructs a LayoutBuilderTitle condition plugin.
   *
   * @param \Symfony\Component\HttpFoundation\RequestStack $request_stack
   *   The request stack.
   * @param \Drupal\Core\Entity\EntityDisplayRepositoryInterface $entity_display_repository
   *   The entity display repository.
   * @param array $configuration
   *   A configuration array containing information about the plugin instance.
   * @param string $plugin_id
   *   The plugin_id for the plugin instance.
   * @param array $plugin_definition
   *   The plugin implementation definition.
   */
  public function __construct(RequestStack $request_stack, EntityDisplayRepositoryInterface $entity_display_repository, array $configuration, $plugin_id, array $plugin_definition) {
    parent::__construct($configuration, $plugin_id, $plugin_definition);
    $this->requestStack = $request_stack;
    $this->entityDisplayRepository = $entity_display_repository;
  }

  /**
   * {@inheritdoc}
   */
  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
    return new static(
      $container->get('request_stack'),
      $container->get('entity_display.repository'),
      $configuration,
      $plugin_id,
      $plugin_definition
    );
  }

  /**
   * {@inheritdoc}
   */
  public function buildConfigurationForm(array $form, FormStateInterface $form_state) {
    $form['is_panelized'] = [
      '#type' => 'checkboxes',
      '#title' => $this->t('Page is panelized with a title:'),
      '#options' => ['enabled' => $this->t('Enabled')],
      '#default_value' => $this->configuration['is_panelized'],
      '#description' => $this->t('Returns TRUE if the page being viewed is a panelized page.'),
    ];

    return parent::buildConfigurationForm($form, $form_state);
  }

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

  /**
   * Evaluates the condition and returns TRUE or FALSE accordingly.
   *
   * @return bool
   *   TRUE if the condition has been met, FALSE otherwise.
   */
  public function evaluate() {
    if ((empty($this->configuration['is_panelized']) || (isset($this->configuration['is_panelized']['enabled']) && empty($this->configuration['is_panelized']['enabled']))) && !$this->isNegated()) {
      return TRUE;
    }

    // Page Manager support for Panels.
    $request = $this->requestStack->getCurrentRequest();
    $page_manager = $request->attributes->get('page_manager_page');
    if (!empty($page_manager) && $page_manager->access('view')) {
      $variant = $request->attributes->get('page_manager_page_variant');
      if ($variant->access('view')) {
        /** @var \Drupal\ctools\Plugin\BlockVariantInterface $variant_plugin */
        $variant_plugin = $variant->getVariantPlugin();
        if ($variant_plugin->pluginId != 'http_status_code') {
          if (method_exists($variant_plugin, 'getRegionAssignments')) {
            foreach ($variant_plugin->getRegionAssignments() as $blocks) {
              /** @var \Drupal\Core\Block\BlockPluginInterface[] $blocks */
              foreach ($blocks as $block) {
                if ($block->getPluginId() == 'page_title_block') {
                  return TRUE;
                }
              }
            }
          }
        }
      }
    }

    // Layout support for Node / Taxonomy Term.
    $supported_entities = ['node', 'taxonomy_term'];
    foreach ($supported_entities as $supported_entity) {
      $entity = $this->getContextValue($supported_entity);
      if (!empty($entity) && $entity->__isset('layout_builder__layout')) {
        // Layout Builder custom display for individual entity.
        $layout_values = $entity->get('layout_builder__layout')->getValue();
        $section = array_pop($layout_values);
        if (!empty($section['section'])) {
          foreach ($section['section']->getComponents() as $component) {
            $plugin = $component->getPlugin();
            $configuration = $plugin->getConfiguration();
            if ($configuration['id'] == 'field_block:node:page:title' ||
                $configuration['id'] == 'page_title_block') {
              return TRUE;
            }
          }
        }
        else {
          // Layout Builder default display for supported entities.
          $view_modes = $this->entityDisplayRepository->getViewModeOptionsByBundle($entity->getEntityTypeId(), $entity->getType());
          foreach (array_keys($view_modes) as $view_mode) {
            $display = wxt_library_entity_get_display($entity->getEntityTypeId(), $entity->getType(), $view_mode);
            if (($display instanceof LayoutBuilderEntityViewDisplay)) {
              if ($display->getComponent('title')) {
                return TRUE;
              }
            }
          }
        }
      }
    }

    // Panelizer support for Node.
    $node = $this->getContextValue('node');
    if (!empty($node) && $node->__isset('panelizer')) {
      $panelizer = $node->get('panelizer');

      $panelizer_values = $node->get('panelizer')->getValue();
      $view_mode = array_pop($panelizer_values);
      $view_mode = $view_mode['view_mode'];

      $panelizer = \Drupal::service('panelizer');

      $displays = $panelizer->getDefaultPanelsDisplays($node->getEntityTypeId(), $node->bundle(), $view_mode);
      if (!array_key_exists('default', $displays)) {
        return TRUE;
      }
      $display = $displays['default'];

      $display = $panelizer->getEntityViewDisplay($node->getEntityTypeId(), $node->bundle(), $view_mode);
      $render_display = $display->collectRenderDisplay($node, $view_mode);
      $content = $render_display->get('content');

      if (isset($content['title'])) {
        return TRUE;
      }
    }

    // Panelizer support for Taxonomy Term.
    $taxonomy_term = $this->getContextValue('taxonomy_term');
    if (!empty($taxonomy_term) && $taxonomy_term->__isset('panelizer')) {

      $panelizer = $taxonomy_term->get('panelizer');

      $panelizer_values = $taxonomy_term->get('panelizer')->getValue();

      $view_mode = array_pop($panelizer_values);
      $view_mode = $view_mode['view_mode'];

      $panelizer = \Drupal::service('panelizer');

      $displays = $panelizer->getDefaultPanelsDisplays($taxonomy_term->getEntityTypeId(), $taxonomy_term->bundle(), $view_mode);
      if (!array_key_exists('default', $displays)) {
        return TRUE;
      }
      $display = $displays['default'];

      $display = $panelizer->getEntityViewDisplay($taxonomy_term->getEntityTypeId(), $taxonomy_term->bundle(), $view_mode);
      $render_display = $display->collectRenderDisplay($taxonomy_term, $view_mode);
      $content = $render_display->get('content');

      if (isset($content['name'])) {
        return TRUE;
      }
    }

    return FALSE;

  }

  /**
   * Provides a human readable summary of the condition's configuration.
   */
  public function summary() {
    if (!empty($this->configuration['is_panelized'])) {
      return $this->t('Is a panelized page with a title');
    }
  }

  /**
   * {@inheritdoc}
   */
  public function defaultConfiguration() {
    return ['is_panelized' => []] + parent::defaultConfiguration();
  }

}

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

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