/** * Gets a given layout with empty regions and relevant metadata. * * @param \Drupal\page_manager\PageVariantInterface $page_variant * The page variant entity. * @param string $layout_id * The machine name of the requested layout. * * @return \Symfony\Component\HttpFoundation\JsonResponse */ public function getLayout(PageVariantInterface $page_variant, $layout_id) { /** @var \Drupal\panels\Plugin\DisplayVariant\PanelsDisplayVariant $variant_plugin */ $variant_plugin = $page_variant->getVariantPlugin(); // Build the requested layout. $configuration = $variant_plugin->getConfiguration(); $configuration['layout'] = $layout_id; $variant_plugin->setConfiguration($configuration); // Inherit our PageVariant's contexts before rendering. $variant_plugin->setContexts($page_variant->getContexts()); $regions = $variant_plugin->getRegionNames(); $region_data = []; $region_content = []; // Compile region content and metadata. foreach ($regions as $id => $label) { // Wrap the region with a class/data attribute that our app can use. $region_name = Html::getClass("block-region-{$id}"); $region_content[$id] = ['#prefix' => '<div class="' . $region_name . '" data-region-name="' . $id . '">', '#suffix' => '</div>']; // Format region metadata. $region_data[] = ['name' => $id, 'label' => $label]; } $build = $variant_plugin->getLayout()->build($region_content); // Get the current layout. $current_layout = $variant_plugin->getLayout()->getPluginId(); // Get a list of all available layouts. $layouts = $this->layoutPluginManager->getLayoutOptions(); $data = ['id' => $layout_id, 'label' => $layouts[$layout_id], 'current' => $current_layout == $layout_id, 'html' => $this->renderer->render($build), 'regions' => $region_data]; // Update temp store. $this->savePageVariant($page_variant); // Return a structured JSON response for our Backbone App. return new JsonResponse($data); }
/** * Get a list of layout options suitable for a select list. * * @return array */ protected function getLayoutOptions() { $options = [MegaMenuInterface::NO_LAYOUT => $this->t('No layout')]; return $options + $this->layoutPluginManager->getLayoutOptions(); }