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

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

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