end module removal

This commit is contained in:
Manuel Raynaud
2013-10-21 11:30:19 +02:00
parent a10fa20340
commit 28b7423443
5 changed files with 56 additions and 4 deletions

View File

@@ -24,6 +24,7 @@
namespace Thelia\Action; namespace Thelia\Action;
use Propel\Runtime\Propel; use Propel\Runtime\Propel;
use Symfony\Component\EventDispatcher\EventSubscriberInterface; use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Filesystem\Filesystem;
use Thelia\Core\Event\Cache\CacheEvent; use Thelia\Core\Event\Cache\CacheEvent;
use Thelia\Core\Event\Module\ModuleDeleteEvent; use Thelia\Core\Event\Module\ModuleDeleteEvent;
use Thelia\Core\Event\Module\ModuleToggleActivationEvent; use Thelia\Core\Event\Module\ModuleToggleActivationEvent;
@@ -64,7 +65,37 @@ class Module extends BaseAction implements EventSubscriberInterface
public function delete(ModuleDeleteEvent $event) 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);
} catch (\Exception $e) {
$con->rollBack();
throw $e;
}
}
} }
protected function cacheClear() protected function cacheClear()

View File

@@ -88,6 +88,7 @@ class ModuleController extends BaseAdminController
{ {
if (null !== $response = $this->checkAuth("admin.module.delete")) return $response; if (null !== $response = $this->checkAuth("admin.module.delete")) return $response;
$message = null;
try { try {
$module_id = $this->getRequest()->get('module_id'); $module_id = $this->getRequest()->get('module_id');
@@ -96,8 +97,22 @@ class ModuleController extends BaseAdminController
$this->dispatch(TheliaEvents::MODULE_DELETE, $deleteEvent); $this->dispatch(TheliaEvents::MODULE_DELETE, $deleteEvent);
} catch (\Exception $e) { 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');
} }
} }
} }

View File

@@ -62,4 +62,9 @@ class ModuleEvent extends ActionEvent
return $this->module; return $this->module;
} }
public function hasModule()
{
return null !== $this->module;
}
} }

View File

@@ -225,7 +225,7 @@ abstract class BaseModule extends ContainerAware
return basename(dirname($this->reflected->getFileName())); return basename(dirname($this->reflected->getFileName()));
} }
public function install() public function install(ConnectionInterface $con = null)
{ {
} }
@@ -249,7 +249,7 @@ abstract class BaseModule extends ContainerAware
} }
public function destroy() public function destroy(ConnectionInterface $con = null)
{ {
} }

View File

@@ -25,6 +25,7 @@
<div class="row"> <div class="row">
<div class="col-md-12"> <div class="col-md-12">
{if $error_message}<div class="alert alert-danger">{$error_message}</div>{/if}
{include file="includes/module-block.html" module_type="1" caption_title={intl l='Classic modules'}} {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="2" caption_title={intl l='Delivery modules'}}
{include file="includes/module-block.html" module_type="3" caption_title={intl l='Payment modules'}} {include file="includes/module-block.html" module_type="3" caption_title={intl l='Payment modules'}}