diff --git a/core/lib/Thelia/Core/Template/Assets/AssetManagerInterface.php b/core/lib/Thelia/Core/Template/Assets/AssetManagerInterface.php index 20acff2c3..09a7acd8d 100644 --- a/core/lib/Thelia/Core/Template/Assets/AssetManagerInterface.php +++ b/core/lib/Thelia/Core/Template/Assets/AssetManagerInterface.php @@ -1,7 +1,7 @@ . */ +/* along with this program. If not, see . */ /* */ /*************************************************************************************/ namespace Thelia\Core\Template\Assets; -interface AssetManagerInterface -{ +interface AssetManagerInterface { /** - * Prepare an asset directory. + * Prepare an asset directory by checking that no changes occured in + * the source directory. If any change is detected, the whole asset directory + * is copied in the web space. + * + * @param string $sourceAssetsDirectory the full path to the source asstes directory + * @param string $webAssetsDirectoryBase the base directory of the web based asset directory + * @param $webAssetsTemplate + * @param string $webAssetsKey the assets key : module name or 0 for base template * - * @param string $source_assets_directory the full path to the source asstes directory - * @param string $web_assets_directory_base the base directory of the web based asset directory * @throws \RuntimeException if something goes wrong. + * + * @internal param string $source_assets_directory the full path to the source asstes directory + * @internal param string $web_assets_directory_base the base directory of the web based asset directory + * @internal param string $key the assets key : module name or 0 for base template */ - public function prepareAssets($source_assets_directory, $web_assets_directory_base); + public function prepareAssets($sourceAssetsDirectory, $webAssetsDirectoryBase, $webAssetsTemplate, $webAssetsKey); /** * Generates assets from $asset_path in $output_path, using $filters. * - * @param string $asset_path the full path to the asset file (or file collection, e.g. *.less) + * @param $assetSource + * @param $assetDirectoryBase + * @param string $webAssetsDirectoryBase the full path to the asset file (or file collection, e.g. *.less) * - * @param string $web_assets_directory_base the full disk path to the base assets output directory in the web space - * @param string $output_url the URL to the base assets output directory in the web space + * @param string $webAssetsTemplate the full disk path to the base assets output directory in the web space + * @param $webAssetsKey + * @param string $outputUrl the URL to the base assets output directory in the web space * - * @param string $asset_type the asset type: css, js, ... The generated files will have this extension. Pass an empty string to use the asset source extension. - * @param array $filters a list of filters, as defined below (see switch($filter_name) ...) + * @param string $assetType the asset type: css, js, ... The generated files will have this extension. Pass an empty string to use the asset source extension. + * @param array $filters a list of filters, as defined below (see switch($filter_name) ...) * - * @param boolean $debug the debug mode, true or false + * @param boolean $debug true / false * - * @throws \InvalidArgumentException if an invalid filter name is found - * @return string The URL to the generated asset file. + * @internal param string $web_assets_directory_base the full disk path to the base assets output directory in the web space + * @internal param string $output_url the URL to the base assets output directory in the web space + * + * @return string The URL to the generated asset file. */ - public function processAsset($asset_path, $web_assets_directory_base, $output_url, $asset_type, $filters, $debug); + public function processAsset($assetSource, $assetDirectoryBase, $webAssetsDirectoryBase, $webAssetsTemplate, $webAssetsKey, $outputUrl, $assetType, $filters, $debug); } \ No newline at end of file diff --git a/core/lib/Thelia/Core/Template/Assets/AsseticAssetManager.php b/core/lib/Thelia/Core/Template/Assets/AsseticAssetManager.php index 5854d967f..16f6c67c7 100755 --- a/core/lib/Thelia/Core/Template/Assets/AsseticAssetManager.php +++ b/core/lib/Thelia/Core/Template/Assets/AsseticAssetManager.php @@ -1,7 +1,7 @@ . */ +/* along with this program. If not, see . */ /* */ /*************************************************************************************/ @@ -31,7 +31,6 @@ use Assetic\AssetWriter; use Thelia\Model\ConfigQuery; use Thelia\Log\Tlog; use Symfony\Component\Filesystem\Filesystem; -use Symfony\Component\Filesystem\Exception\IOException; /** * This class is a simple helper for generating assets using Assetic. @@ -52,7 +51,7 @@ class AsseticAssetManager implements AssetManagerInterface /** * Create a stamp form the modification time of the content of the given directory and all of its subdirectories * - * @param string $directory ther directory name + * @param string $directory ther directory name * @return string the stamp of this directory */ protected function getStamp($directory) @@ -73,19 +72,21 @@ class AsseticAssetManager implements AssetManagerInterface /** * Check if a file is a source asset file * - * @param \DirectoryIterator $fileInfo + * @param \SplFileInfo $fileInfo + * + * @return bool */ - protected function isSourceFile(\SplFileInfo $fileInfo) - { + protected function isSourceFile(\SplFileInfo $fileInfo) { return in_array($fileInfo->getExtension(), $this->source_file_extensions); } /** * Recursively copy assets from the source directory to the destination - * directory in the web space, ommiting source files. + * directory in the web space, omitting source files. * - * @param string $from_directory the source - * @param string $to_directory the destination + * @param Filesystem $fs + * @param string $from_directory the source + * @param string $to_directory the destination * @throws \RuntimeException if a problem occurs. */ protected function copyAssets(Filesystem $fs, $from_directory, $to_directory) @@ -122,38 +123,21 @@ class AsseticAssetManager implements AssetManagerInterface } } - /** - * Compite the assets path relative to the base template directory - * - * @param string $source_assets_directory the source directory - * @param string $web_assets_directory_base base directory of the web assets - * @return the full path of the destination directory - */ - protected function getRelativeDirectoryPath($source_assets_directory, $web_assets_directory_base) - { - $source_assets_directory = realpath($source_assets_directory); - - // Remove base path from asset source path to get a path relative to the template base - // and use it to create the destination path. - return str_replace( - realpath(THELIA_ROOT), - '', - $source_assets_directory - ); - } - /** * Compute the destination directory path, from the source directory and the * base directory of the web assets * - * @param string $source_assets_directory the source directory - * @param string $web_assets_directory_base base directory of the web assets - * @return the full path of the destination directory + * @param string $webAssetsDirectoryBase base directory of the web assets + * @param $webAssetsTemplate + * @param string $webAssetsKey the assests key : module name or 0 for base template + * + * @internal param string $source_assets_directory the source directory + * @return the full path of the destination directory */ - protected function getDestinationDirectory($source_assets_directory, $web_assets_directory_base) + protected function getDestinationDirectory($webAssetsDirectoryBase, $webAssetsTemplate, $webAssetsKey) { // Compute the absolute path of the output directory - return $web_assets_directory_base . $this->getRelativeDirectoryPath($source_assets_directory, $web_assets_directory_base); + return $webAssetsDirectoryBase . DS . $webAssetsTemplate . DS . $webAssetsKey; } /** @@ -161,14 +145,17 @@ class AsseticAssetManager implements AssetManagerInterface * the source directory. If any change is detected, the whole asset directory * is copied in the web space. * - * @param string $source_assets_directory the full path to the source asstes directory - * @param string $web_assets_directory_base the base directory of the web based asset directory + * @param string $sourceAssetsDirectory the full path to the source asstes directory + * @param string $webAssetsDirectoryBase the base directory of the web based asset directory + * @param $webAssetsTemplate + * @param string $webAssetsKey the assets key : module name or 0 for base template + * * @throws \RuntimeException if something goes wrong. */ - public function prepareAssets($source_assets_directory, $web_assets_directory_base) + public function prepareAssets($sourceAssetsDirectory, $webAssetsDirectoryBase, $webAssetsTemplate, $webAssetsKey) { // Compute the absolute path of the output directory - $to_directory = $this->getDestinationDirectory($source_assets_directory, $web_assets_directory_base); + $to_directory = $this->getDestinationDirectory($webAssetsDirectoryBase, $webAssetsTemplate, $webAssetsKey); // Get a path to the stamp file $stamp_file_path = $to_directory . DS . '.source-stamp'; @@ -177,7 +164,7 @@ class AsseticAssetManager implements AssetManagerInterface $prev_stamp = @file_get_contents($stamp_file_path); // Get the current stamp of the source directory - $curr_stamp = $this->getStamp($source_assets_directory); + $curr_stamp = $this->getStamp($sourceAssetsDirectory); if ($prev_stamp !== $curr_stamp) { @@ -186,11 +173,11 @@ class AsseticAssetManager implements AssetManagerInterface // FIXME: locking or not locking ? /* $lock_file = "$web_assets_directory_base/assets-".md5($source_assets_directory)."-generation-lock.txt"; - + if (! $fp = fopen($lock_file, "w")) { throw new IOException(sprintf('Failed to open lock file %s', $lock_file)); } - + if (flock($fp, LOCK_EX|LOCK_NB)) { // do an exclusive lock */ $tmp_dir = "$to_directory.tmp"; @@ -198,7 +185,7 @@ class AsseticAssetManager implements AssetManagerInterface $fs->remove($tmp_dir); // Copy the whole source dir in a temp directory - $this->copyAssets($fs, $source_assets_directory, $tmp_dir); + $this->copyAssets($fs, $sourceAssetsDirectory, $tmp_dir); // Remove existing directory if ($fs->exists($to_directory)) $fs->remove($to_directory); @@ -208,17 +195,18 @@ class AsseticAssetManager implements AssetManagerInterface /* // Release the lock flock($fp, LOCK_UN); - + // Remove the lock file @fclose($fp); - + $fs->remove($lock_file); */ if (false === @file_put_contents($stamp_file_path, $curr_stamp)) { throw new \RuntimeException( "Failed to create asset stamp file $stamp_file_path. Please check that your web server has the proper access rights to do that."); } - /* } else { + /* } + else { @fclose($fp); } */ @@ -228,13 +216,13 @@ class AsseticAssetManager implements AssetManagerInterface /** * Decode the filters names, and initialize the Assetic FilterManager * - * @param FilterManager $filterManager the Assetic filter manager - * @param string $filters a comma separated list of filter names + * @param FilterManager $filterManager the Assetic filter manager + * @param string $filters a comma separated list of filter names * @throws \InvalidArgumentException if a wrong filter is passed - * @return an array of filter names + * @return an array of filter names */ - protected function decodeAsseticFilters(FilterManager $filterManager, $filters) - { + protected function decodeAsseticFilters(FilterManager $filterManager, $filters) { + if (!empty($filters)) { $filter_list = explode(',', $filters); @@ -273,7 +261,8 @@ class AsseticAssetManager implements AssetManagerInterface break; } } - } else { + } + else { $filter_list = array(); } @@ -283,67 +272,73 @@ class AsseticAssetManager implements AssetManagerInterface /** * Generates assets from $asset_path in $output_path, using $filters. * - * @param string $asset_path the full path to the asset file (or file collection, e.g. *.less) + * @param $assetSource + * @param $assetDirectoryBase + * @param string $webAssetsDirectoryBase the full path to the asset file (or file collection, e.g. *.less) * - * @param string $web_assets_directory_base the full disk path to the base assets output directory in the web space - * @param string $output_url the URL to the base assets output directory in the web space + * @param string $webAssetsTemplate the full disk path to the base assets output directory in the web space + * @param $webAssetsKey + * @param string $outputUrl the URL to the base assets output directory in the web space * - * @param string $asset_type the asset type: css, js, ... The generated files will have this extension. Pass an empty string to use the asset source extension. - * @param array $filters a list of filters, as defined below (see switch($filter_name) ...) + * @param string $assetType the asset type: css, js, ... The generated files will have this extension. Pass an empty string to use the asset source extension. + * @param array $filters a list of filters, as defined below (see switch($filter_name) ...) * - * @param boolean $debug true / false - * @throws \InvalidArgumentException if an invalid filter name is found - * @return string The URL to the generated asset file. + * @param boolean $debug true / false + * + * @return string The URL to the generated asset file. */ - public function processAsset($asset_path, $web_assets_directory_base, $output_url, $asset_type, $filters, $debug) + public function processAsset($assetSource, $assetDirectoryBase, $webAssetsDirectoryBase, $webAssetsTemplate, $webAssetsKey, $outputUrl, $assetType, $filters, $debug) { - $asset_name = basename($asset_path); - $input_directory = realpath(dirname($asset_path)); + $assetName = basename($assetSource); + $inputDirectory = realpath(dirname($assetSource)); + + $assetFileDirectoryInAssetDirectory = trim(str_replace(array($assetDirectoryBase, $assetName), '', $assetSource), DS); $am = new AssetManager(); $fm = new FilterManager(); // Get the filter list - $filter_list = $this->decodeAsseticFilters($fm, $filters); + $filterList = $this->decodeAsseticFilters($fm, $filters); // Factory setup - $factory = new AssetFactory($input_directory); + $factory = new AssetFactory($inputDirectory); $factory->setAssetManager($am); $factory->setFilterManager($fm); - $factory->setDefaultOutput('*' . (!empty($asset_type) ? '.' : '') . $asset_type); + $factory->setDefaultOutput('*' . (!empty($assetType) ? '.' : '') . $assetType); $factory->setDebug($debug); - $asset = $factory->createAsset($asset_name, $filter_list); + $asset = $factory->createAsset($assetName, $filterList); - $input_directory = realpath(dirname($asset_path)); - - $output_directory = $this->getDestinationDirectory($input_directory, $web_assets_directory_base); + $outputDirectory = $this->getDestinationDirectory($webAssetsDirectoryBase, $webAssetsTemplate, $webAssetsKey); // Get the URL part from the relative path - $output_relative_path = $this->getRelativeDirectoryPath($input_directory, $web_assets_directory_base); + $outputRelativePath = $webAssetsTemplate . DS . $webAssetsKey; - $output_relative_web_path = rtrim(str_replace('\\', '/', $output_relative_path), '/') . '/'; + $outputRelativeWebPath = rtrim(str_replace('\\', '/', $outputRelativePath), '/') . '/'; - $asset_target_filename = $asset->getTargetPath(); + $assetTargetFilename = $asset->getTargetPath(); - // This is the final name of the generated asset - $asset_destination_path = $output_directory . DS . $asset_target_filename; + /* + * This is the final name of the generated asset + * We preserve file structure intending to keep - for example - relative css links working + */ + $assetDestinationPath = $outputDirectory . DS . $assetFileDirectoryInAssetDirectory . DS . $assetTargetFilename; - Tlog::getInstance()->addDebug("Asset destination full path: $asset_destination_path"); + Tlog::getInstance()->addDebug("Asset destination full path: $assetDestinationPath"); // We generate an asset only if it does not exists, or if the asset processing is forced in development mode - if (! file_exists($asset_destination_path) || ($this->debugMode && ConfigQuery::read('process_assets', true)) ) { + if (! file_exists($assetDestinationPath) || ($this->debugMode && ConfigQuery::read('process_assets', true)) ) { - $writer = new AssetWriter($output_directory); + $writer = new AssetWriter($outputDirectory . DS . $assetFileDirectoryInAssetDirectory); - Tlog::getInstance()->addDebug("Writing asset to $output_directory"); + Tlog::getInstance()->addDebug("Writing asset to $outputDirectory . DS . $assetFileDirectoryInAssetDirectory"); $writer->writeAsset($asset); } - return rtrim($output_url, '/') . '/' . ltrim($output_relative_web_path, '/') . $asset_target_filename; + return rtrim($outputUrl, '/') . '/' . trim($outputRelativeWebPath, '/') . '/' . trim($assetFileDirectoryInAssetDirectory, '/') . '/' . ltrim($assetTargetFilename, '/'); } -} \ No newline at end of file +} diff --git a/core/lib/Thelia/Core/Template/Loop/OrderCoupon.php b/core/lib/Thelia/Core/Template/Loop/OrderCoupon.php index 80e24c487..ed74a4dac 100755 --- a/core/lib/Thelia/Core/Template/Loop/OrderCoupon.php +++ b/core/lib/Thelia/Core/Template/Loop/OrderCoupon.php @@ -91,21 +91,20 @@ class OrderCoupon extends BaseLoop implements PropelSearchLoopInterface $cleanedConditions = array(); - foreach ($conditions->getConditions() as $condition) { + /*foreach ($conditions->getConditions() as $condition) { $cleanedConditions[] = $condition->getToolTip(); - } + }*/ $loopResultRow->set("ID", $orderCoupon->getId()) ->set("CODE", $orderCoupon->getCode()) ->set("TITLE", $orderCoupon->getTitle()) ->set("SHORT_DESCRIPTION", $orderCoupon->getShortDescription()) ->set("DESCRIPTION", $orderCoupon->getDescription()) ->set("EXPIRATION_DATE", $orderCoupon->getExpirationDate( OrderQuery::create()->findPk($this->getOrder())->getLangId() )) - ->set("USAGE_LEFT", $orderCoupon->getMaxUsage()) ->set("IS_CUMULATIVE", $orderCoupon->getIsCumulative()) ->set("IS_REMOVING_POSTAGE", $orderCoupon->getIsRemovingPostage()) ->set("IS_AVAILABLE_ON_SPECIAL_OFFERS", $orderCoupon->getIsAvailableOnSpecialOffers()) - ->set("AMOUNT", $orderCoupon->getAmount()) - ->set("APPLICATION_CONDITIONS", $cleanedConditions) + //->set("AMOUNT", $orderCoupon->getAmount()) + //->set("APPLICATION_CONDITIONS", $cleanedConditions) ->set("DAY_LEFT_BEFORE_EXPIRATION", $daysLeftBeforeExpiration) ; $loopResult->addRow($loopResultRow);