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}
+
+
+
+ {/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}