Including security review as a submodule - with patched for Yaffs.
[yaffs-website] / web / modules / contrib / blazy / src / BlazyGrid.php
1 <?php
2
3 namespace Drupal\blazy;
4
5 use Drupal\Component\Serialization\Json;
6
7 /**
8  * Provides grid utilities.
9  */
10 class BlazyGrid {
11
12   /**
13    * Returns items as a grid display wrapped by theme_item_list().
14    *
15    * @param array $items
16    *   The grid items being modified.
17    * @param array $settings
18    *   The given settings.
19    *
20    * @return array
21    *   The modified array of grid items.
22    */
23   public static function build(array $items = [], array $settings = []) {
24     $blazy = empty($settings['blazy_data']) ? '' : Json::encode($settings['blazy_data']);
25     $settings['style'] = empty($settings['style']) ? 'grid' : $settings['style'];
26
27     $grids = [];
28     foreach ($items as $delta => $item) {
29       // @todo: Support non-Blazy which normally uses item_id.
30       $item_settings = isset($item['#build']['settings']) ? $item['#build']['settings'] : $settings;
31       $item_settings['delta'] = $delta;
32
33       // Supports both single formatter field and complex fields such as Views.
34       $grid = [];
35       $grid['content'] = [
36         '#theme'      => 'container',
37         '#children'   => $item,
38         '#attributes' => ['class' => ['grid__content']],
39       ];
40
41       self::buildGridItemAttributes($grid, $item_settings);
42
43       $grids[] = $grid;
44       unset($grid);
45     }
46
47     $count = empty($settings['count']) ? count($grids) : $settings['count'];
48     $element = [
49       '#theme' => 'item_list',
50       '#items' => $grids,
51       '#context' => ['settings' => $settings],
52       '#attributes' => [
53         'class' => [
54           'blazy',
55           'blazy--grid',
56           'block-' . $settings['style'],
57           'block-count-' . $count,
58         ],
59         'data-blazy' => $blazy,
60       ],
61       '#wrapper_attributes' => [
62         'class' => ['item-list--blazy', 'item-list--blazy-' . $settings['style']],
63       ],
64     ];
65
66     if (!empty($settings['media_switch'])) {
67       $switch = str_replace('_', '-', $settings['media_switch']);
68       $element['#attributes']['data-' . $switch . '-gallery'] = TRUE;
69     }
70
71     $settings['grid_large'] = $settings['grid'];
72     foreach (['small', 'medium', 'large'] as $grid) {
73       if (!empty($settings['grid_' . $grid])) {
74         $element['#attributes']['class'][] = $grid . '-block-' . $settings['style'] . '-' . $settings['grid_' . $grid];
75       }
76     }
77
78     return $element;
79   }
80
81   /**
82    * Modifies the grid item wrapper attributes.
83    *
84    * @param array $grid
85    *   The grid item being modified.
86    * @param array $settings
87    *   The given settings.
88    */
89   public static function buildGridItemAttributes(array &$grid = [], array $settings = []) {
90     if (!empty($settings['grid_item_class'])) {
91       $grid['#wrapper_attributes']['class'][] = $settings['grid_item_class'];
92     }
93
94     $grid['#wrapper_attributes']['class'][] = 'grid';
95
96     if (!empty($settings['type'])) {
97       $grid['#wrapper_attributes']['class'][] = 'grid--' . $settings['type'];
98     }
99
100     if (!empty($settings['media_switch'])) {
101       $grid['#wrapper_attributes']['class'][] = 'grid--' . str_replace('_', '-', $settings['media_switch']);
102     }
103
104     $grid['#wrapper_attributes']['class'][] = 'grid--' . $settings['delta'];
105   }
106
107 }