You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
ryzom-core/code/web/api/common/actionPage.php

162 lines
4.4 KiB
PHTML

<?php
/* Copyright (C) 2012 Winch Gate Property Limited
*
* This file is part of ryzom_api.
* ryzom_api is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* ryzom_api is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with ryzom_app. If not, see <http://www.gnu.org/licenses/>.
*/
class ryActionClass {
public $classname;
public $instance;
public $args;
public $requires;
function __construct($classname, $instance, $args, $requires) {
$this->classname = $classname;
$this->instance = $instance;
$this->args = $args;
$this->requires = $requires;
}
}
class ryActionPage {
private static $classesArgs = array();
private static $myClasses = array();
private static $aliases = array();
private static $messages;
private static $haveMessage;
protected static $id;
public $instanceName;
public $myMethods = array();
function __construct() {
}
function addMethods($child_class) {
if (is_array($child_class)) {
foreach ($child_class as $c_class)
$this->myMethods = array_merge($this->myMethods, get_class_methods($c_class));
} else {
$this->myMethods = get_class_methods($child_class);
}
}
static function addClass($name, $classname, $args=array(), $requires=NULL) {
self::$myClasses[$name] = new ryActionClass($classname, NULL, $args, $requires);
}
static function addAlias($aliasname, $name) {
self::$aliases[$aliasname] = $name;
}
static function initInstance($listener) {
$i = self::$myClasses[$listener];
if (!$i->instance) {
// requires
if ($i->requires) {
self::initInstance($i->requires);
}
if ($i->args)
$i->instance = new $i->classname($listener, $i->args);
else
$i->instance = new $i->classname($listener);
$i->instance->addMethods($i->classname);
$i->instance->instanceName = $listener;
}
return $i->instance;
}
static function getInstance($listener) {
return self::initInstance($listener);
}
static function _addMSG($type='OK', $message='') {
self::$messages[] = array($type, $message);
return '';
}
function addMSG($type='OK', $action='', $message='') {
self::$messages[] = array($type, $message);
$this->haveMessage = $action;
return '';
}
static function getMSGs() {
return self::$messages;
}
static function call($action, $url_params) {
$action_params = explode('_', $action);
if (count($action_params) != 2)
return self::_addMSG('ERR', 'Action call error : bad params of ['.$action.']');
list($listener, $call) = $action_params;
if (array_key_exists($listener,self::$aliases))
$listener = self::$aliases[$listener];
if (!array_key_exists($listener, self::$myClasses))
return self::_addMSG('ERR', 'Action call error : class ['. $listener .'] not found');
$i = self::initInstance($listener);
if (in_array('action'.$call, $i->myMethods)) {
$i->haveMessage = NULL;
$ret = call_user_func(array($i, 'action'.$call), $url_params);
if (!isset($_SESSION['last_action']) or $action != $_SESSION['last_action'])
$_SESSION['last_action'] = $action;
$msg = $i->haveMessage;
if ($msg and ($msg != $action)) {
$ret = self::call($msg, $url_params);
return self::_addMSG('OK', $ret);
}
return self::_addMSG('OK', $ret);
} else
return self::_addMSG('ERR', 'Action call error : action ['. $call .'] of ['. $listener .'] not found');
}
}
function callAction($action) {
$c = '';
ryActionPage::call($action, ryzom_get_params());
$msgs = ryActionPage::getMSGs();
foreach ($msgs as $msg) {
if ($msg[0] == 'HEADER')
$c .= $msg[1];
}
foreach ($msgs as $msg) {
if ($msg[0] == 'ERR')
$c .= _s('message error', $msg[1]);
else if ($msg[0] == 'MSG')
$c .= _s('message', $msg[1]);
else if ($msg[0] == 'WARNING')
$c .= _s('message warning', $msg[1]);
else if ($msg[0] != 'HEADER')
$c .= $msg[1];
}
return $c;
}
?>