b4e4fe1694f3b98f8bcae6155d078a440d3cc9a0
[yaffs-website] / BootstrapLayouts / PageManager.php
1 <?php
2
3 namespace Drupal\bootstrap_layouts\Plugin\BootstrapLayouts;
4
5 use Drupal\bootstrap_layouts\BootstrapLayout;
6
7 /**
8  * Handles Display Suite specific layout implementations.
9  *
10  * @BootstrapLayoutsHandler("page_manager")
11  */
12 class PageManager extends BootstrapLayoutsHandlerBase {
13
14   /**
15    * {@inheritdoc}
16    */
17   public function loadInstances(array $entity_ids = NULL) {
18     $layouts = [];
19     $properties = ['variant' => 'panels_variant'];
20     if ($entity_ids) {
21       $properties['id'] = $entity_ids;
22     }
23     /** @var \Drupal\Core\Entity\EntityTypeManager $entity_type_manager */
24     $entity_type_manager = $this->container->get('entity_type.manager');
25     /** @var \Drupal\Core\Config\Entity\ConfigEntityInterface[] $config_entities */
26     $config_entities = $entity_type_manager->getStorage('page_variant')->loadByProperties($properties);
27     foreach ($config_entities as $entity_id => $config_entity) {
28       if (($info = $config_entity->get('variant_settings')) && isset($info['layout']) && isset($info['blocks'])) {
29         $id = $info['layout'];
30
31         // BootstrapLayout requires an associative array of "items" assigned to
32         // a particular region, keyed by that region. Unfortunately, Page
33         // Manager stores this value inside each block array; extract it.
34         $regions = [];
35         foreach ($info['blocks'] as $uuid => $block) {
36           $regions[$block['region']][$uuid] = $block;
37         }
38
39         // Retrieve any layout settings.
40         $settings = isset($info['layout_settings']) ? $info['layout_settings'] : [];
41
42         // Create a new BootstrapLayout instance.
43         $layouts[$entity_id] = new BootstrapLayout($id, $regions, $settings);
44       }
45     }
46     return $layouts;
47   }
48
49   /**
50    * {@inheritdoc}
51    */
52   public function saveInstances(array $layouts = []) {
53     /** @var \Drupal\Core\Entity\EntityTypeManager $entity_type_manager */
54     $entity_type_manager = $this->container->get('entity_type.manager');
55
56     /** @var \Drupal\Core\Config\Entity\ConfigEntityInterface[] $config_entities */
57     $config_entities = $entity_type_manager->getStorage('page_variant')
58       ->loadByProperties(['variant' => 'panels_variant', 'id' => array_keys($layouts)]);
59
60     /** @var \Drupal\bootstrap_layouts\BootstrapLayout[] $layouts */
61     foreach ($layouts as $entity_id => $layout) {
62       $config_entity = $config_entities[$entity_id];
63       $info = $config_entity->get('variant_settings');
64       $info['layout'] = $layout->getId();
65
66       // The region is stored inside the block array. To effectively change
67       // a region for a block, the variant's blocks must be iterated over and
68       // changed manually based on the associative region key provided by the
69       // BootstrapLayout instance.
70       $info['blocks'] = [];
71       foreach ($layout->getRegions() as $region => $blocks) {
72         foreach ($blocks as $uuid => $block) {
73           $block['region'] = $region;
74           $info['blocks'][$uuid] = $block;
75         }
76       }
77
78       $info['layout_settings'] = $layout->getSettings();
79       $config_entity->set('variant_settings', $info)->save();
80     }
81   }
82
83 }