5050use Sulu \Component \Security \Authorization \SecurityCheckerInterface ;
5151use Sulu \Component \Security \Authorization \SecurityCondition ;
5252use Sulu \Component \Security \SecuredControllerInterface ;
53+ use Sulu \Component \Webspace \Manager \WebspaceManagerInterface ;
5354use Symfony \Component \Form \FormFactoryInterface ;
5455use Symfony \Component \HttpFoundation \Request ;
5556use Symfony \Component \HttpFoundation \Response ;
@@ -119,6 +120,11 @@ class ArticleController extends AbstractRestController implements ClassResourceI
119120 */
120121 private $ documentInspector ;
121122
123+ /**
124+ * @var WebspaceManagerInterface|null
125+ */
126+ private $ webspaceManager ;
127+
122128 public function __construct (
123129 ViewHandlerInterface $ viewHandler ,
124130 DocumentManagerInterface $ documentManager ,
@@ -132,7 +138,8 @@ public function __construct(
132138 SecurityCheckerInterface $ securityChecker ,
133139 bool $ displayTabAll ,
134140 ?TokenStorageInterface $ tokenStorage = null ,
135- ?DocumentInspector $ documentInspector = null
141+ ?DocumentInspector $ documentInspector = null ,
142+ ?WebspaceManagerInterface $ webspaceManager = null
136143 ) {
137144 parent ::__construct ($ viewHandler , $ tokenStorage );
138145
@@ -147,10 +154,15 @@ public function __construct(
147154 $ this ->securityChecker = $ securityChecker ;
148155 $ this ->displayTabAll = $ displayTabAll ;
149156 $ this ->documentInspector = $ documentInspector ;
157+ $ this ->webspaceManager = $ webspaceManager ;
150158
151159 if (null === $ this ->documentInspector ) {
152160 @trigger_deprecation ('sulu/article-bundle ' , '2.5 ' , 'Instantiating the ArticleController without the $documentInspector argument is deprecated! ' );
153161 }
162+
163+ if (null === $ this ->webspaceManager ) {
164+ @trigger_deprecation ('sulu/article-bundle ' , '2.6 ' , 'Instantiating the ArticleController without the $webspaceManager argument is deprecated! ' );
165+ }
154166 }
155167
156168 /**
@@ -177,6 +189,9 @@ protected function getFieldDescriptors(): array
177189 ->setSearchField ('title ' )
178190 ->setSearchability (FieldDescriptor::SEARCHABILITY_YES )
179191 ->build (),
192+ 'mainWebspace ' => ElasticSearchFieldDescriptor::create ('mainWebspace ' , 'public.main_webspace ' )
193+ ->setSearchability (FieldDescriptor::SEARCHABILITY_NO )
194+ ->build (),
180195 'creatorFullName ' => ElasticSearchFieldDescriptor::create ('creatorFullName ' , 'sulu_article.list.creator ' )
181196 ->setSortField ('creatorFullName.raw ' )
182197 ->build (),
@@ -246,6 +261,7 @@ public function cgetAction(Request $request): Response
246261 * tagId?: string,
247262 * pageId?: string,
248263 * publishedState?: string,
264+ * mainWebspace?: string,
249265 * } $filter */
250266 $ filter = $ request ->query ->all ()['filter ' ] ?? [];
251267
@@ -312,14 +328,20 @@ public function cgetAction(Request $request): Response
312328 $ search ->addQuery (new TermQuery ('excerpt.tags.id ' , $ tagId ), BoolQuery::MUST );
313329 }
314330
315- if ($ pageId = $ request ->get ('pageId ' , $ filter ['pageId ' ] ?? null )) {
316- $ search ->addQuery (new TermQuery ('parent_page_uuid ' , $ pageId ), BoolQuery::MUST );
331+ $ pageIdFilter = $ request ->get ('pageId ' , $ filter ['pageId ' ] ?? null );
332+ if (\is_string ($ pageIdFilter ) && '' !== $ pageIdFilter ) {
333+ $ search ->addQuery (new TermQuery ('parent_page_uuid ' , $ pageIdFilter ), BoolQuery::MUST );
317334 }
318335
319336 if ($ workflowStage = $ request ->get ('workflowStage ' , $ filter ['publishedState ' ] ?? null )) {
320337 $ search ->addQuery (new TermQuery ('published_state ' , 'published ' === $ workflowStage ), BoolQuery::MUST );
321338 }
322339
340+ $ mainWebspaceFilter = $ request ->get ('mainWebspace ' , $ filter ['mainWebspace ' ] ?? null );
341+ if (\is_string ($ mainWebspaceFilter ) && '' !== $ mainWebspaceFilter ) {
342+ $ search ->addQuery (new TermQuery ('main_webspace ' , $ mainWebspaceFilter ), BoolQuery::MUST );
343+ }
344+
323345 if ($ this ->getBooleanRequestParameter ($ request , 'exclude-shadows ' , false , false )) {
324346 $ search ->addQuery (new TermQuery ('localization_state.state ' , 'shadow ' ), BoolQuery::MUST_NOT );
325347 }
@@ -376,9 +398,19 @@ function(FieldDescriptorInterface $fieldDescriptor) use ($fields) {
376398 $ searchResult = $ repository ->findRaw ($ search );
377399 $ result = [];
378400 foreach ($ searchResult as $ document ) {
379- $ documentData = $ this ->normalize ($ document ['_source ' ], $ fieldDescriptors );
401+ if (!\is_array ($ document ) || !isset ($ document ['_source ' ])) {
402+ continue ;
403+ }
404+
405+ /** @var array<string, mixed> $source */
406+ $ source = $ document ['_source ' ];
407+ $ documentData = $ this ->normalize ($ source , $ fieldDescriptors );
380408 $ documentData ['ghostLocale ' ] = 'ghost ' == $ documentData ['localizationState ' ]['state ' ] ? $ documentData ['localizationState ' ]['locale ' ] : null ;
381409
410+ $ mainWebspace = $ source ['main_webspace ' ] ?? null ;
411+ $ webspace = $ this ->webspaceManager && \is_string ($ mainWebspace ) ? $ this ->webspaceManager ->getWebspaceCollection ()->getWebspace ($ mainWebspace ) : null ;
412+ $ documentData ['mainWebspace ' ] = $ webspace ? $ webspace ->getName () : $ mainWebspace ;
413+
382414 if (false !== ($ index = \array_search ($ documentData ['id ' ], $ ids ))) {
383415 $ result [$ index ] = $ documentData ;
384416 } else {
0 commit comments