Current File : /home/pacjaorg/public_html/cop/libraries/fof40/Utils/ViewManifestMigration.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);
}
}
}
}