select { max-width:100% } .menu-options-buttons { } #menu-manage-actions { width:50%; vertical-align:top; text-align:center; padding:15px } select.menu-btn { text-align:left } label { font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; color:black; line-height:14px } label.input { margin-right:10px; } #core-menumanager-main { width:100%; margin-left:auto; margin-right:auto } table.table { width: 95% ; margin-left:auto; margin-right:auto; } label.selection-row { padding:6px ; cursor: pointer; width:90%} table.table tbody > tr >td { } table.table tbody > tr > td label { display: block; cursor: pointer; font-size: 14px; line-height: 2em; padding-left: 15px; font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; color:black; } table.table tbody > tr >td label > input { margin-left:5px; margin-right: 10px; float: left; } .table-striped tbody > tr:nth-child(2n+1) > td, .table-striped tbody > tr:nth-child(2n+1) > th { background-color: rgb(249, 249, 249); } .menu-panel { min-height: 20px; padding: 19px; margin-bottom: 20px; background-color: rgb(245, 245, 245); border: 1px solid rgb(227, 227, 227); border-radius: 5px; box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.05) inset; color: #2F2F2F; font-size: 13px; font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; } .menu-panel-header { display: block; padding: 10px; font-size: 13px; font-weight: bold; font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; line-height: 20px; border-radius: 5px; text-transform: uppercase; margin-bottom:10px; background-color: rgb(0, 136, 204); color: white; } ul.unstyled, ol.unstyled { margin-left: 0px; list-style: none outside none; } .pull-right { float: right } .pull-left { float: left } .menuOption { opacity:0.2 } .menuOption:hover { opacity:1 } .sortable li { border-radius: 4px } .sortable li:hover { background-color: silver; box-shadow:3px 3px 3px silver } .regularMenu { cursor:move; border-bottom:1px dotted silver; margin-bottom:6px; padding-left:3px; padding-right:3px; padding-top:10px; padding-bottom:10px } .ui-draggable { background-color: rgb(245, 245, 245); min-width:100px;} ",'jquery'); } if($_SERVER['E_DEV_MENU'] == 'true') { if(isset($_GET['configure']) || isset($_GET['iframe'])) { //No layout parse when in iframe mod define('e_IFRAME', true); } $mn = new e_layout; //e107::js('core','jquery.scoped.js','jquery'); // e107::css('url',e_THEME.'jayya/style.css'); require_once("auth.php"); require_once("footer.php"); exit; } // if($_SERVER['E_DEV_MENU'] == 'true') //{ function e_help() { if($_SERVER['E_DEV_MENU'] != 'true') { return false; } $p = e107::getPref('e_menu_list'); // new storage for xxxxx_menu.php list. $sql = e107::getDb(); $text = '
'; $text .= "
"; if($sql->select('page','*',"menu_name !='' ORDER BY menu_name")) { $text .= ""; } $text .= "
"; return array('caption'=>'Menu Items','text'=>$text); } //} // 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 class e_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); require_once(e_CORE."templates/admin_icons_template.php"); e107::js('url',"http://ajax.googleapis.com/ajax/libs/jqueryui/1.10.1/jquery-ui.min.js"); e107::js('url', "http://ajax.googleapis.com/ajax/libs/jqueryui/1.10.1/themes/base/jquery-ui.css"); e107::js('inline',' $(function() { // post the form back to this script. var saveData = function(areaid) { var formid = "#form-" + areaid; var form = $(formid); var data = form.serialize(); $.ajax({ type: "POST", url: "menus.php", data: data }).done(function( msg ) { $(".menuOption").show(); // alert("POSTED: "+ msg ); }); } $(".sortable").sortable({ connectWith: $("#area-1,#area-2,#area-3,#area-4,#area-5"), revert: true, cursor: "move", distance: 20, // containment: $(".sortable"), update: function(ev,ui) { var areaid = $(this).attr("id"); saveData(areaid); } }); // $( ".draggable", window.top.document).click(function() // { // alert("hi there"); // }); // http://jsfiddle.net/DT764/2/ $( ".draggable", window.top.document).draggable({ connectToSortable: ".sortable", helper: "clone", appendTo: $(this), // ".sortable", // "#area-1", //FIXME Needs to be a specific area. revert: "invalid", containment: "parent", delay: 0, revertDuration: 100, cursor: "move", iframeFix: true, containment: false, stop: function(e, ui) { //TODO Rename layout and area in the hidden fields to that of the where the menu was dropped. // Figure out positioning magic to determine if e.ui.position is in the iframe // var what = $(this).parent().attr("id"); // $(".sortable").draggable( "disable" ); // alert(what); } }); // $( "ul, li", window.top.document ).disableSelection(); $( ".deleteMenu").on("click", function() { var deleteId = $(this).attr("data-delete"); var area = $(this).attr("data-area"); $("#"+deleteId).hide("slow", function(){ $("#"+deleteId).remove(); }); // $("#"+deleteId).remove(); // alert(deleteId + " " + area); saveData(area); }); }); '); /* 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 = $HEADER; $this->FOOTER = $FOOTER; $this->CUSTOMHEADER = $CUSTOMHEADER; $this->CUSTOMFOOTER = $CUSTOMFOOTER; $this->style = $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); } /** * 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; } private function renderMenu($row, $layout, $area, $count) { // return print_a($row,true); $frm = e107::getForm(); $uniqueId = "menu_".$frm->name2id($row['path']).'_'.$this->cnt; $TEMPLATE = '
  • '.$this->renderMenuOptions($row, $layout, $area, $this->cnt, $uniqueId).'
  • '; // TODO perhaps a simple counter for the id return $TEMPLATE; } /** * @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) { //print_r($_POST); // return; if($mode == 'visibility') { $ret = $this->menuSaveVisibility(); // echo json_encode($ret); return; } if($mode == 'parms') { $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',2); $data = array(); foreach($files as $file) { $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(); } private function renderVisibilityOptions() { if(!vartrue($_GET['vis'])) return; // print_a($_GET); $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']."
    ".MENLAN_4." ". 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'=>MENLAN_26, 'class'=> 'e-save')); $text .= "
    "; // $text .= " ".MENLAN_26."
    "; $checked = ($listtype == 2) ? " checked='checked' " : ""; $text .= $frm->radio('listtype', 2, $checked, array('label'=>MENLAN_27, '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) */ 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(); // TODO lan $text = "
    Menu parameters ".$row['menu_name']."
    Parameters (query string format): ".$frm->text('menu_parms', $row['menu_parms'], 900, 'class=e-save span7')."
    "; /* $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("Menu Layout",$text); } 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(isset($this->CUSTOMHEADER) && isset($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(); } //include_lan(e_LANGUAGEDIR.e_LANGUAGE.'/admin/lan_'.e_PAGE); // FIXME - quick temporarry fix for missing icons on menu administration. We need different core style to be included (forced) here - e.g. e107_web/css/admin/sprite.css if(e_IFRAME) //<-- Check config and delete buttons if modifying { //e107::js('core','bootstrap/js/bootstrap.min.js'); //e107::css('core','bootstrap/css/bootstrap.min.css'); e107::css('url','{e_THEME}/bootstrap/admin_style.css'); } $e_sub_cat = 'menus'; require_once(e_HANDLER."file_class.php"); require_once(e_HANDLER."menumanager_class.php"); $rs = new form; $frm = e107::getForm(); $men = new e_menuManager(0); // use 1 for dragdrop. $mes = e107::getMessage(); if(e_AJAX_REQUEST) { if(vartrue($_GET['enc'])) { $string = base64_decode($_GET['enc']); parse_str($string,$_GET); // print_a($_GET); } // print_a($_POST); if(vartrue($_GET['vis'])) { $text = $men->menuVisibilityOptions(); } // print_a($_GET); if(vartrue($_GET['parmsId'])) { $text = $men->menuInstanceParameters(); } if(vartrue($_POST['mode'])) { // print_r($_POST); // $men->setMenuId($this->menuId); $text = $men->menuSaveAjax($_POST['mode']); } echo $text; exit; } if(isset($_GET['configure']) || isset($_GET['iframe'])) { //No layout parse when in iframe mod define('e_IFRAME', true); } require_once("auth.php"); if($_POST) { e107::getCache()->clear_sys("menus_"); } //FIXME still used in e_HANDLER.menumanager_class.php if (vartrue($message) != "") { echo $ns -> tablerender('Updated', "
    ".$message."


    "); } //BC - configure and dot delimiter deprecated if (!isset($_GET['configure'])) { // $men->menuScanMenus(); // - Runs 2x - Is already called by menuModify() in menumanager_class.php $text = $men->menuRenderMessage(); $text .= $men->menuSelectLayout(); $text .= $men->menuVisibilityOptions(); $text .= $men->menuInstanceParameters(); $text .= $men->menuRenderIframe(); $ns -> tablerender(ADLAN_6.SEP.LAN_MENULAYOUT, $text, 'menus_config'); } else // Within the IFrame. { $men->menuRenderPage(); } // ----------------------------------------------------------------------------- require_once("footer.php"); // ----------------------------------------------------------------------- function menus_adminmenu() { // See admin_shortcodes_class.php - get_admin_menumanager() // required there so it can be shared by plugins. } ?>