debug = FALSE; $this->dragDrop = $dragdrop; if($this->dragDrop) { $this->debug = TRUE; } if ($NEWSHEADER) { $HEADER .= $NEWSHEADER; } if(isset($_POST['custom_select'])) { $this->curLayout = $_POST['custom_select']; } elseif(isset($_GET['lay'])) { $this->curLayout = $_GET['lay']; } else { $this->curLayout = vartrue($_GET['configure'], $pref['sitetheme_deflayout']); } $this->curLayout = $tp->filter($this->curLayout); $this->dbLayout = ($this->curLayout != $pref['sitetheme_deflayout']) ? $this->curLayout : ""; //menu_layout is left blank when it's default. if(isset($_POST['menu_id']) || vartrue($_GET['id'])) { $this->menuId = (isset($_POST['menu_id'])) ? intval($_POST['menu_id']) : intval($_GET['id']); } if (/*$menu_act == "sv" || */isset($_POST['class_submit'])) { $this->menuSaveVisibility(); } elseif(isset($_POST['parms_submit'])) { $this->menuSaveParameters(); } if (vartrue($_GET['mode']) == "deac") { $this->menuDeactivate(); } if ($_GET['mode'] == "conf") { $this->menuGoConfig(); } $this->menuGrabLayout(); $menu_array = $this->parseheader($HEADER.$FOOTER, 'check'); if($menu_array) { sort($menu_array, SORT_NUMERIC); $menu_check = 'set'; foreach ($menu_array as $menu_value) { if ($menu_value != $menu_check) { $this->menu_areas[] = $menu_value; } $menu_check = $menu_value; } } $this->menuModify(); if(!empty($_POST['menuActivate'])) { $menuActivate = $tp->filter($_POST['menuActivate']); $this->menuActivateLoc = key($menuActivate); $this->menuActivateIds = $tp->filter($_POST['menuselect']); $this->menuActivate(); } $this->loadMenuData(); if(vartrue($_POST['menuSetCustomPages'])) { $custompages = $tp->filter($_POST['custompages']); $this->menuSetCustomPages($custompages); } if(isset($_POST['menuUsePreset']) && $_POST['curLayout']) { $this->menuSetPreset(); } $this->menuSetConfigList(); // Update Active MenuConfig List. } /** * Load the Menu Table data for the current layout. */ private function loadMenuData() { $menu_qry = 'SELECT * FROM #menus WHERE menu_location > 0 AND menu_layout = "'.$this->dbLayout.'" ORDER BY menu_location,menu_order'; $sql = e107::getDb(); $eMenuArea = array(); if($rows = $sql->retrieve($menu_qry, true)) { $lastLoc = -1; $c = 0; foreach($rows as $row) { $loc = intval($row['menu_location']); if($lastLoc != $loc) { $c = 1; } if($c !== intval($row['menu_order'])) // fix the order if it is off.. { if($sql->update('menus', "menu_order= ".$c." WHERE menu_id = ".$row['menu_id']." LIMIT 1")) { $row['menu_order'] = $c; } } $eMenuArea[$loc][] = $row; $lastLoc = $loc; $c++; } } $this->menuData = $eMenuArea; } // ------------------------------------------------------------------------- /** * @param $url * @return string */ function menuRenderIframe($url='') { $ns = e107::getRender(); $sql = e107::getDb(); if(!$url) { $url = e_SELF."?configure=".$this->curLayout; } // $cnt = $sql->select("menus", "*", "menu_location > 0 AND menu_layout = '$curLayout' ORDER BY menu_name "); // calculate height to remove vertical scroll-bar. // $text = ""; $text = ""; return $text; } /** * @return array|string */ function menuRenderMessage() { // return $this->menuMessage; // $text .= "ID = ".$this->menuId; return e107::getMessage()->render('menuUi'); } /** * @param $message * @param $type * @param $session * @return void */ function menuAddMessage($message, $type = E_MESSAGE_INFO, $session = false) { e107::getMessage()->add(array($message, 'menuUi'), $type, $session); } // ------------------------------------------------------------------------- /** * @return void */ function menuGrabLayout() { global $HEADER,$FOOTER,$CUSTOMHEADER,$CUSTOMFOOTER,$LAYOUT; // new v2.3 if($tmp = e_theme::loadLayout($this->curLayout)) { $LAYOUT = $tmp; } if(isset($LAYOUT) && is_array($LAYOUT)) // $LAYOUT is a combined $HEADER,$FOOTER. { $HEADER = array(); $FOOTER = array(); foreach($LAYOUT as $key=>$template) { $tmp = explode("{---}",$template); $hd = varset($tmp[0]); $ft = varset($tmp[1]); $HEADER[$key] = isset($LAYOUT['_header_']) ? $LAYOUT['_header_'] . $hd : $hd; $FOOTER[$key] = isset($LAYOUT['_footer_']) ? $ft . $LAYOUT['_footer_'] : $ft ; } unset($hd,$ft); } if(($this->curLayout == 'legacyCustom' || $this->curLayout=='legacyDefault') && (isset($CUSTOMHEADER) || isset($CUSTOMFOOTER)) ) // 0.6 themes. { if($this->curLayout == 'legacyCustom') { $HEADER = ($CUSTOMHEADER) ? $CUSTOMHEADER : $HEADER; $FOOTER = ($CUSTOMFOOTER) ? $CUSTOMFOOTER : $FOOTER; } } elseif($this->curLayout && $this->curLayout !== "legacyCustom" && (isset($CUSTOMHEADER[$this->curLayout]) || (is_array($CUSTOMFOOTER) && isset($CUSTOMFOOTER[$this->curLayout])))) // 0.7 themes { // echo " MODE 0.7 ".$this->curLayout; $HEADER = isset($CUSTOMHEADER[$this->curLayout]) ? $CUSTOMHEADER[$this->curLayout] : $HEADER; $FOOTER = is_array($CUSTOMFOOTER) && isset($CUSTOMFOOTER[$this->curLayout]) ? $CUSTOMFOOTER[$this->curLayout] : $FOOTER; } elseif($this->curLayout && is_array($HEADER) && isset($HEADER[$this->curLayout]) && isset($FOOTER[$this->curLayout])) // 0.8 themes - we use only $HEADER and $FOOTER arrays. { // echo " MODE 0.8 ".$this->curLayout; $HEADER = $HEADER[$this->curLayout]; $FOOTER = $FOOTER[$this->curLayout]; } elseif($this->curLayout && ($this->curLayout !== 'legacyDefault') && (deftrue('e_MENUMANAGER_ACTIVE'))) { if(!empty($HEADER) && is_string($HEADER) && 'legacyDefault') { $msg = '$HEADER is a string. It should be an array with a key: '.$this->curLayout.''; // NO LAN } if(is_array($HEADER) && !isset($HEADER[$this->curLayout])) { $msg = '$HEADER is missing a key for this layout. ('.$this->curLayout.')'; } if(!empty($msg)) { echo '
THEME ISSUE: '.$msg.'
'; } } // Almost the same code as found in templates/header_default.php --------- } /** * @return void */ function menuGoConfig() { if(!$_GET['path'] || ($_GET['mode'] != "conf")) { return; } $file = urldecode($_GET['path']).".php"; $file = e107::getParser()->filter($file); $newurl = e_PLUGIN_ABS.$file."?id=".intval($_GET['id']).'&iframe=1'; /* return ""; */ header("Location: ".$newurl); exit; } // ----------------------------------------------------------------------------- /** * @return void */ function menuModify() { $sql = e107::getDb(); $tp = e107::getParser(); $menu_act = ""; if(isset($_POST['menuAct'])) { foreach($_POST['menuAct'] as $k => $v) { if(trim($v)) { $value = $tp->filter($_POST['menuAct'][$k]); $this->menuId = intval($k); list($menu_act, $location, $position, $this->menuNewLoc) = explode(".", $value); } } } if ($menu_act == "move") { $this->menuMove(); } if (isset($location) && isset($position) && $menu_act == "bot") { $menu_count = $sql->count("menus", "(*)", " WHERE menu_location='{$location}' AND menu_layout = '".$this->dbLayout."' "); $sql->update("menus", "menu_order=".($menu_count+1)." WHERE menu_order='{$position}' AND menu_location='{$location}' AND menu_layout = '$this->dbLayout' "); $sql->update("menus", "menu_order=menu_order-1 WHERE menu_location='{$location}' AND menu_order > {$position} AND menu_layout = '".$this->dbLayout."' "); e107::getLog()->add('MENU_06',$location.'[!br!]'.$position.'[!br!]'.$this->menuId,E_LOG_INFORMATIVE,''); } if (isset($location) && isset($position) && $menu_act == "top") { $sql->update("menus", "menu_order=menu_order+1 WHERE menu_location='{$location}' AND menu_order < {$position} AND menu_layout = '".$this->dbLayout."' ",$this->debug); $sql->update("menus", "menu_order=1 WHERE menu_id='{$this->menuId}' "); e107::getLog()->add('MENU_05',$location.'[!br!]'.$position.'[!br!]'.$this->menuId,E_LOG_INFORMATIVE,''); } if (isset($location) && isset($position) && $menu_act == "dec") { $sql->update("menus", "menu_order=menu_order-1 WHERE menu_order='".($position+1)."' AND menu_location='{$location}' AND menu_layout = '".$this->dbLayout."' ",$this->debug); $sql->update("menus", "menu_order=menu_order+1 WHERE menu_id='{$this->menuId}' AND menu_location='{$location}' AND menu_layout = '".$this->dbLayout."' "); e107::getLog()->add('MENU_08',$location.'[!br!]'.$position.'[!br!]'.$this->menuId,E_LOG_INFORMATIVE,''); } if (isset($location) && isset($position) && $menu_act == "inc") { $sql->update("menus", "menu_order=menu_order+1 WHERE menu_order='".($position-1)."' AND menu_location='{$location}' AND menu_layout = '".$this->dbLayout."' ",$this->debug); $sql->update("menus", "menu_order=menu_order-1 WHERE menu_id='{$this->menuId}' AND menu_location='{$location}' AND menu_layout = '".$this->dbLayout."' "); e107::getLog()->add('MENU_07',$location.'[!br!]'.$position.'[!br!]'.$this->menuId,E_LOG_INFORMATIVE,''); } if (!isset($_GET['configure'])) { // Scan plugin directories to see if menus to add $this->menuScanMenus(); } } // ---------------------------------------------------------------------------- /** * @return false|mixed */ function menuSetPreset() { global $location; $sql = e107::getDb(); $tp = e107::getParser(); if(!$menuAreas = $this->getMenuPreset()) { e107::getMessage()->addDebug("No Menu Preset Found"); return false; } $sql->update("menus", "menu_location='0' WHERE menu_layout = '" . $this->dbLayout . "' "); // Clear All existing. foreach($menuAreas as $val) { if($sql->select("menus", 'menu_name, menu_path', "menu_name = '" . $tp->filter($val['menu_name']) . "' LIMIT 1")) { $row = $sql->fetch(); if(!$sql->update('menus', "menu_order='" . (int) $val['menu_order'] . "', menu_location = " . (int) $val['menu_location'] . ", menu_class= " . $val['menu_class'] . " WHERE menu_name='" . $tp->filter($val['menu_name']) . "' AND menu_layout = '" . $this->dbLayout . "' LIMIT 1 ")) { $insert = array( 'menu_id' => 0, 'menu_name' => $tp->filter($val['menu_name']), 'menu_location' => (int) $val['menu_location'], 'menu_order' => (int) $val['menu_order'], 'menu_class' => $tp->filter($val['menu_class']), 'menu_pages' => '', 'menu_path' => $tp->filter($row['menu_path']), 'menu_layout' => $this->dbLayout, 'menu_parms' => '', ); $sql->insert("menus", $insert); e107::getLog()->add('MENU_01', $tp->filter($row['menu_name']) . '[!br!]' . $location . '[!br!]' . varset($menu_count, 0) . '[!br!]' . $tp->filter($row['menu_path']), E_LOG_INFORMATIVE, ''); } } } return $menuAreas; } // ---------------------------------------------------------------------------- /** * @return void */ public function menuScanMenus() { global $sql2; $sql = e107::getDb(); $efile = new e_file; $efile->dirFilter = array('/', 'CVS', '.svn', 'languages'); $efile->fileFilter[] = '^e_menu\.php$'; $fileList = $efile->get_files(e_PLUGIN, "_menu\.php$", 'standard', 1); // $this->menuAddMessage('Scanning for new menus', E_MESSAGE_DEBUG); e107::getDebug()->log("Scanning for new menus", E107_DBG_BASIC); $menuList = array(); // existing menus in table. if($result = $sql->retrieve('menus', 'menu_name', null, true)) { foreach($result as $mn) { if($mn['menu_name']) { $menuList[] = $mn['menu_name']; } } } //v2.x Scan Custom Page Menus. $pageMenus = $sql->retrieve('page', 'page_id, menu_name, menu_title', "menu_name !='' ", true); foreach($pageMenus as $row) { if(!in_array($row['menu_name'], $menuList)) { $insert = array( 'menu_id' => 0, 'menu_name' => $row['menu_name'], 'menu_location' => 0, 'menu_order' => 0, 'menu_class' => 0, 'menu_pages' => '', 'menu_path' => $row['page_id'], 'menu_layout' => '', 'menu_parms' => '' ); if($sql->insert("menus", $insert)) { $this->menuAddMessage(MENLAN_10 . " - " . $row['menu_name'], E_MESSAGE_DEBUG); } } } $menustr = varset($menustr); $message = varset($message); foreach($fileList as $file) { list($parent_dir) = explode('/', str_replace(e_PLUGIN, "", $file['path'])); $file['path'] = str_replace(e_PLUGIN, "", $file['path']); $file['fname'] = str_replace(".php", "", $file['fname']); $valid_menu = false; $existing_menu = in_array($file['fname'], $menuList); // $sql->count("menus", "(*)", "WHERE menu_name='{$file['fname']}'"); if(file_exists(e_PLUGIN . $parent_dir . '/plugin.xml') || file_exists(e_PLUGIN . $parent_dir . '/plugin.php')) { if(e107::isInstalled($parent_dir)) { // Its a 'new style' plugin with a plugin.php file, or an even newer one with plugin.xml file - only include if plugin installed $valid_menu = true; // Whether new or existing, include in list // echo "Include {$parent_dir}:{$file['fname']}
"; } } else // Just add the menu anyway { $valid_menu = true; // echo "Default Include {$parent_dir}:{$file['fname']}
"; } if($valid_menu) { $menustr .= "&" . str_replace(".php", "", $file['fname']); if(!$existing_menu) // New menu to add to list { $insert = array( 'menu_id' => 0, 'menu_name' => $file['fname'], 'menu_location' => 0, 'menu_order' => 0, 'menu_class' => 0, 'menu_pages' => '', 'menu_path' => $file['path'], 'menu_layout' => '', 'menu_parms' => '' ); if($sql->insert("menus", $insert)) { // Could do admin logging here - but probably not needed $message .= MENLAN_10 . " - " . $file['fname'] . "
"; //FIXME } else { $this->menuAddMessage("Couldn't add menu: " . $file['fname'] . " to table ", E_MESSAGE_DEBUG); } } } } //Reorder all menus into 1...x order if(!is_object($sql2)) { $sql2 = new db; } // Shouldn't be needed if(!isset($sql3) || !is_object($sql3)) { $sql3 = new db; } $location_count = $sql3->select("menus", "menu_location", "menu_location>0 GROUP BY menu_location"); while($location_count) { if($sql->select("menus", "menu_id", "menu_location={$location_count} ORDER BY menu_order ASC")) { $c = 1; while($row = $sql->fetch()) { $sql2->update("menus", "menu_order={$c} WHERE menu_id=" . $row['menu_id']); $c++; } } $location_count--; } $sql->select("menus", "*", "menu_path NOT REGEXP('[0-9]+') "); while(list($menu_id, $menu_name, $menu_location, $menu_order) = $sql->fetch('num')) { if(stripos($menustr, $menu_name) === false) { $sql2->delete("menus", "menu_name='$menu_name'"); $message .= MENLAN_11 . " - " . $menu_name . "
"; } } $this->menuAddMessage(vartrue($message), E_MESSAGE_DEBUG); } // --------------------------------------------------------------------------- /** * @param $val * @return int|mixed */ function menuPresetPerms($val) { $link_class = strtolower(trim((string) $val)); $menu_perm['everyone'] = e_UC_PUBLIC; $menu_perm['guest'] = e_UC_GUEST; $menu_perm['member'] = e_UC_MEMBER; $menu_perm['mainadmin'] = e_UC_MAINADMIN; $menu_perm['admin'] = e_UC_ADMIN; $menu_perm['nobody'] = e_UC_NOBODY; $link_class = isset($menu_perm[$link_class]) ? $menu_perm[$link_class] : e_UC_PUBLIC; return $link_class; } /** * @param $id * @param $fields * @param $tabs * @param e_form $ui * @param $values * @return string */ private function menuParamForm($id, $fields, $tabs, e_form $ui, $values=array()) { $fields['menu_id'] = array('type'=>'hidden', 'writeParms'=>array('value'=>$id)); $fields['mode'] = array('type'=>'hidden', 'writeParms'=>array('value'=>'parms')); $forms = $models = array(); $forms[] = array( 'id' => 'e-save', 'header' => '', 'footer' => '', 'url' => e_SELF, 'query' => "lay=".$this->curLayout, 'fieldsets' => array( 'create' => array( 'tabs' => $tabs, //used within a single form. 'legend' => '', 'fields' => $fields, //see e_admin_ui::$fields 'header' => '', //XXX Unused? 'footer' => '', 'after_submit_options' => '', // or true for default redirect options 'after_submit_default' => '', // or true for default redirect options 'triggers' => false, // standard create/update-cancel triggers ) ) ); // $models[] = $controller->getModel(); $models[] = e107::getModel()->setData($values); return $ui->renderCreateForm($forms, $models, e_AJAX_REQUEST); } /** * This one will be greatly extended, allowing menus to offer UI and us * settings per instance later ($parm variable available for menus - same as shortcode's $parm) */ function menuInstanceParameters() { if(!vartrue($_GET['parmsId'])) return; $id = intval($_GET['parmsId']); $frm = e107::getForm(); $sql = e107::getDb(); if(!$sql->select("menus", "*", "menu_id=".$id)) { $this->menuAddMessage("Couldn't Load Menu",E_MESSAGE_ERROR); return null; }; $row = $sql->fetch(); $text = "
".MENLAN_44." ".$row['menu_name']." "; if(file_exists(e_PLUGIN.$row['menu_path']."e_menu.php")) // v2.x new e_menu.php { $plug = rtrim($row['menu_path'],'/'); $obj = e107::getAddon($plug,'e_menu'); if(!is_object($obj)) { $text .= ""; } else { $menuName = substr($row['menu_name'],0,-5); } $menuName = varset($menuName); $fields = e107::callMethod($obj,'config',$menuName); $tabs = isset($obj->tabs) ? $obj->tabs : array(LAN_CONFIGURE); if(!$form = e107::getAddon($plug,'e_menu',$plug."_menu_form")) { $form = $frm; } $value = e107::unserialize($row['menu_parms']); if(!empty($fields)) { return $this->menuParamForm($id, $fields,$tabs,$form,$value); /* foreach($fields as $k=>$v) { $text .= ""; // $v['writeParms']['class'] = 'e-save'; $i = $k; if(!empty($v['multilan'])) { $i = $k.'['.e_LANGUAGE.']'; if(isset($value[$k][e_LANGUAGE])) { $value[$k] = varset($value[$k][e_LANGUAGE],''); } } $text .= ""; }*/ } else { $text .= ""; } } else { $text .= ""; } $text .= "
".e107::getParser()->lanVars(MENLAN_46, $plug)."
".$v['title']."".$form->renderElement($i, $value[$k], $v); if(!empty($v['help'])) { //$v['writeParms']['title'] = e107::getParser()->toAttribute($v['help']); $text .= "
".$v['help']."
"; } $text .= "
".MENLAN_47.": ".$row['menu_path']."e_menu.php
".MENLAN_45." ".$frm->text('menu_parms', $row['menu_parms'], 900, 'class=e-save&size=xxlarge')."
"; /* $text .= "
"; $text .= $frm->admin_button('parms_submit', LAN_SAVE, 'update'); $text .= "
"; */ $text .= $frm->hidden('mode','parms'); $text .= $frm->hidden('menu_id',$id); $text .= "
"; return $text; } /** * @return string|void */ function menuVisibilityOptions() { if(!vartrue($_GET['vis'])) return; $sql = e107::getDb(); $frm = e107::getForm(); $tp = e107::getParser(); require_once(e_HANDLER."userclass_class.php"); if(!$sql->select("menus", "*", "menu_id=".intval($_GET['vis']))) { $this->menuAddMessage(MENLAN_48,E_MESSAGE_ERROR); return; } $row = $sql->fetch(); $listtype = substr($row['menu_pages'], 0, 1); $menu_pages = substr($row['menu_pages'], 2); $menu_pages = str_replace("|", "\n", $menu_pages); $text = "
". MENLAN_7." ".$row['menu_name']."
".LAN_VISIBLE_TO." ". $frm->userclass('menu_class', $row['menu_class'], 'dropdown', array('options'=>"public,member,guest,admin,main,classes,nobody", 'class'=>'e-save'))."
"; $checked = ($listtype == 1) ? " checked='checked' " : ""; $text .= $frm->radio('listtype', 1, $checked, array('label'=>$tp->toHTML(MENLAN_26,true), 'class'=> 'e-save')); $text .= "
"; // $text .= " ".MENLAN_26."
"; $checked = ($listtype == 2) ? " checked='checked' " : ""; $text .= $frm->radio('listtype', 2, $checked, array('label'=> $tp->toHTML(MENLAN_27,true), 'class'=> 'e-save')); // $text .= " ".MENLAN_27."
"; $text .= "
".MENLAN_28."
"; $text .= $frm->hidden('mode','visibility'); $text .= $frm->hidden('menu_id',intval($_GET['vis'])); // ""; /* $text .= "
"; $text .= $frm->admin_button('class_submit', MENLAN_6, 'update');
"; */ $text .= "
"; return $text; //$caption = MENLAN_7." ".$row['menu_name']; //$ns->tablerender($caption, $text); //echo $text; } // ----------------------------------------------------------------------------- /** * @return void */ function menuActivate() // Activate Multiple Menus. { $sql = e107::getDb(); $location = $this->menuActivateLoc; $menu_count = $sql->count("menus", "(*)", " WHERE menu_location=".$location." AND menu_layout = '".$this->dbLayout."' "); $menu_count++; // Need to add 1 to create NEW order number. foreach($this->menuActivateIds as $sel_mens) { //Get info from menu being activated if($sql->select("menus", 'menu_name, menu_path' , "menu_id = ".intval($sel_mens)." ")) { $row=$sql->fetch(); //If menu is not already activated in that area, add the record. //$query = "SELECT menu_name,menu_path FROM #menus WHERE menu_name='".$row['menu_name']."' AND menu_layout = '".$this->dbLayout."' AND menu_location = ".$location." LIMIT 1 "; //if(!$sql->gen($query, $this->debug)) { $insert = array( 'menu_id' => 0, 'menu_name' => $row['menu_name'], 'menu_location' => $location, 'menu_order' => $menu_count, 'menu_class' => intval($row['menu_class']), 'menu_pages' => '', 'menu_path' => $row['menu_path'], 'menu_layout' => $this->dbLayout, 'menu_parms' => '' ); $sql->insert("menus",$insert, $this->debug); e107::getLog()->add('MENU_01',$row['menu_name'].'[!br!]'.$location.'[!br!]'.$menu_count.'[!br!]'.$row['menu_path'],E_LOG_INFORMATIVE,''); $menu_count++; } } } } // ----------------------------------------------------------------------------- /** * @param $array * @return void */ function menuSetCustomPages($array) { $pref = e107::getPref(); $key = key($array); $pref['sitetheme_custompages'][$key] = array_filter(explode(" ",$array[$key])); save_prefs(); } // ------------------------------------------------------------------------------ /** * @return false|mixed */ function getMenuPreset() { $pref = e107::getPref(); $layout = $this->curLayout; if(!isset($pref['sitetheme_layouts'][$layout]['menuPresets'])) { e107::getMessage()->addDebug(print_a($pref['sitetheme_layouts'],true)); return FALSE; } $areas = $pref['sitetheme_layouts'][$layout]['menuPresets']['area']; foreach($areas as $area => $menus) { $areaID = $menus['@attributes']['id']; foreach($menus['menu'] as $k=>$v) { $perm = isset($v['@attributes']['perm']) ? $v['@attributes']['perm'] : null; $menuArea[] = array( 'menu_location' => $areaID, 'menu_order' => $k, 'menu_name' => $v['@attributes']['name']."_menu", 'menu_class' => $this->menuPresetPerms($perm) ); } } return varset($menuArea, array()); } // ------------------------------------------------------------------------------ /** * @param $array * @param $name * @return false|mixed|void */ function checkMenuPreset($array, $name) { if(!is_array($array)) { return; } foreach($array as $key=>$val) { if($val['menu_name']==$name) { return $val['menu_location']; } } return FALSE; } // -------------------------------------------------------------------------- /** * @return array */ function menuSaveParameters() { $sql = e107::getDb(); $tp = e107::getParser(); $id = intval($_POST['menu_id']); if(isset($_POST['menu_parms'])) // generic params { $parms = $tp->filter($_POST['menu_parms']); $parms = $sql->escape(strip_tags($parms)); $check = $sql->update("menus", "menu_parms=\"".$parms."\" WHERE menu_id=".$id.""); } else // Save e_menu.php parameters. { unset($_POST['menu_id'], $_POST['mode'], $_POST['menuActivate'], $_POST['menuSetCustomPages'], $_POST['e-token']); $parms = $_POST; $check = e107::getMenu()->updateParms($id,$parms); } if($check) { return array('msg'=>'All Okay','error'=>false); // FIXME - menu log //e107::getLog()->add('MENU_02',$_POST['menu_parms'].'[!br!]'.$parms.'[!br!]'.$this->menuId,E_LOG_INFORMATIVE,''); // $this->menuAddMessage(LAN_SAVED,E_MESSAGE_SUCCESS); } elseif(false === $check) { return array('msg'=>LAN_UPDATED_FAILED,'error'=>true); } else { return array('msg'=>'No Changes Made','error'=>false); // $this->menuAddMessage(LAN_NOCHANGE_NOTSAVED,E_MESSAGE_INFO); } } // -------------------------------------------------------------------------- /** * @return array */ function menuSaveVisibility() // Used by Ajax { $tp = e107::getParser(); $sql = e107::getDb(); $pageList = $tp->filter($_POST['pagelist']); $listType = $tp->filter($_POST['listtype']); $pagelist = explode("\r\n", $pageList); for ($i = 0, $iMax = count($pagelist); $i < $iMax; $i++) { $pagelist[$i] = trim($pagelist[$i]); } $plist = implode("|", $pagelist); $pageparms = $listType.'-'.$plist; $pageparms = preg_replace("#\|$#", "", $pageparms); $pageparms = (trim($pageList) == '') ? '' : $pageparms; if($sql->update("menus", "menu_class='".intval($_POST['menu_class'])."', menu_pages='{$pageparms}' WHERE menu_id=".intval($_POST['menu_id']))) { e107::getLog()->add('MENU_02',$_POST['menu_class'].'[!br!]'.$pageparms.'[!br!]'.$this->menuId,E_LOG_INFORMATIVE,''); return array('msg'=>LAN_UPDATED, 'error'=> false); //$this->menuAddMessage($message,E_MESSAGE_SUCCESS); } else { return array('msg'=>LAN_UPDATED_FAILED, 'error'=> true, 'posted'=>$_POST); // $this->menuAddMessage($message,E_MESSAGE_ERROR); } } /** * @param $id * @return void */ function setMenuId($id) { $this->menuId = intval($id); } // ----------------------------------------------------------------------- /** * @return array */ function menuDeactivate() { $sql = e107::getDb(); $sql2 = e107::getDb(); //echo "FOUND= ".$this->menuId; $error = false; $message = ''; if($sql->gen('SELECT menu_name, menu_location, menu_order FROM #menus WHERE menu_id = '.$this->menuId.' LIMIT 1')) { $row = $sql->fetch(); //Check to see if there is already a menu with location = 0 (to maintain BC) if($sql2->select('menus', 'menu_id', "menu_name='{$row['menu_name']}' AND menu_location = 0 AND menu_layout ='".$this->dbLayout."' LIMIT 1")) { //menu_location=0 already exists, we can just delete this record if(!$sql2->delete('menus', 'menu_id='.$this->menuId)) { $message = "Deletion Failed"; $error = true; } } else { //menu_location=0 does NOT exist, let's just convert this to it if(!$sql2->update("menus", "menu_location=0, menu_order=0, menu_class=0, menu_pages='' WHERE menu_id=".$this->menuId)) { $message = "FAILED"; $error = true; } } //Move all menus up (reduces order number) that have a higher menu order number than one deactivated, in the selected location. $sql->update("menus", "menu_order=menu_order-1 WHERE menu_location={$row['menu_location']} AND menu_order > {$row['menu_order']} AND menu_layout = '".$this->dbLayout."' "); e107::getLog()->add('MENU_04',$row['menu_name'].'[!br!]'.$row['menu_location'].'[!br!]'.$row['menu_order'].'[!br!]'.$this->menuId,E_LOG_INFORMATIVE,''); } else { $message = "NO CHANGES MADE : ".$this->menuId; $error = true; } return array('msg'=>$message,'error'=>$error); } // ---------------------------------------------------------------------- /** * Move a Menu */ function menuMove() {// Get current menu name $sql = e107::getDb(); if($sql->select('menus', 'menu_name', 'menu_id='.$this->menuId, 'default')) { $row = $sql->fetch(); //Check to see if menu is already active in the new area, if not then move it if(!$sql->select('menus', 'menu_id', "menu_name='{$row['menu_name']}' AND menu_location = ".$this->menuNewLoc." AND menu_layout='".$this->dbLayout ."' LIMIT 1")) { $menu_count = $sql->count("menus", "(*)", " WHERE menu_location=".$this->menuNewLoc); $sql->update("menus", "menu_location='{$this->menuNewLoc}', menu_order=".($menu_count+1)." WHERE menu_id=".$this->menuId); if(isset($location) && isset($position)) { $sql->update("menus", "menu_order=menu_order-1 WHERE menu_location='{$location}' AND menu_order > {$position} AND menu_layout='".$this->dbLayout ."' "); } } e107::getLog()->add('MENU_03',$row['menu_name'].'[!br!]'.$this->menuNewLoc.'[!br!]'.$this->menuId,E_LOG_INFORMATIVE,''); } } // =----------------------------------------------------------------------------- /** * @param $row * @return string */ function renderOptionRow($row) { $frm = e107::getForm(); $text = ""; $pdeta = ""; $color = (varset($color) == "white") ? "#DDDDDD" : "white"; if($row['menu_pages'] == "dbcustom") { $pdeta = LAN_CUSTOM; } else { $menuPreset = varset($menuPreset); $row['menu_name'] = preg_replace("#_menu$#i", "", $row['menu_name']); if($pnum = $this->checkMenuPreset($menuPreset,$row['menu_name'].'_menu')) { $pdeta = MENLAN_39." {$pnum}"; } } if(!$this->dragDrop) { $menuInf = (!is_numeric($row['menu_path'])) ? ' ('.substr($row['menu_path'],0,-1).')' : " ( #".$row['menu_path']." )"; // $menuInf = $row['menu_path']; $text .= " "; $text .= $frm->checkbox('menuselect[]',$row['menu_id'],'',array('label'=>$row['menu_name'].$menuInf)); $text .= "   ".$pdeta."  \n"; } else { $menu_count = varset($menu_count); // Menu Choices box. $text .= "
"; $text .= $this->menuRenderMenu($row, $menu_count,true); $text .= "
\n"; } return $text; } /** * @return void */ function menuRenderPage() { global $HEADER, $FOOTER, $rs; $pref = e107::getPref(); $sql = e107::getDb(); $tp = e107::getParser(); // echo "
"; $this->parseheader($HEADER); // $layouts_str; $layout = ($this->curLayout); $menuPreset = $this->getMenuPreset(); echo "
"; echo $rs->form_open("post", e_SELF."?configure=".$this->curLayout, "menuActivation"); $text = ""; $text .= ""; $text .= ""; $text .= "
".MENLAN_36."... ...".MENLAN_37."
"; if(!$this->dragDrop) { $text .= "
"; $text .= "\n"; } //else //{ // $text .= "
\n"; // } $pageMenu = array(); $pluginMenu = array(); $done = array(); $sql->select("menus", "menu_name, menu_id, menu_pages, menu_path", "1 ORDER BY menu_name ASC"); while ($row = $sql->fetch()) { if(in_array($row['menu_name'],$done)) { continue; } $done[] = $row['menu_name']; if(is_numeric($row['menu_path'])) { $pageMenu[] = $row; } else { $pluginMenu[] = $row; } } $text .= "
"; foreach($pageMenu as $row) { $text .= $this->renderOptionRow($row); } $text .= ""; foreach($pluginMenu as $row) { $text .= $this->renderOptionRow($row); } $text .= (!$this->dragDrop) ? "
".MENLAN_49."
".MENLAN_50."
" : ""; $text .= "
"; $text .= "
"; if(!count($this->menu_areas)) { $text = "
"; $text .= MENLAN_51."
"; if(isset($this->customMenu) && count($this->customMenu)) { $text .= "

".MENLAN_52."

  • ".implode("
  • ",$this->customMenu)."

"; $text .= "

".MENLAN_53."

"; } $text .= "
"; } // $ns -> tablerender(MENLAN_22.'blabla', $text); if(!deftrue("e_DEBUG_MENUMANAGER")) { echo ""; } else { echo $this->renderPanel(MENLAN_22, $text); } // echo $rs->form_close(); echo "
"; $FOOTER = str_replace('','', $FOOTER); $this->parseheader($FOOTER); if($this->debug) { echo "
 
"; } // echo "
"; } //------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------// /* function menuSelectLayout() { $pref = e107::getPref(); // onchange=\"urljump(this.options[selectedIndex].value);\" $text = "
"; $text .= "
".MENLAN_54.": "; $text .= "
".MENLAN_30."
"; // $text .= "
Something here
"; return $text; } */ //------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------// /** * @param $LAYOUT * @param $check * @return array|void */ function parseheader($LAYOUT, $check = FALSE) { // $tmp = explode("\n", $LAYOUT); // if(strpos($LAYOUT,' tag from the admin header when menu-manager is active. // { // $LAYOUT = preg_replace('/]*>/','', $LAYOUT); // } // Split up using the same function as the shortcode handler $tmp = preg_split('#(\{\S[^\x02]*?\S\})#', $LAYOUT, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE); $str = array(); for($c = 0, $cMax = count($tmp); $c < $cMax; $c++) { if(preg_match("/[\{|\}]/", $tmp[$c])) { if($check) { if(strpos($tmp[$c], "{MENU=")!==false || strpos($tmp[$c], "{MENUAREA=")!==false) { $matches = array(); // Match all menu areas, menu number is limited to tinyint(3) preg_match_all("/\{(?:MENU|MENUAREA)=([\d]{1,3})(:[\w\d]*)?\}/", $tmp[$c], $matches); $this->menuSetCode($matches, $str); } } else { $this->checklayout($tmp[$c]); } } else { if(!$check) { echo $tmp[$c]; } } } if($check) { return $str; } } /** * @param $matches * @param $ret * @return void */ function menuSetCode($matches, &$ret) { if(!$matches || !vartrue($matches[1])) { return; } foreach ($matches[1] as $match) { $ret[] = $match; } } /** * @param $caption * @param $text * @return string */ function renderPanel($caption, $text) { $plugtext = ""; return $plugtext; } /** * @param $str * @return void */ function checklayout($str) { // Displays a basic representation of the theme global $PLUGINS_DIRECTORY, $rs, $sc_style, $menu_order, $style; // global $style required. $PLUGINS_DIRECTORY = e107::getFolder('PLUGINS'); $pref = e107::getPref(); $tp = e107::getParser(); $ns = e107::getRender(); $menuLayout = ($this->curLayout != $pref['sitetheme_deflayout']) ? $this->curLayout : ""; // if(strstr($str, "LOGO")) // { // echo $tp->parseTemplate("{LOGO}"); // } if(strpos($str, "SETSTYLE") !== false) { $style = preg_replace("/\{SETSTYLE=(.*?)\}/si", "\\1", $str); $this->style = $style; $ns->setStyle($style); } /*elseif(strstr($str, "SITENAME")) { echo "[SiteName]"; }*/ /*elseif(strstr($str, "SITETAG")) { echo "
[SiteTag]
"; }*/ // elseif(strstr($str, "SITELINKS")) // { // echo "[SiteLinks]"; // } // elseif(strstr($str, "NAVIGATION")) // { // $cust = preg_replace("/\W*\{NAVIGATION(.*?)(\+.*)?\}\W*/si", "\\1", $str); // $tp->parseTemplate("{NAVIGATION".$cust."}",true); // echo "Navigation Area"; // } elseif(strpos($str, '{---MODAL---}') !== false) { //echo "\n \n"; echo '
'; //TODO Store in a central area - currently used in header.php, header_default.php and here. echo ' '; //echo getModal(); } elseif(strpos($str, '{---CAPTION---}') !== false) { echo LAN_CAPTION; } elseif(strpos($str, '{LAYOUT_ID}') !== false) { echo 'layout-'.e107::getForm()->name2id($this->curLayout); } elseif(strpos($str, "ALERT") !== false) { echo ''; //echo "[Navigation Area]"; } elseif(strpos($str, "LANGUAGELINKS") !== false) { echo "
[".defset('ADLAN_132', "Language")."]
"; } elseif(strpos($str, "CUSTOM") !== false) { $cust = preg_replace("/\W*\{CUSTOM=(.*?)(\+.*)?\}\W*/si", "\\1", $str); echo "
[" . $cust . "]
"; } elseif(strpos($str, "CMENU") !== false) { $cust = preg_replace("/\W*\{CMENU=(.*?)(\+.*)?\}\W*/si", "\\1", $str); if(isset($this->customMenu)) { $this->customMenu[] = $cust; } echo $tp->parseTemplate("{CMENU=".$cust."}",true); // echo $this->renderPanel('Embedded Custom Menu',$cust); } elseif(strpos($str, "SETIMAGE") !== false) { $cust = preg_replace("/\W*\{SETIMAGE(.*?)(\+.*)?\}\W*/si", "\\1", $str); echo $tp->parseTemplate("{SETIMAGE".$cust."}",true); // echo $this->renderPanel('Embedded Custom Menu',$cust); } /*elseif(strstr($str, "{WMESSAGE")) { echo "
[Welcome Message Area]
"; // echo $this->renderPanel('Embedded Custom Menu',$cust); }*/ elseif(strpos($str, "{FEATUREBOX") !== false) { echo "
[".LAN_PLUGIN_FEATUREBOX_NAME."]
"; // echo $this->renderPanel('Embedded Custom Menu',$cust); } // Display embedded Plugin information. else if(strpos($str, "PLUGIN") !== false) { $plug = preg_replace("/\{PLUGIN=(.*?)\}/si", "\\1", $str); $plug = trim($plug); if(file_exists((e_PLUGIN . "{$plug}/{$plug}_config.php"))) { $link = e_PLUGIN . "{$plug}/{$plug}_config.php"; } if(file_exists((e_PLUGIN . $plug . "/config.php"))) { $link = e_PLUGIN . $plug . "/config.php"; } // $plugtext = ""; echo "
"; echo $this->renderPanel($plug, $plugtext); // $ns->tablerender($plug, $plugtext); } else if(strpos($str, "MENU") !== false) { $matches = array(); if(preg_match_all("/\{(?:MENU|MENUAREA)=([\d]{1,3})(:[\w\d]*)?\}/", $str, $matches)) // { $menuText = ""; foreach($matches[1] as $menu) { $menu = preg_replace("/\{(?:MENU|MENUAREA)=(.*?)(:.*?)?\}/si", "\\1", $str); if(isset($sc_style['MENU']['pre']) && strpos($str, 'ret') !== false) { $menuText .= $sc_style['MENU']['pre']; } // --------------- $menuText .= "\n\n"; $menuText .= "\n\n"; // --------------- if(isset($sc_style['MENU']['post']) && strpos($str, 'ret') !== false) { $menuText .= $sc_style['MENU']['post']; } } echo $menuText; // $ns->tablerender('', varset($menuText)); // Could fail with a badly built theme. } else { echo $tp->parseTemplate($str,true); } } else { echo $tp->parseTemplate($str,true); } } //------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------// /** * @param $row * @param $menu_count * @param $rep * @return string|void */ function menuRenderMenu($row, $menu_count, $rep = FALSE) { global $rs,$menu,$menu_info,$menu_act, $style; $style = $this->style; // $menu_count is empty in here //FIXME extract $menu_location = ''; $menu_order = ''; extract($row); if(empty($menu_id)){ return; } $menu_name = varset($menu_name); $menu_name = preg_replace("#_menu#i", "", $menu_name); //TODO we need a CSS class for this $vis = (varset($menu_class) || strlen(varset($menu_pages)) > 1) ? " " : ""; //DEBUG div not allowed in final tags $caption = "
{$menu_name}{$vis}
"; // use theme render style instead // Undocumented special parameter 'admin_title' $menuParms = array(); if(!empty($row['menu_parms'])) parse_str($row['menu_parms'], $menuParms); if(isset($menuParms['admin_title']) && $menuParms['admin_title']) { $caption = deftrue($menuParms['admin_title'], $menuParms['admin_title']).$vis; } elseif(isset($menuParms['title']) && $menuParms['title']) { $caption = deftrue($menuParms['title'], $menuParms['title']).$vis; } else $caption = $menu_name.$vis; $menu_info = "{$menu_location}.{$menu_order}"; $text = ""; $conf = ''; if (file_exists(e_PLUGIN.varset($menu_path).$menu_name.'_menu_config.php')) { $conf = $menu_path.$menu_name.'_menu_config'; } if($conf == '' && file_exists(e_PLUGIN."{$menu_path}config.php")) { $conf = "{$menu_path}config"; } // // $text = "
"; $text .= ' '; $text .= ($rep == true) ? "
" : ""; // $text .= ""; if(!$this->dragDrop) { return "".$caption."
". $text; // return; // return $ns->tablerender($caption, $text,'', true); Theme style too unpredictable. } else { return "
".$caption."
".$text."
"; } } /** * @param $mode * @return false|string|void|null */ function menuSaveAjax($mode = null) { if($mode == 'visibility') { $ret = $this->menuSaveVisibility(); // echo json_encode($ret); return null; } if($mode == 'delete') { list($tmp,$area) = explode("-",$_POST['area']); if($_POST['area'] == 'remove') { list($tmp,$deleteID) = explode("-",$_POST['removeid']); $this->menuId = $deleteID; $ret = $this->menuDeactivate(); // echo json_encode($ret); return null; } } if($mode == 'parms') { $ret = $this->menuSaveParameters(); if(!empty($ret['error'])) { return json_encode($ret); } return null; } // print_r($_POST); return; $this->debug = TRUE; $sql = e107::getDb(); // Allow deletion by ajax, but not the rest when drag/drop disabled. if(!$this->dragDrop){ return; } $this -> dbLayout = $_POST['layout']; list($tmp,$insertID) = explode("-",$_POST['insert']); $insert[] = $insertID; if($_POST['mode'] == 'insert' && count($insert) && $area) // clear out everything before rewriting everything to db. { $this->menuActivateLoc = $area; // location $this->menuActivateIds = $insert; // array of ids, in order. $this->menuActivate(); } elseif($_POST['mode'] == 'update') { $sql->update("menus","menu_location = ".intval($area)." WHERE menu_id = ".intval($insertID)."",$this->debug); } $c = 0; if(count($_POST['list'])<2) { return; } // resort the menus in this 'Area" foreach($_POST['list'] as $val) { list($b,$id) = explode("-",$val); $order[] = $id; $sql->update("menus","menu_order = ".$c." WHERE menu_id = ".intval($id)."",$this->debug); $c++; } // same for delete etc. // echo "
"; } /** * @return void */ function menuSetConfigList() { e107::getDebug()->log("Scanning for Menu config files"); $sql = e107::getDb(); $pref = e107::getPref(); $prev_name = ''; $search = array('_menu','_'); $sql -> select("menus", "*", "menu_location != 0 ORDER BY menu_path,menu_name"); while($row = $sql-> fetch()) { $link = ""; $id = substr($row['menu_path'],0,-1); if (file_exists(e_PLUGIN."{$row['menu_path']}{$row['menu_name']}_menu_config.php")) { $link = $row['menu_path'].$row['menu_name']."_menu_config.php"; } if($row['menu_path'] == 'news/') { $row['menu_path'] = "blogcalendar_menu/"; } if(file_exists(e_PLUGIN.$row['menu_path']."config.php")) { $link = $row['menu_path']."config.php"; } if($link) { $tmp[$id]['name'] = ucwords(str_replace($search,"",$row['menu_name'])); // remove _ if(vartrue($prev) == $id && ($tmp[$id]['name'] != $prev_name)) { $tmp[$id]['name'] .= ":".$prev_name; } $tmp[$id]['link'] = $link; $prev = $id; $prev_name = $tmp[$id]['name']; } } $pref['menuconfig_list'] = vartrue($tmp); e107::getConfig()->setPref($pref)->save(false,true,false); } } // end of Class. // XXX Menu Manager Re-Write with drag and drop and multi-dimensional array as storage. ($pref) // TODO Get Drag & Drop Working with the iFrame // TODO Sorting, visibility, parameters and delete. // TODO Get THIS http://jsbin.com/odiqi3 working with iFrames!! XXX XXX /** * Used only for the menu-selector at the moment. * Class e_layout */ class e_mm_layout { private $menuData = array(); private $iframe = false; private $cnt = 0; function __construct() { $pref = e107::getPref(); $ns = e107::getRender(); // $this->convertMenuTable(); $this->menuData = e107::getPref('menu_layouts'); if(e_AJAX_REQUEST) { if(varset($_POST['data'])) { $this->processPost(); } if(vartrue($_GET['enc'])) { $string = base64_decode($_GET['enc']); parse_str($string,$_GET); } if(vartrue($_GET['vis'])) { $text = $this->renderVisibilityOptions(); } // print_a($_GET); if(vartrue($_GET['parmsId'])) { // $text = $this->renderInstanceParameters(); } if(vartrue($_POST['mode'])) { // print_r($_POST); // $men->setMenuId($this->menuId); // $text = $this->menuSaveAjax($_POST['mode']); } echo $text; exit; } if(vartrue($_GET['configure'])) //ie Inside the IFRAME. { global $HEADER,$FOOTER,$CUSTOMHEADER,$CUSTOMFOOTER,$style; $this->HEADER = $HEADER; $this->FOOTER = $FOOTER; $this->CUSTOMHEADER = $CUSTOMHEADER; $this->CUSTOMFOOTER = $CUSTOMFOOTER; $this->style = $style; unset($HEADER,$FOOTER,$CUSTOMHEADER,$CUSTOMFOOTER,$style); e107::loadAdminIcons(); // require_once(e_CORE."templates/admin_icons_template.php"); /* e107::js('inline', " win = document.getElementById('menu_iframe').contentWindow; win.jQuery(dragelement,parent.document).draggable({ connectToSortable : $('#sortable') }); ",'jquery'); */ $this->curLayout = vartrue($_GET['configure'], $pref['sitetheme_deflayout']); $this->renderLayout($this->curLayout); } else // Parent - ie. main admin page. { e107::css('inline'," .menuOption { display: none } "); $theme = e107::getPref('sitetheme'); require_once(e_THEME.$theme."/theme.php"); $this->HEADER = varset($HEADER); $this->FOOTER = varset($FOOTER); $this->CUSTOMHEADER = varset($CUSTOMHEADER); $this->CUSTOMFOOTER = varset($CUSTOMFOOTER); $this->style = varset($style); // XXX HELP _ i don't work with iFrames. // $("#sortable") //$("iframe").contents().find(".sortable") /* e107::js('inline',' $(function() { $( ".sortable" ).sortable({ revert: true }); $("iframe").load(function(){ var frameid = $("#iframe-default").contents().find(".sortable").attr("id") $( ".draggable" ).draggable({ connectToSortable: "#" + frameid, helper: "clone", revert: "invalid", cursor: "move", iframeFix: true }); }); // $( "ul, li" ).disableSelection(); }); ','jquery'); */ $this->scanForNew(); $this->renderInterface(); } } /** * Save Menu Pref */ protected function processPost() { $cnf = e107::getConfig('core'); $existing = $cnf->get('menu_layouts'); $data = $_POST['data']; $layout = $_POST['layout']; $area = $_POST['area']; $save = array(); foreach($_POST['data']['layout']['area'] as $v) // reset key values. { $save[] = $v; } // $save[$layout][$area] = $_POST['data']['layout']['area']; echo "\nLAYOUT=".$layout."\n"; echo "AREA=".$area."\n"; //print_r($save); e107::getConfig('core')->setPref('menu_layouts/'.$layout."/".$area, $save)->save(); } /** * Substitute all {MENU=X} and Render output. */ private function renderLayout($layout='') { $ALL = $this->getHeadFoot(); $HEADER = $ALL['HEADER']; $FOOTER = $ALL['FOOTER']; $tp = e107::getParser(); $head = preg_replace_callback("/\{MENU=([\d]{1,3})(:[\w\d]*)?\}/", array($this, 'renderMenuArea'), $HEADER[THEME_LAYOUT]); $foot = preg_replace_callback("/\{MENU=([\d]{1,3})(:[\w\d]*)?\}/", array($this, 'renderMenuArea'), $FOOTER[THEME_LAYOUT]); global $style; $style = $this->style; echo $tp->parseTemplate($head); // echo "
MAIN CONTENT
"; echo $tp->parseTemplate($foot); } /** * @return array */ public static function menuSelector() { // $p = e107::getPref('e_menu_list'); // new storage for xxxxx_menu.php list. $sql = e107::getDb(); $frm = e107::getForm(); $done = array(); $pageMenu = array(); $pluginMenu = array(); $sql->select("menus", "menu_name, menu_id, menu_pages, menu_path", "1 ORDER BY menu_name ASC"); while($row = $sql->fetch()) { if(in_array($row['menu_name'], $done)) { continue; } $done[] = $row['menu_name']; if(is_numeric($row['menu_path'])) { $pageMenu[] = $row; } else { $pluginMenu[] = $row; } } $tab1 = ''; $tab2 = ''; $tabs = array( 'custom' => array('caption' => '', 'text' => $tab1), 'plugin' => array('caption' => '', 'text' => $tab2) ); $defLayout = e107::getRegistry('core/e107/menu-manager/curLayout');; $text = '
'; $text .= ""; $layouts = self::getLayouts(); $tp = e107::getParser(); // var_dump($layouts['menus']); $text .= ' '; $text .= $frm->tabs($tabs); $text .= '
'; $tp = e107::getParser(); $caption = MENLAN_22;; return array('caption' => $caption, 'text' => $text); } /** * @param $theme * @return array|false */ public static function getLayouts($theme = null) { if(empty($theme)) { $theme = e107::pref('core', 'sitetheme'); } $sql = e107::getDb(); // required $tp = e107::getParser(); $HEADER = null; $FOOTER = null; $LAYOUT = null; $CUSTOMHEADER = null; $CUSTOMFOOTER = null; $path = e_THEME . $theme . '/'; $file = $path . "theme.php"; if(!is_readable($file)) { return false; } e107::set('css_enabled', false); e107::set('js_enabled', false); // new v2.2.2 HTML layout support. if(is_dir($path . "layouts") && is_readable($path . "theme.html")) { $lyt = scandir($path . "layouts"); $LAYOUT = array(); foreach($lyt as $lays) { if($lays === '.' || $lays === '..') { continue; } $key = str_replace("_layout.html", '', $lays); if($lm = e_theme::loadLayout($key, $theme)) { $LAYOUT = $LAYOUT + $lm; } } } else // prior to v2.2.2 { $themeFileContent = file_get_contents($file); $srch = array(''); // replace LAN file load. $themeFileContent = preg_replace("/e107::lan\(['|\"]theme.*\);/","e107::themeLan(null, '".$theme."');", $themeFileContent); // $themeFileContent = preg_replace("/define\(['|\"]BOOTSTRAP['|\"].*;/", '', $themeFileContent); // $themeFileContent = preg_replace("/define\(['|\"]FONTAWESOME['|\"].*;/", '', $themeFileContent); $themeFileContent = preg_replace("/LAN_[\w]*/", '""', $themeFileContent); $themeFileContent = preg_replace("/include_lan\(.*;/", '', $themeFileContent); $themeFileContent = preg_replace("/define\(.*;/", '', $themeFileContent); $themeFileContent = preg_replace('/\(\s?THEME\s?\./', '( e_THEME. "' . $theme . '/" .', str_replace($srch, '', $themeFileContent)); $themeFileContent = str_replace('USER_WIDTH', "''", $themeFileContent); $themeFileContent = str_replace('tablestyle', $tp->filter($theme, 'wd') . "_tablestyle", $themeFileContent); // rename function to avoid conflicts while parsing. $themeFileContent = str_replace("class " . $theme . "_theme", "class " . $theme . "__theme", $themeFileContent); // rename class to avoid conflicts while parsing. $themeFileContent = str_replace('__DIR__', var_export(dirname($file), true), $themeFileContent); $themeFileContent = str_replace('__FILE__', var_export($file, true), $themeFileContent); if(PHP_MAJOR_VERSION > 6) { try { eval($themeFileContent); } catch(Error $e) { trigger_error("Couldn't parse theme.php file. ". $e->getMessage()."\n\n".$themeFileContent); echo "
Couldn't parse theme.php: " . $e->getMessage() . "
"; file_put_contents(e_LOG."menuManagerParseDebug.log", $themeFileContent); } } else { try { eval($themeFileContent); } catch(ParseError $e) { trigger_error("Couldn't parse theme.php file.". $e->getMessage()); echo "
Couldn't parse theme.php: " . $e->getMessage() . "
"; } } } e107::set('css_enabled', true); e107::set('js_enabled', true); $head = array(); $foot = array(); if(isset($LAYOUT) && (isset($HEADER) || isset($FOOTER))) { $fallbackLan = "This theme is using deprecated elements. All [x]HEADER and [x]FOOTER variables should be removed from theme.php."; // DO NOT TRANSLATE! $warningLan = $tp->lanVars(deftrue('MENLAN_60', $fallbackLan), '$'); echo "
" . $warningLan . "
"; } if(isset($LAYOUT) && is_array($LAYOUT)) // $LAYOUT is a combined $HEADER,$FOOTER. { foreach($LAYOUT as $key => $template) { if($key == '_header_' || $key == '_footer_' || $key == '_modal_') { continue; } if(strpos($template, '{---}') !== false) { list($hd, $ft) = explode("{---}", $template); $head[$key] = isset($LAYOUT['_header_']) ? $LAYOUT['_header_'] . $hd : $hd; $foot[$key] = isset($LAYOUT['_footer_']) ? $ft . $LAYOUT['_footer_'] : $ft; } else { e107::getMessage()->addDebug('Missing "{---}" in $LAYOUT["' . $key . '"] '); } } unset($hd, $ft); } if(is_string($CUSTOMHEADER)) { $head['legacyCustom'] = $CUSTOMHEADER; } elseif(is_array($CUSTOMHEADER)) { foreach($CUSTOMHEADER as $k => $v) { $head[$k] = $v; } } if(is_string($HEADER)) { $head['legacyDefault'] = $HEADER; } elseif(is_array($HEADER)) { foreach($HEADER as $k => $v) { $head[$k] = $v; } } if(is_string($CUSTOMFOOTER)) { $foot['legacyCustom'] = $CUSTOMFOOTER; } elseif(is_array($CUSTOMFOOTER)) { foreach($CUSTOMFOOTER as $k => $v) { $foot[$k] = $v; } } if(is_string($FOOTER)) { $foot['legacyDefault'] = $FOOTER; } elseif(is_array($FOOTER)) { foreach($FOOTER as $k => $v) { $foot[$k] = $v; } } $layout = array(); foreach($head as $k => $v) { $template = $v . "\n{---}" . $foot[$k]; $layout['templates'][$k] = $template; $layout['menus'][$k] = self::countMenus($template, $k); } return $layout; } /** * @param $template * @param $name * @return array|mixed */ private static function countMenus($template, $name) { if(preg_match_all("/\{(?:MENU|MENUAREA)=([\d]{1,3})(:[\w\d]*)?\}/", $template, $matches)) { sort($matches[1]); return $matches[1]; } e107::getDebug()->log("No Menus Found in Template:" . $name . " with strlen: " . strlen($template)); return array(); } /** * Render {MENU=X} */ private function renderMenuArea($matches) { $frm = e107::getForm(); $area = $matches[1]; // return print_a($this->menuData,true); $text = ""; // $text .= $frm->button('submit','submit','submit','submit'); $text .= $frm->hidden('layout',THEME_LAYOUT); $text .= $frm->hidden('area',$area); $text .= $frm->close(); return $text; } /** * @param $row * @param $layout * @param $area * @return string */ private function renderMenu($row, $layout, $area) { // return print_a($row,true); $frm = e107::getForm(); $uniqueId = "menu_".$frm->name2id($row['path']).'_'.$this->cnt; return '
  • '.$this->renderMenuOptions($row, $layout, $area, $this->cnt, $uniqueId)."
  • \n"; } /** * @param $row (array of data from $pref['menu_layouts'] * @param $layout . eg. 'default' or 'home' * @param number $area as in {MENU=x} * @param incrementor number. */ public function renderMenuOptions($row, $layout, $area, $c , $uniqueId='xxx') { $frm = e107::getForm(); // $text = " "; $text = str_replace("_menu","",$row['name']); // $layout = 'layout'; // $area = 'area'; //TODO Delete, Config etc. //$data[$layout][$location][] = array('name'=>$row['menu_name'],'class'=>$row['menu_class'],'path'=>$row['menu_path'],'pages'=>$row['menu_pages'],'parms'=>$row['menu_parms']); // $area = 'area_'.$area; // 'layout' and 'area' will later be substituted. $text .= $frm->hidden('data[layout][area]['.$c.'][name]',$row['name'],array('id'=>'name-'.$area.'-'.$c) ); $text .= $frm->hidden('data[layout][area]['.$c.'][class]',$row['class'], array('id'=>'class-'.$area.'-'.$c) ); $text .= $frm->hidden('data[layout][area]['.$c.'][path]',$row['path'], array('id'=>'path-'.$area.'-'.$c) ); $text .= $frm->hidden('data[layout][area]['.$c.'][pages]',$row['pages'], array('id'=>'pages-'.$area.'-'.$c) ); $text .= $frm->hidden('data[layout][area]['.$c.'][parms]',$row['parms'], array('id'=>'parms-'.$area.'-'.$c) ); $visibilityLink = e_SELF."?enc=".base64_encode('lay='.$layout.'&vis='.$area.'-'.$c.'&iframe=1&class='.$row['class'].'&pages='.$row['pages']); $text .= "×"; // $('.hello').remove(); $text .= ''; /* $text .= ' '; if($conf) { $text .= ''; } $editLink = e_SELF."?enc=".base64_encode('lay='.$layout.'&parmsId='.$menu_id.'&iframe=1'); $text .= ''; $text .= ' '; */ return $text; } /* function menuSaveAjax($mode = null) { if($mode == 'visibility') { $ret = $this->menuSaveVisibility(); // echo json_encode($ret); return; } if($mode == 'parms') { // echo "hi there"; $ret = array('msg'=>'hi there','error'=>true); // $ret = $this->menuSaveParameters(); echo json_encode($ret); return; } // print_r($_POST); return; } */ /** * Scan Plugin folders for new _menu files. */ private function scanForNew() { $fl = e107::getFile(); $fl->dirFilter = array('/', 'CVS', '.svn', 'languages'); $files = $fl->get_files(e_PLUGIN,"_menu\.php$",'standard',1); $data = array(); foreach($files as $file) { if($file == 'e_menu.php') { continue; } $valid_menu = false; if (file_exists($file['path'].'/plugin.xml') || file_exists($file['path'].'/plugin.php')) { // if (e107::isInstalled($file['path'])) //FIXME need a check that doesn't exlude page, news and others that don't require installation. { $valid_menu = TRUE; // Whether new or existing, include in list } } else // Just add the menu anyway { $valid_menu = TRUE; } $path = trim(str_replace(e_PLUGIN,"",$file['path']),"/"); if($valid_menu) { $fname = str_replace(".php","",$file['fname']); $data[$fname] = $path; } } $config = e107::getConfig('core'); $config->set('e_menu_list',$data); $config->save(); } /** * @return string|void */ private function renderVisibilityOptions() { if(!vartrue($_GET['vis'])) return; // print_a($_GET); $tp = e107::getParser(); $sql = e107::getDb(); $ns = e107::getRender(); $frm = e107::getForm(); require_once(e_HANDLER."userclass_class.php"); /* if(!$sql->select("menus", "*", "menu_id=".intval($_GET['vis']))) { $this->menuAddMessage("Couldn't Load Menu",E_MESSAGE_ERROR); return; } $row = $sql->fetch(); */ $listtype = substr($_GET['pages'], 0, 1); $menu_pages = substr($_GET['pages'], 2); $menu_pages = str_replace("|", "\n", $menu_pages); $text = "
    ". MENLAN_7." ".$row['menu_name']."
    ".LAN_VISIBLE_TO." ". r_userclass('menu_class', intval($_GET['class']), "off", "public,member,guest,admin,main,classes,nobody")."
    "; $checked = ($listtype == 1) ? " checked='checked' " : ""; $text .= $frm->radio('listtype', 1, $checked, array('label'=> $tp->toHTML(MENLAN_26,true), 'class'=> 'e-save')); $text .= "
    "; // $text .= " ".MENLAN_26."
    "; $checked = ($listtype == 2) ? " checked='checked' " : ""; $text .= $frm->radio('listtype', 2, $checked, array('label'=> $tp->toHTML(MENLAN_27,true), 'class'=> 'e-save')); // $text .= " ".MENLAN_27."
    "; $text .= "
    ".MENLAN_28."
    "; $text .= $frm->hidden('mode','visibility'); $text .= $frm->hidden('menu_id',$_GET['vis']); // is NOT an integer /* $text .= "
    "; $text .= $frm->admin_button('class_submit', MENLAN_6, 'update');
    "; */ $text .= "
    "; return $text; //$caption = MENLAN_7." ".$row['menu_name']; //$ns->tablerender($caption, $text); //echo $text; } /** * This one will be greatly extended, allowing menus to offer UI and us * settings per instance later ($parm variable available for menus - same as shortcode's $parm) * @see menuInstanceParameters() in menumanager_class.php */ /* private function renderInstanceParameters() { if(!vartrue($_GET['parmsId'])) return; $id = intval($_GET['parmsId']); $frm = e107::getForm(); $sql = e107::getDb(); if(!$sql->select("menus", "*", "menu_id=".$id)) { $this->menuAddMessage("Couldn't Load Menu",E_MESSAGE_ERROR); return; }; $row = $sql->fetch(); $text = "
    ".MENLAN_44." ".$row['menu_name']."
    ".MENLAN_45." ".$frm->text('menu_parms', $row['menu_parms'], 900, 'class=e-save ')."
    "; // $text .= " //
    "; // $text .= $frm->admin_button('parms_submit', LAN_SAVE, 'update'); // $text .= " //
    "; $text .= $frm->hidden('mode','parms'); $text .= $frm->hidden('menu_id',$id); $text .= "
    "; return $text; } */ /** * Render the main area with TABS and iframes. */ private function renderInterface() { $ns = e107::getRender(); $tp = e107::getParser(); $frm = e107::getForm(); $TEMPL = $this->getHeadFoot(); $layouts = array_keys($TEMPL['HEADER']); e107::js('inline',' $(function() { $(".draggable").draggable({ connectToSortable: $(".sortable"), helper: "clone", revert: "invalid", cursor: "move", iframeFix: true, refreshPositions: true }); })' ); $text = ''; $active = 'active'; $text .= '
    '; foreach($layouts as $title) { $text .= '
    '; $active = ''; } $text .= '
    '; // $ns->frontend = false; $ns->tablerender(MENLAN_55,$text); } /** * @return array */ private function getHeadFoot() { $H = array(); $F = array(); if(is_string($this->HEADER)) { $H['default'] = $this->HEADER; $F['default'] = $this->FOOTER; } else { $H = $this->HEADER; $F = $this->FOOTER; } // 0.6 / 0.7-1.x if(!empty($this->CUSTOMHEADER)) { if(!is_array($this->CUSTOMHEADER)) { $H['legacyCustom'] = $this->CUSTOMHEADER; $F['legacyCustom'] = $this->CUSTOMFOOTER; } else { foreach($this->CUSTOMHEADER as $k=>$v) { $H[$k] = $v; } foreach($this->CUSTOMFOOTER as $k=>$v) { $F[$k] = $v; } } } return array('HEADER'=>$H, 'FOOTER'=>$F); } //$ns = e107::getRender(); }