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)']);
}
}
}
