Minahito
minah****@users*****
2006年 11月 2日 (木) 00:02:00 JST
Index: xoops2jp/html/modules/legacy/admin/class/ModuleInstallUtils.class.php diff -u xoops2jp/html/modules/legacy/admin/class/ModuleInstallUtils.class.php:1.1.2.1 xoops2jp/html/modules/legacy/admin/class/ModuleInstallUtils.class.php:1.1.2.2 --- xoops2jp/html/modules/legacy/admin/class/ModuleInstallUtils.class.php:1.1.2.1 Wed Nov 1 20:54:56 2006 +++ xoops2jp/html/modules/legacy/admin/class/ModuleInstallUtils.class.php Thu Nov 2 00:02:00 2006 @@ -15,6 +15,54 @@ class Legacy_ModuleInstallUtils { /** + * Executes SQL file which xoops_version of $module specifies. This + * function is usefull for installers, but it's impossible to control + * for detail. + * + * @static + * @param XoopsModule $module + * @param Legacy_ModuleUtilsSimpleLog $log + * @note FOR THE CUSTOM-INSTALLER + */ + function installSQLAutomatically(&$module, &$log) + { + $sqlfileInfo =& $module->getInfo('sqlfile'); + $dirname = $module->getVar('dirname'); + + if (!isset($sqlfileInfo[XOOPS_DB_TYPE])) { + return; + } + + require_once XOOPS_MODULE_PATH . "/legacy/admin/class/Legacy_SQLScanner.class.php"; + $scanner =& new Legacy_SQLScanner(); + $scanner->setDB_PREFIX(XOOPS_DB_PREFIX); + + $sqlfile = $sqlfileInfo[XOOPS_DB_TYPE]; + if (!$scanner->loadFile(XOOPS_MODULE_PATH . "/${dirname}/" . $sqlfile)) { + $log->addError(XCube_Utils::formatMessage(_AD_LEGACY_ERROR_SQL_FILE_NOT_FOUND, $sqlfile)); + return false; + } + + $scanner->parse(); + $sqls = $scanner->getSQL(); + + $root =& XCube_Root::getSingleton(); + $db =& $root->mController->getDB(); + + // + // TODO The following variable exists for rollback, but it is not implemented. + // + foreach ($sqls as $sql) { + if (!$db->query($sql)) { + $log->addError($db->error()); + return; + } + } + + $log->addReport(_AD_LEGACY_MESSAGE_DATABASE_SETUP_FINISHED); + } + + /** * Installs all of module templates $module specify. This function is * usefull for installer and updater. In the case of updater, you should * uninstall all of module templates before this function. @@ -37,10 +85,69 @@ $templates = $module->getInfo('templates'); if ($templates != false) { foreach ($templates as $template) { - Legacy_ModuleUtils::installModuleTemplate($module, $template, $log); + Legacy_ModuleInstallUtils::installModuleTemplate($module, $template, $log); } } } + + /** + * Inserts the specified template to DB. + * + * @section Attention + * + * This function depends the specific spec of Legacy_RenderSystem, but this + * static function is needed by the 2nd installer of Legacy System. + * + * @static + * @param XoopsModule $module + * @param string[][] $template + * @param Legacy_ModuleUtilsSimpleLog $log + * @return bool + * + * @note This is not usefull a litte for custom-installers. + * @todo We'll need the way to specify the template by identity or others. + */ + function installModuleTemplate($module, $template, &$log) + { + $tplHandler =& xoops_gethandler('tplfile'); + + $fileName = trim($template['file']); + + $tpldata = Legacy_ModuleInstallUtils::readTemplateFile($module->get('dirname'), $fileName); + if ($tpldata == false) + return false; + + // + // Create template file object, then store it. + // + $tplfile =& $tplHandler->create(); + $tplfile->setVar('tpl_refid', $module->getVar('mid')); + $tplfile->setVar('tpl_lastimpoerted', 0); + $tplfile->setVar('tpl_lastmodified', time()); + + if (preg_match("/\.css$/i", $fileName)) { + $tplfile->setVar('tpl_type', 'css'); + } + else { + $tplfile->setVar('tpl_type', 'module'); + } + + $tplfile->setVar('tpl_source', $tpldata, true); + $tplfile->setVar('tpl_module', $module->getVar('dirname')); + $tplfile->setVar('tpl_tplset', 'default'); + $tplfile->setVar('tpl_file', $fileName, true); + + $description = isset($tpl['description']) ? $tpl['description'] : ''; + $tplfile->setVar('tpl_desc', $description, true); + + if ($tplHandler->insert($tplfile)) { + $log->addReport(XCube_Utils::formatMessage(_AD_LEGACY_MESSAGE_TEMPLATE_INSTALLED, $fileName)); + } + else { + $log->addError(XCube_Utils::formatMessage(_AD_LEGACY_ERROR_COULD_NOT_INSTALL_TEMPLATE, $fileName)); + return false; + } + } /** * Uninstalls all of module templates $module specify. This function is @@ -117,8 +224,8 @@ $func_num = 0; foreach ($definedBlocks as $block) { $func_num++; - $newBlock =& Legacy_ModuleUtils::createBlockByInfo($module, $block, $func_num); - Legacy_ModuleUtils::installBlock($module, $newBlock, $block, $this->mLog); + $newBlock =& Legacy_ModuleInstallUtils::createBlockByInfo($module, $block, $func_num); + Legacy_ModuleInstallUtils::installBlock($module, $newBlock, $block, $this->mLog); } } @@ -153,6 +260,128 @@ } /** + * Create XoopsBlock object by array that is defined in xoops_version, return it. + * @param $module XoopsModule + * @param $block array + * @return XoopsBlock + */ + function &createBlockByInfo(&$module, $block, $func_num) + { + $options = isset($block['options']) ? $block['options'] : null; + $edit_func = isset($block['edit_func']) ? $block['edit_func'] : null; + $template = isset($block['template']) ? $block['template'] : null; + $visible = isset($block['visible']) ? $block['visible'] : (isset($block['visible_any']) ? $block['visible_any']: 0); + $blockHandler =& xoops_gethandler('block'); + $blockObj =& $blockHandler->create(); + + $blockObj->set('mid', $module->getVar('mid')); + $blockObj->set('options', $options); + $blockObj->set('name', $block['name']); + $blockObj->set('title', $block['name']); + $blockObj->set('block_type', 'M'); + $blockObj->set('c_type', 1); + $blockObj->set('isactive', 1); + $blockObj->set('dirname', $module->getVar('dirname')); + $blockObj->set('func_file', $block['file']); + + // + // IMPORTANT CONVENTION + // + $show_func = ""; + if (isset($block['class'])) { + $show_func = "cl::" . $block['class']; + } + else { + $show_func = $block['show_func']; + } + + $blockObj->set('show_func', $show_func); + $blockObj->set('edit_func', $edit_func); + $blockObj->set('template', $template); + $blockObj->set('last_modified', time()); + $blockObj->set('visible', $visible); + + $func_num = isset($block['func_num']) ? intval($block['func_num']) : $func_num; + $blockObj->set('func_num', $func_num); + + return $blockObj; + } + + /** + * This function can receive both new and update. + * @param $module XoopsModule + * @param $blockObj XoopsBlock + * @param $block array + * @return bool + */ + function installBlock(&$module, &$blockObj, &$block, &$log) + { + $isNew = $blockObj->isNew(); + $blockHandler =& xoops_gethandler('block'); + + if (!empty($block['show_all_module'])) { + $autolink = false; + } else { + $autolink = true; + } + if (!$blockHandler->insert($blockObj, $autolink)) { + $log->addError(XCube_Utils::formatMessage(_AD_LEGACY_ERROR_COULD_NOT_INSTALL_BLOCK, $blockObj->getVar('name'))); + + return false; + } + else { + $log->addReport(XCube_Utils::formatMessage(_AD_LEGACY_MESSAGE_BLOCK_INSTALLED, $blockObj->getVar('name'))); + + $tplHandler =& xoops_gethandler('tplfile'); + + if (!Legacy_ModuleInstallUtils::installAllOfBlockTemplates($module, $blockObj)) { + $log->addError(XCube_Utils::formatMessage(_AD_LEGACY_ERROR_BLOCK_TEMPLATE_INSTALL, $blockObj->getVar('name'))); + } + + // + // Process of a permission. + // + if ($isNew) { + if (!empty($block['show_all_module'])) { + $link_sql = "INSERT INTO " . $blockHandler->db->prefix('block_module_link') . " (block_id, module_id) VALUES (".$blockObj->getVar('bid').", 0)"; + if (!$blockHandler->db->query($link_sql)) { + $log->addWarn(XCube_Utils::formatMessage(_AD_LEGACY_ERROR_COULD_NOT_SET_LINK, $blockObj->getVar('name'))); + } + } + $gpermHandler =& xoops_gethandler('groupperm'); + $bperm =& $gpermHandler->create(); + $bperm->setVar('gperm_itemid', $blockObj->getVar('bid')); + $bperm->setVar('gperm_name', 'block_read'); + $bperm->setVar('gperm_modid', 1); + + if (!empty($block['visible_any'])) { + $memberHandler =& xoops_gethandler('member'); + $groupObjects =& $memberHandler->getGroups(); + foreach($groupObjects as $group) { + $bperm->setVar('gperm_groupid', $group->getVar('groupid')); + $bperm->setNew(); + if (!$gpermHandler->insert($bperm)) { + $log->addWarn(XCube_Utils::formatMessage(_AD_LEGACY_ERROR_COULD_NOT_SET_BLOCK_PERMISSION, $blockObj->getVar('name'))); + } + } + } else { + $root =& XCube_Root::getSingleton(); + $groups = $root->mContext->mXoopsUser->getGroups(); + foreach ($groups as $mygroup) { + $bperm->setVar('gperm_groupid', $mygroup); + $bperm->setNew(); + if (!$gpermHandler->insert($bperm)) { + $log->addWarn(XCube_Utils::formatMessage(_AD_LEGACY_ERROR_COULD_NOT_SET_BLOCK_PERMISSION, $blockObj->getVar('name'))); + } + } + } + } + + return true; + } + } + + /** * Uninstalls a block which $block specifies. In the same time, deletes * permissions for the block. * @@ -178,6 +407,252 @@ $criteria->add(new Criteria('gperm_modid', 1)); $gpermHandler->deleteAll($criteria); } + + /** + * Save the information of block's template specified and the source code of it + * to database. + * @return bool + */ + function installAllOfBlockTemplates(&$module, &$block) + { + if ($block->get('template') == null) { + return true; + } + + $tplHandler =& xoops_gethandler('tplfile'); + + $criteria =& new CriteriaCompo(); + $criteria->add(new Criteria('tpl_type', 'block')); + $criteria->add(new Criteria('tpl_tplset', 'default')); + $criteria->add(new Criteria('tpl_module', $module->getVar('dirname'))); + $criteria->add(new Criteria('tpl_file', $block->getVar('template'))); + $tplfiles =& $tplHandler->getObjects($criteria); + + if (count($tplfiles) > 0) { + $tplfile =& $tplfiles[0]; + } + else { + $tplfile =& $tplHandler->create(); + $tplfile->setVar('tpl_refid', $block->getVar('bid')); + $tplfile->setVar('tpl_tplset', 'default'); + $tplfile->setVar('tpl_file', $block->getVar('template')); + $tplfile->setVar('tpl_module', $module->getVar('dirname')); + $tplfile->setVar('tpl_type', 'block'); + // $tplfile->setVar('tpl_desc', $tpl_desc); + $tplfile->setVar('tpl_lastimported', 0); + } + + $tplSource = Legacy_ModuleInstallUtils::readTemplateFile($module->getVar('dirname'), $block->getVar('template'), true); + $tplfile->setVar('tpl_source', $tplSource); + $tplfile->setVar('tpl_lastmodified', time()); + + return $tplHandler->insert($tplfile); + } + + /** + * Read template file, return it. + * + * @note This is must, but it depends on ... + */ + function readTemplateFile($dirname, $fileName, $isblock = false) + { + // + // Load template data + // + if ($isblock) { + $filePath = XOOPS_MODULE_PATH . "/" . $dirname . "/templates/blocks/" . $fileName; + } + else { + $filePath = XOOPS_MODULE_PATH . "/" . $dirname . "/templates/" . $fileName; + } + + if (!file_exists($filePath)) { + return false; + } + + $lines = file($filePath); + if ($lines == false) { + return false; + } + + $tpldata = ""; + foreach ($lines as $line) { + // + // Unify linefeed to "\r\n" + // + $tpldata .= str_replace("\n", "\r\n", str_replace("\r\n", "\n", $line)); + } + + return $tpldata; + } + + function installAllOfConfigs(&$module, &$log) + { + $configInfos = Legacy_ModuleInstallUtils::getConfigInfosFromManifesto($module); + + $count = 0; + if (is_array($configInfos)) { + $configHandler =& xoops_gethandler('config'); + + foreach ($configInfos as $configInfo) { + $config =& $configHandler->createConfig(); + + $config->loadFromConfigInfo($module->get('mid'), $configInfo, $count++); + + if ($configHandler->insertConfig($config)) { + $log->addReport(XCube_Utils::formatMessage(_AD_LEGACY_MESSAGE_INSERT_CONFIG, $configInfo['name'])); + } + else { + $log->addError(XCube_Utils::formatMessage(_AD_LEGACY_ERROR_COULD_NOT_INSERT_CONFIG, $configInfo['name'])); + } + + unset($config); + } + } + } + + /** + * Get & build config items from Manifesto by specific module object. + */ + function &getConfigInfosFromManifesto(&$module) + { + $configInfos = $module->getInfo('config'); + + // + // Insert comment config by old style. + // + if ($module->getVar('hascomments') !=0 ) { + require_once XOOPS_ROOT_PATH . "/include/comment_constants.php"; + + $configInfos[] = array('name' => 'com_rule', + 'title' => '_CM_COMRULES', + 'description' => '', + 'formtype' => 'select', + 'valuetype' => 'int', + 'default' => 1, + 'options' => array('_CM_COMNOCOM' => XOOPS_COMMENT_APPROVENONE, '_CM_COMAPPROVEALL' => XOOPS_COMMENT_APPROVEALL, '_CM_COMAPPROVEUSER' => XOOPS_COMMENT_APPROVEUSER, '_CM_COMAPPROVEADMIN' => XOOPS_COMMENT_APPROVEADMIN) + ); + + $configInfos[] = array('name' => 'com_anonpost', + 'title' => '_CM_COMANONPOST', + 'description' => '', + 'formtype' => 'yesno', + 'valuetype' => 'int', + 'default' => 0 + ); + } + + // + // Insert comment config by old style. + // + if ($module->get('hasnotification') != 0) { + require_once XOOPS_ROOT_PATH . '/include/notification_constants.php'; + require_once XOOPS_ROOT_PATH . '/include/notification_functions.php'; + + $t_options = array(); + $t_options['_NOT_CONFIG_DISABLE'] = XOOPS_NOTIFICATION_DISABLE; + $t_options['_NOT_CONFIG_ENABLEBLOCK'] = XOOPS_NOTIFICATION_ENABLEBLOCK; + $t_options['_NOT_CONFIG_ENABLEINLINE'] = XOOPS_NOTIFICATION_ENABLEINLINE; + $t_options['_NOT_CONFIG_ENABLEBOTH'] = XOOPS_NOTIFICATION_ENABLEBOTH; + + $configInfos[] = array( + 'name' => 'notification_enabled', + 'title' => '_NOT_CONFIG_ENABLE', + 'description' => '_NOT_CONFIG_ENABLEDSC', + 'formtype' => 'select', + 'valuetype' => 'int', + 'default' => XOOPS_NOTIFICATION_ENABLEBOTH, + 'options' => $t_options + ); + + // + // FIXME: doesn't work when update module... can't read back the + // array of options properly... " changing to " + // + + unset ($t_options); + + $t_options = array(); + $t_categoryArr =& notificationCategoryInfo('', $module->get('mid')); + foreach ($t_categoryArr as $t_category) { + $t_eventArr =& notificationEvents($t_category['name'], false, $module->get('mid')); + foreach ($t_eventArr as $t_event) { + if (!empty($event['invisible'])) { + continue; + } + $t_optionName = $t_category['title'] . ' : ' . $t_event['title']; + $t_options[$t_optionName] = $t_category['name'] . '-' . $t_event['name']; + } + } + + $configInfos[] = array( + 'name' => 'notification_events', + 'title' => '_NOT_CONFIG_EVENTS', + 'description' => '_NOT_CONFIG_EVENTSDSC', + 'formtype' => 'select_multi', + 'valuetype' => 'array', + 'default' => array_values($t_options), + 'options' => $t_options + ); + } + + return $configInfos; + } + + /** + * Delete all configs of $module. + * + * @param $module XoopsModule + */ + function uninstallAllOfConfigs(&$module, &$log) + { + if ($module->get('hasconfig') == 0) { + return; + } + + $configHandler =& xoops_gethandler('config'); + $configs =& $configHandler->getConfigs(new Criteria('conf_modid', $module->get('mid'))); + + if (count($configs) == 0) { + return; + } + + foreach ($configs as $config) { + $configHandler->deleteConfig($config); + } + } + + /** + * Executes SQL query as cube style. + */ + function DBquery($query, &$module, $log) + { + require_once XOOPS_MODULE_PATH . "/legacy/admin/class/Legacy_SQLScanner.class.php"; + + $successFlag = true; + + $scanner =& new Legacy_CubeStyleSQLScanner(); + $scanner->setDB_PREFIX(XOOPS_DB_PREFIX); + $scanner->setDirname($module->get('dirname')); + $scanner->setBuffer($query); + $scanner->parse(); + $sqlArr = $scanner->getSQL(); + + $root =& XCube_Root::getSingleton(); + + foreach ($sqlArr as $sql) { + if ($root->mController->mDB->query($sql)) { + $log->addReport("Success: ${sql}"); + $successFlag &= true; + } + else { + $log->addError("Failure: ${sql}"); + $successFlag = false; + } + } + + return $successFlag; + } } ?> \ No newline at end of file