layout_builder_tomsaw-1.0.x-dev/src/EventSubscriber/LayoutBuilderTomsawSubscriber.php

src/EventSubscriber/LayoutBuilderTomsawSubscriber.php
<?php

namespace Drupal\layout_builder_tomsaw\EventSubscriber;

use Drupal\Core\Url;
use Drupal\Core\Routing\RouteMatchInterface;
use Drupal\layout_builder\Form\AddBlockForm;
use Drupal\layout_builder\LayoutBuilderEvents;
use Symfony\Component\HttpKernel\KernelEvents;

use Drupal\core_event_dispatcher\FormHookEvents;
use Symfony\Component\HttpKernel\Event\RequestEvent;

use Drupal\layout_builder\Form\ConfigureBlockFormBase;
use Drupal\core_event_dispatcher\Event\Form\FormAlterEvent;
use Drupal\core_event_dispatcher\Event\Form\FormIdAlterEvent;
use Drupal\layout_builder_tomsaw\LayoutBuilderTomSawCallback;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Drupal\layout_builder\Event\SectionComponentBuildRenderArrayEvent;

/**
 * Layout Builder TomSaw event subscriber.
 */
class LayoutBuilderTomsawSubscriber implements EventSubscriberInterface
{
  public function __construct(
    private readonly RouteMatchInterface $currentRoute
  ) {
  }

  /**
   * {@inheritdoc}
   */
  public static function getSubscribedEvents(): array
  {
    return [
      FormHookEvents::FORM_ALTER => 'formAlter',
      'hook_event_dispatcher.form_layout_builder_add_block.alter' => 'addBlock',
      LayoutBuilderEvents::SECTION_COMPONENT_BUILD_RENDER_ARRAY => ['onBuildRender', 50],
      KernelEvents::REQUEST => ['onKernelRequest']
    ];
  }

  public function formAlter(FormAlterEvent $event): void
  {
    $form = &$event->getForm();
    // Various Objects to source information from
    $form_state = $event->getFormState();
    $form_object = $form_state->getFormObject();
    // $base_form_id = $form_object->getBaseFormId();
    // $form_id = $form_object->getFormId();

    if ($form_object instanceof OverridesEntityForm)
      $form['#weight'] = 10;

    if ($form_object instanceof ConfigureBlockFormBase) {
      $form['settings']['admin_label']['#title'] = [
        '#type' => 'html_tag',
        '#tag' => 'h1',
        '#value' => strval($form['settings']['admin_label']['#plain_text']) . " block"
      ];
      $form['settings']['admin_label']['#weight'] = -20;
      unset($form['settings']['admin_label']['#plain_text']);

      // @optimize whats poermitting access to the block label?
      $form['settings']['admin_label']['#access'] = true;
      
      // ui_styles opens used details container with form_styles
      // We close them, to avoid endless scrolling due to many styles 
      foreach ($form as $key => &$children)
        if(str_starts_with($key, "ui_styles",) && isset($children['#open']))
          $children['#open'] = FALSE;

      // $section = $form_object->getCurrentSection();
      $component = $form_object->getCurrentComponent();
      $component_id = $component->get('configuration')['id'];
      // Uses the same architecture like ui_styles
      // @see ui_styles_layout_builder.module
      if ($component_id == "entity_block:media") {
        $form['settings']['object_fit'] = [
          '#type' => 'select',
          '#title' => "Object Fit",
          '#empty_option' => "- Fill -",
          '#options' => [
            'cover' => 'Cover',
            'contain' => 'Contain',
            'scale-down' => 'Scale Down',
            'none' => 'None'
          ],
          '#default_value' => $component->get('object_fit')
        ];

        // Our submit handler must execute before the default one, because the
        // default handler stores the section & component data in the tempstore
        // and we need to update those objects before that happens.
        array_unshift($form['#submit'], [LayoutBuilderTomSawCallback::class, 'blockPlugin_submit']);
      }
      // Alternatively, use $component and $component_id to gather information
      if(isset($form['settings']['ui_patterns'])) {
        $pattern = explode(':', $form['settings']['ui_patterns']['#component_id']);

        $form['settings']['ui_patterns_library_single'] = [
          '#type' => 'link',
          '#title' => t("View Library "),
          '#url' => Url::fromRoute(
            "ui_patterns_library.single", 
            [
              'provider' => $pattern[0],
              'machineName' => $pattern[1]
            ]
          ),
          '#attributes' => [
            'class' => ['button'],
            'target' => '_blank'
          ],
          '#weight' => -9
        ];
      }
    }

    // Better default settings for new Blocks
    if ($form_object instanceof AddBlockForm) {
      // Disable Block Label rendering
      $form['settings']['label_display']['#default_value'] = false;
    }
  }

  /**
   * Adjust some block_content default_values
   */
  public function addBlock(FormIdAlterEvent $event): void
  {
    $formatter = &$event->getForm()['settings']['formatter'];

    $formatter['label']['#default_value'] = "hidden";

    if (isset($formatter['type']['#options']['entity_reference_entity_view'])) {
      $formatter['type']['#default_value'] = 'entity_reference_entity_view';
    }
  }

  public function onBuildRender(SectionComponentBuildRenderArrayEvent $event): void
  {
    $component = $event->getComponent();
    $object_fit = $component->get('object_fit');
    if ($object_fit) {
      $build = $event->getBuild();
      $build['#attributes']['class'][] = 'forward-height';
      $build['#attributes']['class'][] = 'of-' . $object_fit;
      $event->setBuild($build);
    }
  }

  /**
   * Kernel request event handler.
   *
   * @param \Symfony\Component\HttpKernel\Event\RequestEvent $event
   *   Response event.
   */
  public function onKernelRequest(RequestEvent $event)
  {
    $routename = $this->currentRoute->getRouteName();

    if (str_starts_with($routename, 'layout_builder.')) {
      $event->getRequest()->request->set('dialogOptions', ['width' => 'min(90vw, 36rem)']);
    }
  }
}

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

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