Code Coverage
 
Lines
Branches
Paths
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 21
0.00% covered (danger)
0.00%
0 / 10
0.00% covered (danger)
0.00%
0 / 9
0.00% covered (danger)
0.00%
0 / 2
CRAP
0.00% covered (danger)
0.00%
0 / 1
PreprocessViewsView
0.00% covered (danger)
0.00%
0 / 21
0.00% covered (danger)
0.00%
0 / 10
0.00% covered (danger)
0.00%
0 / 9
0.00% covered (danger)
0.00%
0 / 2
42
0.00% covered (danger)
0.00%
0 / 1
 __construct
0.00% covered (danger)
0.00%
0 / 1
n/a
0 / 0
n/a
0 / 0
0.00% covered (danger)
0.00%
0 / 1
2
 preprocessViewsView
0.00% covered (danger)
0.00%
0 / 20
0.00% covered (danger)
0.00%
0 / 10
0.00% covered (danger)
0.00%
0 / 9
0.00% covered (danger)
0.00%
0 / 1
30
1<?php
2
3declare(strict_types=1);
4
5namespace Drupal\display_builder_views\Hook;
6
7use Drupal\Core\Entity\EntityTypeManagerInterface;
8use Drupal\Core\Hook\Attribute\Hook;
9use Drupal\Core\Plugin\Context\Context;
10use Drupal\Core\Plugin\Context\ContextDefinition;
11use Drupal\Core\Plugin\Context\EntityContext;
12use Drupal\display_builder\DisplayBuildablePluginManager;
13use Drupal\ui_patterns\Element\ComponentElementBuilder;
14use Symfony\Component\DependencyInjection\Attribute\Autowire;
15
16/**
17 * Hook implementations for the display_builder_views module.
18 */
19class PreprocessViewsView {
20
21  public function __construct(
22    protected EntityTypeManagerInterface $entityTypeManager,
23    #[Autowire('@ui_patterns.component_element_builder')]
24    protected ComponentElementBuilder $componentElementBuilder,
25    #[Autowire('@plugin.manager.display_buildable')]
26    private DisplayBuildablePluginManager $displayBuildableManager,
27  ) {}
28
29  /**
30   * Implements hook_preprocess_HOOK() for 'views_view'.
31   *
32   * @param array $variables
33   *   An associative array containing the variables to pass to the template.
34   */
35  #[Hook('preprocess_views_view')]
36  public function preprocessViewsView(array &$variables): void {
37    $view = $variables['view'];
38    $extenders = $view->getDisplay()->getExtenders();
39
40    if (!isset($extenders['display_builder'])) {
41      return;
42    }
43
44    $extender = $extenders['display_builder'];
45    /** @var \Drupal\display_builder\DisplayBuildableInterface $buildable */
46    $buildable = $this->displayBuildableManager->createInstance('view_display', ['extender' => $extender]);
47    $sources = $buildable->getSources();
48
49    // We fallback on normal View if Display Builder is empty or disabled!
50    if (empty($sources) || !$buildable->getProfile()) {
51      return;
52    }
53
54    // Inject the view in context to be available by our UI Patterns source
55    // plugins.
56    $contexts = [];
57    $view_entity = $this->entityTypeManager->getStorage('view')->load($view->id());
58    $contexts['ui_patterns_views:view_entity'] = EntityContext::fromEntity($view_entity);
59    $contexts['ui_patterns_views:view'] = new Context(new ContextDefinition('any'), $view);
60    $contexts['ui_patterns_views:rows'] = new Context(new ContextDefinition('any'), $variables['rows'] ?? []);
61    // @todo pass all variables for each source, find a way to do it sooner than
62    // in this preprocess if possible.
63    $contexts['ui_patterns_views:variables'] = new Context(new ContextDefinition('any'), $variables);
64
65    $fake_build = [];
66
67    foreach ($sources as $source) {
68      $fake_build = $this->componentElementBuilder->buildSource($fake_build, 'content', [], $source, $contexts);
69    }
70
71    // Init the variable to render in views-view.html.twig.
72    // @see \Drupal\display_builder_views\Plugin\views\display_extender\DisplayExtender::preExecute()
73    $variables['content'] = $fake_build['#slots']['content'] ?? [];
74    $variables['content']['#cache'] = $fake_build['#cache'] ?? [];
75  }
76
77}