lb_plus-1.0.x-dev/src/EventSubscriber/EditableUiBuilder.php

src/EventSubscriber/EditableUiBuilder.php
<?php

declare(strict_types=1);

namespace Drupal\lb_plus\EventSubscriber;

use Drupal\lb_plus\LbPlusEntityHelperTrait;
use Drupal\Core\Config\ConfigFactoryInterface;
use Drupal\Core\Entity\EntityDisplayRepositoryInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Drupal\navigation_plus\Event\EditableUiBuilder as EditableUiBuilderEvent;

final class EditableUiBuilder implements EventSubscriberInterface {

  use LbPlusEntityHelperTrait;

  public function __construct(
    protected EntityDisplayRepositoryInterface $entityDisplayRepository,
    protected ConfigFactoryInterface $configFactory,
  ) {}

  public function onUiBuild(EditableUiBuilderEvent $event): void {
    if ($event->getMode() !== 'edit') {
      return;
    }
    $entity = $event->getEntity();
    $view_mode = $event->getViewMode();
    $display = _navigation_plus_get_entity_view_display($entity, $view_mode);
    if ($display && $display->getThirdPartySetting('layout_builder', 'enabled', FALSE)) {
      $section_storage = $this->getSectionStorageForEntity($entity, $display->getMode());
      if ($section_storage) {
        $build = $event->getBuild();
        $preserved_fields = $display->getThirdPartySetting('edit_plus_lb', 'preserved_fields', []);

        // Override the node build with the layout builder UI.
        $field_names = array_keys($entity->getFieldDefinitions());
        $field_names = array_diff($field_names, $preserved_fields);
        $build = array_diff_key($build, array_flip($field_names));
        unset($build['_layout_builder']);
        $build['layout'] = [
          '#type' => 'layout_builder_plus',
          '#section_storage' => $section_storage,
        ];
        $event->setBuild($build);
      }
    }
  }

  /**
   * {@inheritdoc}
   */
  public static function getSubscribedEvents(): array {
    return [
      EditableUiBuilderEvent::class => ['onUiBuild'],
    ];
  }

}

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

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