site_srl = (int)$site_module_info->site_srl; $args->title = Context::get('title'); $args->menu_srl = getNextSequence(); $args->listorder = $args->menu_srl * -1; $output = executeQuery('menu.insertMenu', $args); if(!$output->toBool()) return $output; $this->add('menu_srl', $args->menu_srl); $this->setMessage('success_registed'); $returnUrl = Context::get('success_return_url') ? Context::get('success_return_url') : getNotEncodedUrl('', 'module', 'admin', 'act', 'dispMenuAdminContent'); $this->setRedirectUrl($returnUrl); } /** * Change the menu title * @return void|object */ function procMenuAdminUpdate() { // List variables $args->title = Context::get('title'); $args->menu_srl = Context::get('menu_srl'); $output = executeQuery('menu.updateMenu', $args); if(!$output->toBool()) return $output; $this->setMessage('success_registed'); $returnUrl = Context::get('success_return_url') ? Context::get('success_return_url') : getNotEncodedUrl('', 'module', 'admin', 'act', 'dispMenuAdminManagement', 'menu_srl', $args->menu_srl); $this->setRedirectUrl($returnUrl); } /** * Delete menu process method * @return void|Object */ function procMenuAdminDelete() { $menu_srl = Context::get('menu_srl'); $oMenuAdminModel = &getAdminModel('menu'); $menu_info = $oMenuAdminModel->getMenu($menu_srl); if($menu_info->title == '__XE_ADMIN__') return new Object(-1, 'msg_adminmenu_cannot_delete'); $this->deleteMenu($menu_srl); $this->setMessage('success_deleted', 'info'); $returnUrl = Context::get('success_return_url') ? Context::get('success_return_url') : getNotEncodedUrl('', 'module', 'admin', 'act', 'dispMenuAdminSiteMap'); $this->setRedirectUrl($returnUrl); } /** * Delete menu * Delete menu_item and xml cache files * @return Object */ function deleteMenu($menu_srl) { // Delete cache files $cache_list = FileHandler::readDir("./files/cache/menu","",false,true); if(count($cache_list)) { foreach($cache_list as $cache_file) { $pos = strpos($cache_file, $menu_srl.'.'); if($pos>0)FileHandler::removeFile($cache_file); } } // Delete images of menu buttons $image_path = sprintf('./files/attach/menu_button/%s', $menu_srl); FileHandler::removeDir($image_path); $args->menu_srl = $menu_srl; // Delete menu items $output = executeQuery("menu.deleteMenuItems", $args); if(!$output->toBool()) return $output; // Delete the menu $output = executeQuery("menu.deleteMenu", $args); if(!$output->toBool()) return $output; return new Object(0,'success_deleted'); } /** * Add an item to the menu * @return void */ function procMenuAdminInsertItem() { // List variables to insert $source_args = Context::getRequestVars(); unset($source_args->module); unset($source_args->act); if($source_args->menu_open_window!="Y") $source_args->menu_open_window = "N"; if($source_args->menu_expand !="Y") $source_args->menu_expand = "N"; if($source_args->menu_grant_default == -1) $source_args->group_srls = -1; if(!is_array($source_args->group_srls)) $source_args->group_srls = str_replace('|@|',',',$source_args->group_srls); else $source_args->group_srls = implode(',', $source_args->group_srls); $source_args->parent_srl = (int)$source_args->parent_srl; if($source_args->cType == 'CREATE') $source_args->menu_url = $source_args->create_menu_url; else if($source_args->cType == 'SELECT') $source_args->menu_url = $source_args->select_menu_url; // upload button $btnOutput = $this->_uploadButton($source_args); // Re-order variables (Column's order is different between form and DB) $args->menu_srl = $source_args->menu_srl; $args->menu_item_srl = $source_args->menu_item_srl; $args->parent_srl = $source_args->parent_srl; $args->menu_srl = $source_args->menu_srl; $args->menu_id = $source_args->menu_id; if ($source_args->menu_name_key) $args->name = $source_args->menu_name_key; else $args->name = $source_args->menu_name; if(!strstr($args->name, '$user_lang->')) { $args->name = htmlspecialchars($args->name); } $args->url = trim($source_args->menu_url); $args->open_window = $source_args->menu_open_window; $args->expand = $source_args->menu_expand; if($btnOutput['normal_btn']) $args->normal_btn = $btnOutput['normal_btn']; if($btnOutput['hover_btn']) $args->hover_btn = $btnOutput['hover_btn']; if($btnOutput['active_btn']) $args->active_btn = $btnOutput['active_btn']; $args->group_srls = $source_args->group_srls; // if cType is CREATE, create module if($source_args->cType == 'CREATE' || $source_args->cType == 'SELECT') { $site_module_info = Context::get('site_module_info'); $cmArgs->site_srl = (int)$site_module_info->site_srl; $cmArgs->browser_title = $args->name; $cmArgs->menu_srl = $source_args->menu_srl; if($source_args->layout_srl) { $cmArgs->layout_srl = $source_args->layout_srl; } switch ($source_args->module_type){ case 'WIDGET' : case 'ARTICLE' : case 'OUTSIDE' : $cmArgs->module = 'page'; $cmArgs->page_type = $source_args->module_type; break; default: $cmArgs->module = $source_args->module_type; unset($cmArgs->page_type); } $oModuleController = &getController('module'); if($source_args->cType == 'CREATE') { $cmArgs->mid = $source_args->create_menu_url; $output = $oModuleController->insertModule($cmArgs); } else { $oModuleModel = &getModel('module'); $module_info = $oModuleModel->getModuleInfoByModuleSrl($source_args->module_srl); if($cmArgs->layout_srl) { $module_info->layout_srl = $cmArgs->layout_srl; } $cmArgs = $module_info; $cmArgs->mid = $source_args->select_menu_url; $cmArgs->module_srl = $source_args->module_srl; $output = $oModuleController->updateModule($cmArgs); } if(!$output->toBool()) return new Object(-1, $output->message); } // Check if already exists $oMenuModel = &getAdminModel('menu'); $item_info = $oMenuModel->getMenuItemInfo($args->menu_item_srl); // button is deleted, db delete if($source_args->isNormalDelete == 'Y') $args->normal_btn = ''; if($source_args->isHoverDelete == 'Y') $args->hover_btn = ''; if($source_args->isActiveDelete == 'Y') $args->active_btn = ''; $message = ''; // Update if exists if(!empty($args->menu_item_srl) && $item_info->menu_item_srl == $args->menu_item_srl) { $output = executeQuery('menu.updateMenuItem', $args); if(!$output->toBool()) return $output; $message = 'success_updated'; // Insert if not exist } else { if(!$args->menu_item_srl) $args->menu_item_srl = getNextSequence(); $args->listorder = -1*$args->menu_item_srl; $output = executeQuery('menu.insertMenuItem', $args); if(!$output->toBool()) return $output; $message = 'success_registed'; } // Get information of the menu $menu_info = $oMenuModel->getMenu($args->menu_srl); $menu_title = $menu_info->title; // Update the xml file and get its location $xml_file = $this->makeXmlFile($args->menu_srl); // If a new menu item that mid is URL is added, the current layout is applied if(preg_match('/^([a-zA-Z0-9\_\-]+)$/', $args->url)) { $mid = $args->url; $mid_args->menu_srl = $args->menu_srl; $mid_args->mid = $mid; // Get layout value of menu_srl $output = executeQuery('menu.getMenuLayout', $args); // Set if layout value is not specified in the module $oModuleModel = &getModel('module'); $columnList = array('layout_srl'); $module_info = $oModuleModel->getModuleInfoByMid($mid, 0, $columnList); if(!$module_info->layout_srl&&$output->data->layout_srl) $mid_args->layout_srl = $output->data->layout_srl; // Change menu value of the mid to the menu $oModuleController = &getController('module'); $oModuleController->updateModuleMenu($mid_args); } $this->add('xml_file', $xml_file); $this->add('menu_srl', $args->menu_srl); $this->add('menu_item_srl', $args->menu_item_srl); $this->add('menu_title', $menu_title); $this->add('parent_srl', $args->parent_srl); $this->setMessage($message, 'info'); $returnUrl = Context::get('success_return_url') ? Context::get('success_return_url') : getNotEncodedUrl('', 'module', 'admin', 'act', 'dispMenuAdminSiteMap', 'menu_srl', $args->menu_srl); $this->setRedirectUrl($returnUrl); } /** * Delete menu item(menu of the menu) * @return void|Object */ function procMenuAdminDeleteItem() { // List variables $args = Context::gets('menu_srl','menu_item_srl'); $oMenuAdminModel = &getAdminModel('menu'); // Get information of the menu $menu_info = $oMenuAdminModel->getMenu($args->menu_srl); $menu_title = $menu_info->title; // Get original information $item_info = $oMenuAdminModel->getMenuItemInfo($args->menu_item_srl); if($menu_title == '__XE_ADMIN__' && $item_info->parent_srl == 0)return $this->stop('msg_cannot_delete_for_admin_topmenu'); if($item_info->parent_srl) $parent_srl = $item_info->parent_srl; // Display an error that the category cannot be deleted if it has a child node $output = executeQuery('menu.getChildMenuCount', $args); if(!$output->toBool()) return $output; if($output->data->count>0) return new Object(-1, 'msg_cannot_delete_for_child'); // Remove from the DB $output = executeQuery("menu.deleteMenuItem", $args); if(!$output->toBool()) return $output; // Update the xml file and get its location $xml_file = $this->makeXmlFile($args->menu_srl); // Delete all of image buttons if($item_info->normal_btn) FileHandler::removeFile($item_info->normal_btn); if($item_info->hover_btn) FileHandler::removeFile($item_info->hover_btn); if($item_info->active_btn) FileHandler::removeFile($item_info->active_btn); $this->add('xml_file', $xml_file); $this->add('menu_title', $menu_title); $this->add('menu_item_srl', $parent_srl); $this->setMessage('success_deleted'); $returnUrl = Context::get('success_return_url') ? Context::get('success_return_url') : getNotEncodedUrl('', 'module', 'admin', 'act', 'dispMenuAdminManagement', 'menu_srl', $args->menu_srl); $this->setRedirectUrl($returnUrl); } /** * Move menu items * @return void */ function procMenuAdminMoveItem() { $menu_srl = Context::get('menu_srl'); $mode = Context::get('mode'); $parent_srl = Context::get('parent_srl'); $source_srl = Context::get('source_srl'); $target_srl = Context::get('target_srl'); if(!$menu_srl || !$mode || !$target_srl) return new Object(-1,'msg_invalid_request'); $this->moveMenuItem($menu_srl,$parent_srl,$source_srl,$target_srl,$mode); } /** * Arrange menu items * @return void|object */ function procMenuAdminArrangeItem() { $this->menuSrl = Context::get('menu_srl'); $args->title = Context::get('title'); $parentKeyList = Context::get('parent_key'); $this->itemKeyList = Context::get('item_key'); // menu name update $args->menu_srl = $this->menuSrl; $output = executeQuery('menu.updateMenu', $args); if(!$output->toBool()) return $output; $this->map = array(); if(is_array($parentKeyList)) { foreach($parentKeyList as $no=>$srl) { if ($srl === 0) continue; if (!is_array($this->map[$srl]))$this->map[$srl] = array(); $this->map[$srl][] = $no; } } $result = array(); if(is_array($this->itemKeyList)) { foreach($this->itemKeyList as $srl) { if (!$this->checked[$srl]){ unset($target); $this->checked[$srl] = 1; $target->node = $srl; $target->child= array(); while(count($this->map[$srl])){ $this->_setParent($srl, array_shift($this->map[$srl]), $target); } $result[] = $target; } } } if(is_array($result)) { $i = 0; foreach($result AS $key=>$node) { $this->moveMenuItem($this->menuSrl, 0, $i, $node->node, 'move'); //move parent node $this->_recursiveMoveMenuItem($node); //move child node $i = $node->node; } } $this->setMessage('success_updated', 'info'); $returnUrl = Context::get('success_return_url') ? Context::get('success_return_url') : getNotEncodedUrl('', 'module', 'admin', 'act', 'dispMenuAdminManagement', 'menu_srl', $args->menu_srl); $this->setRedirectUrl($returnUrl); } /** * Set parent number to child * @param int $parent_srl * @param int $child_index * @param object $target * @return void */ function _setParent($parent_srl, $child_index, &$target) { $child_srl = $this->itemKeyList[$child_index]; $this->checked[$child_srl] = 1; $child_node->node = $child_srl; $child_node->parent_node = $parent_srl; $child_node->child = array(); $target->child[] = $child_node; while(count($this->map[$child_srl])){ $this->_setParent($child_srl, array_shift($this->map[$child_srl]), $child_node); } //return $target; } /** * move item with sub directory(recursive) * @param object $result * @return void */ function _recursiveMoveMenuItem($result) { $i = 0; while(count($result->child)) { unset($node); $node = array_shift($result->child); $this->moveMenuItem($this->menuSrl, $node->parent_node, $i, $node->node, 'move'); $this->_recursiveMoveMenuItem($node); $i = $node->node; } } /** * move menu item * @param int $menu_srl * @param int $parent_srl * @param int $source_srl * @param int $target_srl * @param string $mode 'move' or 'insert' * @return void */ function moveMenuItem($menu_srl,$parent_srl,$source_srl,$target_srl,$mode){ // Get the original menus $oMenuAdminModel = &getAdminModel('menu'); $target_item = $oMenuAdminModel->getMenuItemInfo($target_srl); if($target_item->menu_item_srl != $target_srl) return new Object(-1,'msg_invalid_request'); // Move the menu location(change the order menu appears) if($mode == 'move') { $args->parent_srl = $parent_srl; $args->menu_srl = $menu_srl; if($source_srl) { $source_item = $oMenuAdminModel->getMenuItemInfo($source_srl); if($source_item->menu_item_srl != $source_srl) return new Object(-1,'msg_invalid_request'); $args->listorder = $source_item->listorder-1; } else { $output = executeQuery('menu.getMaxListorder', $args); if(!$output->toBool()) return $output; $args->listorder = (int)$output->data->listorder; if(!$args->listorder) $args->listorder= 0; } $args->parent_srl = $parent_srl; $output = executeQuery('menu.updateMenuItemListorder', $args); if(!$output->toBool()) return $output; $args->parent_srl = $parent_srl; $args->menu_item_srl = $target_srl; $output = executeQuery('menu.updateMenuItemNode', $args); if(!$output->toBool()) return $output; // Add a child } elseif($mode == 'insert') { $args->menu_item_srl = $target_srl; $args->parent_srl = $parent_srl; $args->listorder = -1*getNextSequence(); $output = executeQuery('menu.updateMenuItemNode', $args); if(!$output->toBool()) return $output; } $xml_file = $this->makeXmlFile($menu_srl); return $xml_file; } /** * Update xml file * XML file is not often generated after setting menus on the admin page\n * For this occasional cases, manually update was implemented. \n * It looks unnecessary at this moment however no need to eliminate the feature. Just leave it. * @return void */ function procMenuAdminMakeXmlFile() { // Check input value $menu_srl = Context::get('menu_srl'); // Get information of the menu $oMenuAdminModel = &getAdminModel('menu'); $menu_info = $oMenuAdminModel->getMenu($menu_srl); $menu_title = $menu_info->title; // Re-generate the xml file $xml_file = $this->makeXmlFile($menu_srl); // Set return value $this->add('menu_title',$menu_title); $this->add('xml_file',$xml_file); } /** * Register a menu image button * @return void */ function procMenuAdminUploadButton() { $menu_srl = Context::get('menu_srl'); $menu_item_srl = Context::get('menu_item_srl'); $target = Context::get('target'); $target_file = Context::get($target); // Error occurs when the target is neither a uploaded file nor a valid file if(!$menu_srl || !$menu_item_srl || !$target_file || !is_uploaded_file($target_file['tmp_name']) || !preg_match('/\.(gif|jpeg|jpg|png)/i',$target_file['name'])) { Context::set('error_messge', Context::getLang('msg_invalid_request')); // Move the file to a specific director if the uploaded file meets requirement } else { $tmp_arr = explode('.',$target_file['name']); $ext = $tmp_arr[count($tmp_arr)-1]; $path = sprintf('./files/attach/menu_button/%d/', $menu_srl); $filename = sprintf('%s%d.%s.%s', $path, $menu_item_srl, $target, $ext); if(!is_dir($path)) FileHandler::makeDir($path); move_uploaded_file($target_file['tmp_name'], $filename); Context::set('filename', $filename); } $this->setTemplatePath($this->module_path.'tpl'); $this->setTemplateFile('menu_file_uploaded'); } /** * Remove the menu image button * @return void */ function procMenuAdminDeleteButton() { $menu_srl = Context::get('menu_srl'); $menu_item_srl = Context::get('menu_item_srl'); $target = Context::get('target'); $filename = Context::get('filename'); FileHandler::removeFile($filename); $this->add('target', $target); } /** * Get all act list for admin menu * @return void */ function procMenuAdminAllActList() { $oModuleModel = &getModel('module'); $installed_module_list = $oModuleModel->getModulesXmlInfo(); if(is_array($installed_module_list)) { $currentLang = Context::getLangType(); $menuList = array(); foreach($installed_module_list AS $key=>$value) { $info = $oModuleModel->getModuleActionXml($value->module); if($info->menu) $menuList[$value->module] = $info->menu; unset($info->menu); } } $this->add('menuList', $menuList); } /** * Get all act list for admin menu * @return void|object */ function procMenuAdminInsertItemForAdminMenu() { $requestArgs = Context::getRequestVars(); $tmpMenuName = explode(':', $requestArgs->menu_name); $moduleName = $tmpMenuName[0]; $menuName = $tmpMenuName[1]; // variable setting $logged_info = Context::get('logged_info'); //$oMenuAdminModel = &getAdminModel('menu'); $oMemberModel = &getModel('member'); //$parentMenuInfo = $oMenuAdminModel->getMenuItemInfo($requestArgs->parent_srl); $groupSrlList = $oMemberModel->getMemberGroups($logged_info->member_srl); //preg_match('/\{\$lang->menu_gnb\[(.*?)\]\}/i', $parentMenuInfo->name, $m); $oModuleModel = &getModel('module'); //$info = $oModuleModel->getModuleInfoXml($moduleName); $info = $oModuleModel->getModuleActionXml($moduleName); $url = getNotEncodedFullUrl('', 'module', 'admin', 'act', $info->menu->{$menuName}->index); if(empty($url)) $url = getNotEncodedFullUrl('', 'module', 'admin', 'act', $info->admin_index_act); if(empty($url)) $url = getNotEncodedFullUrl('', 'module', 'admin'); $dbInfo = Context::getDBInfo(); $args->menu_item_srl = (!$requestArgs->menu_item_srl) ? getNextSequence() : $requestArgs->menu_item_srl; $args->parent_srl = $requestArgs->parent_srl; $args->menu_srl = $requestArgs->menu_srl; $args->name = sprintf('{$lang->menu_gnb_sub[\'%s\']}', $menuName); //if now page is https... if(strpos($url, 'https') !== false) { $args->url = str_replace('https'.substr($dbInfo->default_url, 4), '', $url); } else { $args->url = str_replace($dbInfo->default_url, '', $url); } $args->open_window = 'N'; $args->expand = 'N'; $args->normal_btn = ''; $args->hover_btn = ''; $args->active_btn = ''; $args->group_srls = implode(',', array_keys($groupSrlList)); $args->listorder = -1*$args->menu_item_srl; // Check if already exists $oMenuModel = &getAdminModel('menu'); $item_info = $oMenuModel->getMenuItemInfo($args->menu_item_srl); // Update if exists if($item_info->menu_item_srl == $args->menu_item_srl) { $output = executeQuery('menu.updateMenuItem', $args); if(!$output->toBool()) return $output; } // Insert if not exist else { $args->listorder = -1*$args->menu_item_srl; $output = executeQuery('menu.insertMenuItem', $args); if(!$output->toBool()) return $output; } // Get information of the menu $menu_info = $oMenuModel->getMenu($args->menu_srl); $menu_title = $menu_info->title; // Update the xml file and get its location $xml_file = $this->makeXmlFile($args->menu_srl); $returnUrl = Context::get('success_return_url') ? Context::get('success_return_url') : getNotEncodedUrl('', 'module', 'admin', 'act', 'dispAdminSetup'); $this->setRedirectUrl($returnUrl); } /** * Generate XML file for menu and return its location * @param int $menu_srl * @return string */ function makeXmlFile($menu_srl) { // Return if there is no information when creating the xml file if(!$menu_srl) return; // Get menu informaton $args->menu_srl = $menu_srl; $output = executeQuery('menu.getMenu', $args); if(!$output->toBool() || !$output->data) return $output; $site_srl = (int)$output->data->site_srl; if($site_srl) { $oModuleModel = &getModel('module'); $columnList = array('sites.domain'); $site_info = $oModuleModel->getSiteInfo($site_srl, $columnList); $domain = $site_info->domain; } // Get a list of menu items corresponding to menu_srl by listorder $args->menu_srl = $menu_srl; $args->sort_index = 'listorder'; $output = executeQuery('menu.getMenuItems', $args); if(!$output->toBool()) return; // Specify the name of the cache file $xml_file = sprintf("./files/cache/menu/%s.xml.php", $menu_srl); $php_file = sprintf("./files/cache/menu/%s.php", $menu_srl); // If no data found, generate an XML file without node data $list = $output->data; if(!$list) { $xml_buff = ""; FileHandler::writeFile($xml_file, $xml_buff); FileHandler::writeFile($php_file, ''); return $xml_file; } // Change to an array if only a single data is obtained if(!is_array($list)) $list = array($list); // Create a tree for loop $list_count = count($list); for($i=0;$i<$list_count;$i++) { $node = $list[$i]; $menu_item_srl = $node->menu_item_srl; $parent_srl = $node->parent_srl; $tree[$parent_srl][$menu_item_srl] = $node; } // A common header to set permissions of the cache file and groups $header_script = '$lang_type = Context::getLangType(); '. '$is_logged = Context::get(\'is_logged\'); '. '$logged_info = Context::get(\'logged_info\'); '. '$site_srl = '.$site_srl.';'. '$site_admin = false;'. 'if($site_srl) { '. '$oModuleModel = &getModel(\'module\');'. '$site_module_info = $oModuleModel->getSiteInfo($site_srl); '. 'if($site_module_info) Context::set(\'site_module_info\',$site_module_info);'. 'else $site_module_info = Context::get(\'site_module_info\');'. '$grant = $oModuleModel->getGrant($site_module_info, $logged_info); '. 'if($grant->manager ==1) $site_admin = true;'. '}'. 'if($is_logged) {'. 'if($logged_info->is_admin=="Y") $is_admin = true; '. 'else $is_admin = false; '. '$group_srls = array_keys($logged_info->group_list); '. '} else { '. '$is_admin = false; '. '$group_srls = array(); '. '}'; // Create the xml cache file (a separate session is needed for xml cache) $xml_buff = sprintf( 'init(); '. 'header("Content-Type: text/xml; charset=UTF-8"); '. 'header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); '. 'header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); '. 'header("Cache-Control: no-store, no-cache, must-revalidate"); '. 'header("Cache-Control: post-check=0, pre-check=0", false); '. 'header("Pragma: no-cache"); '. '%s '. '$oContext->close(); '. '?>'. '%s', $header_script, $this->getXmlTree($tree[0], $tree, $site_srl, $domain) ); // Create php cache file $php_output = $this->getPhpCacheCode($tree[0], $tree, $site_srl, $domain); $php_buff = sprintf( 'list = array(%s); '. 'Context::set("included_menu", $menu); '. '?>', $header_script, $php_output['name'], $php_output['buff'] ); // Save File FileHandler::writeFile($xml_file, $xml_buff); FileHandler::writeFile($php_file, $php_buff); return $xml_file; } /** * Create xml data recursively looping for array nodes by referencing to parent_srl * menu xml file uses a tag named "node" and this XML configures menus on admin page. * (Implement tree menu by reading the xml file in tree_menu.js) * @param array $source_node * @param array $tree * @param int $site_srl * @param string $domain * @return string */ function getXmlTree($source_node, $tree, $site_srl, $domain) { if(!$source_node) return; $oMenuAdminModel = &getAdminModel('menu'); foreach($source_node as $menu_item_srl => $node) { $child_buff = ""; // Get data of the child nodes if($menu_item_srl&&$tree[$menu_item_srl]) $child_buff = $this->getXmlTree($tree[$menu_item_srl], $tree, $site_srl, $domain); // List variables $names = $oMenuAdminModel->getMenuItemNames($node->name, $site_srl); foreach($names as $key => $val) { $name_arr_str .= sprintf('"%s"=>"%s",',$key, str_replace('\\','\\\\',htmlspecialchars($val))); } $name_str = sprintf('$_names = array(%s); print $_names[$lang_type];', $name_arr_str); $url = str_replace(array('&','"','<','>'),array('&','"','<','>'),$node->url); if(preg_match('/^([0-9a-zA-Z\_\-]+)$/', $node->url)) { $href = getSiteUrl($domain, '','mid',$node->url); $pos = strpos($href, $_SERVER['HTTP_HOST']); if($pos !== false) $href = substr($href, $pos+strlen($_SERVER['HTTP_HOST'])); } else $href = $url; $open_window = $node->open_window; $expand = $node->expand; $normal_btn = $node->normal_btn; if($normal_btn && preg_match('/^\.\/files\/attach\/menu_button/i',$normal_btn)) $normal_btn = str_replace(array('&','"','<','>'),array('&','"','<','>'),$normal_btn); else $normal_btn = ''; $hover_btn = $node->hover_btn; if($hover_btn && preg_match('/^\.\/files\/attach\/menu_button/i',$hover_btn)) $hover_btn = str_replace(array('&','"','<','>'),array('&','"','<','>'),$hover_btn); else $hover_btn = ''; $active_btn = $node->active_btn; if($active_btn && preg_match('/^\.\/files\/attach\/menu_button/i',$active_btn)) $active_btn = str_replace(array('&','"','<','>'),array('&','"','<','>'),$active_btn); else $active_btn = ''; $group_srls = $node->group_srls; if($normal_btn) { if(preg_match('/\.png$/',$normal_btn)) $classname = 'class="iePngFix"'; else $classname = ''; if($hover_btn) $hover_str = sprintf('onmouseover="this.src=\'%s\'"', $hover_btn); else $hover_str = ''; if($active_btn) $active_str = sprintf('onmousedown="this.src=\'%s\'"', $active_btn); else $active_str = ''; $link = sprintf('<img src="%s" onmouseout="this.src=\'%s\'" alt="" %s %s %s />', $normal_btn, $normal_btn, $hover_str, $active_str, $classname); } else { $link = ''; } // If the value of node->group_srls exists if($group_srls)$group_check_code = sprintf('($is_admin==true||(is_array($group_srls)&&count(array_intersect($group_srls, array(%s))))||($is_logged&&%s))',$group_srls,$group_srls == -1?1:0); else $group_check_code = "true"; $attribute = sprintf( 'node_srl="%s" parent_srl="%s" text="" url="" href="" open_window="%s" expand="%s" normal_btn="%s" hover_btn="%s" active_btn="%s" link="%s"', $menu_item_srl, $node->parent_srl, $group_check_code, $name_str, $group_check_code, $url, $group_check_code, $href, $open_window, $expand, $normal_btn, $hover_btn, $active_btn, $group_check_code, $link ); if($child_buff) $buff .= sprintf('%s', $attribute, $child_buff); else $buff .= sprintf('', $attribute); } return $buff; } /** * Return php code converted from nodes in an array * Although xml data can be used for tpl, menu to menu, it needs to use javascript separately * By creating cache file in php and then you can get menu information without DB * This cache includes in ModuleHandler::displayContent() and then Context::set() * @param array $source_node * @param array $tree * @param int $site_srl * @param string $domain * @return array */ function getPhpCacheCode($source_node, $tree, $site_srl, $domain) { $output = array("buff"=>"", "url_list"=>array()); if(!$source_node) return $output; $oMenuAdminModel = &getAdminModel('menu'); foreach($source_node as $menu_item_srl => $node) { // Get data from child nodes if exist. if($menu_item_srl&&$tree[$menu_item_srl]) $child_output = $this->getPhpCacheCode($tree[$menu_item_srl], $tree, $site_srl, $domain); else $child_output = array("buff"=>"", "url_list"=>array()); // List variables $names = $oMenuAdminModel->getMenuItemNames($node->name, $site_srl); unset($name_arr_str); foreach($names as $key => $val) { $name_arr_str .= sprintf('"%s"=>"%s",',$key, str_replace(array('\\','"'),array('\\\\','"'),$val)); } $name_str = sprintf('$_menu_names[%d] = array(%s); %s', $node->menu_item_srl, $name_arr_str, $child_output['name']); // If url value is not empty in the current node, put the value into an array url_list if($node->url) $child_output['url_list'][] = $node->url; $output['url_list'] = array_merge($output['url_list'], $child_output['url_list']); // If node->group_srls value exists if($node->group_srls)$group_check_code = sprintf('($is_admin==true||(is_array($group_srls)&&count(array_intersect($group_srls, array(%s))))||($is_logged && %s))',$node->group_srls,$node->group_srls == -1?1:0); else $group_check_code = "true"; // List variables $href = str_replace(array('&','"','<','>'),array('&','"','<','>'),$node->href); $url = str_replace(array('&','"','<','>'),array('&','"','<','>'),$node->url); if(preg_match('/^([0-9a-zA-Z\_\-]+)$/i', $node->url)) { $href = getSiteUrl($domain, '','mid',$node->url); $pos = strpos($href, $_SERVER['HTTP_HOST']); if($pos !== false) $href = substr($href, $pos+strlen($_SERVER['HTTP_HOST'])); } else $href = $url; $open_window = $node->open_window; $normal_btn = str_replace(array('&','"','<','>'),array('&','"','<','>'),$node->normal_btn); $hover_btn = str_replace(array('&','"','<','>'),array('&','"','<','>'),$node->hover_btn); $active_btn = str_replace(array('&','"','<','>'),array('&','"','<','>'),$node->active_btn); foreach($child_output['url_list'] as $key =>$val) { $child_output['url_list'][$key] = addslashes($val); } $selected = '"'.implode('","',$child_output['url_list']).'"'; $child_buff = $child_output['buff']; $expand = $node->expand; $normal_btn = $node->normal_btn; if($normal_btn && preg_match('/^\.\/files\/attach\/menu_button/i',$normal_btn)) $normal_btn = str_replace(array('&','"','<','>'),array('&','"','<','>'),$normal_btn); else $normal_btn = ''; $hover_btn = $node->hover_btn; if($hover_btn && preg_match('/^\.\/files\/attach\/menu_button/i',$hover_btn)) $hover_btn = str_replace(array('&','"','<','>'),array('&','"','<','>'),$hover_btn); else $hover_btn = ''; $active_btn = $node->active_btn; if($active_btn && preg_match('/^\.\/files\/attach\/menu_button/i',$active_btn)) $active_btn = str_replace(array('&','"','<','>'),array('&','"','<','>'),$active_btn); else $active_btn = ''; $group_srls = $node->group_srls; if($normal_btn) { if(preg_match('/\.png$/',$normal_btn)) $classname = 'class=\"iePngFix\"'; else $classname = ''; if($hover_btn) $hover_str = sprintf('onmouseover=\"this.src=\'%s\'\"', $hover_btn); else $hover_str = ''; if($active_btn) $active_str = sprintf('onmousedown=\"this.src=\'%s\'\"', $active_btn); else $active_str = ''; $link = sprintf('"\"".$_menu_names[%d][$lang_type]."\""', $normal_btn, $normal_btn, $node->menu_item_srl, $hover_str, $active_str, $classname); if($active_btn) $link_active = sprintf('"\"".$_menu_names[%d][$lang_type]."\""', $active_btn, $node->menu_item_srl, $classname); else $link_active = $link; } else { $link_active = $link = sprintf('$_menu_names[%d][$lang_type]', $node->menu_item_srl); } // Create properties (check if it belongs to the menu node by url_list. It looks a trick but fast and powerful) $attribute = sprintf( '"node_srl"=>"%s","parent_srl"=>"%s","text"=>(%s?$_menu_names[%d][$lang_type]:""),"href"=>(%s?"%s":""),"url"=>(%s?"%s":""),"open_window"=>"%s","normal_btn"=>"%s","hover_btn"=>"%s","active_btn"=>"%s","selected"=>(array(%s)&&in_array(Context::get("mid"),array(%s))?1:0),"expand"=>"%s", "list"=>array(%s), "link"=>(%s? ( array(%s)&&in_array(Context::get("mid"),array(%s)) ?%s:%s):""),', $node->menu_item_srl, $node->parent_srl, $group_check_code, $node->menu_item_srl, $group_check_code, $href, $group_check_code, $url, $open_window, $normal_btn, $hover_btn, $active_btn, $selected, $selected, $expand, $child_buff, $group_check_code, $selected, $selected, $link_active, $link ); // Generate buff data $output['buff'] .= sprintf('%s=>array(%s),', $node->menu_item_srl, $attribute); $output['name'] .= $name_str; } return $output; } /** * Mapping menu and layout * When setting menu on the layout, map the default layout * @param int $layout_srl * @param array $menu_srl_list */ function updateMenuLayout($layout_srl, $menu_srl_list) { if(!count($menu_srl_list)) return; // Delete the value of menu_srls $args->menu_srls = implode(',',$menu_srl_list); $output = executeQuery('menu.deleteMenuLayout', $args); if(!$output->toBool()) return $output; $args->layout_srl = $layout_srl; // Mapping menu_srls, layout_srl for($i=0;$imenu_srl = $menu_srl_list[$i]; $output = executeQuery('menu.insertMenuLayout', $args); if(!$output->toBool()) return $output; } } /** * Register a menu image button * @param object $args * @return array */ function _uploadButton($args) { // path setting $path = sprintf('./files/attach/menu_button/%d/', $args->menu_srl); if($args->menu_normal_btn || $args->menu_hover_btn || $args->menu_active_btn) if(!is_dir($path)) FileHandler::makeDir($path); if($args->isNormalDelete == 'Y' || $args->isHoverDelete == 'Y' || $args->isActiveDelete == 'Y') { $oMenuModel = &getAdminModel('menu'); $itemInfo = $oMenuModel->getMenuItemInfo($args->menu_item_srl); if($args->isNormalDelete == 'Y' && $itemInfo->normal_btn) FileHandler::removeFile($itemInfo->normal_btn); if($args->isHoverDelete == 'Y' && $itemInfo->hover_btn) FileHandler::removeFile($itemInfo->hover_btn); if($args->isActiveDelete == 'Y' && $itemInfo->active_btn) FileHandler::removeFile($itemInfo->active_btn); } $returnArray = array(); // normal button if($args->menu_normal_btn) { $tmp_arr = explode('.',$args->menu_normal_btn['name']); $ext = $tmp_arr[count($tmp_arr)-1]; $filename = sprintf('%s%d.%s.%s', $path, $args->menu_item_srl, 'menu_normal_btn', $ext); move_uploaded_file($args->menu_normal_btn['tmp_name'], $filename); $returnArray['normal_btn'] = $filename; } // hover button if($args->menu_hover_btn) { $tmp_arr = explode('.',$args->menu_hover_btn['name']); $ext = $tmp_arr[count($tmp_arr)-1]; $filename = sprintf('%s%d.%s.%s', $path, $args->menu_item_srl, 'menu_hover_btn', $ext); move_uploaded_file($args->menu_hover_btn['tmp_name'], $filename); $returnArray['hover_btn'] = $filename; } // active button if($args->menu_active_btn) { $tmp_arr = explode('.',$args->menu_active_btn['name']); $ext = $tmp_arr[count($tmp_arr)-1]; $filename = sprintf('%s%d.%s.%s', $path, $args->menu_item_srl, 'menu_active_btn', $ext); move_uploaded_file($args->menu_active_btn['tmp_name'], $filename); $returnArray['active_btn'] = $filename; } return $returnArray; } } ?>