173 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			173 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| /**
 | |
|  * @package   FOF
 | |
|  * @copyright Copyright (c)2010-2022 Nicholas K. Dionysopoulos / Akeeba Ltd
 | |
|  * @license   GNU General Public License version 3, or later
 | |
|  */
 | |
| 
 | |
| namespace FOF40\Utils;
 | |
| 
 | |
| 
 | |
| use FOF40\Container\Container;
 | |
| use Joomla\CMS\Filesystem\File;
 | |
| use Joomla\Filesystem\Folder;
 | |
| 
 | |
| class ViewManifestMigration
 | |
| {
 | |
| 	/**
 | |
| 	 * Migrates Joomla 4 view XML manifests into their Joomla 3 locations
 | |
| 	 *
 | |
| 	 * @param   Container  $container  The FOF 4 container of the component we'll be migrating.
 | |
| 	 *
 | |
| 	 * @return  void
 | |
| 	 */
 | |
| 	public static function migrateJoomla4MenuXMLFiles(Container $container): void
 | |
| 	{
 | |
| 		self::migrateJoomla4MenuXMLFiles_real($container->frontEndPath, $container->backEndPath);
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Migrates Joomla 4 view XML manifests into their Joomla 3 locations
 | |
| 	 *
 | |
| 	 * @param   string  $frontendPath  Component's frontend path
 | |
| 	 * @param   string  $backendPath   Component's backend path
 | |
| 	 *
 | |
| 	 * @return  void
 | |
| 	 * @noinspection PhpUnused
 | |
| 	 */
 | |
| 	public static function migrateJoomla4MenuXMLFiles_real($frontendPath, $backendPath): void
 | |
| 	{
 | |
| 		// This only applies to Joomla 3
 | |
| 		if (version_compare(JVERSION, '3.999.999', 'gt'))
 | |
| 		{
 | |
| 			return;
 | |
| 		}
 | |
| 
 | |
| 		// Map modern to legacy locations
 | |
| 		$maps = [
 | |
| 			$frontendPath . '/tmpl'          => $frontendPath . '/views',
 | |
| 			$frontendPath . '/ViewTemplates' => $frontendPath . '/views',
 | |
| 			$backendPath . '/tmpl'           => $backendPath . '/views',
 | |
| 			$backendPath . '/ViewTemplates'  => $backendPath . '/views',
 | |
| 		];
 | |
| 
 | |
| 		foreach ($maps as $source => $dest)
 | |
| 		{
 | |
| 			try
 | |
| 			{
 | |
| 				self::migrateViewXMLManifests($source, $dest);
 | |
| 			}
 | |
| 			catch (\UnexpectedValueException $e)
 | |
| 			{
 | |
| 				// This means the source folder doesn't exist. No problem!
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Removes the legacy `views` paths from the front- and backend of the component on Joomla 4 and later versions.
 | |
| 	 *
 | |
| 	 * @param   Container  $container
 | |
| 	 *
 | |
| 	 * @return  void
 | |
| 	 */
 | |
| 	public static function removeJoomla3LegacyViews(Container $container): void
 | |
| 	{
 | |
| 		self::removeJoomla3LegacyViews_real($container->frontEndPath, $container->backEndPath);
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Removes the legacy `views` paths from the front- and backend of the component on Joomla 4 and later versions.
 | |
| 	 *
 | |
| 	 * @param   string  $frontendPath  Component's frontend path
 | |
| 	 * @param   string  $backendPath   Component's backend path
 | |
| 	 *
 | |
| 	 * @return  void
 | |
| 	 * @noinspection PhpUnused
 | |
| 	 */
 | |
| 	public static function removeJoomla3LegacyViews_real($frontendPath, $backendPath): void
 | |
| 	{
 | |
| 		// This only applies to Joomla 4
 | |
| 		if (version_compare(JVERSION, '3.999.999', 'le'))
 | |
| 		{
 | |
| 			return;
 | |
| 		}
 | |
| 
 | |
| 		$legacyLocations = [
 | |
| 			$frontendPath . '/views',
 | |
| 			$backendPath . '/views',
 | |
| 		];
 | |
| 
 | |
| 		foreach ($legacyLocations as $path)
 | |
| 		{
 | |
| 			if (!is_dir($path))
 | |
| 			{
 | |
| 				continue;
 | |
| 			}
 | |
| 
 | |
| 			Folder::delete($path);
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Migrates view manifest XML files from the source to the dest folder.
 | |
| 	 *
 | |
| 	 * @param   string  $source  Source folder to scan, i.e. the `tmpl` or `ViewTemplates` folder.
 | |
| 	 * @param   string  $dest    Target folder to copy the files to, i.e. the legacy `views` folder.
 | |
| 	 */
 | |
| 	private static function migrateViewXMLManifests(string $source, string $dest): void
 | |
| 	{
 | |
| 		$di = new \DirectoryIterator($source);
 | |
| 
 | |
| 		/** @var \DirectoryIterator $folderItem */
 | |
| 		foreach ($di as $folderItem)
 | |
| 		{
 | |
| 			if ($folderItem->isDot() || !$folderItem->isDir())
 | |
| 			{
 | |
| 				continue;
 | |
| 			}
 | |
| 
 | |
| 			// Delete the metadata.xml and tmpl/*.xml files in the corresponding `views` subfolder
 | |
| 			$killLegacyFile   = $dest . '/' . $folderItem->getFilename() . '/metadata.xml';
 | |
| 			$killLegacyFolder = $dest . '/' . $folderItem->getFilename() . '/tmpl';
 | |
| 
 | |
| 			if (!@is_file($killLegacyFile))
 | |
| 			{
 | |
| 				File::delete($killLegacyFile);
 | |
| 			}
 | |
| 
 | |
| 			if (@file_exists($killLegacyFolder) && @is_dir($killLegacyFolder))
 | |
| 			{
 | |
| 				$files = Folder::files($killLegacyFolder, '\.xml$', false, true);
 | |
| 
 | |
| 				if (!empty($files))
 | |
| 				{
 | |
| 					File::delete($files);
 | |
| 				}
 | |
| 			}
 | |
| 
 | |
| 			$filesIterator = new \DirectoryIterator($folderItem->getPathname());
 | |
| 
 | |
| 			/** @var \DirectoryIterator $fileItem */
 | |
| 			foreach ($filesIterator as $fileItem)
 | |
| 			{
 | |
| 				if ($fileItem->isDir())
 | |
| 				{
 | |
| 					continue;
 | |
| 				}
 | |
| 
 | |
| 				if ($fileItem->getExtension() != 'xml')
 | |
| 				{
 | |
| 					continue;
 | |
| 				}
 | |
| 
 | |
| 				$destPath = $dest . '/' . $folderItem->getFilename() . (($fileItem->getFilename() == 'metadata.xml') ? '' : '/tmpl');
 | |
| 
 | |
| 				$destPathName = $destPath . '/' . $fileItem->getFilename();
 | |
| 
 | |
| 				Folder::create($destPath);
 | |
| 				File::copy($fileItem->getPathname(), $destPathName);
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| } |