php__memcache_ui/Memcache_UI/Core/Context.inc
2016-03-05 09:42:27 +01:00

307 lines
7.7 KiB
PHP

<?php
namespace Memcache_UI\Core {
class Context {
protected $logLevelClasses = NULL;
/**
* Base URL for the script, for HTTP paths
*
* @var string
*/
protected $base;
/**
* Base directory for the script, for file operations
*/
protected $directory;
/**
* Graphics context
*
* @var GraphicsContext
*/
protected $gc = NULL;
/**
* Locale with encoding
*
* This is a static because a page runs for only one locale.
*/
protected static $locale = 'en_US.UTF8';
/**
* Logging level, as per RFC5424
*
* @link http://php.net/network.constants.php
*
* @var integer
*/
protected $logLevel = NULL;
/**
* Messages for display.
*
* @var array
*/
protected $messages = array();
/**
* Requested path: <$PHP_SELF>?q=a/b/c
*
* @var string
*/
protected $path = NULL;
/**
* Tidy the output ?
*
* @var boolean
*/
protected $tidy = NULL;
/**
* User information: logged or not ?
*
* @var boolean
*/
protected $user = FALSE;
function __construct() {
$this->initLocale(); // Check extension and initialize locale
$this->getTidy(); // Needed to check optional extension
}
function __destruct() {
if (!empty($this->messages)) {
$ret = (string) new Element('pre', array('class' => array('messages')),
implode("\n", $this->getMessage(TRUE)));
echo $ret;
}
}
function __toString() {
$ret = '<pre>' . print_r($this, TRUE) . '</pre>';
return $ret;
}
/**
* Get the base path where the script is located.
*
* This is helpful to locate other files using paths relative to the install.
*/
public function getBase() {
if (!isset($this->base)) {
$this->base = dirname($_SERVER['SCRIPT_NAME']);
if ($this->base == '/') {
$this->base = '';
}
}
return $this->base;
}
public function getDirectory() {
if (!isset($this->directory)) {
$this->directory = dirname($_SERVER['SCRIPT_FILENAME']);
}
return $this->directory;
}
public function getLogLevel() {
if (!isset($this->logLevel)) {
$usLogLevel = NULL;
foreach ($_GET as $key => $value) {
if (strtolower($key) === 'loglevel') {
$usLogLevel = (int) $value;
break;
}
}
if (!isset($usLogLevel)) {
$usLogLevel = LOG_NOTICE;
}
if ($usLogLevel < LOG_EMERG) {
$this->logLevel = LOG_EMERG;
}
elseif ($usLogLevel > LOG_DEBUG) {
$this->logLevel = LOG_DEBUG;
}
else {
$this->logLevel = $usLogLevel; // We now know it to be safe
}
}
return $this->logLevel;
}
public function getLogLevelClass($logLevel) {
if (!isset($this->logLevelClasses)) {
$this->logLevelClasses = array(
LOG_EMERG => 'error',
LOG_ALERT => 'error',
LOG_CRIT => 'error',
LOG_ERR => 'error',
LOG_WARNING => 'warning',
LOG_NOTICE => 'warning',
LOG_INFO => 'status',
LOG_DEBUG => 'status',
);
}
if ($logLevel < LOG_EMERG) {
$logLevel = LOG_EMERG;
}
elseif ($logLevel > LOG_DEBUG) {
$logLevel = LOG_DEBUG;
}
return $this->logLevelClasses[$logLevel];
}
public function getMessage($clear = FALSE) {
$ret = $this->messages;
if ($clear) {
$this->messages = array();
}
return $ret;
}
/**
* Return the requested path.
*
* @param string $path
*/
public function getPath() {
if (!isset($this->path)) {
$this->path = empty($_GET['q']) ? '' : $_GET['q'];
}
return $this->path;
}
/**
* Return the "tidy" status.
*
* Will only be TRUE if requested (possibly by default) and extension is
* loaded. A warning will be generated if tidy is requested but extension is
* not loaded.
*/
public function getTidy() {
static $notified = FALSE;
if (!isset($this->tidy)) {
$this->tidy = TRUE;
foreach ($_GET as $key => $value) {
if (strtolower($key) === 'tidy') {
$this->tidy = !!$value;
break;
}
}
if (!$notified && $this->tidy && !extension_loaded('tidy')) {
$this->setMessage(t('Extension @tidy requested but missing: output formatting unavailable.', array(
'@tidy' => 'tidy',
)), LOG_WARNING);
$notified = TRUE;
$this->tidy = FALSE;
}
}
return $this->tidy;
}
/**
* Initialize the locale based on the user Accept-Language header.
*
* @TODO support "xx" form, and not just "xx_YY".
* @TODO support more platforms. UNIX and MacOS X do not handle locales like Linux
*
* @link @link http://www.php.net/manual/fr/function.bind-textdomain-codeset.php#42631
*
* @return void
*/
protected function initLocale() {
static $notified = FALSE;
if (!$notified && !extension_loaded('intl')) {
// Do not invoke t() before initializing locale
$this->setMessage(strtr('Extension @intl requested but missing: translations unavailable.', array(
'@intl' => 'intl',
)), LOG_WARNING);
}
else {
$locale = \Locale::acceptFromHttp($_SERVER['HTTP_ACCEPT_LANGUAGE']);
$this->setMessage(strtr('Requested locale: @locale', array('@locale' => $locale)), LOG_DEBUG);
if (!empty($locale)) {
$matches = array();
$count = preg_match('/^([a-z]{2}_[A-Z]{2})(\.(\w+))*/', $locale, $matches);
if ($count) {
$count = count($matches);
}
$locale = $count >= 2
? $matches[1]
: 'en_US';
$codeset = $count >= 4
? $matches[3]
: 'UTF8';
self::$locale = $locale . '.' . $codeset;
setlocale(LC_ALL, self::$locale);
$domain = 'messages';
$translation_path = 'locale';
bindtextdomain($domain, $translation_path);
textdomain($domain);
bind_textdomain_codeset($domain, 'UTF8');
$this->setMessage(self::t('Locale: @locale', array('@locale' => self::$locale)), LOG_DEBUG);
}
}
}
/**
* Add a message to the messages list if it is above the current logging level.
*
* @param string $text
* @param integer $logLevel
*
* @return void
*/
public function setMessage($text, $logLevel = LOG_NOTICE) {
if ($logLevel <= $this->getlogLevel()) {
if (is_array($text) || (is_object($text) && !method_exists($text, '__toString'))) {
$this->messages[] = array('<pre>' . print_r($text, TRUE) . '</pre>', $logLevel);
}
else {
$this->messages[] = array((string) $text, $logLevel);
}
}
}
/**
* Wrapper to combine gettext translation and parameter substitution.
*
* @param string $message
* @param array $args
*
* @return string
*/
static function t($message, $args = array()) {
return strtr(gettext($message), $args);
}
/**
* Embryonic version of Drupal url().
*
* @param string $path
* @param array $options
* - No option currently recognized.
* - 'absolute' likely at some point
*
* @return string
*/
static function url($path = NULL, $options = array()) {
$options += array(
// 'absolute' => FALSE,
);
return $this->getBase() . '?q=' . urlencode($path);
}
}
}