1
0
mirror of https://github.com/e107inc/e107.git synced 2025-08-06 06:38:00 +02:00
This commit is contained in:
jburns131
2013-05-12 01:15:49 -04:00
15 changed files with 1211 additions and 148 deletions

View File

@@ -16,7 +16,7 @@ e107 is a free (open-source) content management system which allows you to easil
### Reporting Bugs ### Reporting Bugs
Be sure you are using the most recent version prior to reporting an issue. Be sure you are using the most recent version prior to reporting an issue.
Your may report any bugs or feature requests on Github (https://github.com/e107inc/e107/issues) You may report any bugs or feature requests on GitHub (https://github.com/e107inc/e107/issues)
### Pull-Requests ### Pull-Requests

View File

@@ -56,6 +56,11 @@ if(strpos(e_QUERY, 'configure') !== FALSE || vartrue($_GET['enc']))
// e107::js('core', 'core/admin.jquery.js', 'jquery', 4); // e107::js('core', 'core/admin.jquery.js', 'jquery', 4);
e107::js('core','bootstrap/js/bootstrap-tooltip.js'); e107::js('core','bootstrap/js/bootstrap-tooltip.js');
// e107::css('core','bootstrap/css/bootstrap.min.css'); // e107::css('core','bootstrap/css/bootstrap.min.css');
e107::js('inline', " e107::js('inline', "
$(function() { $(function() {
@@ -134,7 +139,6 @@ if(strpos(e_QUERY, 'configure') !== FALSE || vartrue($_GET['enc']))
e107::css('inline'," .column { width:100%; padding-bottom: 100px; } e107::css('inline'," .column { width:100%; padding-bottom: 100px; }
.regularMenu { border-bottom:1px dotted silver; margin-bottom:6px; padding-left:3px; padding-right:3px; padding-bottom:20px }
#core-menumanager-main th {color: silver; font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; font-size:14px; font-weight: bold; line-height:24px; background-color:#2F2F2F } #core-menumanager-main th {color: silver; font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; font-size:14px; font-weight: bold; line-height:24px; background-color:#2F2F2F }
.portlet { margin: 0 1em 1em 0; } .portlet { margin: 0 1em 1em 0; }
.portlet-header { margin: 0.3em; padding-bottom: 4px; padding-left: 0.2em; cursor:move } .portlet-header { margin: 0.3em; padding-bottom: 4px; padding-left: 0.2em; cursor:move }
@@ -158,7 +162,9 @@ if(strpos(e_QUERY, 'configure') !== FALSE || vartrue($_GET['enc']))
.icon-search { .icon-search {
background-position: -48px 0; background-position: -48px 0;
} }
.icon-align-justify {
background-position: -336px -48px;
}
/* A little bit of bootstrap styling - loading /bootstrap.css could break some themes */ /* A little bit of bootstrap styling - loading /bootstrap.css could break some themes */
@@ -214,6 +220,13 @@ if(strpos(e_QUERY, 'configure') !== FALSE || vartrue($_GET['enc']))
border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
} }
.btn-mini {
padding: 0px 2px;
font-size: 10.5px;
border-radius: 3px 3px 3px 3px;
}
.tbox { text-align:left } .tbox { text-align:left }
.menuOptions { .menuOptions {
@@ -302,15 +315,39 @@ if(strpos(e_QUERY, 'configure') !== FALSE || vartrue($_GET['enc']))
} }
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'); ",'jquery');
} }
if($_SERVER['E_ENV_MENUS'] == 'developer')
if($_SERVER['E_DEV_MENU'] == 'true')
{ {
if(isset($_GET['configure']) || isset($_GET['iframe'])) if(isset($_GET['configure']) || isset($_GET['iframe']))
{ {
@@ -325,10 +362,17 @@ if($_SERVER['E_ENV_MENUS'] == 'developer')
exit; exit;
} }
if($_SERVER['E_ENV_MENUS'] == 'developer') // if($_SERVER['E_DEV_MENU'] == 'true')
{ //{
function e_help() function e_help()
{ {
if($_SERVER['E_DEV_MENU'] != 'true')
{
return false;
}
$p = e107::getPref('e_menu_list'); // new storage for xxxxx_menu.php list. $p = e107::getPref('e_menu_list'); // new storage for xxxxx_menu.php list.
$sql = e107::getDb(); $sql = e107::getDb();
@@ -343,9 +387,24 @@ if($_SERVER['E_ENV_MENUS'] == 'developer')
<div class='active tab-pane' id='plugins'> <div class='active tab-pane' id='plugins'>
<ul>"; <ul>";
$c = 500; // start high to prevent overwriting of keys after we drag and drop.
foreach($p as $menu => $folder) foreach($p as $menu => $folder)
{ {
$text .= "<li id='{$folder}' class='draggable' style='cursor:move'>".str_replace("_menu","",$menu)."</li>"; $text .= "<li id='{$menu}' class='draggable regularMenu' style='cursor:move'>";
// $text .= str_replace("_menu","",$menu);
$defaults = array(
'name' => $menu,
'path' => $folder,
'class' => '0'
);
$text .= e_layout::renderMenuOptions($defaults,'layout','area',$c);
$text .= "</li>";
$c++;
} }
$text .= "</ul> $text .= "</ul>
@@ -358,7 +417,18 @@ if($_SERVER['E_ENV_MENUS'] == 'developer')
$text .= "<ul>"; $text .= "<ul>";
while($row = $sql->fetch()) while($row = $sql->fetch())
{ {
$text .= "<li id='".$row['page_id']."' class='draggable' style='cursor:move'>".$row['menu_name']."</li>"; $text .= "<li id='".$row['page_id']."' class='draggable regularMenu' style='cursor:move'>";
// $text .= $row['menu_name'];
$defaults = array(
'name' => $row['menu_name'],
'path' => $row['page_id'],
'class' => '0'
);
$text .= e_layout::renderMenuOptions($defaults,'layout','area',$c);
$text .= "</li>";
} }
$text .= "</ul>"; $text .= "</ul>";
@@ -370,77 +440,235 @@ if($_SERVER['E_ENV_MENUS'] == 'developer')
return array('caption'=>'Menu Items','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) // 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 Get Drag & Drop Working with the iFrame
// TODO Sorting, visibility, parameters and delete. // TODO Sorting, visibility, parameters and delete.
// TODO Get THIS http://jsbin.com/odiqi3 working with iFrames!! XXX XXX
class e_layout class e_layout
{ {
private $menuData = array(); private $menuData = array();
private $iframe = false;
private $cnt = 0;
function __construct() function __construct()
{ {
$pref = e107::getPref(); $pref = e107::getPref();
$ns = e107::getRender(); $ns = e107::getRender();
$this->convertMenuTable(); // $this->convertMenuTable();
$this->menuData = e107::getPref('menu_layouts');
if(e_AJAX_REQUEST)
{
if(varset($_POST['data']))
{
$this->processPost();
}
exit;
}
if(vartrue($_GET['configure'])) //ie Inside the IFRAME. if(vartrue($_GET['configure'])) //ie Inside the IFRAME.
{
$this->curLayout = varsettrue($_GET['configure'], $pref['sitetheme_deflayout']);
$this->renderLayout($this->curLayout);
}
else // Parent - ie. main admin page.
{ {
// XXX HELP _ i don't work with iFrames. 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',' e107::js('inline','
$(function() { $(function()
$( "#sortable" ).sortable({ {
revert: true // 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 );
}); });
$( ".draggable" ).draggable({
connectToSortable: "#sortable", }
helper: "clone",
revert: "invalid",
$(".sortable").sortable({
connectWith: $("#area-1,#area-2,#area-3,#area-4,#area-5"),
revert: true,
cursor: "move", cursor: "move",
// iframeFix: true, distance: 20,
// containment: $(".sortable"),
start: function(ev,ui) update: function(ev,ui)
{ {
}, var areaid = $(this).attr("id");
drag: function(ev,ui) saveData(areaid);
{
},
stop: function(ev, ui)
{
} }
}); });
$( "ul, li" ).disableSelection();
// Not Working.
$("#menu_iframe").load(function(){
$("#menu_iframe").contents().find("#sortable").droppable({ // $( ".draggable", window.top.document).click(function()
accept: ".drag", // {
drop: function( event, ui ) { // alert("hi there");
var html = "<div class=\'droptrue\'>"+ ui.draggable.html() + "</div>"; // });
//alert(html);
$(this).append(html); // 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 = varsettrue($_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->scanForNew();
$this->renderInterface(); $this->renderInterface();
@@ -449,43 +677,56 @@ class e_layout
/** /**
* Convert from e107_menu table to $pref format. * Save Menu Pref
*/ */
function convertMenuTable() protected function processPost()
{ {
$sql = e107::getDb(); $cnf = e107::getConfig('core');
$sql->select('menus','*','menu_location !=0 ORDER BY menu_location,menu_order'); $existing = $cnf->get('menu_layouts');
$data = array();
while($row = $sql->fetch()) $data = $_POST['data'];
$layout = $_POST['layout'];
$area = $_POST['area'];
$save = array();
foreach($_POST['data']['layout']['area'] as $v) // reset key values.
{ {
$layout = vartrue($row['menu_layout'],'default'); $save[] = $v;
$location = $row['menu_location'];
$data[$layout][$location][] = array('name'=>$row['menu_name'],'class'=>$row['menu_class'],'path'=>$row['menu_path'],'pages'=>$row['menu_pages'],'parms'=>$row['menu_parms']);
} }
$this->menuData = ($data); // $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. * Substitute all {MENU=X} and Render output.
*/ */
private function renderLayout($layout='') private function renderLayout($layout='')
{ {
$ALL = $this->getHeadFoot();
global $HEADER,$FOOTER,$style; // included by theme file in class2. $HEADER = $ALL['HEADER'];
$FOOTER = $ALL['FOOTER'];
$tp = e107::getParser(); $tp = e107::getParser();
$head = preg_replace_callback("/\{MENU=([\d]{1,3})(:[\w\d]*)?\}/", array($this, 'renderMenuArea'), $HEADER[THEME_LAYOUT]); $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]); $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 $tp->parsetemplate($head);
// echo "<div>MAIN CONTENT</div>"; // echo "<div>MAIN CONTENT</div>";
echo $tp->parsetemplate($foot); echo $tp->parsetemplate($foot);
@@ -502,45 +743,128 @@ class e_layout
*/ */
private function renderMenuArea($matches) private function renderMenuArea($matches)
{ {
$frm = e107::getForm();
$area = $matches[1]; $area = $matches[1];
// return print_a($this->menuData,true); // return print_a($this->menuData,true);
$text = "<div class='menu-panel'>"; $text = "<div class='menu-panel'>";
$text .= "<div class='menu-panel-header' title=\"".MENLAN_34."\">Area ".$area."</div>"; $text .= "<div class='menu-panel-header' title=\"".MENLAN_34."\">Area ".$area."</div>\n";
$text .= $frm->open('form-area-'.$area,'post',e_SELF);
$text .= "<ul id='area-".$area."' class='sortable unstyled'>
<li>&nbsp;</li>";
if(vartrue($this->menuData[THEME_LAYOUT]) && is_array($this->menuData[THEME_LAYOUT][$area])) if(vartrue($this->menuData[THEME_LAYOUT]) && is_array($this->menuData[THEME_LAYOUT][$area]))
{ {
$text .= "<ul id='sortable' class='unstyled'>";
foreach($this->menuData[THEME_LAYOUT][$area] as $val) foreach($this->menuData[THEME_LAYOUT][$area] as $val)
{ {
$text .= $this->renderMenu($val); $text .= $this->renderMenu($val, THEME_LAYOUT, $area,$count);
$this->cnt++;
}
} }
$text .= "</ul>"; $text .= "</ul>";
}
$text .= "</div>"; $text .= "</div>";
// $text .= $frm->button('submit','submit','submit','submit');
$text .= $frm->hidden('layout',THEME_LAYOUT);
$text .= $frm->hidden('area',$area);
$text .= $frm->close();
return $text; return $text;
} }
private function renderMenu($row) private function renderMenu($row, $layout, $area, $count)
{ {
// return print_a($row,true); // return print_a($row,true);
$TEMPLATE = '<li class="regularMenu" id="block-1-1"> '.$row['name'].' </li>'; // TODO perhaps a simple counter for the id $frm = e107::getForm();
$uniqueId = "menu_".$frm->name2id($row['path']).'_'.$this->cnt;
$TEMPLATE = '<li class="regularMenu" id="'.$uniqueId.'"> '.$this->renderMenuOptions($row, $layout, $area, $this->cnt, $uniqueId).' </li>
'; // TODO perhaps a simple counter for the id
return $TEMPLATE; 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 = "<i class='icon-align-justify'></i> ";
$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'] );
$text .= $frm->hidden('data[layout][area]['.$c.'][class]',$row['class'] );
$text .= $frm->hidden('data[layout][area]['.$c.'][path]',$row['path'] );
$text .= $frm->hidden('data[layout][area]['.$c.'][pages]',$row['pages'] );
$text .= $frm->hidden('data[layout][area]['.$c.'][parms]',$row['parms'] );
$visibilityLink = e_SELF."?enc=".base64_encode('lay='.$layout.'&vis='.$c.'&iframe=1');
$text .= "<a href='#' class='menuOption menu-btn menu-btn-mini menu-btn-danger deleteMenu pull-right' data-area='area-".$area."' data-delete='".$uniqueId."'>&times;</a>"; // $('.hello').remove();
$text .= '<a class="menuOption e-menumanager-option menu-btn pull-right" data-modal-caption="'.MENLAN_20.'" href="'.$visibilityLink.'" title="'.MENLAN_20.'"><i class="icon-search"></i></a>';
/*
$text .= '<span class="menu-options-buttons">
<a class="e-menumanager-option menu-btn" data-modal-caption="'.MENLAN_20.'" href="'.$visibilityLink.'" title="'.MENLAN_20.'"><i class="S16 e-search-16"></i></a>';
if($conf)
{
$text .= '<a class="menu-btn" target="_top" href="'.e_SELF.'?lay='.$layout.'&amp;mode=conf&amp;path='.urlencode($conf).'&amp;id='.$menu_id.'"
title="Configure menu"><i class="S16 e-configure-16"></i></a>';
}
$editLink = e_SELF."?enc=".base64_encode('lay='.$layout.'&parmsId='.$menu_id.'&iframe=1');
$text .= '<a data-modal-caption="Configure parameters" class="e-menumanager-option menu-btn e-tip" target="_top" href="'.$editLink.'" title="Configure parameters"><i class="S16 e-edit-16" ></i></a>';
$text .= '<a title="'.LAN_DELETE.'" id="remove-'.$menu_id.'-'.$menu_location.'" class="e-tip delete e-menumanager-delete menu-btn" href="'.e_SELF.'?configure='.$layout.'&amp;mode=deac&amp;id='.$menu_id.'"><i class="S16 e-delete-16"></i></a>
</span>';
*/
return $text;
}
/** /**
* Scan Plugin folders for new _menu files. * Scan Plugin folders for new _menu files.
*/ */
@@ -554,9 +878,23 @@ class e_layout
foreach($files as $file) foreach($files as $file)
{ {
$valid_menu = false;
if (file_exists($file['path'].'/plugin.xml') || file_exists($file['path'].'/plugin.php'))
{
if (e107::isInstalled($parent_dir))
{
$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']),"/"); $path = trim(str_replace(e_PLUGIN,"",$file['path']),"/");
if(e107::isInstalled($path)) if($valid_menu)
{ {
$fname = str_replace(".php","",$file['fname']); $fname = str_replace(".php","",$file['fname']);
$data[$fname] = $path; $data[$fname] = $path;
@@ -579,11 +917,31 @@ class e_layout
{ {
$ns = e107::getRender(); $ns = e107::getRender();
$tp = e107::getParser(); $tp = e107::getParser();
$frm = e107::getForm();
$TEMPL = $this->getHeadFoot(); $TEMPL = $this->getHeadFoot();
$layouts = array_keys($TEMPL['HEADER']); $layouts = array_keys($TEMPL['HEADER']);
e107::js('inline','
$(function()
{
$(".draggable").draggable({
connectToSortable: $(".sortable"),
helper: "clone",
revert: "invalid",
cursor: "move",
iframeFix: true,
refreshPositions: true
});
})'
);
$text = '<ul class="nav nav-tabs">'; $text = '<ul class="nav nav-tabs">';
$active = ' class="active" '; $active = ' class="active" ';
@@ -604,7 +962,7 @@ class e_layout
{ {
$text .= ' $text .= '
<div class="tab-pane '.$active.'" id="'.$title.'"> <div class="tab-pane '.$active.'" id="'.$title.'">
<iframe id="menu_iframe" class="well" width="100%" scrolling="no" style="width: 100%; height: 6933px; border: 0px none;" src="'.e_ADMIN_ABS.'menus.php?configure='.$title.'"></iframe> <iframe id="iframe-'.$frm->name2id($title).'" class="well" width="100%" scrolling="no" style="width: 100%; height: 6933px; border: 0px none;" src="'.e_ADMIN_ABS.'menus.php?configure='.$title.'"></iframe>
</div>'; </div>';
$active = ''; $active = '';
@@ -622,50 +980,46 @@ class e_layout
private function getHeadFoot($_MLAYOUT=null) private function getHeadFoot()
{ {
$theme = e107::getPref('sitetheme');
$H = array(); $H = array();
$F = array(); $F = array();
require(e_THEME.$theme."/theme.php"); if(is_string($this->HEADER))
if(is_string($HEADER))
{ {
$H['default'] = $HEADER; $H['default'] = $this->HEADER;
$F['default'] = $FOOTER; $F['default'] = $this->FOOTER;
} }
else else
{ {
$H = $HEADER; $H = $this->HEADER;
$F = $FOOTER; $F = $this->FOOTER;
} }
// 0.6 / 0.7-1.x // 0.6 / 0.7-1.x
if(isset($CUSTOMHEADER) && isset($CUSTOMHEADER)) if(isset($this->CUSTOMHEADER) && isset($this->CUSTOMHEADER))
{ {
if(!is_array($CUSTOMHEADER)) if(!is_array($this->CUSTOMHEADER))
{ {
$H['legacyCustom'] = $CUSTOMHEADER; $H['legacyCustom'] = $this->CUSTOMHEADER;
$F['legacyCustom'] = $CUSTOMFOOTER; $F['legacyCustom'] = $this->CUSTOMFOOTER;
} }
else else
{ {
foreach($CUSTOMHEADER as $k=>$v) foreach($this->CUSTOMHEADER as $k=>$v)
{ {
$H[$k] = $v; $H[$k] = $v;
}
foreach($this->CUSTOMFOOTER as $k=>$v)
{
$F[$k] = $v; $F[$k] = $v;
} }
} }
} }
if($_MLAYOUT)
{
// return array('HEADER'=>$H[$_MLAYOUT], 'FOOTER'=>$F[$_MLAYOUT]);
}
return array('HEADER'=>$H, 'FOOTER'=>$F); return array('HEADER'=>$H, 'FOOTER'=>$F);

View File

@@ -15,6 +15,81 @@ if (!defined('e107_INIT')) { exit; }
class admin_shortcodes class admin_shortcodes
{ {
function cronUpdateRender($parm,$cacheData)
{
$mes = e107::getMessage();
if($cacheData == 'up-to-date')
{
return '';
}
$installUrl = "#"; // TODO
if($parm=='alert')
{
$text = 'A new update is ready to install! Click to unzip and install v'.$cacheData.'</a>.
<a class="btn btn-success" href="'.$installUrl.'">Install</a>';
$mes->addInfo($text);
return $mes->render();
}
if($parm=='icon')
{
return '<ul class="nav pill">
<li class="dropdown">
<a class="dropdown-toggle" title="Messages" role="button" data-toggle="dropdown" href="#">
'.E_16_E107.' <b class="caret"></b>
</a>
<ul class="dropdown-menu" role="menu">
<li class="nav-header">Update Available</li>
<li><a href="'.$installUrl.'">e107 v'.$cacheData.'</a></li>
</ul>
</li>
</ul>
';
}
}
// {ADMIN_COREUPDATE}
function sc_admin_coreupdate($parm='')
{
$che = e107::getCache();
$mes = e107::getMessage();
$che->setMD5(e_LANGUAGE);
$cacheData = $che->retrieve("releasecheck",3600, TRUE); // 2.0.1 | 'up-to-date' | false ;
$cacheData = 2.1; // XXX Remove to test for real.
if($cacheData)
{
return $this->cronUpdateRender($parm, $cacheData);
}
require_once(e_HANDLER."cron_class.php");
$cron = new _system_cron();
if($result = $cron->checkCoreUpdate())
{
return $this->cronUpdateRender($parm, $cacheData);
}
}
function sc_admin_credits() function sc_admin_credits()
{ {
if (!ADMIN) { return ''; } if (!ADMIN) { return ''; }
@@ -61,9 +136,8 @@ class admin_shortcodes
$ns = e107::getRender(); $ns = e107::getRender();
$pref = e107::getPref(); $pref = e107::getPref();
if(function_exists('e_help')) // new in v2.x for non-admin-ui admin pages. if(function_exists('e_help') && ($tmp = e_help())) // new in v2.x for non-admin-ui admin pages.
{ {
$tmp = e_help();
return $ns->tablerender($tmp['caption'],$tmp['text'],'e_help',true); return $ns->tablerender($tmp['caption'],$tmp['text'],'e_help',true);
} }

View File

@@ -125,7 +125,13 @@ class news_shortcodes extends e_shortcode
{ {
$NEWIMAGE = $param['image_nonew_small']; $NEWIMAGE = $param['image_nonew_small'];
} }
return (!$news_item['news_allow_comments'] ? ''.($pref['comments_icon'] ? $NEWIMAGE : '')." <a title='Comments' href='".e107::getUrl()->create('news/view/item', $news_item)."'>".$param['commentlink'].intval($news_item['news_comment_total']).'</a>' : vartrue($param['commentoffstring'],'Disabled') );
if(deftrue('e_BOOTSTRAP')) // Should be done with CSS, not like above.
{
$NEWIMAGE = "";
}
return (!$news_item['news_allow_comments'] ? ''.($pref['comments_icon'] ? $NEWIMAGE.' ' : '')."<a title='Comments' href='".e107::getUrl()->create('news/view/item', $news_item)."'>".$param['commentlink'].intval($news_item['news_comment_total']).'</a>' : vartrue($param['commentoffstring'],'Disabled') );
} }
function sc_trackback($parm) function sc_trackback($parm)

View File

@@ -226,7 +226,9 @@ class user_shortcodes extends e_shortcode
function sc_user_email_link($parm) function sc_user_email_link($parm)
{ {
$tp = e107::getParser(); $tp = e107::getParser();
return ($this->var['user_hideemail'] && !ADMIN) ? "<i>".LAN_USER_35."</i>" : $tp->parseTemplate("{email={$this->var['user_email']}-link}"); return /* Condition */ ($this->var['user_hideemail'] && !ADMIN) ?
/* Hidden and Not Admin */ "<i>".LAN_USER_35."</i>" :
/* Not Hidden or Admin */ $tp->parseTemplate("{email={$this->var['user_email']}-link}");
} }
@@ -234,7 +236,30 @@ class user_shortcodes extends e_shortcode
function sc_user_email($parm) function sc_user_email($parm)
{ {
$tp = e107::getParser(); $tp = e107::getParser();
return ($this->var['user_hideemail'] && !ADMIN) ? "<i>".LAN_USER_35."</i>" : $tp->toHTML($this->var['user_email'],"no_replace"); return /* Condition */ ($this->var['user_hideemail'] && !ADMIN) ?
/* Hidden and Not Admin */ "<i>".LAN_USER_35."</i>" :
/* Not Hidden or Admin */ "<span style='unicode-bidi:bidi-override; direction: rtl;'>" . strrev($tp->toHTML($this->var['user_email'],"no_replace")) . "</span>";
########################################################
# Security Note - 04 May 2013 #
########################################################
# #
# The CSS code direction rtl is an effective way to #
# prevent spam bots from scraping emails that are #
# not hidden. #
# #
# You can find empirical support for this method at #
# <http://superuser.com/a/235965>. #
# #
# {e_CORE}templates/user_template.php was modified to #
# support this code. In $USER_FULL_TEMPLATE, the #
# LAN_USER_60 value {USER_EMAIL_LINK} was changed to #
# {USER_EMAIL}. I couldn't figure out how the two #
# shortcodes were different, so I took precautions in #
# hopes that the CSS direction won't break actual HTML #
# tags. #
# #
# -- Deltik #
########################################################
} }
@@ -421,7 +446,7 @@ class user_shortcodes extends e_shortcode
if (USERID == $this->var['user_id']) if (USERID == $this->var['user_id'])
{ {
//return "<a href='".$url->create('user/myprofile/edit')."'>".LAN_USER_38."</a>"; //return "<a href='".$url->create('user/myprofile/edit')."'>".LAN_USER_38."</a>";
return "<a href='usersettings.php'>".LAN_USER_38."</a>"; // TODO: repair dirty fix for usersettings return "<a href='".e_HTTP."usersettings.php'>".LAN_USER_38."</a>"; // TODO: repair dirty fix for usersettings
} }
else if(ADMIN && getperms("4") && !$this->var['user_admin']) else if(ADMIN && getperms("4") && !$this->var['user_admin'])
{ {

View File

@@ -142,7 +142,7 @@ $USER_FULL_TEMPLATE = "{SETIMAGE: w=250}
<tr> <tr>
<td {$main_colspan} class='forumheader3'> <td {$main_colspan} class='forumheader3'>
<div class='f-left'>{USER_EMAIL_ICON} ".LAN_USER_60."</div> <div class='f-left'>{USER_EMAIL_ICON} ".LAN_USER_60."</div>
<div class='f-right right'>{USER_EMAIL_LINK}</div> <div class='f-right right'>{USER_EMAIL}</div>
</td> </td>
</tr> </tr>

View File

@@ -0,0 +1,458 @@
<?php
/*
* e107 website system
*
* Copyright (C) 2008-2013 e107 Inc (e107.org)
* Released under the terms and conditions of the
* GNU General Public License (http://www.gnu.org/licenses/gpl.txt)
*
* Application store client
*
*/
class e_marketplace
{
/**
* Protocol type, defaults to WSDL, fallback to 'xmlrpc' if soap extension not installed
* @var e_marketplace_adapter_abstract
*/
protected $adapter = null;
public function __construct($force = null)
{
if(null !== $force)
{
$className = 'e_marketplace_adapter_'.$force;
$this->adapter = new $className();
}
elseif(!class_exists('SoapClient')) $this->adapter = new e_marketplace_adapter_xmlrpc();
else
{
$this->adapter = new e_marketplace_adapter_wsdl();
}
}
/**
* Set authorization key
*/
public function generateAuthKey($username, $password)
{
$this->setAuthKey($this->makeAuthKey($username, $password, true));
return $this;
}
/**
* Set authorization key
*/
public function setAuthKey($authkey)
{
$this->adapter->setAuthKey($authkey);
return $this;
}
public function hasAuthKey()
{
return $this->adapter->hasAuthKey();
}
/**
* Make authorization key from user credentials
*/
public function makeAuthKey($username, $password = '', $plain = false)
{
$now = gmdate('y-m-d H');
if($plain && !empty($password)) $password = md5($password);
return sha1($username.$password.$now);
}
/**
* Retrieve currently used adapter
* @param e_marketplace_adapter_abstract
*/
public function adapter()
{
return $this->adapter;
}
/**
* Retrieve currently used adapter
* @param e_marketplace_adapter_abstract
*/
public function call($method, $data, $apply = true)
{
return $this->adapter()->call($method, $data, $apply);
}
/**
* Direct adapter()->call() execution - experimental stage
*/
public function __call($method, $arguments)
{
if(strpos($method, 'get') === 0 || strpos($method, 'do') === 0)
{
return $this->adapter()->call($method, $arguments);
}
throw new Exception("Error Processing Request", 10);
}
public function __destruct()
{
$this->adapter = null;
//echo "Adapter destroyed", PHP_EOL;
}
}
abstract class e_marketplace_adapter_abstract
{
/**
* e107.org download URL
* @var string
*/
protected $downloadUrl = 'http://e107.org/e107_plugins/addons/request.php';
/**
* e107.org authorization key
* @var string
*/
protected $authKey = null;
abstract public function test($input);
abstract public function call($method, $data, $apply);
abstract public function fetch($method, &$result);
/**
* Set authorization key
*/
public function setAuthKey($authkey)
{
$this->authKey = $authkey;
return $this;
}
public function hasAuthKey()
{
return ($this->authKey !== null) ? true : false;
}
public function getAuthKey()
{
return $this->authKey;
}
/**
* Download a Plugin or Theme to Temp, then test and move to plugin/theme folder and backup to system backup folder.
* @param string $remotefile URL
* @param string $type plugin or theme
*/
public function download($id, $type='theme')
{
$tp = e107::getParser();
$id = intval($id);
$qry = 'id='.$id;
$remotefile = $this->downloadUrl."?auth=".$this->getAuthKey()."&".$qry;
$localfile = md5($remotefile.time()).".zip";
$status = "Downloading...";
$result = $this->getRemoteFile($remotefile, $localfile);
if(!file_exists(e_TEMP.$localfile))
{
$status = ADMIN_FALSE_ICON."<br /><a href='".$remotefile."'>Download Manually</a>";
if(E107_DEBUG_LEVEL > 0)
{
$status .= 'local='.$localfile;
}
echo $status;
exit;
}
else
{
$contents = file_get_contents(e_TEMP.$localfile);
if(strlen($contents) < 400)
{
echo "<script>alert('".$tp->toJS($contents)."')</script>";
return;
}
}
chmod(e_TEMP.$localfile, 0755);
require_once(e_HANDLER."pclzip.lib.php");
$archive = new PclZip(e_TEMP.$localfile);
$unarc = ($fileList = $archive -> extract(PCLZIP_OPT_PATH, e_TEMP, PCLZIP_OPT_SET_CHMOD, 0755)); // Store in TEMP first.
$dir = $this->getRootFolder($unarc);
$destpath = ($type == 'theme') ? e_THEME : e_PLUGIN;
$typeDiz = ucfirst($type);
@copy(e_TEMP.$localfile, e_BACKUP.$dir.".zip"); // Make a Backup in the system folder.
if($dir && is_dir($destpath.$dir))
{
$alert = $tp->toJS(ucfirst($type)." Already Installed".$destpath.$dir);
echo "<script>alert('".$alert."')</script>";
echo "Already Installed";
@unlink(e_TEMP.$localfile);
exit;
}
if($dir == '')
{
echo "<script>alert('Couldn\'t detect the root folder in the zip.')</script>";
@unlink(e_TEMP.$localfile);
exit;
}
if(is_dir(e_TEMP.$dir))
{
$status = "Unzipping...";
if(!rename(e_TEMP.$dir,$destpath.$dir))
{
$alert = $tp->toJS("Couldn't Move ".e_TEMP.$dir." to ".$destpath.$dir." Folder");
echo "<script>alert('".$alert."')</script>";
@unlink(e_TEMP.$localfile);
exit;
}
$alert = $tp->toJS("Download Complete!");
echo "<script>alert('".$alert."')</script>";
// $dir = basename($unarc[0]['filename']);
// $plugPath = preg_replace("/[^a-z0-9-\._]/", "-", strtolower($dir));
$status = "Done"; // ADMIN_TRUE_ICON;
}
else
{
$status = ADMIN_FALSE_ICON."<br /><a href='".$remotefile."'>Download Manually</a>";
if(E107_DEBUG_LEVEL > 0)
{
$status .= print_a($unarc, true);
}
}
echo $status;
@unlink(e_TEMP.$localfile);
exit;
}
// Grab a remote file and save it in the /temp directory. requires CURL
function getRemoteFile($remote_url, $local_file, $type='temp')
{
$path = ($type == 'media') ? e_MEDIA : e_TEMP;
$fp = fopen($path.$local_file, 'w'); // media-directory is the root.
$cp = curl_init($remote_url);
curl_setopt($cp, CURLOPT_FILE, $fp);
curl_setopt($cp, CURLOPT_REFERER, e_REQUEST_HTTP);
curl_setopt($cp, CURLOPT_HEADER, 0);
curl_setopt($cp, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)");
curl_setopt($cp, CURLOPT_COOKIEFILE, e_SYSTEM.'cookies.txt');
$buffer = curl_exec($cp);
curl_close($cp);
fclose($fp);
return ($buffer) ? true : false;
}
}
class e_marketplace_adapter_wsdl extends e_marketplace_adapter_abstract
{
/**
* e107.org WSDL URL
* @var string
*/
protected $wsdl = 'http://e107.org/e107_plugins/addons/service.php?wsdl';
/**
* Soap client instance
* @var SoapClient
*/
protected $client = null;
public function __construct()
{
e107_ini_set('soap.wsdl_cache_enabled', 0);
e107_ini_set('soap.wsdl_cache_ttl', 0);
$options = array(
"trace" => true,
'exception' => true,
"uri" => "http://server.soap.e107.inc.com/",
'cache_wsdl' => WSDL_CACHE_NONE,
'connection_timeout' => 10,
);
$this->client = new SoapClient($this->wsdl, $options);
if(function_exists('xdebug_disable'))
{
//xdebug_disable();
}
}
public function test($input)
{
try
{
$res = $this->client->get_echo($input);
}
catch(Exception $e)
{
$res = $e->getMessage();
}
return $res;
}
/**
* Generic call method
*/
public function _call($method, $args, $apply = true)
{
$result = array(
'data' => null,
//'error'=> array('code' => 0, 'message' => null)
);
$ret = null;
// authorize on every call, service class decides what to do on every method call
$auth = new stdClass;
$auth->authKey = $this->getAuthKey();
$header = new SoapHeader('http://e107.org/services/auth', 'checkAuthHeader', $auth);
try
{
$this->client->__setSoapHeaders(array($header));
if(is_array($args) && $apply)
{
$ret = call_user_func_array(array($this->client, $method), $args);
}
else $ret = $this->client->$method($args);
if(isset($ret['exception']))
{
$result['error']['message'] = "API Exception [call::{$method}]: (#".$ret['exception']['code'].") ".$ret['exception']['message'];
$result['error']['code'] = $ret['exception']['code'];
unset($ret['exception']);
}
$result['data'] = $ret['data'];
}
catch(SoapFault $e)
{
$result['error']['message'] = "SoapFault Exception [call::{$method}]: (#".$e->getCode().") ".$e->getMessage();
$result['error']['code'] = 'SOAP_'.$e->getCode();
}
catch(Exception $e)
{
$result['error']['message'] = "Generic Exception [call::{$method}]: (#".$e->getCode().") ".$e->getMessage();
$result['error']['code'] = 'GEN_'.$e->getCode();
}
if(E107_DEBUG_LEVEL)
{
print_a($this->client->__getLastRequest());
}
return $result;
}
/**
* Public call method
*/
public function call($method, $data, $apply = true)
{
return $this->_call($method, $data, $apply);
}
/**
* Prepare the result, not needed for WSDL
* SUBJECT OF REMOVAL
*/
public function fetch($method, &$result)
{
if(isset($result['error']))
{
return $result;
}
switch ($method)
{
case 'getList':
break;
}
return $result;
}
public function __destruct()
{
$this->client = null;
//echo "SOAP Client destroyed", PHP_EOL;
}
}
class e_marketplace_adapter_xmlrpc extends e_marketplace_adapter_abstract
{
/**
* e107.org XML-rpc service
* @var xmlClass
*/
protected $url = 'http://e107.org/e107_plugins/addons/xservice.php';
public function __construct()
{
}
public function test($input)
{
}
public function call($method, $data, $apply = true)
{
$client = $this->client();
// settings based on current method
$this->prepareClient($client);
// authorization data
$data['auth'] = $this->getAuthKey();
$data['action'] = $method;
// build the request query
$qry = str_replace(array('s%5B', '%5D'), array('[', ']'), http_build_query($data, null, '&'));
$url = $this->url.'?'.$qry;
// call it
$result = $client->loadXMLfile($url,'advanced');
//var_dump($url, $result);
return $result;
}
public function fetch($method, &$result)
{
}
public function prepareClient($method, &$client)
{
switch ($method)
{
case 'getList':
$client->setOptArrayTags('plugin');
break;
}
}
public function client()
{
return e107::getXml(false);
}
}

View File

@@ -413,7 +413,7 @@ class e_form
if($localonly == true) if($localonly == true)
{ {
$text = "<input class='tbox' style='width:80%' id='{$idinput}' type='hidden' name='image' size='40' value='{$curVal}' maxlength='100' />"; $text = "<input class='tbox' style='width:80%' id='{$idinput}' type='hidden' name='image' size='40' value='{$curVal}' maxlength='100' />";
$text .= "<img src='".$img."' id='{$previnput}' class='img-rounded e-expandit e-tip avatar' style='cursor:pointer; width:".$pref['im_width']."px; height:".$pref['im_height']."px' title='Choose an avatar for yourself'/>"; // TODO LAN $text .= "<img src='".$img."' id='{$previnput}' class='img-rounded e-expandit e-tip avatar' style='cursor:pointer; width:".$pref['im_width']."px; height:".$pref['im_height']."px' title='Click on the avatar to change it'/>"; // TODO LAN
} }
else else
{ {

View File

@@ -63,36 +63,26 @@ class e_menu
return; return;
} }
$menu_layout_field = THEME_LAYOUT!=e107::getPref('sitetheme_deflayout') ? THEME_LAYOUT : "";
// e107::getCache()->CachePageMD5 = md5(e_LANGUAGE.$menu_layout_field); // Disabled by line 93 of Cache class.
//FIXME add a function to the cache class for this.
$menu_data = e107::getCache()->retrieve_sys("menus_".USERCLASS_LIST."_".md5(e_LANGUAGE.$menu_layout_field)); // print_a($eMenuArea);
// $menu_data = e107::getCache()->retrieve_sys("menus_".USERCLASS_LIST); if($_SERVER['E_DEV_MENU'] == 'true') // New in v2.x
$menu_data = e107::getArrayStorage()->ReadArray($menu_data);
$eMenuArea = array();
// $eMenuList = array();
// $eMenuActive = array(); // DEPRECATED
if(!is_array($menu_data))
{ {
$menu_qry = 'SELECT * FROM #menus WHERE menu_location > 0 AND menu_class IN ('.USERCLASS_LIST.') AND menu_layout = "'.$menu_layout_field.'" ORDER BY menu_location,menu_order'; $layouts = e107::getPref('menu_layouts');
if(e107::getDb()->db_Select_gen($menu_qry)) if(!is_array($layouts))
{ {
while($row = e107::getDb()->db_Fetch()) $converted = $this->convertMenuTable();
e107::getConfig('core')->set('menu_layouts', $converted)->save();
}
$eMenuArea = $this->getData(THEME_LAYOUT);
}
else // the old v1.x way.
{ {
$eMenuArea[$row['menu_location']][] = $row; $eMenuArea = $this->getDataLegacy();
}
}
$menu_data['menu_area'] = $eMenuArea;
$menuData = e107::getArrayStorage()->WriteArray($menu_data, false);
// e107::getCache()->set_sys('menus_'.USERCLASS_LIST, $menuData);
e107::getCache()->set_sys('menus_'.USERCLASS_LIST.'_'.md5(e_LANGUAGE.$menu_layout_field), $menuData);
}
else
{
$eMenuArea = $menu_data['menu_area'];
} }
$total = array(); $total = array();
foreach($eMenuArea as $area => $val) foreach($eMenuArea as $area => $val)
{ {
@@ -110,9 +100,146 @@ class e_menu
} }
} }
} }
e107::getRender()->eMenuTotal = $total; e107::getRender()->eMenuTotal = $total;
} }
/**
* Convert from v1.x e107_menu table to v2.x $pref format.
*/
function convertMenuTable()
{
$sql = e107::getDb();
$sql->select('menus','*','menu_location !=0 ORDER BY menu_location,menu_order');
$data = array();
while($row = $sql->fetch())
{
$layout = vartrue($row['menu_layout'],'default');
$location = $row['menu_location'];
$data[$layout][$location][] = array('name'=>$row['menu_name'],'class'=> intval($row['menu_class']),'path'=>$row['menu_path'],'pages'=>$row['menu_pages'],'parms'=>$row['menu_parms']);
}
return $data;
}
/**
* V2 Menu Re-Write - retrieve Menu data from $pref['menu_layouts']
*/
protected function getData($layout)
{
$pref = e107::getPref('menu_layouts');
if(!varset($pref[$layout]))
{
return array();
}
foreach($pref[$layout] as $area=>$v);
{
$c = 1;
foreach($v as $val)
{
$class = intval($val['class']);
if(!check_class($class))
{
continue;
}
$ret[$area][] = array(
'menu_id' => $c,
'menu_name' => $val['name'],
'menu_location' => $area,
'menu_class' => $class,
'menu_order' => $c,
'menu_pages' => $val['pages'],
'menu_path' => $val['path'],
'menu_layout' => '',
'menu_parms' => $val['parms']
);
$c++;
}
}
return $ret;
}
/**
* @DEPRECATED
* Legacy Function to retrieve Menu data from tables. - ie. the old v1.x method.
*/
private function getDataLegacy()
{
$sql = e107::getDb();
$menu_layout_field = THEME_LAYOUT!=e107::getPref('sitetheme_deflayout') ? THEME_LAYOUT : "";
// e107::getCache()->CachePageMD5 = md5(e_LANGUAGE.$menu_layout_field); // Disabled by line 93 of Cache class.
//FIXME add a function to the cache class for this.
$menu_data = e107::getCache()->retrieve_sys("menus_".USERCLASS_LIST."_".md5(e_LANGUAGE.$menu_layout_field));
// $menu_data = e107::getCache()->retrieve_sys("menus_".USERCLASS_LIST);
$menu_data = e107::getArrayStorage()->ReadArray($menu_data);
$eMenuArea = array();
// $eMenuList = array();
// $eMenuActive = array(); // DEPRECATED
if(!is_array($menu_data))
{
$menu_qry = 'SELECT * FROM #menus WHERE menu_location > 0 AND menu_class IN ('.USERCLASS_LIST.') AND menu_layout = "'.$menu_layout_field.'" ORDER BY menu_location,menu_order';
if($sql->gen($menu_qry))
{
while($row = $sql->fetch())
{
$eMenuArea[$row['menu_location']][] = $row;
}
}
$menu_data['menu_area'] = $eMenuArea;
$menuData = e107::getArrayStorage()->WriteArray($menu_data, false);
// e107::getCache()->set_sys('menus_'.USERCLASS_LIST, $menuData);
e107::getCache()->set_sys('menus_'.USERCLASS_LIST.'_'.md5(e_LANGUAGE.$menu_layout_field), $menuData);
}
else
{
$eMenuArea = $menu_data['menu_area'];
}
return $eMenuArea;
}
/** /**
* Check visibility of a menu against URL * Check visibility of a menu against URL
* *

View File

@@ -18,6 +18,10 @@ if (!defined('e107_INIT')) { exit; }
/* /*
* Type defines * Type defines
* XXX - convert to eMessage class constants * XXX - convert to eMessage class constants
* @note 07 May 2013: These have been converted to eMessage class constants!
* Example: eMessage::E_MESSAGE_SUCCESS is 'success'
* -- Deltik
* P.S. Now somebody needs to get rid of these universal constants...
*/ */
define('E_MESSAGE_INFO', 'info'); define('E_MESSAGE_INFO', 'info');
define('E_MESSAGE_SUCCESS', 'success'); define('E_MESSAGE_SUCCESS', 'success');
@@ -39,6 +43,17 @@ define('E_MESSAGE_NODISPLAY', 'nodisplay'); // Appears to be needed by update_ro
*/ */
class eMessage class eMessage
{ {
/**
* Type defines
*/
const E_INFO = 'info';
const E_SUCCESS = 'success';
const E_WARNING = 'warning';
const E_ERROR = 'error';
const E_DEBUG = 'debug';
const E_NODISPLAY = 'nodisplay';
/** /**
* System Message Array * System Message Array
* in format [type][message_stack] = array(message[, ...]) * in format [type][message_stack] = array(message[, ...])
@@ -172,7 +187,7 @@ class eMessage
* @param boolean $session * @param boolean $session
* @return eMessage * @return eMessage
*/ */
public function add($message, $type = E_MESSAGE_INFO, $session = false) public function add($message, $type = eMessage::E_INFO, $session = false)
{ {
if(empty($message)) return $this; if(empty($message)) return $this;

View File

@@ -3485,7 +3485,7 @@ class e_admin_tree_model extends e_front_tree_model
$idstr = implode(', ', $ids); $idstr = implode(', ', $ids);
$sql = e107::getDb(); $sql = e107::getDb();
$res = $sql->db_Delete($this->getModelTable(), $this->getFieldIdName().' IN ('.$idstr.')'); $res = $sql->db_Delete($this->getModelTable(), $this->getFieldIdName().' IN (\''.$idstr.'\')');
$this->_db_errno = $sql->getLastErrorNumber(); $this->_db_errno = $sql->getLastErrorNumber();
$this->_db_errmsg = $sql->getLastErrorText(); $this->_db_errmsg = $sql->getLastErrorText();
$modelCacheCheck = $this->getParam('clearModelCache'); $modelCacheCheck = $this->getParam('clearModelCache');
@@ -3493,7 +3493,7 @@ class e_admin_tree_model extends e_front_tree_model
{ {
if($sql->getLastErrorNumber()) if($sql->getLastErrorNumber())
{ {
$this->addMessageError('SQL Delete Error', $session_messages); //TODO - Lan $this->addMessageError('SQL Delete Error: ' . $sql->getLastQuery(), $session_messages); //TODO - Lan
$this->addMessageDebug('SQL Error #'.$sql->getLastErrorNumber().': '.$sql->getLastErrorText()); $this->addMessageDebug('SQL Error #'.$sql->getLastErrorNumber().': '.$sql->getLastErrorText());
} }
} }

View File

@@ -38,8 +38,9 @@ if(file_exists(THEME.'banner_template.php'))
} }
else else
{ {
require_once (e_THEME.'templates/banner_template.php'); require_once (e_PLUGIN.'banner/banner_template.php');
} }
$menu_pref = e107::getConfig('menu')->getPref(''); $menu_pref = e107::getConfig('menu')->getPref('');
if(isset($campaign)) if(isset($campaign))

View File

@@ -311,7 +311,7 @@ class private_message
{ {
$ret .= str_replace(array('--GOOD--', '--FAIL--'), $aCount, LAN_PM_71).'<br />'; $ret .= str_replace(array('--GOOD--', '--FAIL--'), $aCount, LAN_PM_71).'<br />';
} }
$sq->delete('private_msg', 'pm_id = '.$pmid); $sql->delete('private_msg', 'pm_id = '.$pmid);
} }
else else
{ {

View File

@@ -174,6 +174,7 @@ $ADMIN_HEADER = '<div class="navbar '.$inverse.' navbar-fixed-top">
{ADMIN_NAVIGATION=no-main} {ADMIN_NAVIGATION=no-main}
</div> </div>
<div class="dropdown nav pull-right navbar-text "> <div class="dropdown nav pull-right navbar-text ">
<li>{ADMIN_COREUPDATE=icon}</li>
{ADMIN_PM} {ADMIN_PM}
{ADMIN_NAVIGATION=home} {ADMIN_NAVIGATION=home}
{ADMIN_NAVIGATION=language} {ADMIN_NAVIGATION=language}
@@ -213,7 +214,9 @@ $ADMIN_HEADER .= '<div class="container-fluid">
{SETSTYLE=none} {SETSTYLE=none}
</div> </div>
<div class="span10" id="right-panel" >'; <div class="span10" id="right-panel" >
{ADMIN_COREUPDATE=alert}
';
$ADMIN_FOOTER = ' $ADMIN_FOOTER = '

View File

@@ -778,7 +778,7 @@ function render_email($userInfo, $preview = FALSE)
} }
else else
{ {
require_once(e_THEME.'templates/email_template.php'); require_once(e_CORE.'templates/email_template.php');
} }
/* Inline images now handled automatically - just include in email template with an absolute link /* Inline images now handled automatically - just include in email template with an absolute link