. */ /* */ /*************************************************************************************/ 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) ); } }