Chris@0
|
1 <?php
|
Chris@0
|
2
|
Chris@0
|
3 namespace Drupal\views\Element;
|
Chris@0
|
4
|
Chris@0
|
5 use Drupal\Core\Render\Element\RenderElement;
|
Chris@0
|
6 use Drupal\views\Views;
|
Chris@0
|
7
|
Chris@0
|
8 /**
|
Chris@0
|
9 * Provides a render element to display a view.
|
Chris@0
|
10 *
|
Chris@0
|
11 * @RenderElement("view")
|
Chris@0
|
12 */
|
Chris@0
|
13 class View extends RenderElement {
|
Chris@0
|
14
|
Chris@0
|
15 /**
|
Chris@0
|
16 * {@inheritdoc}
|
Chris@0
|
17 */
|
Chris@0
|
18 public function getInfo() {
|
Chris@0
|
19 $class = get_class($this);
|
Chris@0
|
20 return [
|
Chris@0
|
21 '#pre_render' => [
|
Chris@0
|
22 [$class, 'preRenderViewElement'],
|
Chris@0
|
23 ],
|
Chris@0
|
24 '#name' => NULL,
|
Chris@0
|
25 '#display_id' => 'default',
|
Chris@0
|
26 '#arguments' => [],
|
Chris@0
|
27 '#embed' => TRUE,
|
Chris@0
|
28 '#cache' => [],
|
Chris@0
|
29 ];
|
Chris@0
|
30 }
|
Chris@0
|
31
|
Chris@0
|
32 /**
|
Chris@0
|
33 * View element pre render callback.
|
Chris@0
|
34 */
|
Chris@0
|
35 public static function preRenderViewElement($element) {
|
Chris@0
|
36 // Allow specific Views displays to explicitly perform pre-rendering, for
|
Chris@0
|
37 // those displays that need to be able to know the fully built render array.
|
Chris@0
|
38 if (!empty($element['#pre_rendered'])) {
|
Chris@0
|
39 return $element;
|
Chris@0
|
40 }
|
Chris@0
|
41
|
Chris@0
|
42 if (!isset($element['#view'])) {
|
Chris@0
|
43 $view = Views::getView($element['#name']);
|
Chris@0
|
44 }
|
Chris@0
|
45 else {
|
Chris@0
|
46 $view = $element['#view'];
|
Chris@0
|
47 }
|
Chris@0
|
48
|
Chris@0
|
49 $element += $view->element;
|
Chris@0
|
50 $view->element = &$element;
|
Chris@0
|
51 // Mark the element as being prerendered, so other code like
|
Chris@0
|
52 // \Drupal\views\ViewExecutable::setCurrentPage knows that its no longer
|
Chris@0
|
53 // possible to manipulate the $element.
|
Chris@0
|
54 $view->element['#pre_rendered'] = TRUE;
|
Chris@0
|
55
|
Chris@0
|
56 if (isset($element['#response'])) {
|
Chris@0
|
57 $view->setResponse($element['#response']);
|
Chris@0
|
58 }
|
Chris@0
|
59
|
Chris@0
|
60 if ($view && $view->access($element['#display_id'])) {
|
Chris@0
|
61 if (!empty($element['#embed'])) {
|
Chris@0
|
62 $element['view_build'] = $view->preview($element['#display_id'], $element['#arguments']);
|
Chris@0
|
63 }
|
Chris@0
|
64 else {
|
Chris@0
|
65 // Add contextual links to the view. We need to attach them to the dummy
|
Chris@0
|
66 // $view_array variable, since contextual_preprocess() requires that they
|
Chris@0
|
67 // be attached to an array (not an object) in order to process them. For
|
Chris@0
|
68 // our purposes, it doesn't matter what we attach them to, since once they
|
Chris@0
|
69 // are processed by contextual_preprocess() they will appear in the
|
Chris@0
|
70 // $title_suffix variable (which we will then render in
|
Chris@0
|
71 // views-view.html.twig).
|
Chris@0
|
72 $view->setDisplay($element['#display_id']);
|
Chris@0
|
73 // Add the result of the executed view as a child element so any
|
Chris@0
|
74 // #pre_render elements for the view will get processed. A #pre_render
|
Chris@0
|
75 // element cannot be added to the main element as this is already inside
|
Chris@0
|
76 // a #pre_render callback.
|
Chris@0
|
77 $element['view_build'] = $view->executeDisplay($element['#display_id'], $element['#arguments']);
|
Chris@0
|
78
|
Chris@0
|
79 if (isset($element['view_build']['#title'])) {
|
Chris@0
|
80 $element['#title'] = &$element['view_build']['#title'];
|
Chris@0
|
81 }
|
Chris@0
|
82
|
Chris@0
|
83 if (empty($view->display_handler->getPluginDefinition()['returns_response'])) {
|
Chris@0
|
84 // views_add_contextual_links() needs the following information in
|
Chris@0
|
85 // order to be attached to the view.
|
Chris@0
|
86 $element['#view_id'] = $view->storage->id();
|
Chris@0
|
87 $element['#view_display_show_admin_links'] = $view->getShowAdminLinks();
|
Chris@0
|
88 $element['#view_display_plugin_id'] = $view->display_handler->getPluginId();
|
Chris@0
|
89 views_add_contextual_links($element, 'view', $view->current_display);
|
Chris@0
|
90 }
|
Chris@0
|
91 }
|
Chris@0
|
92 if (empty($view->display_handler->getPluginDefinition()['returns_response'])) {
|
Chris@0
|
93 $element['#attributes']['class'][] = 'views-element-container';
|
Chris@0
|
94 $element['#theme_wrappers'] = ['container'];
|
Chris@0
|
95 }
|
Chris@0
|
96 }
|
Chris@0
|
97
|
Chris@0
|
98 return $element;
|
Chris@0
|
99 }
|
Chris@0
|
100
|
Chris@0
|
101 }
|