private function init() { $conn = $this->container->get('doctrine.dbal.default_connection'); /** @var \ZikulaKernel $kernel */ $kernel = $this->container->get('kernel'); $res = $conn->executeQuery("SELECT name FROM modules WHERE name = 'ZikulaExtensionsModule'"); $result = $res->fetch(); if ($result) { // nothing to do, already converted. return ''; } // remove event handlers that were replaced by DependencyInjection $conn->executeQuery("DELETE FROM module_vars WHERE modname = '/EventHandlers' AND name IN ('Extensions', 'Users', 'Search', 'Settings')"); // remove old Errors module from modules table (uninstall and delete) $conn->executeQuery("DELETE FROM modules WHERE name = 'Errors'"); // rename modules in tables: modules, module_vars, group_perms $oldModuleNames = array('Admin', 'Blocks', 'Categories', 'Extensions', 'Groups', 'Mailer', 'PageLock', 'Permissions', 'Search', 'SecurityCenter', 'Settings', 'Theme', 'Users'); foreach ($oldModuleNames as $module) { $conn->executeQuery("UPDATE modules SET name = 'Zikula{$module}Module', directory = 'Zikula/Module/{$module}Module' WHERE name = '{$module}'"); $conn->executeQuery("UPDATE module_vars SET modname = 'Zikula{$module}Module' WHERE modname = '{$module}'"); $strlen = strlen($module) + 1; $conn->executeQuery("UPDATE group_perms SET component = CONCAT('Zikula{$module}Module', SUBSTRING(component, {$strlen})) WHERE component LIKE '{$module}%'"); } // rename themes in tables: themes $oldThemeNames = array('Andreas08', 'Atom', 'SeaBreeze', 'Mobile', 'Printer'); foreach ($oldThemeNames as $theme) { $conn->executeQuery("UPDATE themes SET name = 'Zikula{$theme}Theme', directory = 'Zikula/Theme/{$theme}Theme' WHERE name = '{$theme}'"); } $conn->executeQuery("UPDATE themes SET name = 'ZikulaRssTheme', directory = 'Zikula/Theme/RssTheme' WHERE name = 'RSS'"); // update 'Users' -> 'ZikulaUsersModule' in all the hook tables $sqls = array(); $sqls[] = "UPDATE hook_area SET owner = 'ZikulaUsersModule' WHERE owner = 'Users'"; $sqls[] = "UPDATE hook_binding SET sowner = 'ZikulaUsersModule' WHERE sowner = 'Users'"; $sqls[] = "UPDATE hook_runtime SET sowner = 'ZikulaUsersModule' WHERE sowner = 'Users'"; $sqls[] = "UPDATE hook_subscriber SET owner = 'ZikulaUsersModule' WHERE owner = 'Users'"; foreach ($sqls as $sql) { $conn->executeQuery($sql); } // update default theme name $conn->executeQuery("UPDATE module_vars SET value = 's:20:\"ZikulaAndreas08Theme\";' WHERE modname = 'ZConfig' AND name = 'Default_Theme'"); // confirm custom module urls are valid with new routes, reset if not $modules = $conn->fetchAll("SELECT * FROM modules"); foreach ($modules as $module) { $path = realpath($kernel->getRootDir() . '/../' . $module['url']); if (is_dir($path)) { $meta = \Zikula\Module\ExtensionsModule\Util::getVersionMeta($module['name']); $conn->executeQuery("UPDATE modules SET url = '{$meta['url']}' WHERE id = {$modules['id']}"); } } // ensure data in modules:capabilities is valid $conn->executeQuery("UPDATE `modules` SET `capabilities`='a:0:{}' WHERE `capabilities`=''"); // install Bundles table $boot = new \Zikula\Bundle\CoreBundle\Bundle\Bootstrap(); $helper = new \Zikula\Bundle\CoreBundle\Bundle\Helper\BootstrapHelper($boot->getConnection($kernel)); $helper->createSchema(); $helper->load(); $bundles = array(); // this neatly autoloads $boot->getPersistedBundles($kernel, $bundles); }
/** * Regenerates the theme list * @return bool true * @throws \Exception */ public static function regenerate() { $boot = new \Zikula\Bundle\CoreBundle\Bundle\Bootstrap(); $helper = new \Zikula\Bundle\CoreBundle\Bundle\Helper\BootstrapHelper($boot->getConnection(ServiceUtil::getManager()->get('kernel'))); // sync the filesystem and the bundles table $helper->load(); // Get all themes on filesystem $filethemes = array(); $scanner = new Scanner(); $scanner->scan(array('themes'), 4); $newThemes = $scanner->getThemesMetaData(); foreach ($newThemes as $name => $theme) { foreach ($theme->getPsr0() as $ns => $path) { ZLoader::addPrefix($ns, $path); } foreach ($theme->getPsr4() as $ns => $path) { ZLoader::addPrefixPsr4($ns, $path); } $class = $theme->getClass(); /** @var $bundle \Zikula\Core\AbstractTheme */ $bundle = new $class(); $class = $bundle->getVersionClass(); $version = new $class($bundle); $version['name'] = $bundle->getName(); $array = $version->toArray(); unset($array['id']); $directory = explode('/', $bundle->getRelativePath()); array_shift($directory); $array['directory'] = implode('/', $directory); // loads the gettext domain for theme ZLanguage::bindThemeDomain($bundle->getName()); $array['type'] = 3; $array['state'] = 1; $array['contact'] = 3; $array['xhtml'] = 1; $filethemes[$bundle->getName()] = $array; } $dirArray = FileUtil::getFiles('themes', false, true, null, 'd'); foreach ($dirArray as $dir) { // Work out the theme type if (file_exists("themes/{$dir}/version.php")) { $themetype = 3; // set defaults $themeversion['name'] = preg_replace('/_/', ' ', $dir); $themeversion['displayname'] = preg_replace('/_/', ' ', $dir); $themeversion['version'] = '0'; $themeversion['description'] = ''; include "themes/{$dir}/version.php"; } else { // anything else isn't a theme continue; } $filethemes[$themeversion['name']] = array('directory' => $dir, 'name' => $themeversion['name'], 'type' => 3, 'displayname' => isset($themeversion['displayname']) ? $themeversion['displayname'] : $themeversion['name'], 'version' => isset($themeversion['version']) ? $themeversion['version'] : '1.0.0', 'description' => isset($themeversion['description']) ? $themeversion['description'] : $themeversion['displayname'], 'admin' => isset($themeversion['admin']) ? (int) $themeversion['admin'] : '0', 'user' => isset($themeversion['user']) ? (int) $themeversion['user'] : '******', 'system' => isset($themeversion['system']) ? (int) $themeversion['system'] : '0', 'state' => isset($themeversion['state']) ? $themeversion['state'] : ThemeUtil::STATE_ACTIVE, 'contact' => isset($themeversion['contact']) ? $themeversion['contact'] : '', 'xhtml' => isset($themeversion['xhtml']) ? (int) $themeversion['xhtml'] : 1); unset($themeversion); unset($themetype); } $sm = ServiceUtil::getManager(); $entityManager = $sm->get('doctrine.entitymanager'); $dbthemes = array(); $themeEntities = $entityManager->getRepository('ZikulaThemeModule:ThemeEntity')->findAll(); foreach ($themeEntities as $entity) { $entity = $entity->toArray(); $dbthemes[$entity['name']] = $entity; } // See if we have lost any themes since last generation foreach ($dbthemes as $name => $themeinfo) { if (empty($filethemes[$name])) { // delete a running configuration try { ModUtil::apiFunc('ZikulaThemeModule', 'admin', 'deleterunningconfig', array('themename' => $name)); } catch (\Exception $e) { if (\System::isInstalling()) { // silent fail when installing or upgrading } else { throw $e; } } // delete item from db $item = $entityManager->getRepository('ZikulaThemeModule:ThemeEntity')->findOneBy(array('name' => $name)); $entityManager->remove($item); unset($dbthemes[$name]); } } // See if we have gained any themes since last generation, // or if any current themes have been upgraded foreach ($filethemes as $name => $themeinfo) { if (empty($dbthemes[$name])) { // new theme $themeinfo['state'] = ThemeUtil::STATE_ACTIVE; // add item to db $item = new ThemeEntity(); $item->merge($themeinfo); $entityManager->persist($item); } } // see if any themes have changed foreach ($filethemes as $name => $themeinfo) { if (isset($dbthemes[$name])) { if ($themeinfo['directory'] != $dbthemes[$name]['directory'] || $themeinfo['type'] != $dbthemes[$name]['type'] || $themeinfo['version'] != $dbthemes[$name]['version'] || $themeinfo['admin'] != $dbthemes[$name]['admin'] || $themeinfo['user'] != $dbthemes[$name]['user'] || $themeinfo['system'] != $dbthemes[$name]['system'] || $themeinfo['state'] != $dbthemes[$name]['state'] || $themeinfo['contact'] != $dbthemes[$name]['contact'] || $themeinfo['xhtml'] != $dbthemes[$name]['xhtml']) { $themeinfo['id'] = $dbthemes[$name]['id']; // update item /** @var $item ThemeEntity */ $item = $entityManager->getRepository('ZikulaThemeModule:ThemeEntity')->find($themeinfo['id']); $item->merge($themeinfo); } } } $entityManager->flush(); return true; }