99use Ibexa \Contracts \Core \Repository \Values \Content \ContentInfo ;
1010use JsonException ;
1111use Netgen \Layouts \API \Service \LayoutService ;
12- use Netgen \Layouts \API \Values \Layout \Layout ;
1312use Netgen \Layouts \API \Values \Value ;
1413use Ramsey \Uuid \Uuid ;
1514
15+ use function array_column ;
1616use function array_key_exists ;
17- use function array_map ;
17+ use function array_merge ;
18+ use function count ;
1819use function json_decode ;
1920
2021use const JSON_THROW_ON_ERROR ;
2122
2223final class ComponentLayoutsLoader
2324{
2425 /**
25- * @var array<int, array<string, array<int, array<string, mixed>>>>
26+ * @var array<int, array{
27+ * layouts: array<string, array{
28+ * uuid: string,
29+ * name: string,
30+ * view_types: string[]
31+ * }>,
32+ * count: int
33+ * }>
2634 */
2735 private array $ layoutsData ;
2836
@@ -34,7 +42,12 @@ public function __construct(
3442 /**
3543 * Returns all layouts in which the provided content is used as a component, sorted by name.
3644 *
37- * @return iterable<\Netgen\Layouts\API\Values\Layout\Layout>
45+ * @return array<string, array{
46+ * layout: \Netgen\Layouts\API\Values\Layout\Layout,
47+ * uuid: string,
48+ * name: string,
49+ * view_types: string[]
50+ * }>
3851 */
3952 public function loadComponentLayouts (ContentInfo $ contentInfo ): iterable
4053 {
@@ -44,20 +57,30 @@ public function loadComponentLayouts(ContentInfo $contentInfo): iterable
4457 return [];
4558 }
4659
47- return array_map (
48- fn (array $ layoutData ): Layout => $ this ->layoutService ->loadLayout (Uuid::fromString ($ layoutData ['uuid ' ])),
49- $ this ->layoutsData [$ contentInfo ->id ]['layouts ' ],
50- );
60+ $ layoutsData = $ this ->layoutsData [$ contentInfo ->id ];
61+
62+ foreach ($ layoutsData ['layouts ' ] as $ uuid => $ layoutData ) {
63+ $ layoutsData ['layouts ' ][$ uuid ]['layout ' ] = $ this ->layoutService ->loadLayout (Uuid::fromString ($ uuid ));
64+ }
65+
66+ return $ layoutsData ['layouts ' ];
5167 }
5268
5369 /**
54- * @return array<int, array<string, array<int, array<string, mixed>>>>
70+ * @return array<int, array{
71+ * layouts: array<string, array{
72+ * uuid: string,
73+ * name: string,
74+ * view_types: string[]
75+ * }>,
76+ * count: int
77+ * }>
5578 */
5679 public function loadLayoutsData (): array
5780 {
5881 $ query = $ this ->databaseConnection ->createQueryBuilder ();
5982
60- $ query ->select ('bt.parameters, l.uuid as layout_uuid, l.name as layout_name ' )
83+ $ query ->select ('b.view_type, bt.parameters, l.uuid as layout_uuid, l.name as layout_name ' )
6184 ->from ('nglayouts_block ' , 'b ' )
6285 ->innerJoin (
6386 'b ' ,
@@ -95,10 +118,17 @@ public function loadLayoutsData(): array
95118 continue ;
96119 }
97120
98- $ layoutsData [(int ) $ decodedParameters ['content ' ]]['layouts ' ][] = [
121+ $ layoutsData [(int ) $ decodedParameters ['content ' ]]['layouts ' ][$ dataRow [ ' layout_uuid ' ]] ?? = [
99122 'uuid ' => $ dataRow ['layout_uuid ' ],
100123 'name ' => $ dataRow ['layout_name ' ],
124+ 'view_types ' => [],
101125 ];
126+
127+ $ layoutsData [(int ) $ decodedParameters ['content ' ]]['layouts ' ][$ dataRow ['layout_uuid ' ]]['view_types ' ][] = $ dataRow ['view_type ' ];
128+ }
129+
130+ foreach ($ layoutsData as $ componentId => $ componentData ) {
131+ $ layoutsData [$ componentId ]['count ' ] = count (array_merge (...array_column ($ componentData ['layouts ' ], 'view_types ' )));
102132 }
103133
104134 return $ layoutsData ;
0 commit comments