@@ -180,6 +180,44 @@ public function getFormFieldTypes()
180180 */
181181 public function autoload (): ClassLoader
182182 {
183+ // Register a fallback autoloader for vendor dependencies that might be missing during upgrades.
184+ // This helps prevent "class not found" errors when upgrading between versions with different dependencies.
185+ // The fallback reads the autoload maps from the NEW vendor directory on disk.
186+ $ vendorDir = __DIR__ . '/vendor ' ;
187+ $ psr4File = $ vendorDir . '/composer/autoload_psr4.php ' ;
188+ $ classmapFile = $ vendorDir . '/composer/autoload_classmap.php ' ;
189+
190+ $ psr4Map = file_exists ($ psr4File ) ? require $ psr4File : [];
191+ $ classMap = file_exists ($ classmapFile ) ? require $ classmapFile : [];
192+
193+ if ($ psr4Map || $ classMap ) {
194+ spl_autoload_register (function ($ class ) use ($ psr4Map , $ classMap ) {
195+ // First check classmap for exact class match
196+ if (isset ($ classMap [$ class ]) && file_exists ($ classMap [$ class ])) {
197+ require_once $ classMap [$ class ];
198+ return true ;
199+ }
200+
201+ // Then try PSR-4 namespaces
202+ foreach ($ psr4Map as $ prefix => $ paths ) {
203+ $ prefixLen = strlen ($ prefix );
204+ if (strncmp ($ prefix , $ class , $ prefixLen ) === 0 ) {
205+ $ relativeClass = substr ($ class , $ prefixLen );
206+ $ relativePath = str_replace ('\\' , '/ ' , $ relativeClass ) . '.php ' ;
207+
208+ foreach ($ paths as $ path ) {
209+ $ file = $ path . '/ ' . $ relativePath ;
210+ if (file_exists ($ file )) {
211+ require_once $ file ;
212+ return true ;
213+ }
214+ }
215+ }
216+ }
217+ return false ;
218+ }, true , false ); // prepend=true to run before other autoloaders
219+ }
220+
183221 return require __DIR__ . '/vendor/autoload.php ' ;
184222 }
185223
@@ -1140,13 +1178,17 @@ protected function initializeAdmin()
11401178 return new Themes ($ this ->grav );
11411179 };
11421180
1143- // Initialize white label functionality
1144- $ this ->grav ['admin-whitelabel ' ] = new WhiteLabel ();
1181+ // Initialize white label functionality (lazy-loaded to avoid loading scssphp during upgrades)
1182+ $ this ->grav ['admin-whitelabel ' ] = function () {
1183+ return new WhiteLabel ();
1184+ };
11451185
1146- // Compile a missing preset.css file
1186+ // Compile a missing preset.css file - skip during AJAX task requests to avoid autoloader conflicts during upgrades
1187+ $ task = $ this ->uri ->param ('task ' ) ?? $ this ->uri ->query ('task ' );
1188+ $ isTaskRequest = !empty ($ task );
11471189 $ preset_css = 'asset://admin-preset.css ' ;
11481190 $ preset_path = $ this ->grav ['locator ' ]->findResource ($ preset_css );
1149- if (!$ preset_path ) {
1191+ if (!$ preset_path && ! $ isTaskRequest ) {
11501192 $ this ->grav ['admin-whitelabel ' ]->compilePresetScss ($ this ->config ->get ('plugins.admin.whitelabel ' ));
11511193 }
11521194
0 commit comments