display_builder-1.0.x-dev/modules/display_builder_views/display_builder_views.module
modules/display_builder_views/display_builder_views.module
<?php
/**
* @file
* Contains the display builder views module.
*
* @todo hook when view is deleted to delete display builder associated to view.
*/
declare(strict_types=1);
use Drupal\Core\Plugin\Context\Context;
use Drupal\Core\Plugin\Context\ContextDefinition;
use Drupal\Core\Plugin\Context\EntityContext;
/**
* Implements hook_theme_registry_alter().
*/
function display_builder_views_theme_registry_alter(array &$theme_registry): void {
$isAdmin = Drupal::service('router.admin_context')->isAdminRoute();
if ($isAdmin) {
return;
}
$template_uri = Drupal::service('extension.list.module')->getPath('display_builder_views') . '/templates';
$theme_registry['views_view']['path'] = $template_uri;
}
/**
* Implements hook_preprocess_views_view().
*/
function display_builder_views_preprocess_views_view(array &$variables): void {
$view = $variables['view'];
$current_display = $view->getDisplay();
$extenders = $current_display->getExtenders();
if (!isset($extenders['display_builder'])) {
return;
}
$options = $extenders['display_builder']->options;
$builder_config_id = $options['builder_config_id'] ?? NULL;
if ($builder_config_id === NULL || empty($builder_config_id)) {
// @todo something for preview?
return;
}
$display_builder_id = $options['display_builder_id'] ?? NULL;
if ($display_builder_id === NULL || empty($display_builder_id)) {
// @todo something for preview?
return;
}
/** @var \Drupal\display_builder\StateManager\StateManagerInterface $stateManager */
$stateManager = Drupal::service('display_builder.state_manager');
if ($stateManager->load($display_builder_id) === NULL) {
// @todo if instance is deleted, create a blank one?
return;
}
// Inject the view in context to be available by our UI Patterns source
// plugins.
$contexts = [];
$view_entity = Drupal::entityTypeManager()->getStorage('view')->load($view->id());
$contexts['ui_patterns_views:view_entity'] = EntityContext::fromEntity($view_entity);
$contexts['ui_patterns_views:rows'] = new Context(new ContextDefinition('any'), $variables['rows'] ?? []);
// @todo pass all variables for each source, find a way to do it sooner than
// in this preprocess if possible.
$contexts['ui_patterns_views:variables'] = new Context(new ContextDefinition('any'), $variables);
$builder_data = $stateManager->getCurrentState($display_builder_id) ?? [];
/** @var \Drupal\ui_patterns\Element\ComponentElementBuilder $componentElementBuilder */
$componentElementBuilder = Drupal::service('ui_patterns.component_element_builder');
$fake_build = [];
foreach ($builder_data as $source_data) {
$fake_build = $componentElementBuilder->buildSource($fake_build, 'content', [], $source_data, $contexts);
}
// Init the variable to render in views-view.html.twig.
$variables['display_builder'] = $fake_build['#slots']['content'] ?? [];
$variables['display_builder']['#cache'] = $fake_build['#cache'] ?? [];
}
