Files
espocrm/application/Espo/Core/Utils/File/Unifier.php
Taras Machyshyn 9eaad382ff changed log class
2014-02-24 18:21:42 +02:00

167 lines
4.8 KiB
PHP

<?php
namespace Espo\Core\Utils\File;
use Espo\Core\Utils;
class Unifier
{
private $fileManager;
protected $params = array(
'unsetFileName' => 'unset.json',
'defaultsPath' => 'application/Espo/Core/defaults',
);
public function __construct(\Espo\Core\Utils\File\Manager $fileManager)
{
$this->fileManager = $fileManager;
}
protected function getFileManager()
{
return $this->fileManager;
}
/**
* Unite file content to the file
*
* @param bool $recursively - Note: only for first level of sub directory, other levels of sub directories will be ignored
*
* @return array
*/
public function unify($name, $paths, $recursively = false)
{
$content = $this->unifySingle($paths['corePath'], $name, $recursively);
if (!empty($paths['modulePath'])) {
$customDir = strstr($paths['modulePath'], '{*}', true);
$dirList = $this->getFileManager()->getFileList($customDir, false, '', 'dir');
foreach ($dirList as $dirName) {
$curPath = str_replace('{*}', $dirName, $paths['modulePath']);
$content = Utils\Util::merge($content, $this->unifySingle($curPath, $name, $recursively, $dirName));
}
}
//todo check customPaths
if (!empty($paths['customPath'])) {
$content = Utils\Util::merge($content, $this->unifySingle($paths['customPath'], $name, $recursively));
}
return $content;
}
/**
* Unite file content to the file for one directory [NOW ONLY FOR METADATA, NEED TO CHECK FOR LAYOUTS AND OTHERS]
*
* @param string $dirPath
* @param string $type - name of type array("metadata", "layouts"), ex. $this->name
* @param bool $recursively - Note: only for first level of sub directory, other levels of sub directories will be ignored
* @param string $moduleName - name of module if exists
*
* @return string - content of the files
*/
protected function unifySingle($dirPath, $type, $recursively = false, $moduleName = '')
{
if (empty($dirPath) || !file_exists($dirPath)) {
return false;
}
$unsetFileName = $this->params['unsetFileName'];
//get matadata files
$fileList = $this->getFileManager()->getFileList($dirPath, $recursively, '\.json$');
$defaultValues = $this->loadDefaultValues($this->getFileManager()->getDirName($dirPath), $type);
$content= array();
$unsets= array();
foreach($fileList as $dirName => $fileName) {
if (is_array($fileName)) { /*get content from files in a sub directory*/
$content[$dirName]= $this->unifySingle(Utils\Util::concatPath($dirPath,$dirName), $type, false, $moduleName); //only first level of a sub directory
} else { /*get content from a single file*/
if ($fileName == $unsetFileName) {
$fileContent = $this->getFileManager()->getContents(array($dirPath, $fileName));
$unsets = Utils\Json::getArrayData($fileContent);
continue;
} /*END: Save data from unset.json*/
$mergedValues = $this->unifyGetContents(array($dirPath, $fileName), $defaultValues);
if (!empty($mergedValues)) {
$name = $this->getFileManager()->getFileName($fileName, '.json');
$content[$name] = $mergedValues;
}
}
}
//unset content
$content= Utils\Util::unsetInArray($content, $unsets);
//END: unset content
return $content;
}
/**
* Helpful method for get content from files for unite Files
*
* @param string | array $paths
* @param string | array() $defaults - It can be a string like ["metadata","layouts"] OR an array with default values
*
* @return array
*/
protected function unifyGetContents($paths, $defaults)
{
$fileContent= $this->getFileManager()->getContents($paths);
$decoded= Utils\Json::getArrayData($fileContent);
if (empty($decoded) && !is_array($decoded)) {
$GLOBALS['log']->emergency('Syntax error or empty file - '.Utils\Util::concatPath($folderPath, $fileName));
} else {
//Default values
if (is_string($defaults) && !empty($defaults)) {
$defType= $defaults;
unset($defaults);
$name= $this->getFileManager()->getFileName($fileName, '.json');
$defaults= $this->loadDefaultValues($name, $defType);
}
$mergedValues= Utils\Util::merge($defaults, $decoded);
//END: Default values
return $mergedValues;
}
return array();
}
/**
* Load default values for selected type [metadata, layouts]
*
* @param string $name
* @param string $type - [metadata, layouts]
*
* @return array
*/
protected function loadDefaultValues($name, $type='metadata')
{
$defaultPath= $this->params['defaultsPath'];
$defaultValue= $this->getFileManager()->getContents( array($defaultPath, $type, $name.'.json') );
if ($defaultValue!==false) {
//return default array
return Utils\Json::decode($defaultValue, true);
}
return array();
}
}
?>