* @package gulliver.system * @access private */ class Controller { /** * @var boolean debug switch for general purpose */ public $debug = null; /** * @var array - private array to store proxy data */ private $__data__ = array(); /** * @var object - private object to store the http request data */ private $__request__; /** * @var object - headPublisher object to handle the output */ private $headPublisher = null; /** * @var string - response type var. possibles values: json|plain */ private $responseType = ''; /** * Magic setter method * * @param string $name * @param string $value */ public function __set($name, $value) { $this->__data__[$name] = $value; } /** * Magic getter method * * @param string $name * @return string or NULL if the internal var doesn't exist */ public function __get($name) { if (array_key_exists($name, $this->__data__)) { return $this->__data__[$name]; } $trace = debug_backtrace(); trigger_error( 'Undefined property via __get(): ' . $name . ' in ' . $trace[0]['file'] . ' on line ' . $trace[0]['line'], E_USER_NOTICE); return null; } /** * Magic isset method * @param string $name */ public function __isset($name) { return isset($this->__data__[$name]); } /** * Magic unset method * @param string $name */ public function __unset($name) { unset($this->__data__[$name]); } /** * Set Response type method * @param string $type contains : json|plain */ public function setResponseType($type) { $this->responseType = $type; } /** * call to execute a internal proxy method and handle its exceptions * @param string $name */ public function call($name) { try { $result = $this->$name($this->__request__); if ($this->responseType == 'json') { print G::json_encode($result); } } catch (Exception $e) { if ($this->responseType != 'json') { $result->exception->class = get_class($e); $result->exception->code = $e->getCode(); $template = new TemplatePower(PATH_TEMPLATE . 'controller.exception.tpl'); $template->prepare(); $template->assign('controller', (function_exists('get_called_class') ? get_called_class() : 'Controller')); $template->assign('message', $e->getMessage()); $template->assign('file', $e->getFile()); $template->assign('line', $e->getLine()); $template->assign('trace', $e->getTraceAsString()); echo $template->getOutputContent(); } else { $result->success = false; $result->msg = $e->getMessage(); switch(get_class($e)) { case 'Exception': $error = "SYSTEM ERROR"; break; case 'PMException': $error = "PROCESSMAKER ERROR"; break; case 'PropelException': $error = "DATABASE ERROR"; break; case 'UserException': $error = "USER ERROR"; break; } $result->error = $error; $result->exception->class = get_class($e); $result->exception->code = $e->getCode(); print G::json_encode($result); } } } /** * Set the http request data * @param array $data */ public function setHttpRequestData($data) { if( is_array($data) ) { while( $var = each($data) ) $this->__request__->$var['key'] = $var['value']; } else $this->__request__ = $data; } /** * Get debug var. method * @param boolan $val boolean value for debug var. */ public function setDebug($val) { $this->debug = $val; } /** * Get debug var. method */ public function getDebug() { if ($this->debug === null) { $this->debug = defined('DEBUG') && DEBUG ? true : false; } return $this->debug; } /*** HeadPublisher Functions Binding ***/ /** * Include a particular extjs library or extension to the main output * @param string $srcFile path of a extjs library or extension * @param boolean $debug debug flag to indicate if the js output will be minifield or not * $debug: true -> the js content will be not minified (readable) * false -> the js content will be minified */ public function includeExtJSLib($srcFile, $debug=false) { $this->getHeadPublisher()->usingExtJs($srcFile, ($debug ? $debug : $this->getDebug())); } /** * Include a javascript file that is using extjs framework to the main output * @param string $srcFile path of javascrit file to include * @param boolean $debug debug flag to indicate if the js output will be minifield or not * $debug: true -> the js content will be not minified (readable) * false -> the js content will be minified */ public function includeExtJS($srcFile, $debug=false) { $this->getHeadPublisher()->addExtJsScript($srcFile, ($debug ? $debug : $this->getDebug())); } /** * Include a Html file to the main output * @param string $file path of html file to include to the main output */ public function setView($file) { $this->getHeadPublisher()->addContent($file); } /** * Set variables to be accesible by javascripts * @param string $name contains var. name * @param string $value conatins var. value */ public function setJSVar($name, $value) { $this->getHeadPublisher()->assign($name, $value); } /** * Set variables to be accesible by the extjs layout template * @param string $name contains var. name * @param string $value conatins var. value */ public function setVar($name, $value) { $this->getHeadPublisher()->sssignVar($name, $value); } /** * method to get the local getHeadPublisher object */ public function getHeadPublisher() { if (!is_object($this->headPublisher)) { $this->headPublisher = headPublisher::getSingleton(); } return $this->headPublisher; } }