@@ -41,7 +41,73 @@ public function index(): Response
4141 }
4242
4343 /**
44- * Edit configuration with given namespace.
44+ * Toggle access_url_changeable for a given setting variable.
45+ * Only platform admins on the main URL (ID = 1) are allowed to change it,
46+ */
47+ #[IsGranted('ROLE_ADMIN ' )]
48+ #[Route('/settings/toggle_changeable ' , name: 'settings_toggle_changeable ' , methods: ['POST ' ])]
49+ public function toggleChangeable (Request $ request , AccessUrlHelper $ accessUrlHelper ): JsonResponse
50+ {
51+ // Security: only admins.
52+ if (!$ this ->isGranted ('ROLE_ADMIN ' )) {
53+ return $ this ->json ([
54+ 'error ' => 'Only platform admins can modify this flag. ' ,
55+ ], 403 );
56+ }
57+
58+ $ currentUrl = $ accessUrlHelper ->getCurrent ();
59+ $ currentUrlId = $ currentUrl ->getId ();
60+
61+ // Only main URL (ID = 1) can toggle the flag.
62+ if (1 !== $ currentUrlId ) {
63+ return $ this ->json ([
64+ 'error ' => 'Only the main URL (ID 1) can toggle this setting. ' ,
65+ ], 403 );
66+ }
67+
68+ $ payload = json_decode ($ request ->getContent (), true );
69+
70+ if (!\is_array ($ payload ) || !isset ($ payload ['variable ' ], $ payload ['status ' ])) {
71+ return $ this ->json ([
72+ 'error ' => 'Invalid payload. ' ,
73+ ], 400 );
74+ }
75+
76+ $ variable = (string ) $ payload ['variable ' ];
77+ $ status = (int ) $ payload ['status ' ];
78+
79+ $ repo = $ this ->entityManager ->getRepository (SettingsCurrent::class);
80+
81+ // We search by variable + current main AccessUrl entity.
82+ $ setting = $ repo ->findOneBy ([
83+ 'variable ' => $ variable ,
84+ 'url ' => $ currentUrl ,
85+ ]);
86+
87+ if (!$ setting ) {
88+ return $ this ->json ([
89+ 'error ' => 'Setting not found. ' ,
90+ ], 404 );
91+ }
92+
93+ try {
94+ $ setting ->setAccessUrlChangeable ($ status );
95+ $ this ->entityManager ->flush ();
96+
97+ return $ this ->json ([
98+ 'result ' => 1 ,
99+ 'status ' => $ status ,
100+ ]);
101+ } catch (\Throwable $ e ) {
102+ return $ this ->json ([
103+ 'error ' => 'Unable to update setting. ' ,
104+ 'details ' => $ e ->getMessage (),
105+ ], 500 );
106+ }
107+ }
108+
109+ /**
110+ * Edit configuration with given namespace (search page).
45111 */
46112 #[IsGranted('ROLE_ADMIN ' )]
47113 #[Route('/settings/search_settings ' , name: 'chamilo_platform_settings_search ' )]
@@ -69,6 +135,35 @@ public function searchSetting(Request $request, AccessUrlHelper $accessUrlHelper
69135 $ schemas = $ manager ->getSchemas ();
70136 [$ ordered , $ labelMap ] = $ this ->computeOrderedNamespacesByTranslatedLabel ($ schemas , $ request );
71137
138+ // Template map for current URL (existing behavior – JSON helper)
139+ $ settingsRepo = $ this ->entityManager ->getRepository (SettingsCurrent::class);
140+ $ settingsWithTemplate = $ settingsRepo ->findBy (['url ' => $ url ]);
141+
142+ foreach ($ settingsWithTemplate as $ s ) {
143+ if ($ s ->getValueTemplate ()) {
144+ $ templateMap [$ s ->getVariable ()] = $ s ->getValueTemplate ()->getId ();
145+ }
146+ }
147+
148+ // MultiURL changeable flags: read from main URL (ID = 1) only
149+ $ changeableMap = [];
150+ $ mainUrlRows = $ settingsRepo ->createQueryBuilder ('sc ' )
151+ ->join ('sc.url ' , 'u ' )
152+ ->andWhere ('u.id = :mainId ' )
153+ ->setParameter ('mainId ' , 1 )
154+ ->getQuery ()
155+ ->getResult ();
156+
157+ foreach ($ mainUrlRows as $ row ) {
158+ if ($ row instanceof SettingsCurrent) {
159+ $ changeableMap [$ row ->getVariable ()] = $ row ->getAccessUrlChangeable ();
160+ }
161+ }
162+
163+ $ currentUrlId = $ url ->getId ();
164+ // Only platform admins on the main URL can toggle the MultiURL flag.
165+ $ canToggleMultiUrlSetting = $ this ->isGranted ('ROLE_ADMIN ' ) && 1 === $ currentUrlId ;
166+
72167 if ('' === $ keyword ) {
73168 return $ this ->render ('@ChamiloCore/Admin/Settings/search.html.twig ' , [
74169 'keyword ' => $ keyword ,
@@ -80,17 +175,12 @@ public function searchSetting(Request $request, AccessUrlHelper $accessUrlHelper
80175 'template_map_by_category ' => $ templateMapByCategory ,
81176 'ordered_namespaces ' => $ ordered ,
82177 'namespace_labels ' => $ labelMap ,
178+ 'changeable_map ' => $ changeableMap ,
179+ 'current_url_id ' => $ currentUrlId ,
180+ 'can_toggle_multiurl_setting ' => $ canToggleMultiUrlSetting ,
83181 ]);
84182 }
85183
86- $ settingsRepo = $ this ->entityManager ->getRepository (SettingsCurrent::class);
87- $ settingsWithTemplate = $ settingsRepo ->findBy (['url ' => $ url ]);
88- foreach ($ settingsWithTemplate as $ s ) {
89- if ($ s ->getValueTemplate ()) {
90- $ templateMap [$ s ->getVariable ()] = $ s ->getValueTemplate ()->getId ();
91- }
92- }
93-
94184 $ settingsFromKeyword = $ manager ->getParametersFromKeywordOrderedByCategory ($ keyword );
95185 if (!empty ($ settingsFromKeyword )) {
96186 foreach ($ settingsFromKeyword as $ category => $ parameterList ) {
@@ -110,7 +200,7 @@ public function searchSetting(Request $request, AccessUrlHelper $accessUrlHelper
110200 // Convert category to schema alias and validate it BEFORE loading/creating the form
111201 $ schemaAlias = $ manager ->convertNameSpaceToService ($ category );
112202
113- // skip unknown/legacy categories (e.g., "tools")
203+ // Skip unknown/legacy categories (e.g., "tools")
114204 if (!isset ($ schemas [$ schemaAlias ])) {
115205 continue ;
116206 }
@@ -139,11 +229,14 @@ public function searchSetting(Request $request, AccessUrlHelper $accessUrlHelper
139229 'template_map_by_category ' => $ templateMapByCategory ,
140230 'ordered_namespaces ' => $ ordered ,
141231 'namespace_labels ' => $ labelMap ,
232+ 'changeable_map ' => $ changeableMap ,
233+ 'current_url_id ' => $ currentUrlId ,
234+ 'can_toggle_multiurl_setting ' => $ canToggleMultiUrlSetting ,
142235 ]);
143236 }
144237
145238 /**
146- * Edit configuration with given namespace.
239+ * Edit configuration with given namespace (main settings page) .
147240 */
148241 #[IsGranted('ROLE_ADMIN ' )]
149242 #[Route('/settings/{namespace} ' , name: 'chamilo_platform_settings ' )]
@@ -217,17 +310,38 @@ public function updateSetting(Request $request, AccessUrlHelper $accessUrlHelper
217310 $ templateMap = [];
218311 $ settingsRepo = $ this ->entityManager ->getRepository (SettingsCurrent::class);
219312
313+ // Template map for current URL (existing behavior – JSON helper)
220314 $ settingsWithTemplate = $ settingsRepo ->findBy (['url ' => $ url ]);
221315
222316 foreach ($ settingsWithTemplate as $ s ) {
223317 if ($ s ->getValueTemplate ()) {
224318 $ templateMap [$ s ->getVariable ()] = $ s ->getValueTemplate ()->getId ();
225319 }
226320 }
321+
322+ // MultiURL changeable flags: read from main URL (ID = 1) only
323+ $ changeableMap = [];
324+ $ mainUrlRows = $ settingsRepo ->createQueryBuilder ('sc ' )
325+ ->join ('sc.url ' , 'u ' )
326+ ->andWhere ('u.id = :mainId ' )
327+ ->setParameter ('mainId ' , 1 )
328+ ->getQuery ()
329+ ->getResult ();
330+
331+ foreach ($ mainUrlRows as $ row ) {
332+ if ($ row instanceof SettingsCurrent) {
333+ $ changeableMap [$ row ->getVariable ()] = $ row ->getAccessUrlChangeable ();
334+ }
335+ }
336+
227337 $ platform = [
228338 'server_type ' => (string ) $ manager ->getSetting ('platform.server_type ' , true ),
229339 ];
230340
341+ $ currentUrlId = $ url ->getId ();
342+ // Only platform admins on the main URL can toggle the MultiURL flag.
343+ $ canToggleMultiUrlSetting = $ this ->isGranted ('ROLE_ADMIN ' ) && 1 === $ currentUrlId ;
344+
231345 return $ this ->render ('@ChamiloCore/Admin/Settings/default.html.twig ' , [
232346 'schemas ' => $ schemas ,
233347 'settings ' => $ settings ,
@@ -238,6 +352,9 @@ public function updateSetting(Request $request, AccessUrlHelper $accessUrlHelper
238352 'ordered_namespaces ' => $ ordered ,
239353 'namespace_labels ' => $ labelMap ,
240354 'platform ' => $ platform ,
355+ 'changeable_map ' => $ changeableMap ,
356+ 'current_url_id ' => $ currentUrlId ,
357+ 'can_toggle_multiurl_setting ' => $ canToggleMultiUrlSetting ,
241358 ]);
242359 }
243360
0 commit comments