rhymix/modules/module/module.class.php
khongchi 82974b0438 #225 사이트맵에 temporary menu가 중복생성되는 오류 해결,
메뉴명을 'temporary menu'에서  'unlinked'로 변경하였으며 'unlinked' 메뉴는 무조건 하나 존재하게 됨.
기존의 temporary menu는 삭제하도록 했고, temporary menu에 있던 하위메뉴들은 'unlinked' 메뉴 하위로 이동됨
2014-01-22 21:24:06 +09:00

616 lines
20 KiB
PHP

<?php
/* Copyright (C) NAVER <http://www.navercorp.com> */
/**
* @class module
* @author NAVER (developers@xpressengine.com)
* @brief high class of the module module
*/
class module extends ModuleObject
{
/**
* @brief Implement if additional tasks are necessary when installing
*/
function moduleInstall()
{
// Register action forward (to use in administrator mode)
$oModuleController = getController('module');
$oDB = &DB::getInstance();
$oDB->addIndex("modules","idx_site_mid", array("site_srl","mid"), true);
$oDB->addIndex('sites','unique_domain',array('domain'),true);
// Create a directory to use in the module module
FileHandler::makeDir('./files/cache/module_info');
FileHandler::makeDir('./files/cache/triggers');
FileHandler::makeDir('./files/ruleset');
// Insert site information into the sites table
$args = new stdClass;
$args->site_srl = 0;
$output = $oDB->executeQuery('module.getSite', $args);
if(!$output->data || !$output->data->index_module_srl)
{
$db_info = Context::getDBInfo();
$domain = Context::getDefaultUrl();
$url_info = parse_url($domain);
$domain = $url_info['host'].( (!empty($url_info['port'])&&$url_info['port']!=80)?':'.$url_info['port']:'').$url_info['path'];
$site_args = new stdClass;
$site_args->site_srl = 0;
$site_args->index_module_srl = 0;
$site_args->domain = $domain;
$site_args->default_language = $db_info->lang_type;
$output = executeQuery('module.insertSite', $site_args);
if(!$output->toBool()) return $output;
}
return new Object();
}
/**
* @brief a method to check if successfully installed
*/
function checkUpdate()
{
$oDB = &DB::getInstance();
// 2008. 10. 27 Add multi-index in the table, the module_part_config
if(!$oDB->isIndexExists("module_part_config","idx_module_part_config")) return true;
// 2008. 11. 13 Delete unique constraint on mid in modules. Add site_srl and then create unique index on site_srl and mid
if(!$oDB->isIndexExists('modules',"idx_site_mid")) return true;
// Move permissions/skin information of all modules to the table, grants.
if($oDB->isColumnExists('modules', 'grants')) return true;
// Move permissions/skin information of all modules to the table, grants.
if(!$oDB->isColumnExists('sites', 'default_language')) return true;
// Delete extra_vars* column
for($i=1;$i<=20;$i++)
{
if($oDB->isColumnExists("documents","extra_vars".$i)) return true;
}
// Insert site information to the table, sites
$args = new stdClass();
$args->site_srl = 0;
$output = $oDB->executeQuery('module.getSite', $args);
if(!$output->data) return true;
// If domain index is defined on the table, sites
if($oDB->isIndexExists('sites', 'idx_domain')) return true;
if(!$oDB->isIndexExists('sites','unique_domain')) return true;
if(!$oDB->isColumnExists("modules", "use_mobile")) return true;
if(!$oDB->isColumnExists("modules", "mlayout_srl")) return true;
if(!$oDB->isColumnExists("modules", "mcontent")) return true;
if(!$oDB->isColumnExists("modules", "mskin")) return true;
// check fix skin
if(!$oDB->isColumnExists("modules", "is_skin_fix")) return true;
if(!$oDB->isColumnExists("module_config", "site_srl")) return true;
if(!is_dir('./files/ruleset')) return true;
$args->skin = '.';
$output = executeQueryArray('module.getModuleSkinDotList', $args);
if($output->data && count($output->data) > 0)
{
foreach($output->data as $item)
{
$skin_path = explode('.', $item->skin);
if(count($skin_path) != 2) continue;
if(is_dir(sprintf(_XE_PATH_ . 'themes/%s/modules/%s', $skin_path[0], $skin_path[1]))) return true;
}
}
// XE 1.7
// check fix mskin
if(!$oDB->isColumnExists("modules", "is_mskin_fix")) return true;
$oModuleModel = getModel('module');
$moduleConfig = $oModuleModel->getModuleConfig('module');
if(!$moduleConfig->isUpdateFixedValue) return true;
// 'unlinked' menu 존재여부 확인
if(!$moduleConfig->unlinked_menu_srl) return true;
else
{
$menuArgs = new stdClass;
$menuArgs->menu_srl = $moduleConfig->unlinked_menu_srl;
$menuOutput = executeQuery('menu.getMenu', $menuArgs);
if(!$menuOutput->data) return true;
}
// menu_srl이 등록되지 않은 mid가 있는지 검사(지정된 menu_srl이 있을 경우, 지정된 menu_item도 있다고 가정)
$args = new stdClass;
$args->site_srl = 0;
$output = executeQueryArray('module.getNotLinkedModuleBySiteSrl',$args);
if($output->toBool() && $output->data && count($output->data) > 0)
{
return true;
}
}
/**
* @brief Execute update
*/
function moduleUpdate()
{
$oDB = &DB::getInstance();
// 2008. 10. 27 module_part_config Add a multi-index to the table and check all information of module_configg
if(!$oDB->isIndexExists("module_part_config","idx_module_part_config"))
{
$oModuleModel = getModel('module');
$oModuleController = getController('module');
$modules = $oModuleModel->getModuleList();
foreach($modules as $key => $module_info)
{
$module = $module_info->module;
if(!in_array($module, array('point','trackback','layout','rss','file','comment','editor'))) continue;
$config = $oModuleModel->getModuleConfig($module);
$module_config = null;
switch($module)
{
case 'point' :
$module_config = $config->module_point;
unset($config->module_point);
break;
case 'trackback' :
case 'rss' :
case 'file' :
case 'comment' :
case 'editor' :
$module_config = $config->module_config;
unset($config->module_config);
if(is_array($module_config) && count($module_config))
{
foreach($module_config as $key => $val)
{
if(isset($module_config[$key]->module_srl)) unset($module_config[$key]->module_srl);
}
}
break;
case 'layout' :
$tmp = $config->header_script;
if(is_array($tmp) && count($tmp))
{
foreach($tmp as $k => $v)
{
if(!$v && !trim($v)) continue;
$module_config[$k]->header_script = $v;
}
}
$config = null;
break;
}
$oModuleController->insertModuleConfig($module, $config);
if(is_array($module_config) && count($module_config))
{
foreach($module_config as $module_srl => $module_part_config)
{
$oModuleController->insertModulePartConfig($module,$module_srl,$module_part_config);
}
}
}
$oDB->addIndex("module_part_config","idx_module_part_config", array("module","module_srl"));
}
// 2008. 11. 13 drop index(unique_mid). Add a column and index on site_srl and mid columns
if(!$oDB->isIndexExists('modules',"idx_site_mid"))
{
$oDB->dropIndex("modules","unique_mid",true);
$oDB->addColumn('modules','site_srl','number',11,0,true);
$oDB->addIndex("modules","idx_site_mid", array("site_srl","mid"),true);
}
// document extra vars
if(!$oDB->isTableExists('document_extra_vars')) $oDB->createTableByXmlFile('./modules/document/schemas/document_extra_vars.xml');
if(!$oDB->isTableExists('document_extra_keys')) $oDB->createTableByXmlFile('./modules/document/schemas/document_extra_keys.xml');
// Move permission, skin info, extection info, admin ID of all modules to the table, grants
if($oDB->isColumnExists('modules', 'grants'))
{
$oModuleController = getController('module');
$oDocumentController = getController('document');
// Get a value of the current system language code
$lang_code = Context::getLangType();
// Get module_info of all modules
$output = executeQueryArray('module.getModuleInfos');
if(count($output->data))
{
foreach($output->data as $module_info)
{
// Separate information about permission granted to the module, extra vars, skin vars, super-admin's authority
$module_srl = trim($module_info->module_srl);
// grant an authority
$grants = unserialize($module_info->grants);
if($grants) $oModuleController->insertModuleGrants($module_srl, $grants);
// Insert skin vars
$skin_vars = unserialize($module_info->skin_vars);
if($skin_vars) $oModuleController->insertModuleSkinVars($module_srl, $skin_vars);
// Insert super admin's ID
$admin_id = trim($module_info->admin_id);
if($admin_id && $admin_id != 'Array')
{
$admin_ids = explode(',',$admin_id);
if(count($admin_id))
{
foreach($admin_ids as $admin_id)
{
$oModuleController->insertAdminId($module_srl, $admin_id);
}
}
}
// Save extra configurations for each module(column data which doesn't exist in the defaut modules)
$extra_vars = unserialize($module_info->extra_vars);
$document_extra_keys = null;
if($extra_vars->extra_vars && count($extra_vars->extra_vars))
{
$document_extra_keys = $extra_vars->extra_vars;
unset($extra_vars->extra_vars);
}
if($extra_vars) $oModuleController->insertModuleExtraVars($module_srl, $extra_vars);
/**
* Move document extra vars(it should have conducted in the documents module however extra vars in modules table should be listed up in this module)
*/
// Insert extra vars if planet module is
if($module_info->module == 'planet')
{
if(!$document_extra_keys || !is_array($document_extra_keys)) $document_extra_keys = array();
$planet_extra_keys->name = 'postscript';
$planet_extra_keys->type = 'text';
$planet_extra_keys->is_required = 'N';
$planet_extra_keys->search = 'N';
$planet_extra_keys->default = '';
$planet_extra_keys->desc = '';
$document_extra_keys[20] = $planet_extra_keys;
}
// Register keys for document extra vars
if(count($document_extra_keys))
{
foreach($document_extra_keys as $var_idx => $val)
{
$oDocumentController->insertDocumentExtraKey($module_srl, $var_idx, $val->name, $val->type, $val->is_required, $val->search, $val->default, $val->desc, 'extra_vars'.$var_idx);
}
// 2009-04-14 Fixed a bug that only 100 extra vars are moved
$oDocumentModel = getModel('document');
$total_count = $oDocumentModel->getDocumentCount($module_srl);
if($total_count > 0)
{
$per_page = 100;
$total_pages = (int) (($total_count - 1) / $per_page) + 1;
// Get extra vars if exist
$doc_args = null;
$doc_args->module_srl = $module_srl;
$doc_args->list_count = $per_page;
$doc_args->sort_index = 'list_order';
$doc_args->order_type = 'asc';
for($doc_args->page = 1; $doc_args->page <= $total_pages; $doc_args->page++)
{
$output = executeQueryArray('document.getDocumentList', $doc_args);
if($output->toBool() && $output->data && count($output->data))
{
foreach ($output->data as $document)
{
if(!$document) continue;
foreach ($document as $key => $var)
{
if (strpos($key, 'extra_vars') !== 0 || !trim($var) || $var == 'N;') continue;
$var_idx = str_replace('extra_vars','',$key);
$oDocumentController->insertDocumentExtraVar($module_srl, $document->document_srl, $var_idx, $var, 'extra_vars'.$var_idx, $lang_code);
}
}
}
} // for total_pages
} // if count
}
// Additional variables of the module, remove
$module_info->grant = null;
$module_info->extra_vars = null;
$module_info->skin_vars = null;
$module_info->admin_id = null;
executeQuery('module.updateModule', $module_info);
$oCacheHandler = CacheHandler::getInstance('object', null, true);
if($oCacheHandler->isSupport())
{
$oCacheHandler->invalidateGroupKey('site_and_module');
}
}
}
// Various column drop
$oDB->dropColumn('modules','grants');
$oDB->dropColumn('modules','admin_id');
$oDB->dropColumn('modules','skin_vars');
$oDB->dropColumn('modules','extra_vars');
}
// Rights of all modules/skins transferring the information into a table Update grants
if(!$oDB->isColumnExists('sites', 'default_language'))
{
$oDB->addColumn('sites','default_language','varchar',255,0,false);
}
// extra_vars * Remove Column
for($i=1;$i<=20;$i++)
{
if(!$oDB->isColumnExists("documents","extra_vars".$i)) continue;
$oDB->dropColumn('documents','extra_vars'.$i);
}
// Enter the main site information sites on the table
$args = new stdClass;
$args->site_srl = 0;
$output = $oDB->executeQuery('module.getSite', $args);
if(!$output->data)
{
// Basic mid, language Wanted
$mid_output = $oDB->executeQuery('module.getDefaultMidInfo', $args);
$db_info = Context::getDBInfo();
$domain = Context::getDefaultUrl();
$url_info = parse_url($domain);
$domain = $url_info['host'].( (!empty($url_info['port'])&&$url_info['port']!=80)?':'.$url_info['port']:'').$url_info['path'];
$site_args->site_srl = 0;
$site_args->index_module_srl = $mid_output->data->module_srl;
$site_args->domain = $domain;
$site_args->default_language = $db_info->lang_type;
$output = executeQuery('module.insertSite', $site_args);
if(!$output->toBool()) return $output;
}
if($oDB->isIndexExists('sites','idx_domain'))
{
$oDB->dropIndex('sites','idx_domain');
}
if(!$oDB->isIndexExists('sites','unique_domain'))
{
$this->updateForUniqueSiteDomain();
$oDB->addIndex('sites','unique_domain',array('domain'),true);
}
if(!$oDB->isColumnExists("modules", "use_mobile"))
{
$oDB->addColumn('modules','use_mobile','char',1,'N');
}
if(!$oDB->isColumnExists("modules", "mlayout_srl"))
{
$oDB->addColumn('modules','mlayout_srl','number',11, 0);
}
if(!$oDB->isColumnExists("modules", "mcontent"))
{
$oDB->addColumn('modules','mcontent','bigtext');
}
if(!$oDB->isColumnExists("modules", "mskin"))
{
$oDB->addColumn('modules','mskin','varchar',250);
}
if(!$oDB->isColumnExists("modules", "is_skin_fix"))
{
$oDB->addColumn('modules', 'is_skin_fix', 'char', 1, 'N');
$output = executeQuery('module.updateSkinFixModules');
}
if(!$oDB->isColumnExists("module_config", "site_srl"))
{
$oDB->addColumn('module_config', 'site_srl', 'number', 11, 0, true);
}
FileHandler::makeDir('./files/ruleset');
$args->skin = '.';
$output = executeQueryArray('module.getModuleSkinDotList', $args);
if($output->data && count($output->data) > 0)
{
foreach($output->data as $item)
{
$skin_path = explode('.', $item->skin);
if(count($skin_path) != 2) continue;
if(is_dir(sprintf(_XE_PATH_ . 'themes/%s/modules/%s', $skin_path[0], $skin_path[1])))
{
unset($args);
$args->skin = $item->skin;
$args->new_skin = implode('|@|', $skin_path);
$output = executeQuery('module.updateSkinAll', $args);
}
}
}
// XE 1.7
if(!$oDB->isColumnExists("modules", "is_mskin_fix"))
{
$oDB->addColumn('modules', 'is_mskin_fix', 'char', 1, 'N');
$output = executeQuery('module.updateMobileSkinFixModules');
}
$oModuleModel = getModel('module');
$moduleConfig = $oModuleModel->getModuleConfig('module');
if(!$moduleConfig->isUpdateFixedValue)
{
$output = executeQuery('module.updateSkinFixModules');
$output = executeQuery('module.updateMobileSkinFixModules');
$oModuleController = getController('module');
if(!$moduleConfig) $moduleConfig = new stdClass;
$moduleConfig->isUpdateFixedValue = TRUE;
$output = $oModuleController->updateModuleConfig('module', $moduleConfig);
}
// menu(sitemap)에 링크되지 않은 모듈인스턴스 링크
$output1 = $this->linkAllModuleInstancesToSitemap();
if(!$output1->toBool()) return $output1;
return new Object(0, 'success_updated');
}
private function linkAllModuleInstancesToSitemap()
{
// 'unlinked' menu가 있는지 검사
$oModuleController = getController('module');
$oModuleModel = getModel('module');
$moduleConfig = $oModuleModel->getModuleConfig('module');
// 'unlinked menu 생성
$menuSrl = 0;
if(!$moduleConfig->unlinked_menu_srl)
{
$menuSrl = $oModuleController->makeUnlinkedMenu();
}
else
{
$menuArgs = new stdClass;
$menuArgs->menu_srl = $moduleConfig->unlinked_menu_srl;
$menuOutput = executeQuery('menu.getMenu', $menuArgs);
if(!$menuOutput->data)
{
$menuSrl = $oModuleController->makeUnlinkedMenu();
}
}
// 'unlinked' menu를 module config에 저장
if($menuSrl)
{
$moduleConfig->unlinked_menu_srl = $menuSrl;
$oModuleController->updateModuleConfig('module', $moduleConfig);
}
// for 1.7.4 update, 기존에 생성된 Temporary menu 항목 정리
$oMenuAdminModel = getAdminModel('menu'); // @var $oMenuAdminModel menuAdminModel
$args = new stdClass();
$args->title = array("Temporary menu");
$temp_menus = executeQueryArray('menu.getMenuByTitle', $args);
$args = new stdClass();
foreach($temp_menus->data as $menu)
{
$args->current_menu_srl = $menu->menu_srl;
$args->menu_srl = $moduleConfig->unlinked_menu_srl;
$output3 = executeQuery('menu.updateMenuItems', $args);
if($output3->toBool())
{
// delete
$oMenuAdminController = getAdminController('menu');
$oMenuAdminController->deleteMenu($menu->menu_srl);
}
}
// menu_srl이 지정되지 않은 mid가 있는지 검사
$args = new stdClass;
$args->site_srl = 0;
$output1 = executeQueryArray('module.getNotLinkedModuleBySiteSrl',$args);
if($output1->toBool() && $output1->data && count($output1->data) > 0)
{
$output2 = $this->updateLinkModule($output1->data, $menuSrl);
if(!$output2->toBool())
{
return $output2;
}
}
return new Object(0,'success');
}
/**
* insert menu when not linked module.
*
* @param array $moduleInfos
* @param int $menuSrl
*
* @return Object
*/
private function updateLinkModule($moduleInfos, $menuSrl)
{
if(!$moduleInfos || !is_array($moduleInfos) || count($moduleInfos) == 0 || $menuSrl == 0)
{
return new Object(-1, 'msg_invalid_request');
}
foreach($moduleInfos as $moduleInfo)
{
// search menu.
$args = new stdClass;
$args->url = $moduleInfo->mid;
$args->site_srl = $moduleInfo->site_srl;
$args->is_shortcut = 'N';
$output = executeQuery('menu.getMenuItemByUrl', $args);
if($output->toBool() && $output->data)
{
$moduleInfo->menu_srl = $output->data->menu_srl;
}
else
{
// create menu item.
$item_args->menu_srl = $menuSrl;
$item_args->url = $moduleInfo->mid;
$item_args->name = $moduleInfo->mid;
$item_args->menu_item_srl = getNextSequence();
$item_args->listorder = -1*$item_args->menu_item_srl;
$output = executeQuery('menu.insertMenuItem', $item_args);
if(!$output->toBool())
{
return $output;
}
$moduleInfo->menu_srl = $menuSrl;
}
$output = executeQuery('module.updateModule', $moduleInfo);
if(!$output->toBool())
{
$oCacheHandler = CacheHandler::getInstance('object', null, true);
if($oCacheHandler->isSupport())
{
$oCacheHandler->invalidateGroupKey('site_and_module');
}
return $output;
}
}
$oMenuAdminController = getAdminController('menu');
$oMenuAdminController->makeXmlFile($menuSrl);
return new Object();
}
function updateForUniqueSiteDomain()
{
$output = executeQueryArray("module.getNonuniqueDomains");
if(!$output->data) return;
foreach($output->data as $data)
{
if($data->count == 1) continue;
$domain = $data->domain;
$args = new stdClass;
$args->domain = $domain;
$output2 = executeQueryArray("module.getSiteByDomain", $args);
$bFirst = true;
foreach($output2->data as $site)
{
if($bFirst)
{
$bFirst = false;
continue;
}
$domain .= "_";
$args = new stdClass;
$args->domain = $domain;
$args->site_srl = $site->site_srl;
$output3 = executeQuery("module.updateSite", $args);
}
}
}
/**
* @brief Re-generate the cache file
*/
function recompileCache()
{
$oModuleModel = getModel('module');
$oModuleModel->getModuleList();
}
}
/* End of file module.class.php */
/* Location: ./modules/module/module.class.php */