3 namespace Drupal\bootstrap_layouts\Plugin\BootstrapLayouts;
5 use Drupal\bootstrap_layouts\BootstrapLayout;
8 * Handles Display Suite specific layout implementations.
10 * @BootstrapLayoutsHandler("page_manager")
12 class PageManager extends BootstrapLayoutsHandlerBase {
17 public function loadInstances(array $entity_ids = NULL) {
19 $properties = ['variant' => 'panels_variant'];
21 $properties['id'] = $entity_ids;
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'];
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.
35 foreach ($info['blocks'] as $uuid => $block) {
36 $regions[$block['region']][$uuid] = $block;
39 // Retrieve any layout settings.
40 $settings = isset($info['layout_settings']) ? $info['layout_settings'] : [];
42 // Create a new BootstrapLayout instance.
43 $layouts[$entity_id] = new BootstrapLayout($id, $regions, $settings);
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');
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)]);
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();
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.
71 foreach ($layout->getRegions() as $region => $blocks) {
72 foreach ($blocks as $uuid => $block) {
73 $block['region'] = $region;
74 $info['blocks'][$uuid] = $block;
78 $info['layout_settings'] = $layout->getSettings();
79 $config_entity->set('variant_settings', $info)->save();