diff --git a/composer.json b/composer.json index 0a4fc0629..e96385edd 100755 --- a/composer.json +++ b/composer.json @@ -39,7 +39,8 @@ "symfony/icu": "1.0", "swiftmailer/swiftmailer": "5.0.*", "symfony/serializer": "2.3.*", - "ensepar/html2pdf": "1.0.1" + "ensepar/html2pdf": "1.0.1", + "symfony/finder": "~2.2" }, "require-dev" : { "phpunit/phpunit": "3.7.*", diff --git a/composer.lock b/composer.lock index f50fb4a4d..a6f05615a 100755 --- a/composer.lock +++ b/composer.lock @@ -3,7 +3,7 @@ "This file locks the dependencies of your project to a known state", "Read more about it at http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file" ], - "hash": "852879ecc2e39e5cf283a3b1c5051a8e", + "hash": "4f3fabbb795a71df45ae9f6ccb6df355", "packages": [ { "name": "ensepar/html2pdf", @@ -949,7 +949,7 @@ }, { "name": "symfony/finder", - "version": "v2.3.5", + "version": "v2.3.6", "target-dir": "Symfony/Component/Finder", "source": { "type": "git", diff --git a/core/lib/Thelia/Action/Area.php b/core/lib/Thelia/Action/Area.php index d9173ae93..92eb75634 100644 --- a/core/lib/Thelia/Action/Area.php +++ b/core/lib/Thelia/Action/Area.php @@ -34,7 +34,6 @@ use Thelia\Model\CountryQuery; use Thelia\Action\BaseAction; use Thelia\Model\Area as AreaModel; - /** * Class Area * @package Thelia\Action @@ -97,7 +96,6 @@ class Area extends BaseAction implements EventSubscriberInterface $event->setArea($area); } - /** * Returns an array of event names this subscriber wants to listen to. * @@ -128,4 +126,4 @@ class Area extends BaseAction implements EventSubscriberInterface TheliaEvents::AREA_CREATE => array('create', 128) ); } -} \ No newline at end of file +} diff --git a/core/lib/Thelia/Action/Cache.php b/core/lib/Thelia/Action/Cache.php new file mode 100644 index 000000000..4407c3e92 --- /dev/null +++ b/core/lib/Thelia/Action/Cache.php @@ -0,0 +1,75 @@ +. */ +/* */ +/*************************************************************************************/ + +namespace Thelia\Action; +use Symfony\Component\EventDispatcher\EventSubscriberInterface; +use Symfony\Component\Filesystem\Filesystem; +use Thelia\Core\Event\Cache\CacheEvent; +use Thelia\Core\Event\TheliaEvents; + +/** + * Class Cache + * @package Thelia\Action + * @author Manuel Raynaud + */ +class Cache extends BaseAction implements EventSubscriberInterface +{ + + public function cacheClear(CacheEvent $event) + { + $dir = $event->getDir(); + + $directoryBrowser = new \DirectoryIterator($dir); + + $fs = new Filesystem(); + $fs->remove($dir); + + } + + /** + * Returns an array of event names this subscriber wants to listen to. + * + * The array keys are event names and the value can be: + * + * * The method name to call (priority defaults to 0) + * * An array composed of the method name to call and the priority + * * An array of arrays composed of the method names to call and respective + * priorities, or 0 if unset + * + * For instance: + * + * * array('eventName' => 'methodName') + * * array('eventName' => array('methodName', $priority)) + * * array('eventName' => array(array('methodName1', $priority), array('methodName2')) + * + * @return array The event names to listen to + * + * @api + */ + public static function getSubscribedEvents() + { + return array( + TheliaEvents::CACHE_CLEAR => array('cacheClear', 128) + ); + } +} diff --git a/core/lib/Thelia/Action/Content.php b/core/lib/Thelia/Action/Content.php index 8560aa00e..3c027ad04 100644 --- a/core/lib/Thelia/Action/Content.php +++ b/core/lib/Thelia/Action/Content.php @@ -160,7 +160,7 @@ class Content extends BaseAction implements EventSubscriberInterface ->filterByFolderId($event->getFolderId()) ->findOne(); - if(null !== $contentFolder) { + if (null !== $contentFolder) { $contentFolder->delete(); } } diff --git a/core/lib/Thelia/Action/Country.php b/core/lib/Thelia/Action/Country.php index 69bf3c568..4c2d0839b 100644 --- a/core/lib/Thelia/Action/Country.php +++ b/core/lib/Thelia/Action/Country.php @@ -32,7 +32,6 @@ use Thelia\Core\Event\TheliaEvents; use Thelia\Model\Country as CountryModel; use Thelia\Model\CountryQuery; - /** * Class Country * @package Thelia\Action @@ -85,15 +84,13 @@ class Country extends BaseAction implements EventSubscriberInterface public function toggleDefault(CountryToggleDefaultEvent $event) { - if( null !== $country = CountryQuery::create()->findPk($event->getCountryId())) - { + if ( null !== $country = CountryQuery::create()->findPk($event->getCountryId())) { $country->toggleDefault(); $event->setCountry($country); } } - /** * Returns an array of event names this subscriber wants to listen to. * @@ -123,4 +120,4 @@ class Country extends BaseAction implements EventSubscriberInterface TheliaEvents::COUNTRY_TOGGLE_DEFAULT => array('toggleDefault', 128) ); } -} \ No newline at end of file +} diff --git a/core/lib/Thelia/Action/Customer.php b/core/lib/Thelia/Action/Customer.php index 85643cb88..2e18872f6 100755 --- a/core/lib/Thelia/Action/Customer.php +++ b/core/lib/Thelia/Action/Customer.php @@ -25,7 +25,6 @@ namespace Thelia\Action; use Symfony\Component\EventDispatcher\EventSubscriberInterface; use Thelia\Core\Event\ActionEvent; -use Thelia\Core\Event\Customer\CustomerAddressEvent; use Thelia\Core\Event\Customer\CustomerCreateOrUpdateEvent; use Thelia\Core\Event\Customer\CustomerEvent; use Thelia\Core\Event\TheliaEvents; diff --git a/core/lib/Thelia/Action/Module.php b/core/lib/Thelia/Action/Module.php new file mode 100644 index 000000000..ddc285960 --- /dev/null +++ b/core/lib/Thelia/Action/Module.php @@ -0,0 +1,136 @@ +. */ +/* */ +/*************************************************************************************/ + +namespace Thelia\Action; +use Propel\Runtime\Propel; +use Symfony\Component\EventDispatcher\EventSubscriberInterface; +use Symfony\Component\Filesystem\Filesystem; +use Thelia\Core\Event\Cache\CacheEvent; +use Thelia\Core\Event\Module\ModuleDeleteEvent; +use Thelia\Core\Event\Module\ModuleToggleActivationEvent; +use Thelia\Core\Event\TheliaEvents; +use Thelia\Model\Map\ModuleTableMap; +use Thelia\Model\ModuleQuery; +use Thelia\Module\BaseModule; + +/** + * Class Module + * @package Thelia\Action + * @author Manuel Raynaud + */ +class Module extends BaseAction implements EventSubscriberInterface +{ + + public function toggleActivation(ModuleToggleActivationEvent $event) + { + if (null !== $module = ModuleQuery::create()->findPk($event->getModuleId())) { + $moduleClass = new \ReflectionClass($module->getFullNamespace()); + + $moduleInstance = $moduleClass->newInstance(); + + if ( method_exists($moduleInstance, 'setContainer')) { + $moduleInstance->setContainer($this->container); + if ($module->getActivate() == BaseModule::IS_ACTIVATED) { + $moduleInstance->deActivate($module); + } else { + $moduleInstance->activate($module); + } + } + + $event->setModule($module); + + $this->cacheClear(); + } + } + + public function delete(ModuleDeleteEvent $event) + { + if (null !== $module = ModuleQuery::create()->findPk($event->getModuleId())) { + $con = Propel::getWriteConnection(ModuleTableMap::DATABASE_NAME); + $con->beginTransaction(); + + try { + if(null === $module->getFullNamespace()) { + throw new \LogicException('can not instanciante this module if namespace is null. Maybe the model is not loaded ?'); + } + + $reflected = new \ReflectionClass($module->getFullNamespace()); + $instance = $reflected->newInstance(); + $instance->setContainer($this->container); + + $path = dirname($reflected->getFileName()); + + $instance->destroy($con); + + $fs = new Filesystem(); + $fs->remove($path); + + $module->delete($con); + + $con->commit(); + + $event->setModule($module); + $this->cacheClear(); + + } catch (\Exception $e) { + $con->rollBack(); + throw $e; + } + } + } + + protected function cacheClear() + { + $cacheEvent = new CacheEvent($this->container->getParameter('kernel.cache_dir')); + + $this->getDispatcher()->dispatch(TheliaEvents::CACHE_CLEAR, $cacheEvent); + } + + /** + * Returns an array of event names this subscriber wants to listen to. + * + * The array keys are event names and the value can be: + * + * * The method name to call (priority defaults to 0) + * * An array composed of the method name to call and the priority + * * An array of arrays composed of the method names to call and respective + * priorities, or 0 if unset + * + * For instance: + * + * * array('eventName' => 'methodName') + * * array('eventName' => array('methodName', $priority)) + * * array('eventName' => array(array('methodName1', $priority), array('methodName2')) + * + * @return array The event names to listen to + * + * @api + */ + public static function getSubscribedEvents() + { + return array( + TheliaEvents::MODULE_TOGGLE_ACTIVATION => array('toggleActivation', 128), + TheliaEvents::MODULE_DELETE => array('delete', 128) + ); + } +} diff --git a/core/lib/Thelia/Action/Pdf.php b/core/lib/Thelia/Action/Pdf.php index 52ce0b92d..2bdad9366 100644 --- a/core/lib/Thelia/Action/Pdf.php +++ b/core/lib/Thelia/Action/Pdf.php @@ -26,7 +26,6 @@ use Symfony\Component\EventDispatcher\EventSubscriberInterface; use Thelia\Core\Event\PdfEvent; use Thelia\Core\Event\TheliaEvents; - /** * Class Pdf * @package Thelia\Action @@ -72,4 +71,4 @@ class Pdf extends BaseAction implements EventSubscriberInterface TheliaEvents::GENERATE_PDF => array("generatePdf", 128) ); } -} \ No newline at end of file +} diff --git a/core/lib/Thelia/Action/ShippingZone.php b/core/lib/Thelia/Action/ShippingZone.php index 517a5ca25..c621efd8f 100644 --- a/core/lib/Thelia/Action/ShippingZone.php +++ b/core/lib/Thelia/Action/ShippingZone.php @@ -29,7 +29,6 @@ use Thelia\Core\Event\TheliaEvents; use Thelia\Model\AreaDeliveryModule; use Thelia\Model\AreaDeliveryModuleQuery; - /** * Class ShippingZone * @package Thelia\Action @@ -55,7 +54,7 @@ class ShippingZone extends BaseAction implements EventSubscriberInterface ->filterByDeliveryModuleId($event->getShoppingZoneId()) ->findOne(); - if($areaDelivery) { + if ($areaDelivery) { $areaDelivery->delete(); } else { throw new \RuntimeException(sprintf('areaDeliveryModule not found with area_id = %d and delivery_module_id = %d', $event->getAreaId(), $event->getShoppingZoneId())); @@ -89,4 +88,4 @@ class ShippingZone extends BaseAction implements EventSubscriberInterface TheliaEvents::SHIPPING_ZONE_REMOVE_AREA => array('removeArea', 128), ); } -} \ No newline at end of file +} diff --git a/core/lib/Thelia/Action/TaxRule.php b/core/lib/Thelia/Action/TaxRule.php index b3f1d23ae..e6d42976e 100644 --- a/core/lib/Thelia/Action/TaxRule.php +++ b/core/lib/Thelia/Action/TaxRule.php @@ -69,8 +69,6 @@ class TaxRule extends BaseAction implements EventSubscriberInterface ->save() ; - - $event->setTaxRule($taxRule); } } @@ -91,12 +89,12 @@ class TaxRule extends BaseAction implements EventSubscriberInterface ->delete(); /* for each country */ - foreach($event->getCountryList() as $country) { + foreach ($event->getCountryList() as $country) { $position = 1; /* on applique les nouvelles regles */ - foreach($taxList as $tax) { - if(is_array($tax)) { - foreach($tax as $samePositionTax) { + foreach ($taxList as $tax) { + if (is_array($tax)) { + foreach ($tax as $samePositionTax) { $taxModel = new TaxRuleCountry(); $taxModel->setTaxRule($taxRule) ->setCountryId($country) diff --git a/core/lib/Thelia/Command/CacheClear.php b/core/lib/Thelia/Command/CacheClear.php index e85e29741..1d4e7919c 100755 --- a/core/lib/Thelia/Command/CacheClear.php +++ b/core/lib/Thelia/Command/CacheClear.php @@ -30,6 +30,8 @@ use Symfony\Component\Filesystem\Filesystem; use Symfony\Component\Filesystem\Exception\IOException; use Thelia\Command\ContainerAwareCommand; +use Thelia\Core\Event\Cache\CacheEvent; +use Thelia\Core\Event\TheliaEvents; /** * clear the cache @@ -72,7 +74,11 @@ class CacheClear extends ContainerAwareCommand $output->writeln(sprintf("Clearing cache in %s directory", $dir)); try { - $directoryBrowser = new \DirectoryIterator($dir); + $cacheEvent = new CacheEvent($dir); + $this-> + getContainer() + ->get('event_dispatcher') + ->dispatch(TheliaEvents::CACHE_CLEAR, $cacheEvent); } catch (\UnexpectedValueException $e) { // throws same exception code for does not exist and permission denied ... if (!file_exists($dir)) { @@ -82,15 +88,11 @@ class CacheClear extends ContainerAwareCommand } throw $e; - } - - $fs = new Filesystem(); - try { - $fs->remove($dir); - - $output->writeln(sprintf("%s cache dir cleared successfully", $dir)); } catch (IOException $e) { $output->writeln(sprintf("Error during clearing cache : %s", $e->getMessage())); } + + $output->writeln(sprintf("%s cache dir cleared successfully", $dir)); + } } diff --git a/core/lib/Thelia/Command/Install.php b/core/lib/Thelia/Command/Install.php index 6423d861a..7b6ca31c5 100755 --- a/core/lib/Thelia/Command/Install.php +++ b/core/lib/Thelia/Command/Install.php @@ -143,8 +143,8 @@ class Install extends ContainerAwareCommand $permissions = new CheckPermission(false, $this->getContainer()->get('thelia.translator')); $isValid = $permissions->exec(); - foreach($permissions->getValidationMessages() as $item => $data) { - if($data['status']) { + foreach ($permissions->getValidationMessages() as $item => $data) { + if ($data['status']) { $output->writeln(array( sprintf("%s ... %s", $data['text'], @@ -162,7 +162,7 @@ class Install extends ContainerAwareCommand } - if(false === $isValid) { + if (false === $isValid) { $output->writeln(array( "", "Please put correct permissions and reload install process" diff --git a/core/lib/Thelia/Command/ModuleActivateCommand.php b/core/lib/Thelia/Command/ModuleActivateCommand.php index d5ca8156d..1b8ac600f 100755 --- a/core/lib/Thelia/Command/ModuleActivateCommand.php +++ b/core/lib/Thelia/Command/ModuleActivateCommand.php @@ -26,7 +26,6 @@ namespace Thelia\Command; use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\OutputInterface; -use Symfony\Component\Filesystem\Filesystem; use Thelia\Model\ModuleQuery; diff --git a/core/lib/Thelia/Command/ModuleGenerateCommand.php b/core/lib/Thelia/Command/ModuleGenerateCommand.php index b34e43dc1..dfc13f29d 100755 --- a/core/lib/Thelia/Command/ModuleGenerateCommand.php +++ b/core/lib/Thelia/Command/ModuleGenerateCommand.php @@ -62,7 +62,7 @@ class ModuleGenerateCommand extends BaseModuleGenerate $output->renderBlock(array( '', sprintf("module %s create with success", $this->module), - "You can now configure your module and complete plugin.xml file", + "You can now configure your module and complete module.xml file", '' ), "bg=green;fg=black"); } @@ -86,7 +86,7 @@ class ModuleGenerateCommand extends BaseModuleGenerate $fs = new Filesystem(); $skeletonDir = str_replace("/", DIRECTORY_SEPARATOR, THELIA_ROOT . "/core/lib/Thelia/Command/Skeleton/Module/"); $fs->copy($skeletonDir . "config.xml", $this->moduleDirectory . DIRECTORY_SEPARATOR . "Config" . DIRECTORY_SEPARATOR . "config.xml"); - $fs->copy($skeletonDir . "plugin.xml", $this->moduleDirectory . DIRECTORY_SEPARATOR . "Config" . DIRECTORY_SEPARATOR . "plugin.xml"); + $fs->copy($skeletonDir . "module.xml", $this->moduleDirectory . DIRECTORY_SEPARATOR . "Config" . DIRECTORY_SEPARATOR . "module.xml"); $classContent = file_get_contents($skeletonDir . "Class.php"); diff --git a/core/lib/Thelia/Command/Skeleton/Module/Class.php b/core/lib/Thelia/Command/Skeleton/Module/Class.php index c4c90aa60..c9c7109ac 100755 --- a/core/lib/Thelia/Command/Skeleton/Module/Class.php +++ b/core/lib/Thelia/Command/Skeleton/Module/Class.php @@ -25,7 +25,7 @@ namespace %%NAMESPACE%%; use Thelia\Module\BaseModule; -class %%CLASSNAME%% extends BaseModule +class Class extends BaseModule { /** * YOU HAVE TO IMPLEMENT HERE ABSTRACT METHODD FROM BaseModule Class diff --git a/core/lib/Thelia/Command/Skeleton/Module/module.xml b/core/lib/Thelia/Command/Skeleton/Module/module.xml new file mode 100755 index 000000000..ae3dbbe53 --- /dev/null +++ b/core/lib/Thelia/Command/Skeleton/Module/module.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/core/lib/Thelia/Command/Skeleton/Module/plugin.xml b/core/lib/Thelia/Command/Skeleton/Module/plugin.xml deleted file mode 100755 index e69de29bb..000000000 diff --git a/core/lib/Thelia/Config/Resources/action.xml b/core/lib/Thelia/Config/Resources/action.xml index 41ded3741..4bc25b65d 100755 --- a/core/lib/Thelia/Config/Resources/action.xml +++ b/core/lib/Thelia/Config/Resources/action.xml @@ -141,6 +141,16 @@ + + + + + + + + + + diff --git a/core/lib/Thelia/Config/Resources/routing/admin.xml b/core/lib/Thelia/Config/Resources/routing/admin.xml index bc84ccf16..e4e29ee55 100755 --- a/core/lib/Thelia/Config/Resources/routing/admin.xml +++ b/core/lib/Thelia/Config/Resources/routing/admin.xml @@ -842,10 +842,19 @@ - + Thelia\Controller\Admin\ModuleController::indexAction + + Thelia\Controller\Admin\ModuleController::toggleActivationAction + \d+ + + + + Thelia\Controller\Admin\ModuleController::deleteAction + + diff --git a/core/lib/Thelia/Controller/Admin/AddressController.php b/core/lib/Thelia/Controller/Admin/AddressController.php index 090aca572..897b8421d 100644 --- a/core/lib/Thelia/Controller/Admin/AddressController.php +++ b/core/lib/Thelia/Controller/Admin/AddressController.php @@ -25,14 +25,12 @@ namespace Thelia\Controller\Admin; use Thelia\Core\Event\Address\AddressCreateOrUpdateEvent; use Thelia\Core\Event\Address\AddressEvent; use Thelia\Core\Event\AdminResources; -use Thelia\Core\Event\Customer\CustomerCreateOrUpdateEvent; use Thelia\Core\Event\TheliaEvents; use Thelia\Form\AddressCreateForm; use Thelia\Form\AddressUpdateForm; use Thelia\Model\AddressQuery; use Thelia\Model\CustomerQuery; - /** * Class AddressController * @package Thelia\Controller\Admin @@ -79,7 +77,7 @@ class AddressController extends AbstractCrudController $this->dispatch(TheliaEvents::ADDRESS_DEFAULT, $addressEvent); $this->adminLogAppend(sprintf("address %d for customer %d removal", $address_id, $address->getCustomerId())); - } catch(\Exception $e) { + } catch (\Exception $e) { \Thelia\Log\Tlog::getInstance()->error(sprintf("error during address removal with message %s", $e->getMessage())); } @@ -177,8 +175,6 @@ class AddressController extends AbstractCrudController $formData["is_default"] ); - - return $event; } @@ -280,8 +276,8 @@ class AddressController extends AbstractCrudController /** * Put in this method post object delete processing if required. * - * @param \Thelia\Core\Event\AddressEvent $deleteEvent the delete event - * @return Response a response, or null to continue normal processing + * @param \Thelia\Core\Event\AddressEvent $deleteEvent the delete event + * @return Response a response, or null to continue normal processing */ protected function performAdditionalDeleteAction($deleteEvent) { @@ -292,8 +288,8 @@ class AddressController extends AbstractCrudController /** * Put in this method post object creation processing if required. * - * @param AddressCreateOrUpdateEvent $createEvent the create event - * @return Response a response, or null to continue normal processing + * @param AddressCreateOrUpdateEvent $createEvent the create event + * @return Response a response, or null to continue normal processing */ protected function performAdditionalCreateAction($createEvent) { @@ -304,4 +300,4 @@ class AddressController extends AbstractCrudController { $this->redirectToEditionTemplate(); } -} \ No newline at end of file +} diff --git a/core/lib/Thelia/Controller/Admin/BaseAdminController.php b/core/lib/Thelia/Controller/Admin/BaseAdminController.php index 9adb7a19a..829e51c37 100755 --- a/core/lib/Thelia/Controller/Admin/BaseAdminController.php +++ b/core/lib/Thelia/Controller/Admin/BaseAdminController.php @@ -378,8 +378,8 @@ class BaseAdminController extends BaseController * Render the given template, and returns the result as a string. * * @param $templateName the complete template name, with extension - * @param array $args the template arguments - * @param null $templateDir + * @param array $args the template arguments + * @param null $templateDir * * @return \Symfony\Component\HttpFoundation\Response */ diff --git a/core/lib/Thelia/Controller/Admin/CountryController.php b/core/lib/Thelia/Controller/Admin/CountryController.php index f3ebf4e42..356c3d846 100644 --- a/core/lib/Thelia/Controller/Admin/CountryController.php +++ b/core/lib/Thelia/Controller/Admin/CountryController.php @@ -244,7 +244,7 @@ class CountryController extends AbstractCrudController try { $this->dispatch(TheliaEvents::COUNTRY_TOGGLE_DEFAULT, $toogleDefaultEvent); - if($toogleDefaultEvent->hasCountry()) { + if ($toogleDefaultEvent->hasCountry()) { return $this->nullResponse(); } } catch (\Exception $ex) { diff --git a/core/lib/Thelia/Controller/Admin/CustomerController.php b/core/lib/Thelia/Controller/Admin/CustomerController.php index 555d2653d..2ae53dc91 100644 --- a/core/lib/Thelia/Controller/Admin/CustomerController.php +++ b/core/lib/Thelia/Controller/Admin/CustomerController.php @@ -24,8 +24,6 @@ namespace Thelia\Controller\Admin; use Propel\Runtime\Exception\PropelException; -use Symfony\Component\Form\Form; -use Thelia\Core\Event\Address\AddressEvent; use Thelia\Core\Event\AdminResources; use Thelia\Core\Event\Customer\CustomerAddressEvent; use Thelia\Core\Event\Customer\CustomerCreateOrUpdateEvent; @@ -33,7 +31,6 @@ use Thelia\Core\Event\Customer\CustomerEvent; use Thelia\Core\Event\TheliaEvents; use Thelia\Form\CustomerModification; use Thelia\Form\Exception\FormValidationException; -use Thelia\Model\AddressQuery; use Thelia\Model\CustomerQuery; use Thelia\Core\Translation\Translator; @@ -58,8 +55,6 @@ class CustomerController extends BaseAdminController )); } - - /** * update customer action * diff --git a/core/lib/Thelia/Controller/Admin/ModuleController.php b/core/lib/Thelia/Controller/Admin/ModuleController.php index c9430ca41..a2079cee7 100644 --- a/core/lib/Thelia/Controller/Admin/ModuleController.php +++ b/core/lib/Thelia/Controller/Admin/ModuleController.php @@ -25,6 +25,11 @@ namespace Thelia\Controller\Admin; use Thelia\Core\Event\AdminResources; +use Thelia\Core\Event\Module\ModuleDeleteEvent; +use Thelia\Core\Event\Module\ModuleToggleActivationEvent; +use Thelia\Core\Event\TheliaEvents; +use Thelia\Module\ModuleManagement; + /** * Class ModuleController * @package Thelia\Controller\Admin @@ -35,7 +40,11 @@ class ModuleController extends BaseAdminController public function indexAction() { if (null !== $response = $this->checkAuth(AdminResources::MODULE_VIEW)) return $response; - return $this->render("modules", array("display_module" => 20)); + + $modulemanagement = new ModuleManagement(); + $modulemanagement->updateModules(); + + return $this->render("modules"); } public function updateAction($module_id) @@ -44,4 +53,68 @@ class ModuleController extends BaseAdminController "module_id" => $module_id )); } + + public function toggleActivationAction($module_id) + { + if (null !== $response = $this->checkAuth("admin.module.update")) return $response; + $message = null; + try { + $event = new ModuleToggleActivationEvent($module_id); + $this->dispatch(TheliaEvents::MODULE_TOGGLE_ACTIVATION, $event); + + if (null === $event->getModule()) { + throw new \LogicException( + $this->getTranslator()->trans("No %obj was updated.", array('%obj' => 'Module'))); + } + } catch (\Exception $e) { + $message = $e->getMessage(); + } + + if ($this->getRequest()->isXmlHttpRequest()) { + if ($message) { + $response = $this->jsonResponse(json_encode(array( + "error" => $message + )), 500); + } else { + $response = $this->nullResponse(); + } + + } else { + $this->redirectToRoute('admin.module'); + } + + return $response; + } + + public function deleteAction() + { + if (null !== $response = $this->checkAuth("admin.module.delete")) return $response; + + $message = null; + try { + + $module_id = $this->getRequest()->get('module_id'); + + $deleteEvent = new ModuleDeleteEvent($module_id); + + $this->dispatch(TheliaEvents::MODULE_DELETE, $deleteEvent); + + if($deleteEvent->hasModule() === false) { + throw new \LogicException( + $this->getTranslator()->trans("No %obj was updated.", array('%obj' => 'Module'))); + } + + } catch (\Exception $e) { + \Thelia\Log\Tlog::getInstance()->error(sprintf("error during module removal : %s", $message)); + $message = $e->getMessage(); + } + + if($message) { + return $this->render("modules", array( + "error_message" => $message + )); + } else { + $this->redirectToRoute('admin.module'); + } + } } diff --git a/core/lib/Thelia/Controller/Admin/OrderController.php b/core/lib/Thelia/Controller/Admin/OrderController.php index ff1346f58..1756582cc 100644 --- a/core/lib/Thelia/Controller/Admin/OrderController.php +++ b/core/lib/Thelia/Controller/Admin/OrderController.php @@ -212,7 +212,6 @@ class OrderController extends BaseAdminController { if (null !== $response = $this->checkAuth(AdminResources::ORDER_UPDATE)) return $response; - $html = $this->renderRaw( $fileName, array( @@ -228,7 +227,7 @@ class OrderController extends BaseAdminController $this->dispatch(TheliaEvents::GENERATE_PDF, $pdfEvent); - if($pdfEvent->hasPdf()) { + if ($pdfEvent->hasPdf()) { return Response::create($pdfEvent->getPdf(), 200, array( 'Content-type' => "application/pdf", diff --git a/core/lib/Thelia/Controller/Admin/ShippingZoneController.php b/core/lib/Thelia/Controller/Admin/ShippingZoneController.php index f458a4f59..5b0cd6dcc 100644 --- a/core/lib/Thelia/Controller/Admin/ShippingZoneController.php +++ b/core/lib/Thelia/Controller/Admin/ShippingZoneController.php @@ -141,5 +141,4 @@ class ShippingZoneController extends BaseAdminController return $this->getRequest()->get('shipping_zone_id', 0); } - } diff --git a/core/lib/Thelia/Controller/Admin/TaxRuleController.php b/core/lib/Thelia/Controller/Admin/TaxRuleController.php index eac6a4aa3..929df576e 100644 --- a/core/lib/Thelia/Controller/Admin/TaxRuleController.php +++ b/core/lib/Thelia/Controller/Admin/TaxRuleController.php @@ -200,8 +200,8 @@ class TaxRuleController extends AbstractCrudController /** * Put in this method post object creation processing if required. * - * @param TaxRuleEvent $createEvent the create event - * @return Response a response, or null to continue normal processing + * @param TaxRuleEvent $createEvent the create event + * @return Response a response, or null to continue normal processing */ protected function performAdditionalCreateAction($createEvent) { @@ -302,4 +302,4 @@ class TaxRuleController extends AbstractCrudController // At this point, the form has errors, and should be redisplayed. return $this->renderEditionTemplate(); } -} \ No newline at end of file +} diff --git a/core/lib/Thelia/Controller/BaseController.php b/core/lib/Thelia/Controller/BaseController.php index 8c819159b..e9f359411 100755 --- a/core/lib/Thelia/Controller/BaseController.php +++ b/core/lib/Thelia/Controller/BaseController.php @@ -58,7 +58,7 @@ class BaseController extends ContainerAware /** * Return an empty response (after an ajax request, for example) */ - protected function nullResponse($status = 200) + protected function nullResponse($content = null, $status = 200) { return new Response(null, $status); } @@ -66,9 +66,9 @@ class BaseController extends ContainerAware /** * Return a JSON response */ - protected function jsonResponse($json_data) + protected function jsonResponse($json_data, $status = 200) { - return new Response($json_data, 200, array('content-type' => 'application/json')); + return new Response($json_data, $status, array('content-type' => 'application/json')); } /** diff --git a/core/lib/Thelia/Core/Event/Area/AreaAddCountryEvent.php b/core/lib/Thelia/Core/Event/Area/AreaAddCountryEvent.php index b6af3c5b3..5c98c071c 100644 --- a/core/lib/Thelia/Core/Event/Area/AreaAddCountryEvent.php +++ b/core/lib/Thelia/Core/Event/Area/AreaAddCountryEvent.php @@ -23,7 +23,6 @@ namespace Thelia\Core\Event\Area; - /** * Class AreaAddCountryEvent * @package Thelia\Core\Event\Area @@ -34,7 +33,7 @@ class AreaAddCountryEvent extends AreaEvent protected $area_id; protected $country_id; - function __construct($area_id, $country_id) + public function __construct($area_id, $country_id) { $this->area_id = $area_id; $this->country_id = $country_id; @@ -80,7 +79,4 @@ class AreaAddCountryEvent extends AreaEvent return $this->country_id; } - - - -} \ No newline at end of file +} diff --git a/core/lib/Thelia/Core/Event/Area/AreaCreateEvent.php b/core/lib/Thelia/Core/Event/Area/AreaCreateEvent.php index d63afa5b9..32dc7a6c8 100644 --- a/core/lib/Thelia/Core/Event/Area/AreaCreateEvent.php +++ b/core/lib/Thelia/Core/Event/Area/AreaCreateEvent.php @@ -23,7 +23,6 @@ namespace Thelia\Core\Event\Area; - /** * Class AreaCreateEvent * @package Thelia\Core\Event\Area @@ -49,5 +48,4 @@ class AreaCreateEvent extends AreaEvent return $this->name; } - -} \ No newline at end of file +} diff --git a/core/lib/Thelia/Core/Event/Area/AreaDeleteEvent.php b/core/lib/Thelia/Core/Event/Area/AreaDeleteEvent.php index 86f936140..2a83c98a4 100644 --- a/core/lib/Thelia/Core/Event/Area/AreaDeleteEvent.php +++ b/core/lib/Thelia/Core/Event/Area/AreaDeleteEvent.php @@ -23,7 +23,6 @@ namespace Thelia\Core\Event\Area; - /** * Class AreaDeleteEvent * @package Thelia\Core\Event\Area @@ -61,5 +60,4 @@ class AreaDeleteEvent extends AreaEvent return $this->area_id; } - -} \ No newline at end of file +} diff --git a/core/lib/Thelia/Core/Event/Area/AreaEvent.php b/core/lib/Thelia/Core/Event/Area/AreaEvent.php index 892d00843..9e0c2dc00 100644 --- a/core/lib/Thelia/Core/Event/Area/AreaEvent.php +++ b/core/lib/Thelia/Core/Event/Area/AreaEvent.php @@ -24,7 +24,6 @@ namespace Thelia\Core\Event\Area; use Thelia\Core\Event\ActionEvent; - /** * Class AreaEvent * @package Thelia\Core\Event\Shipping @@ -63,4 +62,4 @@ class AreaEvent extends ActionEvent { return null !== $this->area; } -} \ No newline at end of file +} diff --git a/core/lib/Thelia/Core/Event/Area/AreaRemoveCountryEvent.php b/core/lib/Thelia/Core/Event/Area/AreaRemoveCountryEvent.php index 84c8f10d2..92cfd57d3 100644 --- a/core/lib/Thelia/Core/Event/Area/AreaRemoveCountryEvent.php +++ b/core/lib/Thelia/Core/Event/Area/AreaRemoveCountryEvent.php @@ -23,7 +23,6 @@ namespace Thelia\Core\Event\Area; - /** * Class AreaRemoveCountryEvent * @package Thelia\Core\Event\Area @@ -32,4 +31,4 @@ namespace Thelia\Core\Event\Area; class AreaRemoveCountryEvent extends AreaAddCountryEvent { -} \ No newline at end of file +} diff --git a/core/lib/Thelia/Core/Event/Area/AreaUpdateEvent.php b/core/lib/Thelia/Core/Event/Area/AreaUpdateEvent.php index f5f7c8704..361607f42 100644 --- a/core/lib/Thelia/Core/Event/Area/AreaUpdateEvent.php +++ b/core/lib/Thelia/Core/Event/Area/AreaUpdateEvent.php @@ -23,7 +23,6 @@ namespace Thelia\Core\Event\Area; - /** * Class AreaUpdateEvent * @package Thelia\Core\Event\Area @@ -32,4 +31,4 @@ namespace Thelia\Core\Event\Area; class AreaUpdateEvent extends AreaCreateEvent { -} \ No newline at end of file +} diff --git a/core/lib/Thelia/Core/Event/Area/AreaUpdatePostageEvent.php b/core/lib/Thelia/Core/Event/Area/AreaUpdatePostageEvent.php index 5f799b93c..b9cb825c4 100644 --- a/core/lib/Thelia/Core/Event/Area/AreaUpdatePostageEvent.php +++ b/core/lib/Thelia/Core/Event/Area/AreaUpdatePostageEvent.php @@ -23,7 +23,6 @@ namespace Thelia\Core\Event\Area; - /** * Class AreaUpdatePostageEvent * @package Thelia\Core\Event\Area @@ -34,7 +33,7 @@ class AreaUpdatePostageEvent extends AreaEvent protected $area_id; protected $postage; - function __construct($area_id) + public function __construct($area_id) { $this->area_id = $area_id; } @@ -79,7 +78,4 @@ class AreaUpdatePostageEvent extends AreaEvent return $this->postage; } - - - -} \ No newline at end of file +} diff --git a/core/lib/Thelia/Core/Event/Cache/CacheEvent.php b/core/lib/Thelia/Core/Event/Cache/CacheEvent.php new file mode 100644 index 000000000..7b21db53d --- /dev/null +++ b/core/lib/Thelia/Core/Event/Cache/CacheEvent.php @@ -0,0 +1,65 @@ +. */ +/* */ +/*************************************************************************************/ + +namespace Thelia\Core\Event\Cache; + +use Thelia\Core\Event\ActionEvent; + +/** + * Class CacheEvent + * @package Thelia\Core\Event\Cache + * @author Manuel Raynaud + */ +class CacheEvent extends ActionEvent +{ + /** + * @var string cache directory + */ + protected $dir; + + public function __construct($dir) + { + $this->dir = $dir; + } + + /** + * @param mixed $dir + * + * @return $this + */ + public function setDir($dir) + { + $this->dir = $dir; + + return $this; + } + + /** + * @return mixed + */ + public function getDir() + { + return $this->dir; + } + +} diff --git a/core/lib/Thelia/Core/Event/Content/ContentAddFolderEvent.php b/core/lib/Thelia/Core/Event/Content/ContentAddFolderEvent.php index a1d1d44e1..dac4317ba 100644 --- a/core/lib/Thelia/Core/Event/Content/ContentAddFolderEvent.php +++ b/core/lib/Thelia/Core/Event/Content/ContentAddFolderEvent.php @@ -24,7 +24,6 @@ namespace Thelia\Core\Event\Content; use Thelia\Model\Content; - /** * Class ContentAddFolderEvent * @package Thelia\Core\Event\Content @@ -61,6 +60,4 @@ class ContentAddFolderEvent extends ContentEvent return $this->folderId; } - - -} \ No newline at end of file +} diff --git a/core/lib/Thelia/Core/Event/Content/ContentRemoveFolderEvent.php b/core/lib/Thelia/Core/Event/Content/ContentRemoveFolderEvent.php index 195f4f3b0..1733ec893 100644 --- a/core/lib/Thelia/Core/Event/Content/ContentRemoveFolderEvent.php +++ b/core/lib/Thelia/Core/Event/Content/ContentRemoveFolderEvent.php @@ -23,7 +23,6 @@ namespace Thelia\Core\Event\Content; - /** * Class ContentRemoveFolderEvent * @package Thelia\Core\Event\Content @@ -31,4 +30,4 @@ namespace Thelia\Core\Event\Content; */ class ContentRemoveFolderEvent extends ContentAddFolderEvent { -} \ No newline at end of file +} diff --git a/core/lib/Thelia/Core/Event/Country/CountryCreateEvent.php b/core/lib/Thelia/Core/Event/Country/CountryCreateEvent.php index 48e8469a4..92d6632ae 100644 --- a/core/lib/Thelia/Core/Event/Country/CountryCreateEvent.php +++ b/core/lib/Thelia/Core/Event/Country/CountryCreateEvent.php @@ -23,7 +23,6 @@ namespace Thelia\Core\Event\Country; - /** * Class CountryCreateEvent * @package Thelia\Core\Event\Country @@ -150,5 +149,4 @@ class CountryCreateEvent extends CountryEvent return $this->area; } - -} \ No newline at end of file +} diff --git a/core/lib/Thelia/Core/Event/Country/CountryDeleteEvent.php b/core/lib/Thelia/Core/Event/Country/CountryDeleteEvent.php index 4a7d9c400..5d658ebc0 100644 --- a/core/lib/Thelia/Core/Event/Country/CountryDeleteEvent.php +++ b/core/lib/Thelia/Core/Event/Country/CountryDeleteEvent.php @@ -23,7 +23,6 @@ namespace Thelia\Core\Event\Country; - /** * Class CountryDeleteEvent * @package Thelia\Core\Event\Country @@ -36,7 +35,7 @@ class CountryDeleteEvent extends CountryEvent */ protected $country_id; - function __construct($country_id) + public function __construct($country_id) { $this->country_id = $country_id; } @@ -57,4 +56,4 @@ class CountryDeleteEvent extends CountryEvent return $this->country_id; } -} \ No newline at end of file +} diff --git a/core/lib/Thelia/Core/Event/Country/CountryEvent.php b/core/lib/Thelia/Core/Event/Country/CountryEvent.php index 962d880fa..505ead8ec 100644 --- a/core/lib/Thelia/Core/Event/Country/CountryEvent.php +++ b/core/lib/Thelia/Core/Event/Country/CountryEvent.php @@ -25,7 +25,6 @@ namespace Thelia\Core\Event\Country; use Thelia\Core\Event\ActionEvent; use Thelia\Model\Country; - /** * Class CountryEvent * @package Thelia\Core\Event\Country @@ -38,7 +37,7 @@ class CountryEvent extends ActionEvent */ protected $country; - function __construct(Country $country = null) + public function __construct(Country $country = null) { $this->country = $country; } @@ -69,5 +68,4 @@ class CountryEvent extends ActionEvent return null !== $this->country; } - -} \ No newline at end of file +} diff --git a/core/lib/Thelia/Core/Event/Country/CountryToggleDefaultEvent.php b/core/lib/Thelia/Core/Event/Country/CountryToggleDefaultEvent.php index 8f8142d0d..a414c70e8 100644 --- a/core/lib/Thelia/Core/Event/Country/CountryToggleDefaultEvent.php +++ b/core/lib/Thelia/Core/Event/Country/CountryToggleDefaultEvent.php @@ -23,7 +23,6 @@ namespace Thelia\Core\Event\Country; - /** * Class CountryToggleDefaultEvent * @package Thelia\Core\Event\Country @@ -33,7 +32,7 @@ class CountryToggleDefaultEvent extends CountryEvent { protected $country_id; - function __construct($country_id) + public function __construct($country_id) { $this->country_id = $country_id; } @@ -45,4 +44,4 @@ class CountryToggleDefaultEvent extends CountryEvent { return $this->country_id; } -} \ No newline at end of file +} diff --git a/core/lib/Thelia/Core/Event/Country/CountryUpdateEvent.php b/core/lib/Thelia/Core/Event/Country/CountryUpdateEvent.php index 496904172..2f82b17d0 100644 --- a/core/lib/Thelia/Core/Event/Country/CountryUpdateEvent.php +++ b/core/lib/Thelia/Core/Event/Country/CountryUpdateEvent.php @@ -23,7 +23,6 @@ namespace Thelia\Core\Event\Country; - /** * Class CountryUpdateEvent * @package Thelia\Core\Event\Country @@ -37,7 +36,7 @@ class CountryUpdateEvent extends CountryCreateEvent protected $description; protected $postscriptum; - function __construct($country_id) + public function __construct($country_id) { $this->country_id = $country_id; } @@ -114,7 +113,4 @@ class CountryUpdateEvent extends CountryCreateEvent return $this->country_id; } - - - -} \ No newline at end of file +} diff --git a/core/lib/Thelia/Core/Event/Module/ModuleDeleteEvent.php b/core/lib/Thelia/Core/Event/Module/ModuleDeleteEvent.php new file mode 100644 index 000000000..5622e3931 --- /dev/null +++ b/core/lib/Thelia/Core/Event/Module/ModuleDeleteEvent.php @@ -0,0 +1,61 @@ +. */ +/* */ +/*************************************************************************************/ + +namespace Thelia\Core\Event\Module; + + +/** + * Class ModuleDeleteEvent + * @package Thelia\Core\Event\Module + * @author Manuel Raynaud + */ +class ModuleDeleteEvent extends ModuleEvent +{ + /** + * @var int module id + */ + protected $module_id; + + function __construct($module_id) + { + $this->module_id = $module_id; + } + + /** + * @param int $module_id + */ + public function setModuleId($module_id) + { + $this->module_id = $module_id; + } + + /** + * @return int + */ + public function getModuleId() + { + return $this->module_id; + } + + +} \ No newline at end of file diff --git a/core/lib/Thelia/Core/Event/Module/ModuleEvent.php b/core/lib/Thelia/Core/Event/Module/ModuleEvent.php new file mode 100644 index 000000000..583a3afc9 --- /dev/null +++ b/core/lib/Thelia/Core/Event/Module/ModuleEvent.php @@ -0,0 +1,70 @@ +. */ +/* */ +/*************************************************************************************/ + +namespace Thelia\Core\Event\Module; +use Thelia\Core\Event\ActionEvent; +use Thelia\Model\Module; + +/** + * Class ModuleEvent + * @package Thelia\Core\Event\Module + * @author Manuel Raynaud + */ +class ModuleEvent extends ActionEvent +{ + /** + * @var \Thelia\Model\Module + */ + protected $module; + + public function __construct(Module $module = null) + { + $this->module = $module; + } + + /** + * @param \Thelia\Model\Module $module + * + * @return $this + */ + public function setModule(Module $module) + { + $this->module = $module; + + return $this; + } + + /** + * @return \Thelia\Model\Module + */ + public function getModule() + { + return $this->module; + } + + public function hasModule() + { + return null !== $this->module; + } + +} diff --git a/core/lib/Thelia/Core/Event/Module/ModuleToggleActivationEvent.php b/core/lib/Thelia/Core/Event/Module/ModuleToggleActivationEvent.php new file mode 100644 index 000000000..c6ece16f4 --- /dev/null +++ b/core/lib/Thelia/Core/Event/Module/ModuleToggleActivationEvent.php @@ -0,0 +1,63 @@ +. */ +/* */ +/*************************************************************************************/ + +namespace Thelia\Core\Event\Module; + +/** + * Class ModuleToggleActivationEvent + * @package Thelia\Core\Event\Module + * @author Manuel Raynaud + */ +class ModuleToggleActivationEvent extends ModuleEvent +{ + /** + * @var int + */ + protected $module_id; + + public function __construct($module_id) + { + $this->module_id = $module_id; + } + + /** + * @param int $module_id + * + * @return $this + */ + public function setModuleId($module_id) + { + $this->module_id = $module_id; + + return $this; + } + + /** + * @return int + */ + public function getModuleId() + { + return $this->module_id; + } + +} diff --git a/core/lib/Thelia/Core/Event/PdfEvent.php b/core/lib/Thelia/Core/Event/PdfEvent.php index e0f873e04..b439c8a23 100644 --- a/core/lib/Thelia/Core/Event/PdfEvent.php +++ b/core/lib/Thelia/Core/Event/PdfEvent.php @@ -23,7 +23,6 @@ namespace Thelia\Core\Event; - /** * Class PdfEvent * @package Thelia\Core\Event @@ -44,12 +43,12 @@ class PdfEvent extends ActionEvent /** * @param $content html content to transform into pdf - * @param string $orientation page orientation, same as TCPDF - * @param string $format The format used for pages, same as TCPDF - * @param string $lang Lang : fr, en, it... - * @param bool $unicode TRUE means that the input text is unicode (default = true) - * @param string $encoding charset encoding; default is UTF-8 - * @param array $marges Default marges (left, top, right, bottom) + * @param string $orientation page orientation, same as TCPDF + * @param string $format The format used for pages, same as TCPDF + * @param string $lang Lang : fr, en, it... + * @param bool $unicode TRUE means that the input text is unicode (default = true) + * @param string $encoding charset encoding; default is UTF-8 + * @param array $marges Default marges (left, top, right, bottom) */ public function __construct($content, $orientation = 'P', $format = 'A4', $lang='fr', $unicode=true, $encoding='UTF-8',array $marges = array(0, 0, 0, 0)) { @@ -189,5 +188,4 @@ class PdfEvent extends ActionEvent return $this->unicode; } - -} \ No newline at end of file +} diff --git a/core/lib/Thelia/Core/Event/Product/ProductCreateEvent.php b/core/lib/Thelia/Core/Event/Product/ProductCreateEvent.php index a9f6bbea1..9717f171d 100644 --- a/core/lib/Thelia/Core/Event/Product/ProductCreateEvent.php +++ b/core/lib/Thelia/Core/Event/Product/ProductCreateEvent.php @@ -23,7 +23,6 @@ namespace Thelia\Core\Event\Product; - class ProductCreateEvent extends ProductEvent { protected $ref; diff --git a/core/lib/Thelia/Core/Event/Product/ProductDeleteEvent.php b/core/lib/Thelia/Core/Event/Product/ProductDeleteEvent.php index 108ceb781..7a3406e7e 100644 --- a/core/lib/Thelia/Core/Event/Product/ProductDeleteEvent.php +++ b/core/lib/Thelia/Core/Event/Product/ProductDeleteEvent.php @@ -23,7 +23,6 @@ namespace Thelia\Core\Event\Product; - class ProductDeleteEvent extends ProductEvent { public function __construct($product_id) diff --git a/core/lib/Thelia/Core/Event/ShippingZone/ShippingZoneAddAreaEvent.php b/core/lib/Thelia/Core/Event/ShippingZone/ShippingZoneAddAreaEvent.php index d1e406646..35f3dcac1 100644 --- a/core/lib/Thelia/Core/Event/ShippingZone/ShippingZoneAddAreaEvent.php +++ b/core/lib/Thelia/Core/Event/ShippingZone/ShippingZoneAddAreaEvent.php @@ -24,7 +24,6 @@ namespace Thelia\Core\Event\ShippingZone; use Thelia\Core\Event\ActionEvent; - /** * Class ShippingZoneAddAreaEvent * @package Thelia\Core\Event\ShippingZone @@ -35,7 +34,7 @@ class ShippingZoneAddAreaEvent extends ActionEvent protected $area_id; protected $shopping_zone_id; - function __construct($area_id, $shopping_zone_id) + public function __construct($area_id, $shopping_zone_id) { $this->area_id = $area_id; $this->shopping_zone_id = $shopping_zone_id; @@ -81,7 +80,4 @@ class ShippingZoneAddAreaEvent extends ActionEvent return $this->shopping_zone_id; } - - - -} \ No newline at end of file +} diff --git a/core/lib/Thelia/Core/Event/ShippingZone/ShippingZoneRemoveAreaEvent.php b/core/lib/Thelia/Core/Event/ShippingZone/ShippingZoneRemoveAreaEvent.php index 6dc6094d6..a3177f522 100644 --- a/core/lib/Thelia/Core/Event/ShippingZone/ShippingZoneRemoveAreaEvent.php +++ b/core/lib/Thelia/Core/Event/ShippingZone/ShippingZoneRemoveAreaEvent.php @@ -23,7 +23,6 @@ namespace Thelia\Core\Event\ShippingZone; - /** * Class ShippingZoneRemoveAreaEvent * @package Thelia\Core\Event\ShippingZone @@ -32,4 +31,4 @@ namespace Thelia\Core\Event\ShippingZone; class ShippingZoneRemoveAreaEvent extends ShippingZoneAddAreaEvent { -} \ No newline at end of file +} diff --git a/core/lib/Thelia/Core/Event/Tax/TaxRuleEvent.php b/core/lib/Thelia/Core/Event/Tax/TaxRuleEvent.php index e364bfd84..6d3f21e6e 100644 --- a/core/lib/Thelia/Core/Event/Tax/TaxRuleEvent.php +++ b/core/lib/Thelia/Core/Event/Tax/TaxRuleEvent.php @@ -118,5 +118,4 @@ class TaxRuleEvent extends ActionEvent return $this->taxList; } - } diff --git a/core/lib/Thelia/Core/Event/TheliaEvents.php b/core/lib/Thelia/Core/Event/TheliaEvents.php index febcb8672..65d7a9cc2 100755 --- a/core/lib/Thelia/Core/Event/TheliaEvents.php +++ b/core/lib/Thelia/Core/Event/TheliaEvents.php @@ -183,7 +183,6 @@ final class TheliaEvents const FOLDER_TOGGLE_VISIBILITY = "action.toggleFolderVisibility"; const FOLDER_UPDATE_POSITION = "action.updateFolderPosition"; - const BEFORE_CREATEFOLDER = "action.before_createFolder"; const AFTER_CREATEFOLDER = "action.after_createFolder"; @@ -204,7 +203,6 @@ final class TheliaEvents const CONTENT_ADD_FOLDER = "action.contentAddFolder"; const CONTENT_REMOVE_FOLDER = "action.contentRemoveFolder"; - const BEFORE_CREATECONTENT = "action.before_createContent"; const AFTER_CREATECONTENT = "action.after_createContent"; @@ -222,7 +220,6 @@ final class TheliaEvents const COUNTRY_TOGGLE_DEFAULT = "action.toggleCountryDefault"; //const COUNTRY_UPDATE_POSITION = "action.updateFolderPosition"; - const BEFORE_CREATECOUNTRY = "action.before_createCountry"; const AFTER_CREATECOUNTRY = "action.after_createCountry"; @@ -670,4 +667,18 @@ final class TheliaEvents const GENERATE_PDF = 'thelia.generatePdf'; + /** + * sent when a module is activated or deactivated + */ + const MODULE_TOGGLE_ACTIVATION = 'thelia.module.toggleActivation'; + + /** + * sent when a module is deleted + */ + const MODULE_DELETE = 'thelia.module.delete'; + + /** + * sent for clearing cache + */ + const CACHE_CLEAR = 'thelia.cache.clear'; } diff --git a/core/lib/Thelia/Core/Template/Loop/Area.php b/core/lib/Thelia/Core/Template/Loop/Area.php index 4d43f524b..524777d08 100644 --- a/core/lib/Thelia/Core/Template/Loop/Area.php +++ b/core/lib/Thelia/Core/Template/Loop/Area.php @@ -30,7 +30,6 @@ use Thelia\Core\Template\Loop\Argument\Argument; use Thelia\Core\Template\Loop\Argument\ArgumentCollection; use Thelia\Model\AreaQuery; - /** * Class Area * @package Thelia\Core\Template\Loop @@ -112,8 +111,7 @@ class Area extends BaseLoop $withoutZone = $this->getWithout_zone(); - if($withoutZone) - { + if ($withoutZone) { $search->joinAreaDeliveryModule('without_zone', Criteria::LEFT_JOIN) ->addJoinCondition('without_zone', 'delivery_module_id '.Criteria::EQUAL.' ?', $withoutZone, null, \PDO::PARAM_INT) ->where('`without_zone`.delivery_module_id '.Criteria::ISNULL); @@ -140,5 +138,4 @@ class Area extends BaseLoop return $loopResult; } - -} \ No newline at end of file +} diff --git a/core/lib/Thelia/Core/Template/Loop/Folder.php b/core/lib/Thelia/Core/Template/Loop/Folder.php index 04ba737fa..efc45030f 100755 --- a/core/lib/Thelia/Core/Template/Loop/Folder.php +++ b/core/lib/Thelia/Core/Template/Loop/Folder.php @@ -114,7 +114,7 @@ class Folder extends BaseI18nLoop if (null !== $content) { $obj = ContentQuery::create()->findPk($content); - if($obj) { + if ($obj) { $search->filterByContent($obj, Criteria::IN); } } diff --git a/core/lib/Thelia/Core/Template/Loop/FolderPath.php b/core/lib/Thelia/Core/Template/Loop/FolderPath.php index 272b9fbbb..2b9a52b0d 100644 --- a/core/lib/Thelia/Core/Template/Loop/FolderPath.php +++ b/core/lib/Thelia/Core/Template/Loop/FolderPath.php @@ -30,7 +30,6 @@ use Thelia\Core\Template\Loop\Argument\ArgumentCollection; use Thelia\Model\FolderQuery; use Thelia\Type\BooleanOrBothType; - /** * Class FolderPath * @package Thelia\Core\Template\Loop @@ -156,5 +155,4 @@ class FolderPath extends BaseI18nLoop return $loopResult; } - -} \ No newline at end of file +} diff --git a/core/lib/Thelia/Core/Template/Loop/Tax.php b/core/lib/Thelia/Core/Template/Loop/Tax.php index 724e57342..e97b9c7d5 100644 --- a/core/lib/Thelia/Core/Template/Loop/Tax.php +++ b/core/lib/Thelia/Core/Template/Loop/Tax.php @@ -97,7 +97,7 @@ class Tax extends BaseI18nLoop $country = $this->getCountry(); $taxRule = $this->getTax_rule(); - if(null !== $taxRule && null !== $country) { + if (null !== $taxRule && null !== $country) { $search->filterByTaxRuleCountry( TaxRuleCountryQuery::create() ->filterByCountryId($country, Criteria::EQUAL) @@ -108,7 +108,7 @@ class Tax extends BaseI18nLoop } $excludeTaxRule = $this->getExclude_tax_rule(); - if(null !== $excludeTaxRule && null !== $country) { + if (null !== $excludeTaxRule && null !== $country) { $excludedTaxes = TaxRuleCountryQuery::create() ->filterByCountryId($country, Criteria::EQUAL) ->filterByTaxRuleId($excludeTaxRule, Criteria::IN) @@ -118,7 +118,7 @@ class Tax extends BaseI18nLoop $excludedTaxes, Criteria::NOT_IN );*/ - foreach($excludedTaxes as $excludedTax) { + foreach ($excludedTaxes as $excludedTax) { $search->filterByTaxRuleCountry($excludedTax, Criteria::NOT_EQUAL); } } diff --git a/core/lib/Thelia/Core/Template/Loop/Template.php b/core/lib/Thelia/Core/Template/Loop/Template.php index 9eaa3ea4f..83ef4fabe 100644 --- a/core/lib/Thelia/Core/Template/Loop/Template.php +++ b/core/lib/Thelia/Core/Template/Loop/Template.php @@ -32,7 +32,6 @@ use Thelia\Core\Template\Loop\Argument\ArgumentCollection; use Thelia\Core\Template\Loop\Argument\Argument; use Thelia\Model\Base\TemplateQuery; -use Thelia\Type; /** * diff --git a/core/lib/Thelia/Core/Template/Smarty/Plugins/DataAccessFunctions.php b/core/lib/Thelia/Core/Template/Smarty/Plugins/DataAccessFunctions.php index 594b45ae9..a401755a4 100755 --- a/core/lib/Thelia/Core/Template/Smarty/Plugins/DataAccessFunctions.php +++ b/core/lib/Thelia/Core/Template/Smarty/Plugins/DataAccessFunctions.php @@ -172,6 +172,7 @@ class DataAccessFunctions extends AbstractSmartyPlugin self::$dataAccessCache['defaultCountry'] = $defaultCountry; }*/ $defaultCountry = CountryQuery::create()->filterByByDefault(1)->limit(1); + return $this->dataAccessWithI18n("defaultCountry", $params, $defaultCountry); } } @@ -237,7 +238,7 @@ class DataAccessFunctions extends AbstractSmartyPlugin public function ConfigDataAccess($params, $smarty) { - if(false === array_key_exists("key", $params)) { + if (false === array_key_exists("key", $params)) { return null; } diff --git a/core/lib/Thelia/Core/Template/Smarty/Plugins/Form.php b/core/lib/Thelia/Core/Template/Smarty/Plugins/Form.php index 1d39dd828..3727ed6c5 100755 --- a/core/lib/Thelia/Core/Template/Smarty/Plugins/Form.php +++ b/core/lib/Thelia/Core/Template/Smarty/Plugins/Form.php @@ -167,7 +167,11 @@ class Form extends AbstractSmartyPlugin if( true === $formFieldConfig->getOption('prototype') ) { } else { + /* access to choices */ + if (isset($formFieldView->vars['choices'])) { + $template->assign("choices", $formFieldView->vars['choices']); + } } } @@ -275,8 +279,8 @@ $this->assignFieldValues($template, $formFieldView->vars["full_name"], $fieldVar foreach ($formView->getIterator() as $row) { if ($this->isHidden($row) && $row->isRendered() === false) { $attributeList = array(); - if(isset($row->vars["attr"])) { - foreach($row->vars["attr"] as $attrKey => $attrValue) { + if (isset($row->vars["attr"])) { + foreach ($row->vars["attr"] as $attrKey => $attrValue) { $attributeList[] = sprintf($attrFormat, $attrKey, $attrValue); } } diff --git a/core/lib/Thelia/Form/Area/AreaCountryForm.php b/core/lib/Thelia/Form/Area/AreaCountryForm.php index c511e0b3c..b3f09ae06 100644 --- a/core/lib/Thelia/Form/Area/AreaCountryForm.php +++ b/core/lib/Thelia/Form/Area/AreaCountryForm.php @@ -28,7 +28,6 @@ use Symfony\Component\Validator\Constraints\GreaterThan; use Symfony\Component\Validator\Constraints\NotBlank; use Thelia\Form\BaseForm; - /** * Class AreaCountryForm * @package Thelia\Form\Area @@ -86,4 +85,4 @@ class AreaCountryForm extends BaseForm { return 'thelia_area_country'; } -} \ No newline at end of file +} diff --git a/core/lib/Thelia/Form/Area/AreaCreateForm.php b/core/lib/Thelia/Form/Area/AreaCreateForm.php index 590001867..79fc4b2a2 100644 --- a/core/lib/Thelia/Form/Area/AreaCreateForm.php +++ b/core/lib/Thelia/Form/Area/AreaCreateForm.php @@ -26,7 +26,6 @@ use Thelia\Core\Translation\Translator; use Symfony\Component\Validator\Constraints\NotBlank; use Thelia\Form\BaseForm; - /** * Class AreaCreateForm * @package Thelia\Form\Shipping @@ -76,4 +75,4 @@ class AreaCreateForm extends BaseForm { return 'thelia_area_creation'; } -} \ No newline at end of file +} diff --git a/core/lib/Thelia/Form/Area/AreaModificationForm.php b/core/lib/Thelia/Form/Area/AreaModificationForm.php index eefcb825a..03f4b2e46 100644 --- a/core/lib/Thelia/Form/Area/AreaModificationForm.php +++ b/core/lib/Thelia/Form/Area/AreaModificationForm.php @@ -25,7 +25,6 @@ namespace Thelia\Form\Area; use Symfony\Component\Validator\Constraints\GreaterThan; use Thelia\Form\Area\AreaCreateForm; - /** * Class AreaModificationForm * @package Thelia\Form\Shipping @@ -46,4 +45,4 @@ class AreaModificationForm extends AreaCreateForm { return 'thelia_area_modification'; } -} \ No newline at end of file +} diff --git a/core/lib/Thelia/Form/Area/AreaPostageForm.php b/core/lib/Thelia/Form/Area/AreaPostageForm.php index ba24499e8..fa22ab908 100644 --- a/core/lib/Thelia/Form/Area/AreaPostageForm.php +++ b/core/lib/Thelia/Form/Area/AreaPostageForm.php @@ -29,7 +29,6 @@ use Symfony\Component\Validator\Constraints\NotBlank; use Thelia\Form\BaseForm; use Thelia\Core\Translation\Translator; - /** * Class AreaPostageForm * @package Thelia\Form\Area @@ -85,4 +84,4 @@ class AreaPostageForm extends BaseForm { return 'thelia_area_postage'; } -} \ No newline at end of file +} diff --git a/core/lib/Thelia/Form/CountryModificationForm.php b/core/lib/Thelia/Form/CountryModificationForm.php index 68570425b..99c404e62 100644 --- a/core/lib/Thelia/Form/CountryModificationForm.php +++ b/core/lib/Thelia/Form/CountryModificationForm.php @@ -23,8 +23,6 @@ namespace Thelia\Form; use Symfony\Component\Validator\Constraints\GreaterThan; -use Symfony\Component\Validator\Constraints\NotBlank; -use Thelia\Core\Translation\Translator; class CountryModificationForm extends CountryCreationForm { diff --git a/core/lib/Thelia/Form/ShippingZone/ShippingZoneAddArea.php b/core/lib/Thelia/Form/ShippingZone/ShippingZoneAddArea.php index 81dd422b6..ea31b696b 100644 --- a/core/lib/Thelia/Form/ShippingZone/ShippingZoneAddArea.php +++ b/core/lib/Thelia/Form/ShippingZone/ShippingZoneAddArea.php @@ -28,7 +28,6 @@ use Symfony\Component\Validator\Constraints\GreaterThan; use Symfony\Component\Validator\Constraints\NotBlank; use Thelia\Form\BaseForm; - /** * Class ShippingZoneAddArea * @package Thelia\Form\ShippingZone @@ -84,4 +83,4 @@ class ShippingZoneAddArea extends BaseForm { return 'thelia_shippingzone_area'; } -} \ No newline at end of file +} diff --git a/core/lib/Thelia/Form/ShippingZone/ShippingZoneRemoveArea.php b/core/lib/Thelia/Form/ShippingZone/ShippingZoneRemoveArea.php index 5c4e5597b..dfa568334 100644 --- a/core/lib/Thelia/Form/ShippingZone/ShippingZoneRemoveArea.php +++ b/core/lib/Thelia/Form/ShippingZone/ShippingZoneRemoveArea.php @@ -23,7 +23,6 @@ namespace Thelia\Form\ShippingZone; - /** * Class ShippingZoneRemoveArea * @package Thelia\Form\ShippingZone @@ -39,4 +38,4 @@ class ShippingZoneRemoveArea extends ShippingZoneAddArea { return 'thelia_shippingzone_remove_area'; } -} \ No newline at end of file +} diff --git a/core/lib/Thelia/Form/TaxRuleCreationForm.php b/core/lib/Thelia/Form/TaxRuleCreationForm.php index be3556321..a5dcc1999 100644 --- a/core/lib/Thelia/Form/TaxRuleCreationForm.php +++ b/core/lib/Thelia/Form/TaxRuleCreationForm.php @@ -24,8 +24,6 @@ namespace Thelia\Form; use Symfony\Component\Validator\Constraints; use Symfony\Component\Validator\Constraints\NotBlank; -use Thelia\Core\Translation\Translator; -use Thelia\Model\CountryQuery; class TaxRuleCreationForm extends BaseForm { diff --git a/core/lib/Thelia/Form/TaxRuleTaxListUpdateForm.php b/core/lib/Thelia/Form/TaxRuleTaxListUpdateForm.php index 1d96c7e4d..ea2d1f06b 100644 --- a/core/lib/Thelia/Form/TaxRuleTaxListUpdateForm.php +++ b/core/lib/Thelia/Form/TaxRuleTaxListUpdateForm.php @@ -34,7 +34,7 @@ class TaxRuleTaxListUpdateForm extends BaseForm protected function buildForm() { $countryList = array(); - foreach(CountryQuery::create()->find() as $country) { + foreach (CountryQuery::create()->find() as $country) { $countryList[$country->getId()] = $country->getId(); } @@ -96,7 +96,7 @@ class TaxRuleTaxListUpdateForm extends BaseForm public function verifyTaxList($value, ExecutionContextInterface $context) { $jsonType = new JsonType(); - if(!$jsonType->isValid($value)) { + if (!$jsonType->isValid($value)) { $context->addViolation("Tax list is not valid JSON"); } @@ -104,10 +104,10 @@ class TaxRuleTaxListUpdateForm extends BaseForm /* check we have 2 level max */ - foreach($taxList as $taxLevel1) { - if(is_array($taxLevel1)) { - foreach($taxLevel1 as $taxLevel2) { - if(is_array($taxLevel2)) { + foreach ($taxList as $taxLevel1) { + if (is_array($taxLevel1)) { + foreach ($taxLevel1 as $taxLevel2) { + if (is_array($taxLevel2)) { $context->addViolation("Bad tax list JSON"); } else { $taxModel = TaxQuery::create()->findPk($taxLevel2); diff --git a/core/lib/Thelia/Model/CartItem.php b/core/lib/Thelia/Model/CartItem.php index 25a4f44aa..427e7e735 100755 --- a/core/lib/Thelia/Model/CartItem.php +++ b/core/lib/Thelia/Model/CartItem.php @@ -60,7 +60,14 @@ class CartItem extends BaseCartItem } } - $this->setQuantity($value); + $this->addQuantity($value); + + return $this; + } + + public function addQuantity($quantity) + { + $this->setQuantity($this->getQuantity() + $quantity); return $this; } diff --git a/core/lib/Thelia/Model/ConfigQuery.php b/core/lib/Thelia/Model/ConfigQuery.php index 7f65b103d..fb8d6fe90 100755 --- a/core/lib/Thelia/Model/ConfigQuery.php +++ b/core/lib/Thelia/Model/ConfigQuery.php @@ -56,7 +56,7 @@ class ConfigQuery extends BaseConfigQuery { public static function getPageNotFoundView() { - return self::read("page_not_found_view", '404'); + return self::read("page_not_found_view", '404.html'); } public static function getPassedUrlView() diff --git a/core/lib/Thelia/Model/Country.php b/core/lib/Thelia/Model/Country.php index e254d4a5e..e64bd4609 100755 --- a/core/lib/Thelia/Model/Country.php +++ b/core/lib/Thelia/Model/Country.php @@ -13,6 +13,9 @@ class Country extends BaseCountry public function toggleDefault() { + if($this->getId() === null) { + throw new \RuntimeException("impossible to just uncheck default country, choose a new one"); + } CountryQuery::create() ->filterByByDefault(1) ->update(array('ByDefault' => 0)); @@ -47,6 +50,10 @@ class Country extends BaseCountry public function preDelete(ConnectionInterface $con = null) { + if($this->getByDefault()) { + return false; + } + $this->dispatchEvent(TheliaEvents::BEFORE_DELETECOUNTRY, new CountryEvent($this)); return true; diff --git a/core/lib/Thelia/Module/BaseModule.php b/core/lib/Thelia/Module/BaseModule.php index 37c40c953..79acdd4b3 100755 --- a/core/lib/Thelia/Module/BaseModule.php +++ b/core/lib/Thelia/Module/BaseModule.php @@ -24,7 +24,10 @@ namespace Thelia\Module; +use Propel\Runtime\Connection\ConnectionInterface; +use Propel\Runtime\Propel; use Symfony\Component\DependencyInjection\ContainerAware; +use Thelia\Model\Map\ModuleTableMap; use Thelia\Model\ModuleI18nQuery; use Thelia\Model\Map\ModuleImageTableMap; use Thelia\Model\ModuleI18n; @@ -43,27 +46,60 @@ abstract class BaseModule extends ContainerAware const IS_ACTIVATED = 1; const IS_NOT_ACTIVATED = 0; + protected $reflected; + public function __construct() { } - public function activate() + public function activate($moduleModel = null) { - $moduleModel = $this->getModuleModel(); + if (null === $moduleModel) { + $moduleModel = $this->getModuleModel(); + } + if ($moduleModel->getActivate() == self::IS_NOT_ACTIVATED) { - $moduleModel->setActivate(self::IS_ACTIVATED); - $moduleModel->save(); + $con = Propel::getWriteConnection(ModuleTableMap::DATABASE_NAME); + $con->beginTransaction(); try { - $this->afterActivation(); + if ($this->preActivation($con)) { + $moduleModel->setActivate(self::IS_ACTIVATED); + $moduleModel->save($con); + $this->postActivation($con); + $con->commit(); + } } catch (\Exception $e) { - $moduleModel->setActivate(self::IS_NOT_ACTIVATED); - $moduleModel->save(); + $con->rollBack(); throw $e; } } } + public function deActivate($moduleModel = null) + { + if (null === $moduleModel) { + $moduleModel = $this->getModuleModel(); + } + if ($moduleModel->getActivate() == self::IS_ACTIVATED) { + $con = Propel::getWriteConnection(ModuleTableMap::DATABASE_NAME); + $con->beginTransaction(); + try { + if ($this->preDeactivation($con)) { + $moduleModel->setActivate(self::IS_NOT_ACTIVATED); + $moduleModel->save($con); + $this->postDeactivation($con); + + $con->commit(); + } + } catch (\Exception $e) { + $con->rollBack(); + throw $e; + } + + } + } + public function hasContainer() { return null === $this->container; @@ -72,7 +108,7 @@ abstract class BaseModule extends ContainerAware public function getContainer() { if ($this->hasContainer() === false) { - throw new \RuntimeException("Sorry, container his not available in this context"); + throw new \RuntimeException("Sorry, container is not available in this context"); } return $this->container; @@ -99,17 +135,19 @@ abstract class BaseModule extends ContainerAware } } - public function deployImageFolder(Module $module, $folderPath) + public function deployImageFolder(Module $module, $folderPath, ConnectionInterface $con = null) { try { $directoryBrowser = new \DirectoryIterator($folderPath); } catch (\UnexpectedValueException $e) { throw $e; } + if(null === $con) { + $con = \Propel\Runtime\Propel::getConnection( + ModuleImageTableMap::DATABASE_NAME + ); + } - $con = \Propel\Runtime\Propel::getConnection( - ModuleImageTableMap::DATABASE_NAME - ); /* browse the directory */ $imagePosition = 1; @@ -178,9 +216,42 @@ abstract class BaseModule extends ContainerAware return $moduleModel; } - abstract public function getCode(); - abstract public function install(); - abstract public function afterActivation(); - abstract public function destroy(); + public function getCode() + { + if (null === $this->reflected) { + $this->reflected = new \ReflectionObject($this); + } + + return basename(dirname($this->reflected->getFileName())); + } + + public function install(ConnectionInterface $con = null) + { + } + + public function preActivation(ConnectionInterface $con = null) + { + return true; + } + + public function postActivation(ConnectionInterface $con = null) + { + + } + + public function preDeactivation(ConnectionInterface $con = null) + { + return true; + } + + public function postDeactivation(ConnectionInterface $con = null) + { + + } + + public function destroy(ConnectionInterface $con = null) + { + + } } diff --git a/core/lib/Thelia/Module/Exception/InvalidXmlDocumentException.php b/core/lib/Thelia/Module/Exception/InvalidXmlDocumentException.php new file mode 100644 index 000000000..49a7d5a68 --- /dev/null +++ b/core/lib/Thelia/Module/Exception/InvalidXmlDocumentException.php @@ -0,0 +1,34 @@ +. */ +/* */ +/*************************************************************************************/ + +namespace Thelia\Module\Exception; + +/** + * Class InvalidXmlDocumentException + * @package Thelia\Module\Exception + * @author Manuel Raynaud + */ +class InvalidXmlDocumentException extends \RuntimeException +{ + +} diff --git a/core/lib/Thelia/Module/ModuleDescriptorValidator.php b/core/lib/Thelia/Module/ModuleDescriptorValidator.php new file mode 100644 index 000000000..8f8c89d4a --- /dev/null +++ b/core/lib/Thelia/Module/ModuleDescriptorValidator.php @@ -0,0 +1,60 @@ +. */ +/* */ +/*************************************************************************************/ + +namespace Thelia\Module; +use Thelia\Module\Exception\InvalidXmlDocumentException; + +/** + * Class ModuleDescriptorValidator + * @package Thelia\Module + * @author Manuel Raynaud + */ +class ModuleDescriptorValidator +{ + private $xsd_file; + + public function __construct() + { + $this->xsd_file = __DIR__ . '/schema/module/module.xsd'; + } + + public function validate($xml_file) + { + $dom = new \DOMDocument(); + + if ($dom->load($xml_file)) { + if ($dom->schemaValidate($this->xsd_file)) { + return true; + } + } + + throw new InvalidXmlDocumentException(sprintf("%s file is not a valid file", $xml_file)); + } + + public function getDescriptor($xml_file) + { + $this->validate($xml_file); + + return @simplexml_load_file($xml_file); + } +} diff --git a/core/lib/Thelia/Module/ModuleManagement.php b/core/lib/Thelia/Module/ModuleManagement.php new file mode 100644 index 000000000..99cc5ca9f --- /dev/null +++ b/core/lib/Thelia/Module/ModuleManagement.php @@ -0,0 +1,118 @@ +. */ +/* */ +/*************************************************************************************/ + +namespace Thelia\Module; + +use Propel\Runtime\Connection\ConnectionInterface; +use Propel\Runtime\Exception\PropelException; +use Propel\Runtime\Propel; +use Symfony\Component\Finder\Finder; +use Thelia\Model\Map\ModuleTableMap; +use Thelia\Model\Module; +use Thelia\Model\ModuleI18n; +use Thelia\Model\ModuleQuery; + +/** + * Class ModuleManagement + * @package Thelia\Module + * @author Manuel Raynaud + */ +class ModuleManagement +{ + protected $baseModuleDir; + protected $reflected; + + public function __construct() + { + $this->baseModuleDir = THELIA_MODULE_DIR; + } + + public function updateModules() + { + $finder = new Finder(); + + $finder + ->name('module.xml') + ->in($this->baseModuleDir . '/*/Config'); + + $descriptorValidator = new ModuleDescriptorValidator(); + foreach ($finder as $file) { + $content = $descriptorValidator->getDescriptor($file->getRealPath()); + $reflected = new \ReflectionClass((string) $content->fullnamespace); + $code = basename(dirname($reflected->getFileName())); + if (null === ModuleQuery::create()->filterByCode($code)->findOne()) { + $module = new Module(); + $con = Propel::getWriteConnection(ModuleTableMap::DATABASE_NAME); + $con->beginTransaction(); + try { + $module + ->setCode($code) + ->setFullNamespace((string) $content->fullnamespace) + ->setType($this->getModuleType($reflected)) + ->setActivate(0) + ->save($con); + + $this->saveDescription($module, $content, $con); + + $con->commit(); + } catch (PropelException $e) { + $con->rollBack(); + throw $e; + } + + } + } + } + + private function saveDescription(Module $module,\SimpleXMLElement $content, ConnectionInterface $con) + { + + foreach ($content->descriptive as $description) { + $locale = $description->attributes()->locale; + + $moduleI18n = new ModuleI18n(); + + $moduleI18n + ->setLocale($locale) + ->setModule($module) + ->setTitle($description->title) + ->setDescription(isset($description->description)?$description->description:null) + ->setPostscriptum(isset($description->postscriptum)?$description->postscriptum:null) + ->setChapo(isset($description->subtitle)?$description->subtitle:null) + ->save($con); + } + } + + private function getModuleType(\ReflectionClass $reflected) + { + if ($reflected->implementsInterface('Thelia\Module\DeliveryModuleInterface')) { + return BaseModule::DELIVERY_MODULE_TYPE; + } elseif ($reflected->implementsInterface('Thelia\Module\PaymentModuleInterface')) { + return BaseModule::PAYMENT_MODULE_TYPE; + } else { + return BaseModule::CLASSIC_MODULE_TYPE; + } + + } + +} diff --git a/core/lib/Thelia/Module/schema/module/module.xsd b/core/lib/Thelia/Module/schema/module/module.xsd new file mode 100644 index 000000000..bcd7bd292 --- /dev/null +++ b/core/lib/Thelia/Module/schema/module/module.xsd @@ -0,0 +1,110 @@ + + + + + + + + The full namespace for the main class module (for example MyModule\MyModule) + + + + + complete description, each description must be identify by ISO CODE 639 + + + + + + + + + + + + + + Module version + + + + + Module author + + + + + + + + + + + + + module type : classic, delivery, payment + + + + + + + + + + + + Les plugins qui doivent déjà être présents + + + + + + + + + + + + + + + + + + minimum required version of Thelia in 'dot' format (for example 1.2.3.4) + + + + + + + + + + current module stability: alpha, beta, rc, prod + + + + + + + + + + + + + + Le nom du fichier contenant la documentation. Ce fichier doit se trouver dans le répertoire du plugin. + + + + + L'URL a interroger pour vérifier la présence d'une nouvelle version, appellé avec le nom du plugin et sa version + + + + + + \ No newline at end of file diff --git a/core/lib/Thelia/Tests/Action/BaseAction.php b/core/lib/Thelia/Tests/Action/BaseAction.php index f0027fd21..c07c07115 100644 --- a/core/lib/Thelia/Tests/Action/BaseAction.php +++ b/core/lib/Thelia/Tests/Action/BaseAction.php @@ -23,7 +23,6 @@ namespace Thelia\Tests\Action; - /** * Class BaseAction * @package Thelia\Tests\Action\ImageTest @@ -41,4 +40,4 @@ class BaseAction extends \PHPUnit_Framework_TestCase return $container; } -} \ No newline at end of file +} diff --git a/core/lib/Thelia/Tests/Action/ContentTest.php b/core/lib/Thelia/Tests/Action/ContentTest.php index 7aa819346..f527026bf 100644 --- a/core/lib/Thelia/Tests/Action/ContentTest.php +++ b/core/lib/Thelia/Tests/Action/ContentTest.php @@ -36,7 +36,6 @@ use Thelia\Model\ContentFolderQuery; use Thelia\Model\ContentQuery; use Thelia\Model\FolderQuery; - /** * Class ContentTest * @package Thelia\Tests\Action @@ -205,7 +204,7 @@ class ContentTest extends BaseAction $test = ContentFolderQuery::create() ->filterByContent($content) ->filterByFolder($folder); - } while($test->count() > 0); + } while ($test->count() > 0); $event = new ContentAddFolderEvent($content, $folder->getId()); @@ -267,10 +266,10 @@ class ContentTest extends BaseAction ->addAscendingOrderByColumn('RAND()') ->findOne(); - if(null === $folder) { + if (null === $folder) { $this->fail('use fixtures before launching test, there is no folder in database'); } return $folder; } -} \ No newline at end of file +} diff --git a/core/lib/Thelia/Tests/Action/FolderTest.php b/core/lib/Thelia/Tests/Action/FolderTest.php index 903e1b77b..7ef88aa0d 100644 --- a/core/lib/Thelia/Tests/Action/FolderTest.php +++ b/core/lib/Thelia/Tests/Action/FolderTest.php @@ -31,7 +31,6 @@ use Thelia\Core\Event\Folder\FolderUpdateEvent; use Thelia\Core\Event\UpdatePositionEvent; use Thelia\Model\FolderQuery; - /** * Class FolderTest * @package Thelia\Tests\Action\ImageTest @@ -73,8 +72,6 @@ class FolderTest extends BaseAction { $folder = $this->getRandomFolder(); - - $visible = !$folder->getVisible(); $event = new FolderUpdateEvent($folder->getId()); @@ -147,7 +144,7 @@ class FolderTest extends BaseAction ->filterByPosition(1, Criteria::GREATER_THAN) ->findOne(); - if(null === $folder) { + if (null === $folder) { $this->fail('use fixtures before launching test, there is no folder in database'); } @@ -169,7 +166,7 @@ class FolderTest extends BaseAction ->filterByPosition(1) ->findOne(); - if(null === $folder) { + if (null === $folder) { $this->fail('use fixtures before launching test, there is no folder in database'); } @@ -191,7 +188,7 @@ class FolderTest extends BaseAction ->filterByPosition(1, Criteria::GREATER_THAN) ->findOne(); - if(null === $folder) { + if (null === $folder) { $this->fail('use fixtures before launching test, there is no folder in database'); } @@ -215,10 +212,10 @@ class FolderTest extends BaseAction ->addAscendingOrderByColumn('RAND()') ->findOne(); - if(null === $folder) { + if (null === $folder) { $this->fail('use fixtures before launching test, there is no folder in database'); } return $folder; } -} \ No newline at end of file +} diff --git a/core/lib/Thelia/Tests/Command/CacheClearTest.php b/core/lib/Thelia/Tests/Command/CacheClearTestSaved.php similarity index 96% rename from core/lib/Thelia/Tests/Command/CacheClearTest.php rename to core/lib/Thelia/Tests/Command/CacheClearTestSaved.php index 00d54cb3b..0d88806f0 100755 --- a/core/lib/Thelia/Tests/Command/CacheClearTest.php +++ b/core/lib/Thelia/Tests/Command/CacheClearTestSaved.php @@ -115,6 +115,10 @@ class CacheClearTest extends \PHPUnit_Framework_TestCase $container->setParameter("kernel.cache_dir", $this->cache_dir); + $dispatcher = $this->getMock("Symfony\Component\EventDispatcher\EventDispatcherInterface"); + + $container->set("event_dispatcher", $dispatcher); + return $container; } diff --git a/core/lib/Thelia/Tests/TaxEngine/CalculatorTest.php b/core/lib/Thelia/Tests/TaxEngine/CalculatorTest.php index 0dbbc73bb..1e6f6f258 100755 --- a/core/lib/Thelia/Tests/TaxEngine/CalculatorTest.php +++ b/core/lib/Thelia/Tests/TaxEngine/CalculatorTest.php @@ -127,7 +127,7 @@ class CalculatorTest extends \PHPUnit_Framework_TestCase $taxRulesCollection = new ObjectCollection(); $aProduct = ProductQuery::create()->findOne(); - if(null === $aProduct) { + if (null === $aProduct) { return; } @@ -169,7 +169,7 @@ class CalculatorTest extends \PHPUnit_Framework_TestCase $taxRulesCollection->setModel('\Thelia\Model\Tax'); $aProduct = ProductQuery::create()->findOne(); - if(null === $aProduct) { + if (null === $aProduct) { return; } @@ -214,7 +214,7 @@ class CalculatorTest extends \PHPUnit_Framework_TestCase $taxRulesCollection->append($tax); $aProduct = ProductQuery::create()->findOne(); - if(null === $aProduct) { + if (null === $aProduct) { return; } @@ -270,7 +270,7 @@ class CalculatorTest extends \PHPUnit_Framework_TestCase $taxRulesCollection->append($tax); $aProduct = ProductQuery::create()->findOne(); - if(null === $aProduct) { + if (null === $aProduct) { return; } diff --git a/core/lib/Thelia/Tools/URL.php b/core/lib/Thelia/Tools/URL.php index 3e137e5e4..d00c5c4ab 100755 --- a/core/lib/Thelia/Tools/URL.php +++ b/core/lib/Thelia/Tools/URL.php @@ -199,7 +199,7 @@ class URL public function retrieve($view, $viewId, $viewLocale) { if (ConfigQuery::isRewritingEnable()) { - $this->retriever->loadViewUrl($view, $viewLocale, $viewId); + URL::getInstance()->absoluteUrl($this->retriever->loadViewUrl($view, $viewLocale, $viewId)); } else { $allParametersWithoutView = array(); $allParametersWithoutView['locale'] = $viewLocale; diff --git a/install/insert.sql b/install/insert.sql index 8e6585a5b..991eb7892 100755 --- a/install/insert.sql +++ b/install/insert.sql @@ -19,7 +19,7 @@ INSERT INTO `config` (`name`, `value`, `secured`, `hidden`, `created_at`, `updat ('image_cache_dir_from_web_root', 'cache/images', 0, 0, NOW(), NOW()), ('document_cache_dir_from_web_root', 'cache/documents', 0, 0, NOW(), NOW()), ('currency_rate_update_url', 'http://www.ecb.int/stats/eurofxref/eurofxref-daily.xml', 0, 0, NOW(), NOW()), -('page_not_found_view', '404', 0, 0, NOW(), NOW()), +('page_not_found_view', '404.html', 0, 0, NOW(), NOW()), ('passed_url_view', 'passed-url', 0, 0, NOW(), NOW()), ('use_tax_free_amounts', 0, 0, 0, NOW(), NOW()), ('process_assets', '1', 0, 0, NOW(), NOW()), @@ -39,6 +39,8 @@ INSERT INTO `module` (`id`, `code`, `type`, `activate`, `position`, `full_namesp (4, 'FakeCB', 3, 0, 2, 'FakeCB\\FakeCB', NOW(), NOW()); INSERT INTO `module_i18n` (`id`, `locale`, `title`, `description`, `chapo`, `postscriptum`) VALUES +('1', 'en_US', 'Debug bar', NULL, NULL, NULL), +('1', 'fr_FR', 'Debug bar', NULL, NULL, NULL), ('2', 'en_US', '72h delivery', NULL, NULL, NULL), ('2', 'fr_FR', 'Livraison par colissimo en 72h', NULL, NULL, NULL); @@ -275,7 +277,6 @@ INSERT INTO `country` (`id`, `area_id`, `isocode`, `isoalpha2`, `isoalpha3`, `by (187, NULL, '862', 'VE', 'VEN', 0, NOW(), NOW()), (188, NULL, '704', 'VN', 'VNM', 0, NOW(), NOW()), (189, NULL, '887', 'YE', 'YEM', 0, NOW(), NOW()), -(190, NULL, '807', 'MK', 'MKD', 0, NOW(), NOW()), (191, NULL, '180', 'CD', 'COD', 0, NOW(), NOW()), (192, NULL, '894', 'ZM', 'ZMB', 0, NOW(), NOW()), (193, NULL, '716', 'ZW', 'ZWE', 0, NOW(), NOW()), @@ -915,9 +916,6 @@ INSERT INTO `country_i18n` (`id`, `locale`, `title`, `description`, `chapo`, `po (189, 'en_US', 'Yemen', '', '', ''), (189, 'es_ES', 'Yemen', '', '', ''), (189, 'fr_FR', 'Yémen', '', '', ''), -(190, 'en_US', 'Yougoslavia', '', '', ''), -(190, 'es_ES', 'Yugoslavia', '', '', ''), -(190, 'fr_FR', 'Yougoslavie', '', '', ''), (191, 'en_US', 'Zaire', '', '', ''), (191, 'es_ES', 'Zaire', '', '', ''), (191, 'fr_FR', 'Zaïre', '', '', ''), diff --git a/local/modules/Cheque/Cheque.php b/local/modules/Cheque/Cheque.php index 4516c84f3..cebaff146 100755 --- a/local/modules/Cheque/Cheque.php +++ b/local/modules/Cheque/Cheque.php @@ -23,6 +23,7 @@ namespace Cheque; +use Propel\Runtime\Connection\ConnectionInterface; use Symfony\Component\EventDispatcher\EventDispatcherInterface; use Symfony\Component\HttpFoundation\Request; use Thelia\Model\ModuleImageQuery; @@ -59,17 +60,13 @@ class Cheque extends BaseModule implements PaymentModuleInterface // no special process, waiting for the cheque. } - public function install() - { - } - - public function afterActivation() + public function postActivation(ConnectionInterface $con = null) { /* 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__)); + $this->deployImageFolder($module, sprintf('%s/images', __DIR__), $con); } /* set module title */ @@ -82,10 +79,6 @@ class Cheque extends BaseModule implements PaymentModuleInterface ); } - public function destroy() - { - // TODO: Implement destroy() method. - } public function getCode() { diff --git a/local/modules/Cheque/Config/module.xml b/local/modules/Cheque/Config/module.xml new file mode 100755 index 000000000..1df6cf589 --- /dev/null +++ b/local/modules/Cheque/Config/module.xml @@ -0,0 +1,18 @@ + + + Cheque\Cheque + + Cheque + + + Cheque + + 1.1 + + Manuel Raynaud + mraynaud@openstudio.fr + + payment + 2.0.0 + alpha + diff --git a/local/modules/Cheque/Config/plugin.xml b/local/modules/Cheque/Config/plugin.xml deleted file mode 100755 index e69de29bb..000000000 diff --git a/local/modules/Colissimo/Colissimo.php b/local/modules/Colissimo/Colissimo.php index 7ff972feb..adbbb32c3 100755 --- a/local/modules/Colissimo/Colissimo.php +++ b/local/modules/Colissimo/Colissimo.php @@ -67,25 +67,6 @@ class Colissimo extends BaseModule implements DeliveryModuleInterface return 2; } - public function afterActivation() - { - - } - - /** - * YOU HAVE TO IMPLEMENT HERE ABSTRACT METHODD FROM BaseModule Class - * Like install and destroy - */ - public function install() - { - // TODO: Implement install() method. - } - - public function destroy() - { - // TODO: Implement destroy() method. - } - public function getCode() { return 'Colissimo'; diff --git a/local/modules/Colissimo/Config/module.xml b/local/modules/Colissimo/Config/module.xml new file mode 100644 index 000000000..1f47ad9c9 --- /dev/null +++ b/local/modules/Colissimo/Config/module.xml @@ -0,0 +1,18 @@ + + + Colissimo\Colissimo + + colisimo + + + colisimo + + 1.0 + + Manuel Raynaud + mraynaud@openstudio.fr + + delivery + 2.0.0 + alpha + diff --git a/local/modules/Colissimo/Config/plugin.xml b/local/modules/Colissimo/Config/plugin.xml deleted file mode 100755 index e69de29bb..000000000 diff --git a/local/modules/FakeCB/Config/module.xml b/local/modules/FakeCB/Config/module.xml new file mode 100644 index 000000000..0beea57f4 --- /dev/null +++ b/local/modules/FakeCB/Config/module.xml @@ -0,0 +1,18 @@ + + + FakeCB\FakeCB + + fake cb + + + simulation cb + + 1.0 + + Manuel Raynaud + mraynaud@openstudio.fr + + payment + 2.0.0 + alpha + diff --git a/local/modules/FakeCB/Config/plugin.xml b/local/modules/FakeCB/Config/plugin.xml deleted file mode 100755 index e69de29bb..000000000 diff --git a/local/modules/FakeCB/FakeCB.php b/local/modules/FakeCB/FakeCB.php index ca682fab3..58c8318da 100755 --- a/local/modules/FakeCB/FakeCB.php +++ b/local/modules/FakeCB/FakeCB.php @@ -23,6 +23,7 @@ namespace FakeCB; +use Propel\Runtime\Connection\ConnectionInterface; use Symfony\Component\EventDispatcher\EventDispatcherInterface; use Symfony\Component\HttpFoundation\Request; use Thelia\Model\Base\ModuleImageQuery; @@ -59,12 +60,8 @@ class FakeCB extends BaseModule implements PaymentModuleInterface // TODO: Implement pay() method. } - public function install() - { - } - - public function afterActivation() + public function postActivation(ConnectionInterface $con = null) { /* insert the images from image folder if first module activation */ $module = $this->getModuleModel(); @@ -82,10 +79,6 @@ class FakeCB extends BaseModule implements PaymentModuleInterface ); } - public function destroy() - { - // TODO: Implement destroy() method. - } public function getCode() { diff --git a/local/modules/TheliaDebugBar/Config/module.xml b/local/modules/TheliaDebugBar/Config/module.xml new file mode 100644 index 000000000..61a4c1b0e --- /dev/null +++ b/local/modules/TheliaDebugBar/Config/module.xml @@ -0,0 +1,18 @@ + + + TheliaDebugBar\TheliaDebugBar + + debugbar for thelia + + + debugbar pour thelia + + 1.0 + + Manuel Raynaud + mraynaud@openstudio.fr + + classic + 2.0.0 + alpha + diff --git a/local/modules/TheliaDebugBar/Config/plugin.xml b/local/modules/TheliaDebugBar/Config/plugin.xml deleted file mode 100755 index e69de29bb..000000000 diff --git a/local/modules/TheliaDebugBar/TheliaDebugBar.php b/local/modules/TheliaDebugBar/TheliaDebugBar.php index da9fddf12..466f50d5a 100755 --- a/local/modules/TheliaDebugBar/TheliaDebugBar.php +++ b/local/modules/TheliaDebugBar/TheliaDebugBar.php @@ -32,21 +32,6 @@ class TheliaDebugBar extends BaseModule * Like install and destroy */ - public function afterActivation() - { - - } - - public function install() - { - // TODO: Implement install() method. - } - - public function destroy() - { - // TODO: Implement destroy() method. - } - public function getCode() { return 'TheliaDebugBar'; diff --git a/templates/admin/default/includes/module-block.html b/templates/admin/default/includes/module-block.html new file mode 100644 index 000000000..658557d4e --- /dev/null +++ b/templates/admin/default/includes/module-block.html @@ -0,0 +1,60 @@ +
+
+ + + + + + + + + {module_include location='modules_table_header'} + + + + + + + {loop type="module" name="module.{$module_type}" module_type={$module_type|default:1} backend_context=1} + + + + + + {module_include location='modules_table_row'} + + + + {/loop} + +
+ {$caption_title|default:{intl l='classic modules'}} +
{intl l="Name"}{intl l="Description"}{intl l="Enable/Disable"}{intl l="Actions"}
{$TITLE}{$CHAPO} +
+ +
+ +
+
+ + {loop type="auth" name="can_change" roles="ADMIN" permissions="admin.modules.documentation"} + + {/loop} + + {loop type="auth" name="can_change" roles="ADMIN" permissions="admin.modules.edit"} + + {/loop} + + {loop type="auth" name="can_delete" roles="ADMIN" permissions="admin.modules.delete"} + + {/loop} +
+
+
+
\ No newline at end of file diff --git a/templates/admin/default/modules.html b/templates/admin/default/modules.html index 8c86c349a..86c336a04 100644 --- a/templates/admin/default/modules.html +++ b/templates/admin/default/modules.html @@ -25,221 +25,11 @@
-
-
- - - - - - - + {if $error_message}
{$error_message}
{/if} + {include file="includes/module-block.html" module_type="1" caption_title={intl l='Classic modules'}} + {include file="includes/module-block.html" module_type="2" caption_title={intl l='Delivery modules'}} + {include file="includes/module-block.html" module_type="3" caption_title={intl l='Payment modules'}} - {module_include location='modules_table_header'} - - - - - - - - - - - - {module_include location='modules_table_row'} - - - - - - - - - {module_include location='modules_table_row'} - - - - - - - - - {module_include location='modules_table_row'} - - - - -
- {intl l='Transport modules'} -
{intl l="Name"}{intl l="Description"}{intl l="Enable/Disable"}{intl l="Actions"}
TinymceEos minima maiores doloribus mollitia perspiciatis esse iusto odit error delectus aliquid! Eius, pariatur accusantium odit quidem laboriosam. -
- -
-
-
- - {loop type="auth" name="can_change" roles="ADMIN" permissions="admin.modules.documentation"} - - {/loop} - - {loop type="auth" name="can_change" roles="ADMIN" permissions="admin.modules.edit"} - - {/loop} - - {loop type="auth" name="can_delete" roles="ADMIN" permissions="admin.modules.delete"} - - {/loop} -
-
So colissimoEos minima maiores doloribus mollitia perspiciatis esse iusto odit error delectus aliquid -
- -
-
-
- - {loop type="auth" name="can_change" roles="ADMIN" permissions="admin.modules.documentation"} - - {/loop} - - {loop type="auth" name="can_change" roles="ADMIN" permissions="admin.modules.edit"} - - {/loop} - - {loop type="auth" name="can_delete" roles="ADMIN" permissions="admin.modules.delete"} - - {/loop} -
-
Title metaEos minima maiores doloribus mollitia perspiciatis esse iusto odit error delectus aliquid -
- -
-
-
- - {loop type="auth" name="can_change" roles="ADMIN" permissions="admin.modules.documentation"} - - {/loop} - - {loop type="auth" name="can_change" roles="ADMIN" permissions="admin.modules.edit"} - - {/loop} - - {loop type="auth" name="can_delete" roles="ADMIN" permissions="admin.modules.delete"} - - {/loop} -
-
-
-
- -
-
- - - - - - - - - {module_include location='modules_table_header'} - - - - - - - - - - - - {module_include location='modules_table_row'} - - - - - - - - - {module_include location='modules_table_row'} - - - - - - - - - {module_include location='modules_table_row'} - - - - -
- {intl l='Delivery modules'} -
{intl l="Name"}{intl l="Description"}{intl l="Enable/Disable"}{intl l="Actions"}
TinymceEos minima maiores doloribus mollitia perspiciatis esse iusto odit error delectus aliquid! Eius, pariatur accusantium odit quidem laboriosam. -
- -
-
-
- - {loop type="auth" name="can_change" roles="ADMIN" permissions="admin.modules.documentation"} - - {/loop} - - {loop type="auth" name="can_change" roles="ADMIN" permissions="admin.modules.edit"} - - {/loop} - - {loop type="auth" name="can_delete" roles="ADMIN" permissions="admin.modules.delete"} - - {/loop} -
-
So colissimoEos minima maiores doloribus mollitia perspiciatis esse iusto odit error delectus aliquid -
- -
-
-
- - {loop type="auth" name="can_change" roles="ADMIN" permissions="admin.modules.documentation"} - - {/loop} - - {loop type="auth" name="can_change" roles="ADMIN" permissions="admin.modules.edit"} - - {/loop} - - {loop type="auth" name="can_delete" roles="ADMIN" permissions="admin.modules.delete"} - - {/loop} -
-
Title metaEos minima maiores doloribus mollitia perspiciatis esse iusto odit error delectus aliquid -
- -
-
-
- - {loop type="auth" name="can_change" roles="ADMIN" permissions="admin.modules.documentation"} - - {/loop} - - {loop type="auth" name="can_change" roles="ADMIN" permissions="admin.modules.edit"} - - {/loop} - - {loop type="auth" name="can_delete" roles="ADMIN" permissions="admin.modules.delete"} - - {/loop} -
-
-
-
@@ -251,8 +41,7 @@ {* Delete module confirmation dialog *} {capture "delete_module_dialog"} - - + {/capture} {include @@ -262,10 +51,25 @@ dialog_title = {intl l="Delete a module"} dialog_message = {intl l="Do you really want to delete this module ?"} - form_action = {url path='/admin/modules/delete'} + form_action = {url path='/admin/configuration/modules/delete'} form_content = {$smarty.capture.delete_module_dialog nofilter} } + + {/block} {block name="javascript-initialization"} @@ -273,4 +77,28 @@ {javascripts file='assets/js/bootstrap-switch/bootstrap-switch.js'} {/javascripts} + + {/block} \ No newline at end of file diff --git a/templates/default/product.html b/templates/default/product.html index b7b203bc9..c0a102d37 100644 --- a/templates/default/product.html +++ b/templates/default/product.html @@ -5,7 +5,7 @@ {* Breadcrumb *} {block name='no-return-functions' append} - {$sBreadcrumb = []} + {$breadcrumbs = []} {loop type="product" name="product_breadcrumb" id="{product attr="id"}"} {loop name="category_path" type="category-path" category="{$DEFAULT_CATEGORY}"} {$breadcrumbs[] = ['title' => {$TITLE}, 'url'=> {$URL}]} @@ -138,6 +138,10 @@ {form_hidden_fields form=$form} + {form_field form=$form field="append"} + + {/form_field} + {if $form_error}
{$form_error_message}
{/if}