public function updatePlugin(\Eccube\Entity\Plugin $plugin, $meta, $event_yml) { $em = $this->app['orm.em']; $em->getConnection()->beginTransaction(); $plugin->setVersion($meta['version'])->setName($meta['name']); if (isset($meta['event'])) { $plugin->setClassName($meta['event']); } $rep = $this->app['eccube.repository.plugin_event_handler']; if (is_array($event_yml)) { foreach ($event_yml as $event => $handlers) { foreach ($handlers as $handler) { if (!$this->checkSymbolName($handler[0])) { throw new PluginException('Handler name format error'); } // updateで追加されたハンドラかどうか調べる $peh = $rep->findBy(array('del_flg' => Constant::DISABLED, 'plugin_id' => $plugin->getId(), 'event' => $event, 'handler' => $handler[0], 'handler_type' => $handler[1])); if (!$peh) { // 新規にevent.ymlに定義されたハンドラなのでinsertする $peh = new \Eccube\Entity\PluginEventHandler(); $peh->setPlugin($plugin)->setEvent($event)->setdelFlg(Constant::DISABLED)->setHandler($handler[0])->setHandlerType($handler[1])->setPriority($rep->calcNewPriority($event, $handler[1])); $em->persist($peh); $em->flush(); } } } # アップデート後のevent.ymlで削除されたハンドラをdtb_plugin_event_handlerから探して削除 foreach ($rep->findBy(array('del_flg' => Constant::DISABLED, 'plugin_id' => $plugin->getId())) as $peh) { if (!isset($event_yml[$peh->getEvent()])) { $em->remove($peh); $em->flush(); } else { $match = false; foreach ($event_yml[$peh->getEvent()] as $handler) { if ($peh->getHandler() == $handler[0] and $peh->getHandlerType() == $handler[1]) { $match = true; } } if (!$match) { $em->remove($peh); $em->flush(); } } } } $em->persist($plugin); $em->flush(); $em->getConnection()->commit(); }
public function unregisterPlugin(\Eccube\Entity\Plugin $p) { $em = $this->app['orm.em']; $em->getConnection()->beginTransaction(); $p->setDelFlg(1)->setEnable(0); foreach ($p->getPluginEventHandlers()->toArray() as $peh) { $peh->setDelFlg(1); } $em->persist($p); $em->flush(); $em->getConnection()->commit(); }