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 .= "
";
$c = 500; // start high to prevent overwriting of keys after we drag and drop.
foreach($p as $menu => $folder)
{
$text .= "";
$c++;
}
$text .= "
";
if($sql->select('page','*',"menu_name !='' ORDER BY menu_name"))
{
$text .= "
";
while($row = $sql->fetch())
{
$text .= "";
}
$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 = '
'; // 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 .= '';
*/
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 = "";
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 = "
";
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 = ' class="active" ';
foreach($layouts as $title)
{
$text .= '- '.$title.'
';
$active = '';
}
$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.
}
?>