Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
Total | |
0.00% |
0 / 1 |
|
33.33% |
4 / 12 |
CRAP | |
65.07% |
95 / 146 |
AssetFilesConfiguration | |
0.00% |
0 / 1 |
|
33.33% |
4 / 12 |
461.65 | |
65.07% |
95 / 146 |
getConfigurationKey | |
100.00% |
1 / 1 |
1 | |
100.00% |
1 / 1 |
|||
getAssetFiles | |
0.00% |
0 / 1 |
60.36 | |
79.63% |
43 / 54 |
|||
addAssetFile | |
100.00% |
1 / 1 |
1 | |
100.00% |
2 / 2 |
|||
addAssetFileFromOptions | |
0.00% |
0 / 1 |
5.51 | |
72.73% |
8 / 11 |
|||
getAssetFileFromFilePath | |
0.00% |
0 / 1 |
6.20 | |
63.64% |
7 / 11 |
|||
getAssetFilesPathFromDirectory | |
0.00% |
0 / 1 |
12.67 | |
83.33% |
15 / 18 |
|||
getAssetRelativePath | |
0.00% |
0 / 1 |
20 | |
0.00% |
0 / 9 |
|||
assetsConfigurationHasChanged | |
0.00% |
0 / 1 |
116.79 | |
15.00% |
3 / 20 |
|||
getConfigurationFilePath | |
100.00% |
1 / 1 |
1 | |
100.00% |
1 / 1 |
|||
saveAssetFilesConfiguration | |
0.00% |
0 / 1 |
4.16 | |
78.57% |
11 / 14 |
|||
setOptions | |
100.00% |
1 / 1 |
1 | |
100.00% |
2 / 2 |
|||
getOptions | |
0.00% |
0 / 1 |
2.15 | |
66.67% |
2 / 3 |
<?php | |
namespace AssetsBundle\AssetFile; | |
class AssetFilesConfiguration | |
{ | |
/** | |
* @var array | |
*/ | |
protected $assetFiles = array(); | |
/** | |
* @return string | |
*/ | |
public function getConfigurationKey() | |
{ | |
return $this->getOptions()->getModuleName() . '-' . $this->getOptions()->getControllerName() . '-' . $this->getOptions()->getActionName(); | |
} | |
/** | |
* @param string $sAssetFileType : (optionnal) | |
* @return array | |
* @throws \InvalidArgumentException | |
*/ | |
public function getAssetFiles($sAssetFileType = null) | |
{ | |
if ($sAssetFileType && !\AssetsBundle\AssetFile\AssetFile::assetFileTypeExists($sAssetFileType)) { | |
throw new \InvalidArgumentException('Asset file type "' . $sAssetFileType . '" is not valid'); | |
} | |
//Check if assets configuration is already set | |
$sConfigurationKey = $this->getConfigurationKey(); | |
if (isset($this->assetFiles[$sConfigurationKey])) { | |
if ($sAssetFileType) { | |
return $this->assetFiles[$sConfigurationKey][$sAssetFileType]; | |
} else { | |
return $this->assetFiles[$sConfigurationKey]; | |
} | |
} | |
//Define default assets | |
$aAssets = $this->assetFiles[$sConfigurationKey] = array( | |
\AssetsBundle\AssetFile\AssetFile::ASSET_CSS => array(), | |
\AssetsBundle\AssetFile\AssetFile::ASSET_LESS => array(), | |
\AssetsBundle\AssetFile\AssetFile::ASSET_JS => array(), | |
\AssetsBundle\AssetFile\AssetFile::ASSET_MEDIA => array() | |
); | |
//Common configuration | |
$aCommonConfiguration = $this->getOptions()->getAssets(); | |
if (!empty($aCommonConfiguration[\AssetsBundle\AssetFile\AssetFile::ASSET_CSS]) && is_array($aCommonConfiguration[\AssetsBundle\AssetFile\AssetFile::ASSET_CSS])) { | |
$aAssets[\AssetsBundle\AssetFile\AssetFile::ASSET_CSS] = array_merge($aAssets[\AssetsBundle\AssetFile\AssetFile::ASSET_CSS], $aCommonConfiguration[\AssetsBundle\AssetFile\AssetFile::ASSET_CSS]); | |
} | |
if (!empty($aCommonConfiguration[\AssetsBundle\AssetFile\AssetFile::ASSET_LESS]) && is_array($aCommonConfiguration[\AssetsBundle\AssetFile\AssetFile::ASSET_LESS])) { | |
$aAssets[\AssetsBundle\AssetFile\AssetFile::ASSET_LESS] = array_merge($aAssets[\AssetsBundle\AssetFile\AssetFile::ASSET_LESS], $aCommonConfiguration[\AssetsBundle\AssetFile\AssetFile::ASSET_LESS]); | |
} | |
if (!empty($aCommonConfiguration[\AssetsBundle\AssetFile\AssetFile::ASSET_JS]) && is_array($aCommonConfiguration[\AssetsBundle\AssetFile\AssetFile::ASSET_JS])) { | |
$aAssets[\AssetsBundle\AssetFile\AssetFile::ASSET_JS] = array_merge($aAssets[\AssetsBundle\AssetFile\AssetFile::ASSET_JS], $aCommonConfiguration[\AssetsBundle\AssetFile\AssetFile::ASSET_JS]); | |
} | |
if (!empty($aCommonConfiguration[\AssetsBundle\AssetFile\AssetFile::ASSET_MEDIA]) && is_array($aCommonConfiguration[\AssetsBundle\AssetFile\AssetFile::ASSET_MEDIA])) { | |
$aAssets[\AssetsBundle\AssetFile\AssetFile::ASSET_MEDIA] = array_merge($aAssets[\AssetsBundle\AssetFile\AssetFile::ASSET_MEDIA], $aCommonConfiguration[\AssetsBundle\AssetFile\AssetFile::ASSET_MEDIA]); | |
} | |
//Module configuration | |
if (isset($aCommonConfiguration[$sModuleName = $this->getOptions()->getModuleName()])) { | |
$aModuleConfiguration = $aCommonConfiguration[$sModuleName]; | |
if (!empty($aModuleConfiguration[\AssetsBundle\AssetFile\AssetFile::ASSET_CSS]) && is_array($aModuleConfiguration[\AssetsBundle\AssetFile\AssetFile::ASSET_CSS])) { | |
$aAssets[\AssetsBundle\AssetFile\AssetFile::ASSET_CSS] = array_merge($aAssets[\AssetsBundle\AssetFile\AssetFile::ASSET_CSS], $aModuleConfiguration[\AssetsBundle\AssetFile\AssetFile::ASSET_CSS]); | |
} | |
if (!empty($aModuleConfiguration[\AssetsBundle\AssetFile\AssetFile::ASSET_LESS]) && is_array($aModuleConfiguration[\AssetsBundle\AssetFile\AssetFile::ASSET_LESS])) { | |
$aAssets[\AssetsBundle\AssetFile\AssetFile::ASSET_LESS] = array_merge($aAssets[\AssetsBundle\AssetFile\AssetFile::ASSET_LESS], $aModuleConfiguration[\AssetsBundle\AssetFile\AssetFile::ASSET_LESS]); | |
} | |
if (!empty($aModuleConfiguration[\AssetsBundle\AssetFile\AssetFile::ASSET_JS]) && is_array($aModuleConfiguration[\AssetsBundle\AssetFile\AssetFile::ASSET_JS])) { | |
$aAssets[\AssetsBundle\AssetFile\AssetFile::ASSET_JS] = array_merge($aAssets[\AssetsBundle\AssetFile\AssetFile::ASSET_JS], $aModuleConfiguration[\AssetsBundle\AssetFile\AssetFile::ASSET_JS]); | |
} | |
if (!empty($aModuleConfiguration[\AssetsBundle\AssetFile\AssetFile::ASSET_MEDIA]) && is_array($aModuleConfiguration[\AssetsBundle\AssetFile\AssetFile::ASSET_MEDIA])) { | |
$aAssets[\AssetsBundle\AssetFile\AssetFile::ASSET_MEDIA] = array_merge($aAssets[\AssetsBundle\AssetFile\AssetFile::ASSET_MEDIA], $aModuleConfiguration[\AssetsBundle\AssetFile\AssetFile::ASSET_MEDIA]); | |
} | |
//Controller configuration | |
if (isset($aModuleConfiguration[$sControllerName = $this->getOptions()->getControllerName()])) { | |
$aControllerConfiguration = $aModuleConfiguration[$sControllerName]; | |
if (!empty($aControllerConfiguration[\AssetsBundle\AssetFile\AssetFile::ASSET_CSS]) && is_array($aControllerConfiguration[\AssetsBundle\AssetFile\AssetFile::ASSET_CSS])) { | |
$aAssets[\AssetsBundle\AssetFile\AssetFile::ASSET_CSS] = array_merge($aAssets[\AssetsBundle\AssetFile\AssetFile::ASSET_CSS], $aControllerConfiguration[\AssetsBundle\AssetFile\AssetFile::ASSET_CSS]); | |
} | |
if (!empty($aControllerConfiguration[\AssetsBundle\AssetFile\AssetFile::ASSET_LESS]) && is_array($aControllerConfiguration[\AssetsBundle\AssetFile\AssetFile::ASSET_LESS])) { | |
$aAssets[\AssetsBundle\AssetFile\AssetFile::ASSET_LESS] = array_merge($aAssets[\AssetsBundle\AssetFile\AssetFile::ASSET_LESS], $aControllerConfiguration[\AssetsBundle\AssetFile\AssetFile::ASSET_LESS]); | |
} | |
if (!empty($aControllerConfiguration[\AssetsBundle\AssetFile\AssetFile::ASSET_JS]) && is_array($aControllerConfiguration[\AssetsBundle\AssetFile\AssetFile::ASSET_JS])) { | |
$aAssets[\AssetsBundle\AssetFile\AssetFile::ASSET_JS] = array_merge($aAssets[\AssetsBundle\AssetFile\AssetFile::ASSET_JS], $aControllerConfiguration[\AssetsBundle\AssetFile\AssetFile::ASSET_JS]); | |
} | |
if (!empty($aControllerConfiguration[\AssetsBundle\AssetFile\AssetFile::ASSET_MEDIA]) && is_array($aControllerConfiguration[\AssetsBundle\AssetFile\AssetFile::ASSET_MEDIA])) { | |
$aAssets[\AssetsBundle\AssetFile\AssetFile::ASSET_MEDIA] = array_merge($aAssets[\AssetsBundle\AssetFile\AssetFile::ASSET_MEDIA], $aControllerConfiguration[\AssetsBundle\AssetFile\AssetFile::ASSET_MEDIA]); | |
} | |
//Action configuration | |
if (isset($aControllerConfiguration[$sActionName = $this->getOptions()->getActionName()])) { | |
$aActionConfiguration = $aControllerConfiguration[$sActionName]; | |
if (!empty($aActionConfiguration[\AssetsBundle\AssetFile\AssetFile::ASSET_CSS]) && is_array($aActionConfiguration[\AssetsBundle\AssetFile\AssetFile::ASSET_CSS])) { | |
$aAssets[\AssetsBundle\AssetFile\AssetFile::ASSET_CSS] = array_merge($aAssets[\AssetsBundle\AssetFile\AssetFile::ASSET_CSS], $aActionConfiguration[\AssetsBundle\AssetFile\AssetFile::ASSET_CSS]); | |
} | |
if (!empty($aActionConfiguration[\AssetsBundle\AssetFile\AssetFile::ASSET_LESS]) && is_array($aActionConfiguration[\AssetsBundle\AssetFile\AssetFile::ASSET_LESS])) { | |
$aAssets[\AssetsBundle\AssetFile\AssetFile::ASSET_LESS] = array_merge($aAssets[\AssetsBundle\AssetFile\AssetFile::ASSET_LESS], $aActionConfiguration[\AssetsBundle\AssetFile\AssetFile::ASSET_LESS]); | |
} | |
if (!empty($aActionConfiguration[\AssetsBundle\AssetFile\AssetFile::ASSET_JS]) && is_array($aActionConfiguration[\AssetsBundle\AssetFile\AssetFile::ASSET_JS])) { | |
$aAssets[\AssetsBundle\AssetFile\AssetFile::ASSET_JS] = array_merge($aAssets[\AssetsBundle\AssetFile\AssetFile::ASSET_JS], $aActionConfiguration[\AssetsBundle\AssetFile\AssetFile::ASSET_JS]); | |
} | |
if (!empty($aActionConfiguration[\AssetsBundle\AssetFile\AssetFile::ASSET_MEDIA]) && is_array($aActionConfiguration[\AssetsBundle\AssetFile\AssetFile::ASSET_MEDIA])) { | |
$aAssets[\AssetsBundle\AssetFile\AssetFile::ASSET_MEDIA] = array_merge($aAssets[\AssetsBundle\AssetFile\AssetFile::ASSET_MEDIA], $aActionConfiguration[\AssetsBundle\AssetFile\AssetFile::ASSET_MEDIA]); | |
} | |
} | |
} | |
} | |
//Retrieve asset files from configuration | |
foreach ($aAssets as $sAssetFileTypeKey => $aAssetFiles) { | |
foreach (array_unique($aAssetFiles) as $sAssetFilePath) { | |
$this->addAssetFileFromOptions(is_array($sAssetFilePath) ? array_merge(array('asset_file_type' => $sAssetFileTypeKey, $sAssetFilePath)) : array('asset_file_path' => $sAssetFilePath, 'asset_file_type' => $sAssetFileTypeKey)); | |
} | |
} | |
if ($sAssetFileType) { | |
return $this->assetFiles[$sConfigurationKey][$sAssetFileType]; | |
} | |
return $this->assetFiles[$sConfigurationKey]; | |
} | |
/** | |
* @param \AssetsBundle\AssetFile\AssetFile $oAssetFile | |
* @return \AssetsBundle\AssetFile\AssetFilesManager | |
*/ | |
public function addAssetFile(\AssetsBundle\AssetFile\AssetFile $oAssetFile) | |
{ | |
$this->assetFiles[$this->getConfigurationKey()][$oAssetFile->getAssetFileType()][$oAssetFile->getAssetFilePath()] = $oAssetFile; | |
return $this; | |
} | |
/** | |
* @param array $aAssetFileOptions | |
* @return \AssetsBundle\AssetFile\AssetFilesConfiguration | |
* @throws \InvalidArgumentException | |
*/ | |
public function addAssetFileFromOptions(array $aAssetFileOptions) | |
{ | |
if (empty($aAssetFileOptions['asset_file_type'])) { | |
throw new \InvalidArgumentException('Asset file type is empty'); | |
} | |
// Initialize asset file | |
$oAssetFile = new \AssetsBundle\AssetFile\AssetFile(); | |
$oAssetFile->setAssetFileType($aAssetFileOptions['asset_file_type']); | |
unset($aAssetFileOptions['asset_file_type']); | |
// Retrieve asset file path | |
if (empty($aAssetFileOptions['asset_file_path'])) { | |
throw new \InvalidArgumentException('Asset file path is empty'); | |
} | |
if (!is_string($aAssetFileOptions['asset_file_path'])) { | |
throw new \InvalidArgumentException('Asset file path expects string, "' . gettype($aAssetFileOptions['asset_file_path']) . '" given'); | |
} | |
// Retrieve asset file realpath | |
$sAssetRealPath = $this->getOptions()->getRealPath($aAssetFileOptions['asset_file_path'])? : $aAssetFileOptions['asset_file_path']; | |
return $this->getAssetFileFromFilePath($oAssetFile, $sAssetRealPath); | |
} | |
/** | |
* @param \AssetsBundle\AssetFile\AssetFile $oAssetFile | |
* @param type $sAssetRealPath | |
* @return \AssetsBundle\AssetFile\AssetFilesConfiguration | |
*/ | |
public function getAssetFileFromFilePath(\AssetsBundle\AssetFile\AssetFile $oAssetFile, $sAssetRealPath) | |
{ | |
if (is_dir($sAssetRealPath)) { | |
foreach ($this->getAssetFilesPathFromDirectory($sAssetRealPath, $oAssetFile->getAssetFileType()) as $sChildAssetRealPath) { | |
$this->getAssetFileFromFilePath($oAssetFile, $sChildAssetRealPath); | |
} | |
return $this; | |
} | |
// Handle path with wildcard | |
elseif (strpos($sAssetRealPath, '*') !== false) { | |
$oGlobIterator = new \GlobIterator($sAssetRealPath); | |
foreach ($oGlobIterator as $oItem) { | |
$this->getAssetFileFromFilePath($oAssetFile, $oItem->getRealPath()); | |
} | |
return $this; | |
} | |
$oNewAssetFile = clone $oAssetFile; | |
return $this->addAssetFile($oNewAssetFile->setAssetFilePath($sAssetRealPath)); | |
} | |
/** | |
* Retrieve assets from a directory | |
* | |
* @param string $sDirPath | |
* @param string $sAssetType | |
* @throws \InvalidArgumentException | |
* @return array | |
*/ | |
protected function getAssetFilesPathFromDirectory($sDirPath, $sAssetType) | |
{ | |
if (!is_string($sDirPath) || !($sDirPath = $this->getOptions()->getRealPath($sDirPath)) && !is_dir($sDirPath)) { | |
throw new \InvalidArgumentException('Directory not found : ' . $sDirPath); | |
} | |
if (!\AssetsBundle\AssetFile\AssetFile::assetFileTypeExists($sAssetType)) { | |
throw new \InvalidArgumentException('Asset\'s type is undefined : ' . $sAssetType); | |
} | |
$oDirIterator = new \DirectoryIterator($sDirPath); | |
$aAssets = array(); | |
$bRecursiveSearch = $this->getOptions()->allowsRecursiveSearch(); | |
// Defined expected extensions forthe given type | |
if ($sAssetType === \AssetsBundle\AssetFile\AssetFile::ASSET_MEDIA) { | |
$aExpectedExtensions = $this->getOptions()->getMediaExt(); | |
} else { | |
$aExpectedExtensions = array(\AssetsBundle\AssetFile\AssetFile::getAssetFileDefaultExtension($sAssetType)); | |
} | |
foreach ($oDirIterator as $oFile) { | |
if ($oFile->isFile()) { | |
if (in_array(strtolower(pathinfo($oFile->getFilename(), PATHINFO_EXTENSION)), $aExpectedExtensions, true)) { | |
$aAssets[] = $oFile->getPathname(); | |
} | |
} elseif ($oFile->isDir() && !$oFile->isDot() && $bRecursiveSearch) { | |
$aAssets = array_merge( | |
$aAssets, $this->getAssetFilesPathFromDirectory($oFile->getPathname(), $sAssetType) | |
); | |
} | |
} | |
return $aAssets; | |
} | |
/** | |
* Retrieve asset relative path | |
* | |
* @param string $sAssetPath | |
* @throws \InvalidArgumentException | |
* @return string | |
*/ | |
public function getAssetRelativePath($sAssetPath) | |
{ | |
if (!($sAssetRealPath = $this->getOptions()->getRealPath($sAssetPath))) { | |
throw new \InvalidArgumentException('File "' . $sAssetPath . '" does not exist'); | |
} | |
//If asset is already a cache file | |
$sCachePath = $this->getOptions()->getCachePath(); | |
return strpos($sAssetRealPath, $sCachePath) !== false ? str_ireplace( | |
array($sCachePath, '.less'), array('', '.css'), $sAssetRealPath | |
) : ( | |
$this->getOptions()->hasAssetsPath() ? str_ireplace( | |
array($this->getOptions()->getAssetsPath(), getcwd(), DIRECTORY_SEPARATOR), array('', '', '_'), $sAssetRealPath | |
) : str_ireplace( | |
array(getcwd(), DIRECTORY_SEPARATOR), array('', '_'), $sAssetRealPath | |
) | |
); | |
} | |
/** | |
* Check if assets configuration is the same as last saved configuration | |
* | |
* @param array $aAssetsType | |
* @return boolean | |
* @throws \RuntimeException | |
* @throws \LogicException | |
*/ | |
public function assetsConfigurationHasChanged(array $aAssetsType = null) | |
{ | |
$aAssetsType = $aAssetsType ? array_unique($aAssetsType) : array(\AssetsBundle\AssetFile\AssetFile::ASSET_CSS, \AssetsBundle\AssetFile\AssetFile::ASSET_LESS, \AssetsBundle\AssetFile\AssetFile::ASSET_JS, \AssetsBundle\AssetFile\AssetFile::ASSET_MEDIA); | |
//Retrieve saved onfiguration file | |
if (file_exists($sConfigFilePath = $this->getConfigurationFilePath())) { | |
\Zend\Stdlib\ErrorHandler::start(); | |
$aConfig = include $sConfigFilePath; | |
\Zend\Stdlib\ErrorHandler::stop(true); | |
if ($aConfig === false || !is_array($aConfig)) { | |
throw new \RuntimeException('Unable to get file content from file "' . $sConfigFilePath . '"'); | |
} | |
//Get assets configuration | |
$aAssets = $this->getOptions()->getAssets(); | |
//Check if configuration has changed for each type of asset | |
foreach ($aAssetsType as $sAssetType) { | |
if (!\AssetsBundle\AssetFile\AssetFile::assetFileTypeExists($sAssetType)) { | |
throw new \LogicException('Asset type "' . $sAssetType . '" does not exist'); | |
} | |
if (empty($aAssets[$sAssetType]) && !empty($aConfig[$sAssetType])) { | |
return true; | |
} elseif (!empty($aAssets[$sAssetType])) { | |
if (empty($aConfig[$sAssetType])) { | |
return true; | |
} elseif (array_diff($aAssets[$sAssetType], $aConfig[$sAssetType]) || array_diff($aConfig[$sAssetType], $aAssets[$sAssetType]) | |
) { | |
return true; | |
} | |
} | |
} | |
return false; | |
} | |
return true; | |
} | |
/** | |
* Retrieve configuration file name for the current request | |
* | |
* @return string | |
*/ | |
public function getConfigurationFilePath() | |
{ | |
return $this->getOptions()->getProcessedDirPath() . DIRECTORY_SEPARATOR . 'config' . DIRECTORY_SEPARATOR . $this->getOptions()->getCacheFileName() . '.conf'; | |
} | |
/** | |
* Save current asset configuration into conf file | |
* | |
* @return \AssetsBundle\AssetFile\AssetFilesConfiguration | |
*/ | |
public function saveAssetFilesConfiguration() | |
{ | |
// Retrieve configuration file path | |
$sConfigurationFilePath = $this->getConfigurationFilePath(); | |
$bFileExists = file_exists($sConfigurationFilePath); | |
// Create dir if needed | |
if (!($bFileExists = file_exists($sConfigurationFilePath)) && !is_dir($sConfigurationFileDirPath = dirname($sConfigurationFilePath))) { | |
\Zend\Stdlib\ErrorHandler::start(); | |
mkdir($sConfigurationFileDirPath, $this->getOptions()->getDirectoriesPermissions()); | |
\Zend\Stdlib\ErrorHandler::stop(true); | |
} | |
\Zend\Stdlib\ErrorHandler::start(); | |
file_put_contents($sConfigurationFilePath, '<?php' . PHP_EOL . 'return ' . var_export($this->getOptions()->getAssets(), 1) . ';'); | |
\Zend\Stdlib\ErrorHandler::stop(true); | |
if (!$bFileExists) { | |
\Zend\Stdlib\ErrorHandler::start(); | |
chmod($sConfigurationFilePath, $this->getOptions()->getFilesPermissions()); | |
\Zend\Stdlib\ErrorHandler::stop(true); | |
} | |
return $this; | |
} | |
/** | |
* @param \AssetsBundle\Service\ServiceOptions $oOptions | |
* @return \AssetsBundle\AssetFile\AssetFilesConfiguration | |
*/ | |
public function setOptions(\AssetsBundle\Service\ServiceOptions $oOptions) | |
{ | |
$this->options = $oOptions; | |
return $this; | |
} | |
/** | |
* @return \AssetsBundle\Service\ServiceOptions | |
*/ | |
public function getOptions() | |
{ | |
if (!($this->options instanceof \AssetsBundle\Service\ServiceOptions)) { | |
$this->setOptions(new \AssetsBundle\Service\ServiceOptions()); | |
} | |
return $this->options; | |
} | |
} |