caching = false;
$this->config_overwrite = false;
$this->use_sub_dirs = false;
$this->template_dir = $globals->spoolroot . '/templates/';
$this->compile_dir = $globals->spoolroot . '/spool/templates_c/';
array_unshift($this->plugins_dir,
$globals->coreroot . '/plugins/',
$globals->spoolroot . '/plugins/');
$this->config_dir = $globals->spoolroot . '/configs/';
$this->compile_check = !empty($globals->debug) || $globals->smarty_autocompile;
$this->_errors = array('errors' => array());
$this->_jsonVars = array();
$this->_failure = false;
if ($globals->mode != 'rw') {
$this->trigError("En raison d'une maintenance, une partie des fonctionnalités du site est"
. " actuellement désactivée, en particulier aucune donnée ne sera sauvegardée");
}
$this->register_prefilter('at_to_globals');
$this->register_prefilter('get_class_constants');
}
// }}}
// {{{ function changeTpl()
public function changeTpl($tpl, $type = SKINNED)
{
$this->_tpl = $tpl;
$this->_page_type = $type;
$this->assign('pl_tpl', $tpl);
}
// }}}
// {{{ function getCoreTpl()
public static function getCoreTpl($tpl)
{
global $globals;
return $globals->coreroot . '/templates/' . $tpl;
}
// }}}
// {{{ function coreTpl()
/** Use a template from the core.
*/
public function coreTpl($tpl, $type = SKINNED)
{
global $globals;
$this->changeTpl(self::getCoreTpl($tpl), $type);
}
// }}}
// {{{ function raw()
public function raw()
{
global $globals;
$this->assign('globals', $globals);
return $this->fetch($this->_tpl);
}
// }}}
// {{{ function _run()
protected function _run($skin)
{
global $globals, $platal, $TIME_BEGIN;
Platal::session()->close();
$this->register_prefilter('trimwhitespace');
$this->register_prefilter('form_force_encodings');
$this->register_prefilter('wiki_include');
$this->register_prefilter('core_include');
$this->register_prefilter('if_rewrites');
$this->assign('pl_triggers', $this->_errors);
$this->assign('pl_errors', $this->nb_errs());
$this->assign('pl_failure', $this->_failure);
$this->assign_by_ref('platal', $platal);
$this->assign_by_ref('globals', $globals);
if (Env::has('json') && count($this->_jsonVars)) {
return $this->jsonDisplay();
}
$display = Env::s('display');
if ($display == 'light' && $this->_page_type == SKINNED) {
$this->_page_type = SIMPLE;
} elseif ($display == 'raw') {
$this->_page_type = NO_SKIN;
} elseif ($display == 'full') {
$this->_page_type = SKINNED;
}
if ($this->_page_type == SIMPLE) {
$this->assign('simple', true);
} else {
$this->assign('simple', false);
}
switch ($this->_page_type) {
case NO_SKIN:
if (!($globals->debug & DEBUG_SMARTY)) {
error_reporting(0);
}
$this->display($this->_tpl);
exit;
case SIMPLE:
case SKINNED:
$this->register_modifier('escape_html', 'escape_html');
$this->default_modifiers = Array('@escape_html');
}
if (S::i('auth') <= AUTH_PUBLIC) {
$this->register_outputfilter('hide_emails');
}
header("Accept-Charset: utf-8");
if (Env::v('forceXml')) {
pl_content_headers("text/xml");
}
if (!$globals->debug) {
error_reporting(0);
$this->display($skin);
pl_print_errors(true);
exit;
}
$this->assign('validate', true);
if (!($globals->debug & DEBUG_SMARTY)) {
error_reporting(0);
}
$START_SMARTY = microtime(true);
$result = $this->fetch($skin);
$ttime = sprintf('Temps total: %.02fs (Smarty %.02fs) - Mémoire totale : %dKo
',
microtime(true) - $TIME_BEGIN, microtime(true) - $START_SMARTY,
memory_get_peak_usage(true) / 1024);
if ($globals->debug & DEBUG_BT) {
PlBacktrace::clean();
$this->assign_by_ref('backtraces', PlBacktrace::$bt);
$result = str_replace('@@BACKTRACE@@',
$this->fetch(self::getCoreTpl('backtrace.tpl')),
$result);
} else {
$result = str_replace('@@BACKTRACE@@', '', $result);
}
$replc = "VALIDATION HTML INACTIVE
";
if ($globals->debug & DEBUG_VALID) {
global $platal;
$fd = fopen($this->compile_dir."/valid.html","w");
fwrite($fd, $result);
fclose($fd);
$replc = 'VALIDATION HTML EN COURS'
. ''
. '
';
}
echo str_replace("@HOOK@", $ttime.$replc, $result);
exit;
}
abstract public function run();
// }}}
// {{{ function nb_errs()
public function nb_errs()
{
return count($this->_errors['errors']);
}
// }}}
// {{{ function trig()
private function trig($msg, $type = 'errors')
{
if (!isset($this->_errors[$type])) {
$this->_errors[$type] = array();
}
$this->_errors[$type][] = $msg;
}
public function trigError($msg)
{
$this->trig($msg, 'errors');
}
public function trigWarning($msg)
{
$this->trig($msg, 'warnings');
}
public function trigSuccess($msg)
{
$this->trig($msg, 'success');
}
// }}}
// {{{ function trigRedirect
// Acts as trig(), but replaces the template with a simple one displaying
// the error messages and a "continue" link.
private function trigRedirect($msg, $continue, $type = 'errors')
{
$this->trig($msg, $type);
$this->coreTpl('msgredirect.tpl');
$this->assign('continue', $continue);
$this->run();
}
public function trigErrorRedirect($msg, $continue)
{
$this->trigRedirect($msg, $continue, 'errors');
}
public function trigWarningRedirect($msg, $continue)
{
$this->trigRedirect($msg, $continue, 'warnings');
}
public function trigSuccessRedirect($msg, $continue)
{
$this->trigRedirect($msg, $continue, 'success');
}
// }}}
// {{{ function kill()
public function kill($msg, $type = 'errors')
{
// PHP is used on command line... do not run the whole page stuff.
if (php_sapi_name() == 'cli') {
echo $msg . "\n";
exit(-1);
}
global $platal;
$this->trig($msg, $type);
$this->_failure = true;
$this->run();
}
public function killError($msg)
{
$this->kill($msg, 'errors');
}
public function killWarning($msg)
{
$this->kill($msg, 'warnings');
}
public function killSuccess($msg)
{
$this->kill($msg, 'success');
}
// }}}
// {{{ function setTitle
public function setTitle($title)
{
global $globals;
if (isset($globals->core->sitename)) {
$title = $globals->core->sitename . ' :: ' . $title;
}
$this->assign('pl_title', $title);
}
// }}}
// {{{ function addJsLink
public function addJsLink($filename, $internal = true, $static_content = true)
{
if ($internal) {
if ($static_content) {
$this->append('pl_js', pl_static_content_path("javascript/", $filename));
} else {
$this->append('pl_js', "javascript/$filename");
}
} else {
$this->append('pl_js', $filename);
}
}
// }}}
// {{{ function addCssLink
public function addCssLink($path)
{
$this->append('pl_css', $path);
}
// }}}
// {{{ function addLink
public function addLink($rel, $path)
{
$this->append('pl_link', array('rel' => $rel, 'href' => $path));
}
// }}}
// {{{ function addCssInline
public function addCssInline($css)
{
if (!empty($css)) {
$this->append('pl_inline_css', $css);
}
}
// }}}
// {{{ function setRssLink
public function setRssLink($title, $path)
{
$this->assign('pl_rss', array('title' => $title, 'href' => $path));
}
// }}}
// {{{ function jsonDisplay
protected function jsonDisplay()
{
pl_content_headers("text/javascript");
if (!empty(PlBacktrace::$bt)) {
$this->jsonAssign('pl_backtraces', PlBacktrace::$bt);
}
array_walk_recursive($this->_jsonVars, "escape_XDB");
$jsonbegin = Env::v('jsonBegin');
$jsonend = Env::v('jsonEnd');
if (Env::has('jsonVar')) {
$jsonbegin = Env::v('jsonVar').' = ';
$jsonend = ';';
} elseif (Env::has('jsonFunc')) {
$jsonbegin = Env::v('jsonFunc').'(';
$jsonend = ');';
}
echo $jsonbegin, json_encode($this->_jsonVars), $jsonend;
exit;
}
// }}}
public function runJSon()
{
pl_content_headers("text/javascript");
if (!empty(PlBacktrace::$bt)) {
$this->jsonAssign('pl_backtraces', PlBacktrace::$bt);
}
echo json_encode($this->_jsonVars);
exit;
}
// {{{ function jsonAssign
public function jsonAssign($var, $value)
{
$this->_jsonVars[$var] = $value;
}
// }}}
}
function escape_XDB(&$item, $key)
{
if ($item instanceof XDBIterator) {
$expanded = array();
while ($a = $item->next()) {
$expanded[] = $a;
}
$item = $expanded;
}
}
// {{{ function escape_html ()
/**
* default smarty plugin, used to auto-escape dangerous html.
*
* < --> <
* > --> >
* " --> "
* & not followed by some entity --> &
*/
function escape_html($string)
{
if (is_string($string)) {
return htmlspecialchars($string, ENT_QUOTES, 'UTF-8');
} else {
return $string;
}
}
// }}}
// {{{ function at_to_globals()
/**
* helper
*/
function _to_globals($s) {
global $globals;
$t = explode('.',$s);
if (count($t) == 1) {
return var_export($globals->$t[0],true);
} else {
return var_export($globals->$t[0]->$t[1],true);
}
}
/**
* compilation plugin used to import $globals confing through #globals.foo.bar# directives
*/
function at_to_globals($tpl_source, $smarty)
{
return preg_replace('/#globals\.([a-zA-Z0-9_.]+?)#/e', '_to_globals(\'\\1\')', $tpl_source);
}
// }}}
// {{{ function get_class_constants()
/**
* helper
*/
function _get_class_const($class, $const)
{
return var_export(constant($class . '::' . $const), true);
}
/**
* Compilation plugin used to import class constants through calls to #Class::CONSTANT#
*/
function get_class_constants($tpl_source, $smarty)
{
return preg_replace('/#([a-zA-Z0-9_]+)::([A-Z0-9_]+)#/e', '_get_class_const(\'\\1\',\'\\2\')', $tpl_source);
}
// }}}
// {{{ function trimwhitespace
function trimwhitespace($source, $smarty)
{
$tags = '(script|pre|textarea)';
preg_match_all("!<$tags.*?>.*?(\\1)>!ius", $source, $tagsmatches);
$source = preg_replace("!<$tags.*?>.*?(\\1)>!ius", "&&&tags&&&", $source);
// remove all leading spaces, tabs and carriage returns NOT
// preceeded by a php close tag.
$source = preg_replace('/((?)\n)[\s]+/m', '\1', $source);
$source = preg_replace("!&&&tags&&&!e", 'array_shift($tagsmatches[0])', $source);
return $source;
}
// }}}
// {{{ function wiki_include
function wiki_include($source, $smarty)
{
global $globals;
return preg_replace('/\{include( [^}]*)? wiki=([^} ]+)(.*?)\}/ui',
'{include\1 file="' . $globals->spoolroot . '/spool/wiki.d/cache_\2.tpl"\3 included=1}',
$source);
}
function core_include($source, $smarty)
{
global $globals;
return preg_replace('/\{include( [^}]*)? core=([^} ]+)(.*?)\}/ui',
'{include\1 file="' . $globals->coreroot . '/templates/\2"\3}',
$source);
}
// }}}
//{{{ function hasPerm
function if_rewrites($source, $smarty)
{
$perms = 'isset($smarty.session.user|smarty:nodefaults) && $smarty.session.user';
return preg_replace(array('/\{(else)?if([^}]*) (\!?)hasPerms?\(([^)]+)\)([^}]*)\}/',
'/\{(else)?if([^}]*) (\!?)t\(([^)]+)\)([^}]*)\}/'),
array('{\1if\2 \3(' . $perms . '->checkPerms(\4))\5}',
'{\1if\2 \3(isset(\4|smarty:nodefaults) && (\4|smarty:nodefaults))\5}'),
$source);
}
// }}}
// {{{
function form_force_encodings($source, $smarty)
{
return preg_replace('/