Example #1
0
 protected function handle()
 {
     // 系统中的未启用的插件
     $all_plugins = $this->getContainer()->getParameter('plugins');
     if ($all_plugins) {
         $all_plugins = $all_plugins->toArray();
     } else {
         $all_plugins = array();
     }
     $unused_plugins = array();
     $used_plugins = array();
     $data = PluginModel::allPlugins();
     foreach ($data as $row) {
         $row['dependency'] = json_decode($row['dependency'], true);
         $used_plugins[$row['id']] = $row;
     }
     foreach ($all_plugins as $plugin_id => $plugin) {
         $plugin['apply_code'] = htmlspecialchars($plugin['apply_code']);
         if (!in_array($plugin_id, $used_plugins)) {
             $unused_plugins[$plugin_id] = $plugin;
         }
     }
     $request = $this->getRequest();
     if ($request->getMethod() == 'POST') {
         $ids = $request->request->get('ids');
         $db = WWWDatabase::getDb();
         $session = $this->getSession();
         $db->transaction();
         try {
             $plugins = PluginModel::allPlugins(function (QueryBuilder $qb) use($ids) {
                 foreach ($ids as $k => $id) {
                     $qb->orWhere($qb->expr()->eq('id', ':id_' . $k))->setParameter(':id_' . $k, $id);
                 }
             });
             // 检查是否有依赖
             // 找出不删的插件
             $not_delete_used_plugins = array();
             foreach ($used_plugins as $used_plugin) {
                 if (!in_array($used_plugin['id'], $ids)) {
                     $not_delete_used_plugins[] = $used_plugin;
                 }
             }
             foreach ($not_delete_used_plugins as $not_delete_used_plugin) {
                 if (($intersect = array_intersect(array_values($not_delete_used_plugin['dependency']), array_values($ids))) != null) {
                     $dependent_plugin_ids = implode(',', $intersect);
                     throw new \Exception("插件'{$not_delete_used_plugin['id']}'依赖'{$dependent_plugin_ids}',不能弃用");
                 }
             }
             // 删除插件
             foreach ($plugins as $plugin) {
                 PluginModel::deletePlugin($plugin['id']);
                 // 删除插件与文章的关系
                 $article_plugins = ArticlePluginModel::allRelationship(function (QueryBuilder $qb) use($plugin) {
                     $qb->where($qb->expr()->eq('plugin_id', ':plugin_id'))->setParameter(':plugin_id', $plugin['id']);
                 });
                 foreach ($article_plugins as $article_plugin) {
                     ArticlePluginModel::deleteRelationship($article_plugin['article_id'], $plugin['id']);
                 }
             }
             $db->commit();
             $session->addFlash('success', '操作成功');
         } catch (\Exception $e) {
             $db->rollback();
             $session->addFlash('error', $e->getMessage());
         }
         return new RedirectResponse($this->generateUrl('admin_www_plugins'));
     } else {
         $ids = $request->query->get('ids');
         if (is_string($ids)) {
             $ids = json_decode($ids, true);
         }
         if (!$ids) {
             throw new \Exception('没有选择任何插件');
         }
         // 显示要删除的插件
         $plugins = PluginModel::allPlugins(function (QueryBuilder $qb) use($ids) {
             foreach ($ids as $k => $id) {
                 $qb->orWhere($qb->expr()->eq('id', ':id_' . $k))->setParameter(':id_' . $k, $id);
             }
         });
         // 检查是否有依赖
         // 找出不删的插件
         $not_delete_used_plugins = array();
         foreach ($used_plugins as $used_plugin) {
             if (!in_array($used_plugin['id'], $ids)) {
                 $not_delete_used_plugins[] = $used_plugin;
             }
         }
         foreach ($not_delete_used_plugins as $not_delete_used_plugin) {
             if (($intersect = array_intersect(array_values($not_delete_used_plugin['dependency']), array_values($ids))) != null) {
                 $dependent_plugin_ids = implode(',', $intersect);
                 throw new \Exception("插件'{$not_delete_used_plugin['id']}'依赖'{$dependent_plugin_ids}',不能弃用");
             }
         }
         return $this->render('plugin/delete.html.twig', array('plugins' => $plugins));
     }
 }