diff --git a/core/lib/Thelia/Action/Module.php b/core/lib/Thelia/Action/Module.php index a994288d9..d27bedd1f 100644 --- a/core/lib/Thelia/Action/Module.php +++ b/core/lib/Thelia/Action/Module.php @@ -27,6 +27,7 @@ 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\ModuleEvent; use Thelia\Core\Event\Module\ModuleToggleActivationEvent; use Thelia\Core\Event\TheliaEvents; use Thelia\Model\Map\ModuleTableMap; @@ -99,6 +100,28 @@ class Module extends BaseAction implements EventSubscriberInterface } } + /** + * @param ModuleEvent $event + */ + public function update(ModuleEvent $event) + { + if (null !== $module = ModuleQuery::create()->findPk($event->getId())) { + + $module + ->setDispatcher($this->getDispatcher()) + ->setLocale($event->getLocale()) + ->setTitle($event->getTitle()) + ->setChapo($event->getChapo()) + ->setDescription($event->getDescription()) + ->setPostscriptum($event->getPostscriptum()) + ; + + $module->save(); + + $event->setModule($module); + } + } + protected function cacheClear() { $cacheEvent = new CacheEvent($this->container->getParameter('kernel.cache_dir')); @@ -130,7 +153,8 @@ class Module extends BaseAction implements EventSubscriberInterface { return array( TheliaEvents::MODULE_TOGGLE_ACTIVATION => array('toggleActivation', 128), - TheliaEvents::MODULE_DELETE => array('delete', 128) + TheliaEvents::MODULE_DELETE => array('delete', 128), + TheliaEvents::MODULE_UPDATE => array('update', 128), ); } } diff --git a/core/lib/Thelia/Config/Resources/form.xml b/core/lib/Thelia/Config/Resources/form.xml index ecd530b69..dd21a9232 100644 --- a/core/lib/Thelia/Config/Resources/form.xml +++ b/core/lib/Thelia/Config/Resources/form.xml @@ -122,6 +122,8 @@
+ + diff --git a/core/lib/Thelia/Config/Resources/routing/admin.xml b/core/lib/Thelia/Config/Resources/routing/admin.xml index a966b2608..52af62c45 100755 --- a/core/lib/Thelia/Config/Resources/routing/admin.xml +++ b/core/lib/Thelia/Config/Resources/routing/admin.xml @@ -925,16 +925,25 @@ - + Thelia\Controller\Admin\ModuleController::indexAction - + + Thelia\Controller\Admin\ModuleController::updateAction + \d+ + + + + Thelia\Controller\Admin\ModuleController::processUpdateAction + + + Thelia\Controller\Admin\ModuleController::toggleActivationAction \d+ - + Thelia\Controller\Admin\ModuleController::deleteAction diff --git a/core/lib/Thelia/Controller/Admin/ModuleController.php b/core/lib/Thelia/Controller/Admin/ModuleController.php index 53322949a..24f297cbf 100644 --- a/core/lib/Thelia/Controller/Admin/ModuleController.php +++ b/core/lib/Thelia/Controller/Admin/ModuleController.php @@ -23,12 +23,15 @@ namespace Thelia\Controller\Admin; +use Thelia\Core\Event\Module\ModuleEvent; use Thelia\Core\Security\Resource\AdminResources; use Thelia\Core\Event\Module\ModuleDeleteEvent; use Thelia\Core\Event\Module\ModuleToggleActivationEvent; use Thelia\Core\Event\TheliaEvents; use Thelia\Core\Security\AccessManager; +use Thelia\Form\ModuleModificationForm; +use Thelia\Model\ModuleQuery; use Thelia\Module\ModuleManagement; /** @@ -36,25 +39,155 @@ use Thelia\Module\ModuleManagement; * @package Thelia\Controller\Admin * @author Manuel Raynaud */ -class ModuleController extends BaseAdminController +class ModuleController extends AbstractCrudController { + public function __construct() + { + parent::__construct( + 'module', + null, + null, + + AdminResources::MODULE, + + null, + TheliaEvents::MODULE_UPDATE, + null + ); + } + + protected function getCreationForm() + { + return null; + } + + protected function getUpdateForm() + { + return new ModuleModificationForm($this->getRequest()); + } + + protected function getCreationEvent($formData) + { + return null; + } + + protected function getUpdateEvent($formData) + { + $event = new ModuleEvent(); + + $event->setLocale($formData['locale']); + $event->setId($formData['id']); + $event->setTitle($formData['title']); + $event->setChapo($formData['chapo']); + $event->setDescription($formData['description']); + $event->setPostscriptum($formData['postscriptum']); + + return $event; + } + + protected function getDeleteEvent() + { + return null; + } + + protected function eventContainsObject($event) + { + return $event->hasModule(); + } + + protected function hydrateObjectForm($object) + { + $object->setLocale($this->getCurrentEditionLocale()); + $data = array( + 'id' => $object->getId(), + 'locale' => $object->getLocale(), + 'title' => $object->getTitle(), + 'chapo' => $object->getChapo(), + 'description' => $object->getDescription(), + 'postscriptum' => $object->getPostscriptum(), + ); + + // Setup the object form + return new ModuleModificationForm($this->getRequest(), "form", $data); + } + + protected function getObjectFromEvent($event) + { + return $event->hasModule() ? $event->getModule() : null; + } + + protected function getExistingObject() + { + return ModuleQuery::create() + ->joinWithI18n($this->getCurrentEditionLocale()) + ->findOneById($this->getRequest()->get('module_id')); + } + + + protected function getObjectLabel($object) + { + return $object->getTitle(); + } + + protected function getObjectId($object) + { + return $object->getId(); + } + + protected function getViewArguments() + { + return array(); + } + + protected function getRouteArguments($module_id = null) + { + return array( + 'module_id' => $module_id === null ? $this->getRequest()->get('module_id') : $module_id, + ); + } + + protected function renderListTemplate($currentOrder) + { + // We always return to the feature edition form + return $this->render( + 'modules', + array() + ); + } + + protected function renderEditionTemplate() + { + // We always return to the feature edition form + return $this->render('module-edit', array_merge($this->getViewArguments(), $this->getRouteArguments())); + } + + protected function redirectToEditionTemplate($request = null, $country = null) + { + // We always return to the module edition form + $this->redirectToRoute( + "admin.module.update", + $this->getViewArguments(), + $this->getRouteArguments() + ); + } + + protected function redirectToListTemplate() + { + $this->redirectToRoute( + "admin.module" + ); + } + public function indexAction() { if (null !== $response = $this->checkAuth(AdminResources::MODULE, AccessManager::VIEW)) return $response; - $modulemanagement = new ModuleManagement(); - $modulemanagement->updateModules(); + $moduleManagement = new ModuleManagement(); + $moduleManagement->updateModules(); return $this->render("modules"); } - public function updateAction($module_id) - { - return $this->render("module-edit", array( - "module_id" => $module_id - )); - } - public function toggleActivationAction($module_id) { if (null !== $response = $this->checkAuth(AdminResources::MODULE, AccessManager::UPDATE)) return $response; diff --git a/core/lib/Thelia/Core/Event/Module/ModuleEvent.php b/core/lib/Thelia/Core/Event/Module/ModuleEvent.php index 583a3afc9..7dc3f67e8 100644 --- a/core/lib/Thelia/Core/Event/Module/ModuleEvent.php +++ b/core/lib/Thelia/Core/Event/Module/ModuleEvent.php @@ -37,6 +37,109 @@ class ModuleEvent extends ActionEvent */ protected $module; + protected $id; + protected $locale; + protected $title; + protected $chapo; + protected $description; + protected $postscriptum; + + /** + * @param mixed $chapo + */ + public function setChapo($chapo) + { + $this->chapo = $chapo; + } + + /** + * @return mixed + */ + public function getChapo() + { + return $this->chapo; + } + + /** + * @param mixed $description + */ + public function setDescription($description) + { + $this->description = $description; + } + + /** + * @return mixed + */ + public function getDescription() + { + return $this->description; + } + + /** + * @param mixed $id + */ + public function setId($id) + { + $this->id = $id; + } + + /** + * @return mixed + */ + public function getId() + { + return $this->id; + } + + /** + * @param mixed $locale + */ + public function setLocale($locale) + { + $this->locale = $locale; + } + + /** + * @return mixed + */ + public function getLocale() + { + return $this->locale; + } + + /** + * @param mixed $postscriptum + */ + public function setPostscriptum($postscriptum) + { + $this->postscriptum = $postscriptum; + } + + /** + * @return mixed + */ + public function getPostscriptum() + { + return $this->postscriptum; + } + + /** + * @param mixed $title + */ + public function setTitle($title) + { + $this->title = $title; + } + + /** + * @return mixed + */ + public function getTitle() + { + return $this->title; + } + public function __construct(Module $module = null) { $this->module = $module; diff --git a/core/lib/Thelia/Core/Event/TheliaEvents.php b/core/lib/Thelia/Core/Event/TheliaEvents.php index 6dbe89e10..1dfcb673c 100755 --- a/core/lib/Thelia/Core/Event/TheliaEvents.php +++ b/core/lib/Thelia/Core/Event/TheliaEvents.php @@ -693,8 +693,9 @@ final class TheliaEvents const MODULE_TOGGLE_ACTIVATION = 'thelia.module.toggleActivation'; /** - * sent when a module is deleted + * module */ + const MODULE_UPDATE = 'thelia.module.update'; const MODULE_DELETE = 'thelia.module.delete'; /** diff --git a/core/lib/Thelia/Core/Security/Resource/AdminResources.php b/core/lib/Thelia/Core/Security/Resource/AdminResources.php index 834c2c628..e953b83aa 100644 --- a/core/lib/Thelia/Core/Security/Resource/AdminResources.php +++ b/core/lib/Thelia/Core/Security/Resource/AdminResources.php @@ -84,7 +84,7 @@ final class AdminResources const MESSAGE = "admin.configuration.message"; - const MODULE = "admin.configuration.module"; + const MODULE = "admin.module"; const ORDER = "admin.order"; diff --git a/core/lib/Thelia/Core/Template/Loop/FolderPath.php b/core/lib/Thelia/Core/Template/Loop/FolderPath.php index ce5ea9526..92c42f890 100644 --- a/core/lib/Thelia/Core/Template/Loop/FolderPath.php +++ b/core/lib/Thelia/Core/Template/Loop/FolderPath.php @@ -102,9 +102,9 @@ class FolderPath extends BaseI18nLoop implements ArraySearchLoopInterface if ($folder != null) { $results[] = array( - "ID" => $result->getId(), - "TITLE" => $result->getVirtualColumn('i18n_TITLE'), - "URL" => $result->getUrl($this->locale), + "ID" => $folder->getId(), + "TITLE" => $folder->getVirtualColumn('i18n_TITLE'), + "URL" => $folder->getUrl($this->locale), "LOCALE" => $this->locale, ); diff --git a/local/modules/FakeCB/Tests/FakeCBTest.php b/core/lib/Thelia/Form/ModuleModificationForm.php similarity index 55% rename from local/modules/FakeCB/Tests/FakeCBTest.php rename to core/lib/Thelia/Form/ModuleModificationForm.php index 20a68fc1d..5b65f5709 100755 --- a/local/modules/FakeCB/Tests/FakeCBTest.php +++ b/core/lib/Thelia/Form/ModuleModificationForm.php @@ -4,7 +4,7 @@ /* Thelia */ /* */ /* Copyright (c) OpenStudio */ -/* email : info@thelia.net */ +/* email : info@thelia.net */ /* web : http://www.thelia.net */ /* */ /* This program is free software; you can redistribute it and/or modify */ @@ -21,32 +21,55 @@ /* */ /*************************************************************************************/ -namespace FakeCB\Tests; +namespace Thelia\Form; -use FakeCB\FakeCB; -use Thelia\Tests\Module\BaseModuleTestor; +use Symfony\Component\Validator\Constraints; +use Symfony\Component\Validator\ExecutionContextInterface; +use Thelia\Model\ModuleQuery; -/** - * - * @author Etienne Roudeix - * - */ -class FakeCBTest extends BaseModuleTestor +class ModuleModificationForm extends BaseForm { - public function getTestedClassName() + use StandardDescriptionFieldsTrait; + + protected function buildForm() { - return 'FakeCB\FakeCB'; + $this->addStandardDescFields(); + + $this->formBuilder + ->add("id", "hidden", array( + "required" => true, + "constraints" => array( + new Constraints\NotBlank(), + new Constraints\Callback( + array( + "methods" => array( + array($this, "verifyModuleId"), + ), + ) + ), + ), + "attr" => array( + "id" => "module_update_id", + ), + )) + ; } - public function getTestedInstance() + /** + * @return string the name of you form. This name must be unique + */ + public function getName() { - return new FakeCB(); + return "thelia_admin_module_modification"; } - public function testInstall() + public function verifyModuleId($value, ExecutionContextInterface $context) { - //$fakeCB = new FakeCB(); + $module = ModuleQuery::create() + ->findPk($value); - //$fakeCB->install(); + if (null === $module) { + $context->addViolation("Module ID not found"); + } } } diff --git a/core/lib/Thelia/Model/Module.php b/core/lib/Thelia/Model/Module.php index d57df77fa..b2518169d 100755 --- a/core/lib/Thelia/Model/Module.php +++ b/core/lib/Thelia/Model/Module.php @@ -4,8 +4,11 @@ namespace Thelia\Model; use Propel\Runtime\Connection\ConnectionInterface; use Thelia\Model\Base\Module as BaseModule; +use Thelia\Model\Tools\ModelEventDispatcherTrait; -class Module extends BaseModule { +class Module extends BaseModule +{ + use ModelEventDispatcherTrait; public function postSave(ConnectionInterface $con = null) { diff --git a/local/modules/FakeCB/Config/config.xml b/local/modules/FakeCB/Config/config.xml deleted file mode 100755 index 2430f5027..000000000 --- a/local/modules/FakeCB/Config/config.xml +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - diff --git a/local/modules/FakeCB/Config/module.xml b/local/modules/FakeCB/Config/module.xml deleted file mode 100644 index 0beea57f4..000000000 --- a/local/modules/FakeCB/Config/module.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - FakeCB\FakeCB - - fake cb - - - simulation cb - - 1.0 - - Manuel Raynaud - mraynaud@openstudio.fr - - payment - 2.0.0 - alpha - diff --git a/local/modules/FakeCB/FakeCB.php b/local/modules/FakeCB/FakeCB.php deleted file mode 100755 index 58c8318da..000000000 --- a/local/modules/FakeCB/FakeCB.php +++ /dev/null @@ -1,88 +0,0 @@ -. */ -/* */ -/*************************************************************************************/ - -namespace FakeCB; - -use Propel\Runtime\Connection\ConnectionInterface; -use Symfony\Component\EventDispatcher\EventDispatcherInterface; -use Symfony\Component\HttpFoundation\Request; -use Thelia\Model\Base\ModuleImageQuery; -use Thelia\Module\BaseModule; -use Thelia\Module\PaymentModuleInterface; - -class FakeCB extends BaseModule implements PaymentModuleInterface -{ - protected $request; - protected $dispatcher; - - public function setRequest(Request $request) - { - $this->request = $request; - } - - public function getRequest() - { - return $this->request; - } - - public function setDispatcher(EventDispatcherInterface $dispatcher) - { - $this->dispatcher = $dispatcher; - } - - public function getDispatcher() - { - return $this->dispatcher; - } - - public function pay() - { - // TODO: Implement pay() method. - } - - - 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__)); - } - - /* set module title */ - $this->setTitle( - $module, - array( - "en_US" => "Credit Card", - "fr_FR" => "Carte de crédit", - ) - ); - } - - - public function getCode() - { - return 'FakeCB'; - } - -} diff --git a/local/modules/FakeCB/images/mastercard.png b/local/modules/FakeCB/images/mastercard.png deleted file mode 100755 index 28701c3dd..000000000 Binary files a/local/modules/FakeCB/images/mastercard.png and /dev/null differ diff --git a/local/modules/FakeCB/images/visa.png b/local/modules/FakeCB/images/visa.png deleted file mode 100755 index ef0447105..000000000 Binary files a/local/modules/FakeCB/images/visa.png and /dev/null differ diff --git a/templates/admin/default/configuration.html b/templates/admin/default/configuration.html index 6b4428b1a..dec253917 100644 --- a/templates/admin/default/configuration.html +++ b/templates/admin/default/configuration.html @@ -116,13 +116,6 @@ {module_include location='system_configuration_top'} - {loop type="auth" name="pcc1" role="ADMIN" resource="admin.configuration.module" access="VIEW"} - - {intl l='Modules activation'} - - - {/loop} - {loop type="auth" name="pcc2" role="ADMIN" resource="admin.configuration.variable" access="VIEW"} {intl l='System variables'} diff --git a/templates/admin/default/includes/module-block.html b/templates/admin/default/includes/module-block.html index 527e9bf6a..f11be5331 100644 --- a/templates/admin/default/includes/module-block.html +++ b/templates/admin/default/includes/module-block.html @@ -27,9 +27,9 @@ @@ -48,7 +48,7 @@ {/loop} {loop type="auth" name="can_delete" role="ADMIN" resource="admin.modules" access="DELETE"} - + {/loop} diff --git a/templates/admin/default/module-edit.html b/templates/admin/default/module-edit.html new file mode 100644 index 000000000..755a50826 --- /dev/null +++ b/templates/admin/default/module-edit.html @@ -0,0 +1,82 @@ +{extends file="admin-layout.tpl"} + +{block name="page-title"}{intl l='Edit a module'}{/block} + +{block name="check-resource"}admin.module{/block} +{block name="check-access"}update{/block} + +{block name="main-content"} + +
+ +
+ + + + {loop type="module" name="module" id=$module_id backend_context="1" lang=$edit_language_id} + +
+
+ +
+ + {form name="thelia.admin.module.modification"} + + + + {include + file = "includes/inner-form-toolbar.html" + hide_submit_buttons = false + + page_url = {url path="/admin/module/update/$module_id"} + close_url = {url path="/admin/modules"} + } + + {* Be sure to get the product ID, even if the form could not be validated *} + + + {form_hidden_fields form=$form} + + {form_field form=$form field='success_url'} + + {/form_field} + + {if $form_error}
{$form_error_message}
{/if} + + {include file="includes/standard-description-form-fields.html" form=$form} + +
+
+
+ +
+

{intl l='Module created on %date_create. Last modification: %date_change' date_create={format_date date=$CREATE_DATE} date_change={format_date date=$UPDATE_DATE}}

+
+
+
+
+ + + {/form} +
+ +
+
+ + {/loop} + +
+ +
+ +{/block} + +{block name="javascript-initialization"} + + + +{/block} \ No newline at end of file diff --git a/templates/admin/default/modules.html b/templates/admin/default/modules.html index d82bce399..0eebed2b8 100644 --- a/templates/admin/default/modules.html +++ b/templates/admin/default/modules.html @@ -2,7 +2,7 @@ {block name="page-title"}{intl l='Modules'}{/block} -{block name="check-resource"}admin.configuration.module{/block} +{block name="check-resource"}admin.module{/block} {block name="check-access"}view{/block} {block name="main-content"} @@ -53,7 +53,7 @@ dialog_title = {intl l="Delete a module"} dialog_message = {intl l="Do you really want to delete this module ?"} - form_action = {url path='/admin/configuration/modules/delete'} + form_action = {url path='/admin/modules/delete'} form_content = {$smarty.capture.delete_module_dialog nofilter} } @@ -81,8 +81,8 @@ {/javascripts}