From 45106f24bdcb9f40af148cb23b3e7ac7f8a8c5cf Mon Sep 17 00:00:00 2001 From: Etienne Roudeix Date: Wed, 18 Sep 2013 15:58:58 +0200 Subject: [PATCH] module image --- core/lib/Thelia/Core/Template/Loop/Image.php | 2 +- core/lib/Thelia/Exception/ModuleException.php | 39 ++++++++ core/lib/Thelia/Module/BaseModule.php | 86 ++++++++++++++++++ .../Thelia/Tests/Module/BaseModuleTestor.php | 53 +++++++++++ core/lib/Thelia/Tools/Image.php | 44 +++++++++ install/insert.sql | 2 +- local/modules/Cheque/Cheque.php | 6 +- local/modules/Colissimo/Colissimo.php | 5 + local/modules/DebugBar/DebugBar.php | 5 + .../{Paypal => FakeCB}/Config/config.xml | 0 .../{Paypal => FakeCB}/Config/plugin.xml | 0 .../{Paypal/Paypal.php => FakeCB/FakeCB.php} | 21 +++-- local/modules/FakeCB/Tests/FakeCBTest.php | 54 +++++++++++ local/modules/FakeCB/images/mastercard.png | Bin 0 -> 3733 bytes local/modules/FakeCB/images/visa.png | Bin 0 -> 3158 bytes phpunit.xml | 1 + 16 files changed, 307 insertions(+), 11 deletions(-) create mode 100755 core/lib/Thelia/Exception/ModuleException.php create mode 100644 core/lib/Thelia/Tests/Module/BaseModuleTestor.php create mode 100755 core/lib/Thelia/Tools/Image.php rename local/modules/{Paypal => FakeCB}/Config/config.xml (100%) rename local/modules/{Paypal => FakeCB}/Config/plugin.xml (100%) rename local/modules/{Paypal/Paypal.php => FakeCB/FakeCB.php} (84%) create mode 100755 local/modules/FakeCB/Tests/FakeCBTest.php create mode 100644 local/modules/FakeCB/images/mastercard.png create mode 100644 local/modules/FakeCB/images/visa.png diff --git a/core/lib/Thelia/Core/Template/Loop/Image.php b/core/lib/Thelia/Core/Template/Loop/Image.php index 8d0c99400..6a3dbfee1 100755 --- a/core/lib/Thelia/Core/Template/Loop/Image.php +++ b/core/lib/Thelia/Core/Template/Loop/Image.php @@ -48,7 +48,7 @@ class Image extends BaseI18nLoop /** * @var array Possible image sources */ - protected $possible_sources = array('category', 'product', 'folder', 'content'); + protected $possible_sources = array('category', 'product', 'folder', 'content', 'module'); /** * @return \Thelia\Core\Template\Loop\Argument\ArgumentCollection diff --git a/core/lib/Thelia/Exception/ModuleException.php b/core/lib/Thelia/Exception/ModuleException.php new file mode 100755 index 000000000..263a071b0 --- /dev/null +++ b/core/lib/Thelia/Exception/ModuleException.php @@ -0,0 +1,39 @@ +. */ +/* */ +/*************************************************************************************/ + +namespace Thelia\Exception; + +class ModuleException extends \RuntimeException +{ + const UNKNOWN_EXCEPTION = 0; + + const CODE_NOT_FOUND = 404; + + public function __construct($message, $code = null, $previous = null) + { + if ($code === null) { + $code = self::UNKNOWN_EXCEPTION; + } + parent::__construct($message, $code, $previous); + } +} diff --git a/core/lib/Thelia/Module/BaseModule.php b/core/lib/Thelia/Module/BaseModule.php index a13403482..faae1e9ce 100755 --- a/core/lib/Thelia/Module/BaseModule.php +++ b/core/lib/Thelia/Module/BaseModule.php @@ -25,6 +25,12 @@ namespace Thelia\Module; use Symfony\Component\DependencyInjection\ContainerAware; +use Thelia\Model\Map\ModuleImageTableMap; +use Thelia\Tools\Image; +use Thelia\Exception\ModuleException; +use Thelia\Model\Module; +use Thelia\Model\ModuleImage; +use Thelia\Model\ModuleQuery; abstract class BaseModule extends ContainerAware { @@ -56,6 +62,86 @@ abstract class BaseModule extends ContainerAware return $this->container; } + public function deployImageFolder(Module $module, $folderPath) + { + try { + $directoryBrowser = new \DirectoryIterator($folderPath); + } catch(\UnexpectedValueException $e) { + throw $e; + } + + $con = \Propel\Runtime\Propel::getConnection( + ModuleImageTableMap::DATABASE_NAME + ); + + /* browse the directory */ + $imagePosition = 1; + foreach($directoryBrowser as $directoryContent) { + /* is it a file ? */ + if ($directoryContent->isFile()) { + + $fileName = $directoryContent->getFilename(); + $filePath = $directoryContent->getPathName(); + + /* is it a picture ? */ + if( Image::isImage($filePath) ) { + + $con->beginTransaction(); + + $image = new ModuleImage(); + $image->setModuleId($module->getId()); + $image->setPosition($imagePosition); + $image->save(); + + $imageDirectory = sprintf("%s/../../../../local/media/images/module", __DIR__); + $imageFileName = sprintf("%s-%d-%s", $module->getCode(), $image->getId(), $fileName); + + $increment = 0; + while(file_exists($imageDirectory . '/' . $imageFileName)) { + $imageFileName = sprintf("module/%s-%d-%d-%s", $module->getCode(), $image->getId(), $increment, $fileName); + $increment++; + } + + $imagePath = sprintf('%s/%s', $imageDirectory, $imageFileName); + + if (! is_dir($imageDirectory)) { + if(! mkdir($imageDirectory, 0777, true)) { + $con->rollBack(); + throw new ModuleException(sprintf("Cannot create directory : %s", $imageDirectory), ModuleException::CODE_NOT_FOUND); + } + } + + if(! copy($filePath, $imagePath)) { + $con->rollBack(); + throw new ModuleException(sprintf("Cannot copy file : %s to : %s", $filePath, $imagePath), ModuleException::CODE_NOT_FOUND); + } + + $image->setFile($imageFileName); + $image->save(); + + $con->commit(); + $imagePosition++; + } + } + } + } + + /** + * @return ChildModule + * @throws \Thelia\Exception\ModuleException + */ + public function getModuleModel() + { + $moduleModel = ModuleQuery::create()->findOneByCode($this->getCode()); + + if(null === $moduleModel) { + throw new ModuleException(sprintf("Module Code `%s` not found", $this->getCode()), ModuleException::CODE_NOT_FOUND); + } + + return $moduleModel; + } + + abstract public function getCode(); abstract public function install(); abstract public function destroy(); diff --git a/core/lib/Thelia/Tests/Module/BaseModuleTestor.php b/core/lib/Thelia/Tests/Module/BaseModuleTestor.php new file mode 100644 index 000000000..ce70cd4ad --- /dev/null +++ b/core/lib/Thelia/Tests/Module/BaseModuleTestor.php @@ -0,0 +1,53 @@ +. */ +/* */ +/*************************************************************************************/ + +namespace Thelia\Tests\Module; + + +/** + * + * @author Etienne Roudeix + * + */ +abstract class BaseModuleTestor extends \PHPUnit_Framework_TestCase +{ + protected $instance; + + abstract public function getTestedClassName(); + abstract public function getTestedInstance(); + + /*protected function getMethod($name) + { + $class = new \ReflectionClass($this->getTestedClassName()); + $method = $class->getMethod($name); + $method->setAccessible(true); + + return $method; + }*/ + + public function setUp() + { + $this->instance = $this->getTestedInstance(); + } +} + diff --git a/core/lib/Thelia/Tools/Image.php b/core/lib/Thelia/Tools/Image.php new file mode 100755 index 000000000..5fa4d3c6c --- /dev/null +++ b/core/lib/Thelia/Tools/Image.php @@ -0,0 +1,44 @@ +. */ +/* */ +/*************************************************************************************/ + +namespace Thelia\Tools; + +class Image +{ + static public function isImage($filePath, $allowedImageTypes = null) + { + $imageFile = getimagesize($filePath); + $imageType = $imageFile[2]; + + if(!is_array($allowedImageTypes) && $imageType != IMAGETYPE_UNKNOWN) { + return true; + } + + if(in_array($imageType , $allowedImageTypes)) + { + return true; + } + + return false; + } +} diff --git a/install/insert.sql b/install/insert.sql index 1882250e2..9ca1d3ba2 100755 --- a/install/insert.sql +++ b/install/insert.sql @@ -34,7 +34,7 @@ INSERT INTO `module` (`id`, `code`, `type`, `activate`, `position`, `full_namesp (1, 'DebugBar', 1, 1, 1, 'DebugBar\\DebugBar', NOW(), NOW()), (2, 'Colissimo', 2, 1, 1, 'Colissimo\\Colissimo', NOW(), NOW()), (3, 'Cheque', 3, 1, 1, 'Cheque\\Cheque', NOW(), NOW()), -(4, 'Paypal', 3, 1, 2, 'Paypal\\Paypal', NOW(), NOW()); +(4, 'FakeCB', 3, 1, 2, 'FakeCB\\FakeCB', NOW(), NOW()); INSERT INTO `module_i18n` (`id`, `locale`, `title`, `description`, `chapo`, `postscriptum`) VALUES ('2', 'en_US', '72h delivery', NULL, NULL, NULL), diff --git a/local/modules/Cheque/Cheque.php b/local/modules/Cheque/Cheque.php index 7d3ef5819..10d78c809 100755 --- a/local/modules/Cheque/Cheque.php +++ b/local/modules/Cheque/Cheque.php @@ -25,7 +25,6 @@ namespace Cheque; use Symfony\Component\EventDispatcher\EventDispatcherInterface; use Symfony\Component\HttpFoundation\Request; -use Thelia\Model\Country; use Thelia\Module\BaseModule; use Thelia\Module\PaymentModuleInterface; @@ -73,4 +72,9 @@ class Cheque extends BaseModule implements PaymentModuleInterface // TODO: Implement destroy() method. } + public function getCode() + { + return 'Cheque'; + } + } diff --git a/local/modules/Colissimo/Colissimo.php b/local/modules/Colissimo/Colissimo.php index 80dfddd78..cfeaab994 100755 --- a/local/modules/Colissimo/Colissimo.php +++ b/local/modules/Colissimo/Colissimo.php @@ -81,4 +81,9 @@ class Colissimo extends BaseModule implements DeliveryModuleInterface // TODO: Implement destroy() method. } + public function getCode() + { + return 'Colissimo'; + } + } diff --git a/local/modules/DebugBar/DebugBar.php b/local/modules/DebugBar/DebugBar.php index 7dde5fa8d..dcdf91313 100755 --- a/local/modules/DebugBar/DebugBar.php +++ b/local/modules/DebugBar/DebugBar.php @@ -41,4 +41,9 @@ class DebugBar extends BaseModule { // TODO: Implement destroy() method. } + + public function getCode() + { + return 'DebugBar'; + } } diff --git a/local/modules/Paypal/Config/config.xml b/local/modules/FakeCB/Config/config.xml similarity index 100% rename from local/modules/Paypal/Config/config.xml rename to local/modules/FakeCB/Config/config.xml diff --git a/local/modules/Paypal/Config/plugin.xml b/local/modules/FakeCB/Config/plugin.xml similarity index 100% rename from local/modules/Paypal/Config/plugin.xml rename to local/modules/FakeCB/Config/plugin.xml diff --git a/local/modules/Paypal/Paypal.php b/local/modules/FakeCB/FakeCB.php similarity index 84% rename from local/modules/Paypal/Paypal.php rename to local/modules/FakeCB/FakeCB.php index bc38855f3..e59651a47 100755 --- a/local/modules/Paypal/Paypal.php +++ b/local/modules/FakeCB/FakeCB.php @@ -21,15 +21,15 @@ /* */ /*************************************************************************************/ -namespace Paypal; +namespace FakeCB; use Symfony\Component\EventDispatcher\EventDispatcherInterface; use Symfony\Component\HttpFoundation\Request; -use Thelia\Model\Country; +use Thelia\Model\Base\ModuleImageQuery; use Thelia\Module\BaseModule; use Thelia\Module\PaymentModuleInterface; -class Paypal extends BaseModule implements PaymentModuleInterface +class FakeCB extends BaseModule implements PaymentModuleInterface { protected $request; protected $dispatcher; @@ -59,13 +59,13 @@ class Paypal extends BaseModule implements PaymentModuleInterface // TODO: Implement pay() method. } - /** - * YOU HAVE TO IMPLEMENT HERE ABSTRACT METHODD FROM BaseModule Class - * Like install and destroy - */ public function install() { - // TODO: Implement install() method. + /* insert the images from image folder if first module activation */ + $module = $this->getModuleModel(); + if(ModuleImageQuery::create()->filterByModule($module)->count() == 0) { + $this->deployImageFolder($module, sprintf('%s/images', __DIR__)); + } } public function destroy() @@ -73,4 +73,9 @@ class Paypal extends BaseModule implements PaymentModuleInterface // TODO: Implement destroy() method. } + public function getCode() + { + return 'FakeCB'; + } + } diff --git a/local/modules/FakeCB/Tests/FakeCBTest.php b/local/modules/FakeCB/Tests/FakeCBTest.php new file mode 100755 index 000000000..b3e2302f2 --- /dev/null +++ b/local/modules/FakeCB/Tests/FakeCBTest.php @@ -0,0 +1,54 @@ +. */ +/* */ +/*************************************************************************************/ + +namespace FakeCB\Tests; + +use FakeCB\FakeCB; +use Thelia\Tests\Module\BaseModuleTestor; + +/** + * + * @author Etienne Roudeix + * + */ +class FakeCBTest extends BaseModuleTestor +{ + public function getTestedClassName() + { + return 'FakeCB\FakeCB'; + } + + public function getTestedInstance() + { + return new FakeCB(); + } + + public function testInstall() + { + $fakeCB = new FakeCB(); + + $fakeCB->install(); + + $out = true; + } +} diff --git a/local/modules/FakeCB/images/mastercard.png b/local/modules/FakeCB/images/mastercard.png new file mode 100644 index 0000000000000000000000000000000000000000..28701c3dd2b033657d86bd5edb3d4e138cba8bf1 GIT binary patch literal 3733 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 literal 0 HcmV?d00001 diff --git a/phpunit.xml b/phpunit.xml index 1cad09b60..a45fc5bb3 100755 --- a/phpunit.xml +++ b/phpunit.xml @@ -12,6 +12,7 @@ core/lib/Thelia/Tests + local/modules/*/Tests