Commit cff7854b authored by Volodymyr Mostepaniuk's avatar Volodymyr Mostepaniuk
Browse files

Issue #3295753 by mostepaniukvm: Move DefaultContentEntityUiProcessor...

Issue #3295753 by mostepaniukvm: Move DefaultContentEntityUiProcessor implementation into DefaultContentEntityProcessor.
parent ed2a687b
Loading
Loading
Loading
Loading
+0 −71
Original line number Diff line number Diff line
<?php

namespace Drupal\custom_elements_ui\Processor;

use Drupal\Core\Entity\ContentEntityInterface;
use Drupal\Core\Entity\Entity\EntityViewDisplay;
use Drupal\custom_elements\CustomElement;
use Drupal\custom_elements\CustomElementGeneratorTrait;
use Drupal\custom_elements\CustomElementsProcessorFieldUtilsTrait;
use Drupal\custom_elements\Processor\CustomElementProcessorInterface;

/**
 * Custom elements ui processor for content entities.
 */
class DefaultContentEntityUiProcessor implements CustomElementProcessorInterface {

  use CustomElementGeneratorTrait;
  use CustomElementsProcessorFieldUtilsTrait;

  /**
   * {@inheritdoc}
   */
  public function supports($data, $view_mode) {
    if ($data instanceof ContentEntityInterface) {
      $display = EntityViewDisplay::collectRenderDisplay($data, $view_mode);
      $is_enabled = $display->getThirdPartySetting('custom_elements', 'enabled', FALSE);
      // @todo Do not check it here but have proper validation instead.
      $ce_name = $display->getThirdPartySetting('custom_elements', 'custom_element_name', '');
      $ce_fields = $display->getThirdPartySetting('custom_elements', 'custom_element_fields', []);
      $is_configured_properly = !empty($ce_name) && !empty($ce_fields);
      return $is_enabled && $is_configured_properly;
    }

    return FALSE;
  }

  /**
   * {@inheritdoc}
   */
  public function addtoElement($data, CustomElement $element, $view_mode) {
    assert($data instanceof ContentEntityInterface);
    $entity = $data;

    $display = EntityViewDisplay::collectRenderDisplay($data, $view_mode);
    $ce_fields = $display->getThirdPartySetting('custom_elements', 'custom_element_fields', []);
    $ce_name = $display->getThirdPartySetting('custom_elements', 'custom_element_name', '');
    $element->setTag($ce_name);

    foreach ($ce_fields as $field_name => $options) {
      if ($this->fieldIsAccessible($entity, $field_name, $element)) {
        if ($options['is_slot']) {
          $nested_elements = [];
          foreach ($entity->get($field_name) as $field_item) {
            $nested_element = new CustomElement();
            $nested_element->setTagPrefix('field');
            $nested_element->setTag($entity->get($field_name)->getFieldDefinition()->getType());
            $this->getCustomElementGenerator()->process($field_item, $nested_element, $view_mode);
            $nested_elements[] = $nested_element;
          }
          $element->setSlotFromNestedElements($options['label'], $nested_elements);
        }
        else {
          $field_items = $entity->get($field_name);
          $property = $field_items->getFieldDefinition()->getFieldStorageDefinition()->getMainPropertyName();
          $element->setAttribute($options['label'], $field_items->{$property});
        }
      }
    }
  }

}
+51 −1
Original line number Diff line number Diff line
@@ -3,6 +3,7 @@
namespace Drupal\custom_elements\Processor;

use Drupal\Core\Entity\ContentEntityInterface;
use Drupal\Core\Entity\Display\EntityViewDisplayInterface;
use Drupal\Core\Entity\Entity\EntityViewDisplay;
use Drupal\Core\Entity\EntityInterface;
use Drupal\Core\Entity\EntityTypeManagerInterface;
@@ -90,10 +91,18 @@ class DefaultContentEntityProcessor implements CustomElementProcessorInterface {
    $displays = EntityViewDisplay::collectRenderDisplays([$entity], $viewMode);
    $display = reset($displays);

    if ($display->getThirdPartySetting('layout_builder', 'enabled')) {
    // If custom element for given view mode was configured in UI then render it
    // accordingly.
    $ce_display_fields = $display->getThirdPartySetting('custom_elements', 'custom_element_fields', []);
    if (!empty($ce_display_fields)) {
      $this->buildConfiguredCustomElement($entity, $element, $display);
    }
    // Otherwise render it from layout builder config if enabled/
    elseif ($display->getThirdPartySetting('layout_builder', 'enabled')) {
      // Skip processing of the fields and let the layout builder render it all.
      $this->addLayoutBuilderContent($entity, $element, $display);
    }
    // Or render every view mode component automatically.
    else {
      foreach ($display->getComponents() as $field_name => $options) {
        if ($this->fieldIsAccessible($entity, $field_name, $element)) {
@@ -139,6 +148,47 @@ class DefaultContentEntityProcessor implements CustomElementProcessorInterface {
    $custom_element->addCacheableDependency(BubbleableMetadata::createFromRenderArray($build));
  }

  /**
   * Builds custom element from configuration.
   *
   * @param \Drupal\Core\Entity\EntityInterface $entity
   *   The entity.
   * @param \Drupal\custom_elements\CustomElement $custom_element
   *   The custom element.
   * @param \Drupal\Core\Entity\Display\EntityViewDisplayInterface $display
   *   Entity view display entity.
   */
  protected function buildConfiguredCustomElement(EntityInterface $entity, CustomElement $custom_element, EntityViewDisplayInterface $display) {
    // Set custom element name if configured.
    // @todo Should custom element name be optional in the form?
    $ce_name = $display->getThirdPartySetting('custom_elements', 'custom_element_name');
    if (!empty($ce_name)) {
      $custom_element->setTag($ce_name);
    }
    $ce_display_fields = $display->getThirdPartySetting('custom_elements', 'custom_element_fields', []);
    foreach ($ce_display_fields as $field_name => $field_options) {
      if ($this->fieldIsAccessible($entity, $field_name, $custom_element)) {
        if ($field_options['is_slot']) {
          $nested_elements = [];
          foreach ($entity->get($field_name) as $field_item) {
            $nested_element = new CustomElement();
            $nested_element->setTagPrefix('field');
            $nested_element->setTag($entity->get($field_name)->getFieldDefinition()->getType());
            // @todo Check if $display->id() returns expected value.
            $this->getCustomElementGenerator()->process($field_item, $nested_element, $display->id());
            $nested_elements[] = $nested_element;
          }
          $custom_element->setSlotFromNestedElements($field_options['label'], $nested_elements);
        }
        else {
          $field_items = $entity->get($field_name);
          $property = $field_items->getFieldDefinition()->getFieldStorageDefinition()->getMainPropertyName();
          $custom_element->setAttribute($field_options['label'], $field_items->{$property});
        }
      }
    }
  }

  /**
   * Converts the block content render array into custom elements.
   *