. * * The layout's title is shown above the page module and tells the editor * which frontend layout is currently active. */ final class BackendLayoutDataProvider implements DataProviderInterface { /** colPos values across all VITEC backend layouts. * Must NOT collide with container child colPos (>= 211). */ private const COL_POS = [ 'main' => 0, 'hero' => 1, 'sidebar' => 2, 'preFooter' => 3, ]; /** Per-frontend-layout: title + ordered list of zones. */ public const LAYOUT_MAP = [ 0 => ['title' => 'Default', 'zones' => ['main']], 1 => ['title' => 'Index Page', 'zones' => ['hero', 'main', 'preFooter']], 2 => ['title' => 'Markets Overview', 'zones' => ['hero', 'main']], 3 => ['title' => 'Market Detail', 'zones' => ['hero', 'main', 'sidebar']], 4 => ['title' => 'Solutions Overview', 'zones' => ['hero', 'main']], 5 => ['title' => 'Solution Detail', 'zones' => ['hero', 'main', 'sidebar']], 6 => ['title' => 'Use Cases Overview', 'zones' => ['hero', 'main']], 7 => ['title' => 'Use Case Detail', 'zones' => ['hero', 'main', 'sidebar']], 8 => ['title' => 'Products Overview', 'zones' => ['hero', 'main']], 9 => ['title' => 'Product Main Category', 'zones' => ['hero', 'main', 'preFooter']], 10 => ['title' => 'Product Detail', 'zones' => ['hero', 'main', 'sidebar']], 11 => ['title' => 'Support Overview', 'zones' => ['hero', 'main']], 12 => ['title' => 'News Overview', 'zones' => ['hero', 'main']], 13 => ['title' => 'News Detail V1', 'zones' => ['hero', 'main', 'sidebar']], 14 => ['title' => 'News Detail V2', 'zones' => ['hero', 'main']], 15 => ['title' => 'News Detail V3', 'zones' => ['hero', 'main', 'sidebar', 'preFooter']], 16 => ['title' => 'Content Page V1', 'zones' => ['hero', 'main']], 17 => ['title' => 'Content Page V2', 'zones' => ['hero', 'main', 'sidebar']], 18 => ['title' => 'Content Page V3', 'zones' => ['hero', 'main', 'sidebar', 'preFooter']], 19 => ['title' => 'Events Overview', 'zones' => ['hero', 'main']], 20 => ['title' => 'Contact Page', 'zones' => ['hero', 'main', 'sidebar']], ]; /** Display name for each zone. Shown as column header in the BE page module. */ private const ZONE_NAMES = [ 'main' => 'Main Content', 'hero' => 'Hero', 'sidebar' => 'Sidebar', 'preFooter' => 'Pre-Footer', ]; public function addBackendLayouts(DataProviderContext $dataProviderContext, BackendLayoutCollection $backendLayoutCollection) { foreach (self::LAYOUT_MAP as $value => $info) { $backendLayoutCollection->add($this->buildBackendLayout((int)$value, $info['title'], $info['zones'])); } } public function getBackendLayout($identifier, $pageId) { $value = (int)$identifier; if (!isset(self::LAYOUT_MAP[$value])) { return null; } $info = self::LAYOUT_MAP[$value]; return $this->buildBackendLayout($value, $info['title'], $info['zones']); } /** * @param string[] $zones */ private function buildBackendLayout(int $value, string $title, array $zones): BackendLayout { $rowsTs = ''; $rowNum = 1; foreach ($zones as $zoneKey) { $name = self::ZONE_NAMES[$zoneKey]; $colPos = self::COL_POS[$zoneKey]; $rowsTs .= <<" return new BackendLayout( (string)$value, 'VITEC Layout: ' . $title, $configuration ); } }