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{
24- /**
25- * @var array<int, array<string, array<int, array<string, mixed>>>>
26- */
27- private array $ layoutsData ;
28-
2925 public function __construct (
3026 private LayoutService $ layoutService ,
3127 private Connection $ databaseConnection ,
@@ -34,30 +30,45 @@ public function __construct(
3430 /**
3531 * Returns all layouts in which the provided content is used as a component, sorted by name.
3632 *
37- * @return iterable<\Netgen\Layouts\API\Values\Layout\Layout>
33+ * @return array<string, array{
34+ * layout?: \Netgen\Layouts\API\Values\Layout\Layout,
35+ * uuid: string,
36+ * name: string,
37+ * view_types: string[]
38+ * }>
3839 */
3940 public function loadComponentLayouts (ContentInfo $ contentInfo ): iterable
4041 {
41- $ this -> layoutsData ?? = $ this ->loadLayoutsData ();
42+ $ layoutsData = $ this ->loadLayoutsData ();
4243
43- if (!array_key_exists ($ contentInfo ->id , $ this -> layoutsData )) {
44+ if (!array_key_exists ($ contentInfo ->id , $ layoutsData )) {
4445 return [];
4546 }
4647
47- return array_map (
48- fn (array $ layoutData ): Layout => $ this ->layoutService ->loadLayout (Uuid::fromString ($ layoutData ['uuid ' ])),
49- $ this ->layoutsData [$ contentInfo ->id ]['layouts ' ],
50- );
48+ $ componentData = $ layoutsData [$ contentInfo ->id ];
49+
50+ foreach ($ componentData ['layouts ' ] as $ uuid => $ layoutData ) {
51+ $ componentData ['layouts ' ][$ uuid ]['layout ' ] = $ this ->layoutService ->loadLayout (Uuid::fromString ($ uuid ));
52+ }
53+
54+ return $ componentData ['layouts ' ];
5155 }
5256
5357 /**
54- * @return array<int, array<string, array<int, array<string, mixed>>>>
58+ * @return array<int, array{
59+ * layouts: array<string, array{
60+ * uuid: string,
61+ * name: string,
62+ * view_types: string[]
63+ * }>,
64+ * count: int
65+ * }>
5566 */
5667 public function loadLayoutsData (): array
5768 {
5869 $ query = $ this ->databaseConnection ->createQueryBuilder ();
5970
60- $ query ->select ('bt.parameters, l.uuid as layout_uuid, l.name as layout_name ' )
71+ $ query ->select ('b.view_type, bt.parameters, l.uuid as layout_uuid, l.name as layout_name ' )
6172 ->from ('nglayouts_block ' , 'b ' )
6273 ->innerJoin (
6374 'b ' ,
@@ -95,10 +106,17 @@ public function loadLayoutsData(): array
95106 continue ;
96107 }
97108
98- $ layoutsData [(int ) $ decodedParameters ['content ' ]]['layouts ' ][] = [
109+ $ layoutsData [(int ) $ decodedParameters ['content ' ]]['layouts ' ][$ dataRow [ ' layout_uuid ' ]] ?? = [
99110 'uuid ' => $ dataRow ['layout_uuid ' ],
100111 'name ' => $ dataRow ['layout_name ' ],
112+ 'view_types ' => [],
101113 ];
114+
115+ $ layoutsData [(int ) $ decodedParameters ['content ' ]]['layouts ' ][$ dataRow ['layout_uuid ' ]]['view_types ' ][] = $ dataRow ['view_type ' ];
116+ }
117+
118+ foreach ($ layoutsData as $ componentId => $ componentData ) {
119+ $ layoutsData [$ componentId ]['count ' ] = count (array_merge (...array_column ($ componentData ['layouts ' ], 'view_types ' )));
102120 }
103121
104122 return $ layoutsData ;
0 commit comments