mirror of
https://github.com/salesagility/SuiteCRM.git
synced 2024-11-21 15:37:57 +00:00
251 lines
6.8 KiB
PHP
251 lines
6.8 KiB
PHP
<?php
|
|
|
|
namespace SuiteCRM\ModuleInstall;
|
|
|
|
use \LoggerManager;
|
|
|
|
/**
|
|
* Class ExtensionManager
|
|
*/
|
|
#[\AllowDynamicProperties]
|
|
class ExtensionManager
|
|
{
|
|
/**
|
|
* @var array
|
|
*/
|
|
protected static $moduleList = [];
|
|
|
|
/**
|
|
* @var
|
|
*/
|
|
protected static $logger;
|
|
|
|
/**
|
|
* Checks if authenticated and dies if not.
|
|
*
|
|
* @return void
|
|
*/
|
|
protected static function handleAuth()
|
|
{
|
|
if (!defined('sugarEntry') || !sugarEntry) {
|
|
die('Not A Valid Entry Point');
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Sets the static module and extension lists.
|
|
*
|
|
* @return void
|
|
*/
|
|
protected static function initialise()
|
|
{
|
|
static::$moduleList = get_module_dir_list();
|
|
static::$logger = LoggerManager::getLogger();
|
|
}
|
|
|
|
/**
|
|
* Compiles source files for given extension to targeted file applying any given filters.
|
|
*
|
|
* @param string $extension Name of Extension i.e. 'Language'
|
|
* @param string $targetFileName Name of target file
|
|
* @param string $filter To filter file names such as language prefixes
|
|
* @param bool $applicationOnly Whether or not to only compile application extensions
|
|
* @return void
|
|
*/
|
|
public static function compileExtensionFiles(
|
|
$extension,
|
|
$targetFileName,
|
|
$filter = '',
|
|
$applicationOnly = false
|
|
) {
|
|
static::handleAuth();
|
|
static::initialise();
|
|
|
|
if ($extension === 'Language' && strpos($targetFileName, $filter) !== 0) {
|
|
$targetFileName = $filter . $targetFileName;
|
|
}
|
|
|
|
if (!$applicationOnly) {
|
|
static::compileModuleExtensions($extension, $targetFileName, $filter);
|
|
}
|
|
|
|
static::compileApplicationExtensions($extension, $targetFileName, $filter);
|
|
}
|
|
|
|
/**
|
|
* @param $extension
|
|
* @param $targetFileName
|
|
* @param string $filter
|
|
* @return void
|
|
*/
|
|
protected static function compileApplicationExtensions(
|
|
$extension,
|
|
$targetFileName,
|
|
$filter = ''
|
|
) {
|
|
static::$logger->{'debug'}("Merging application files for $targetFileName in $extension");
|
|
|
|
$extensionContents = '<?php' . PHP_EOL . '// WARNING: The contents of this file are auto-generated' . PHP_EOL;
|
|
$extPath = "application/Ext/$extension";
|
|
$moduleInstall = "custom/Extension/$extPath";
|
|
$shouldSave = false;
|
|
|
|
if (is_dir($moduleInstall)) {
|
|
$dir = dir($moduleInstall);
|
|
|
|
while ($entry = $dir->read()) {
|
|
if (static::shouldSkipFile($entry, $moduleInstall, $filter)) {
|
|
continue;
|
|
}
|
|
$shouldSave = true;
|
|
$file = file_get_contents("$moduleInstall/$entry");
|
|
$extensionContents .= PHP_EOL . static::removePhpTagsFromString($file);
|
|
}
|
|
}
|
|
|
|
if ($shouldSave) {
|
|
static::saveFile($extPath, $targetFileName, $extensionContents);
|
|
return;
|
|
}
|
|
|
|
static::unlinkFile($extPath, $targetFileName);
|
|
}
|
|
|
|
/**
|
|
* @param $extension
|
|
* @param $targetFileName
|
|
* @param string $filter
|
|
* @return void
|
|
*/
|
|
protected static function compileModuleExtensions(
|
|
$extension,
|
|
$targetFileName,
|
|
$filter = ''
|
|
) {
|
|
static::$logger->{'debug'}(
|
|
self::class . "::compileExtensionFiles() : Merging module files in " .
|
|
"custom/Extension/modules/<module>/$extension to custom/modules/<module>/$extension/$targetFileName"
|
|
);
|
|
|
|
foreach (static::$moduleList as $module) {
|
|
$extensionContents = '<?php'
|
|
. PHP_EOL
|
|
. '// WARNING: The contents of this file are auto-generated'
|
|
. PHP_EOL;
|
|
|
|
$extPath = "modules/$module/Ext/$extension";
|
|
$moduleInstall = "custom/Extension/$extPath";
|
|
$shouldSave = false;
|
|
|
|
if (is_dir($moduleInstall)) {
|
|
$dir = dir($moduleInstall);
|
|
$shouldSave = true;
|
|
$override = [];
|
|
|
|
while ($entry = $dir->read()) {
|
|
if (static::shouldSkipFile($entry, $moduleInstall, $filter)) {
|
|
continue;
|
|
}
|
|
|
|
if (strpos($entry, '_override') === 0) {
|
|
$override[] = $entry;
|
|
continue;
|
|
}
|
|
|
|
$file = file_get_contents("$moduleInstall/$entry");
|
|
static::$logger->{'debug'}(
|
|
self::class . "->compileExtensionFiles(): found {$moduleInstall}{$entry}"
|
|
);
|
|
|
|
$extensionContents .= PHP_EOL . static::removePhpTagsFromString($file);
|
|
}
|
|
|
|
foreach ($override as $entry) {
|
|
$file = file_get_contents("$moduleInstall/$entry");
|
|
$extensionContents .= PHP_EOL . static::removePhpTagsFromString($file);
|
|
}
|
|
}
|
|
|
|
if ($shouldSave) {
|
|
static::saveFile($extPath, $targetFileName, $extensionContents);
|
|
continue;
|
|
}
|
|
|
|
static::unlinkFile($extPath, $targetFileName);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @param string $string
|
|
* @return string
|
|
*/
|
|
protected static function removePhpTagsFromString($string)
|
|
{
|
|
return str_replace(
|
|
['<?php', '?>', '<?PHP', '<?'],
|
|
'',
|
|
$string
|
|
);
|
|
}
|
|
|
|
/**
|
|
* @param $entry
|
|
* @param $moduleInstall
|
|
* @param $filter
|
|
* @return bool
|
|
*/
|
|
protected static function shouldSkipFile(
|
|
$entry,
|
|
$moduleInstall,
|
|
$filter
|
|
) {
|
|
if ($entry === '.' || $entry === '..' || strtolower(substr((string) $entry, -4)) !== '.php') {
|
|
return true;
|
|
}
|
|
|
|
if (!is_file("$moduleInstall/$entry")) {
|
|
return true;
|
|
}
|
|
|
|
if (!empty($filter) && substr_count((string) $entry, (string) $filter) <= 0) {
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @param string $extPath
|
|
* @param string $targetFileName
|
|
* @param string $extensionContents
|
|
* @return void
|
|
*/
|
|
protected static function saveFile(
|
|
$extPath,
|
|
$targetFileName,
|
|
$extensionContents
|
|
) {
|
|
if (!file_exists("custom/$extPath")) {
|
|
mkdir_recursive("custom/$extPath", true);
|
|
}
|
|
|
|
$extensionContents .= PHP_EOL;
|
|
|
|
$out = sugar_fopen("custom/$extPath/$targetFileName", 'wb');
|
|
fwrite($out, $extensionContents);
|
|
fclose($out);
|
|
}
|
|
|
|
/**
|
|
* @param $extPath
|
|
* @param $targetFileName
|
|
* @return void
|
|
*/
|
|
protected static function unlinkFile($extPath, $targetFileName)
|
|
{
|
|
if (file_exists("custom/$extPath/$targetFileName")) {
|
|
unlink("custom/$extPath/$targetFileName");
|
|
}
|
|
}
|
|
}
|