Source for file jResponseXul.class.php
Documentation is available at jResponseXul.class.php
- <?php
- /**
- * @package jelix
- * @subpackage core_response
- * @author Laurent Jouanneau
- * @contributor Dominique Papin, Julien Issler
- * @copyright 2005-2009 Laurent Jouanneau, 2007 Dominique Papin
- * @copyright 2008 Julien Issler
- * @link http://www.jelix.org
- * @licence GNU Lesser General Public Licence see LICENCE file or http://www.gnu.org/licenses/lgpl.html
- */
-
- /**
- *
- */
- require_once(JELIX_LIB_PATH.'tpl/jTpl.class.php');
-
- /**
- * Generate a XUL window
- * @package jelix
- * @subpackage core_response
- * @see jResponse
- */
- class jResponseXul extends jResponse {
- /**
- * @var string
- */
- protected $_type = 'xul';
-
- /**
- * header content : list of overlay links
- * @var array
- */
- protected $_overlays = array ();
- /**
- * header content : list of css file links
- * @var array
- */
- protected $_CSSLink = array ();
- /**
- * header content : list of javascript file links
- * @var array
- */
- protected $_JSLink = array ();
- /**
- * header content : list of piece of javascript code
- * @var array
- */
- protected $_JSCode = array ();
-
- /**
- * root tag name.
- * could be override into child class for other xul document
- */
- protected $_root = 'window';
-
- /**
- * list of attributes and their values for the root element
- * @var array
- */
- public $rootAttributes= array();
-
- /**
- * Title of the window
- * @var string
- */
- public $title = '';
-
- /**
- * template engine to generate the window content
- * @var jTpl
- */
- public $body = null;
-
- /**
- * selector of the template to use
- * @var string
- */
- public $bodyTpl = '';
-
- /**
- * says if an event is sent to retrieve overlays url for the xul content
- * @var boolean
- */
- public $fetchOverlays=false;
-
- protected $_bodyTop = array();
- protected $_bodyBottom = array();
- protected $_headSent = false;
-
- /**
- * constructor
- */
- function __construct (){
- $this->body = new jTpl();
- parent::__construct();
- }
-
- /**
- * generate the xul content.
- * @return boolean true if it's ok
- */
- public function output(){
- $this->_headSent = false;
-
- $this->_httpHeaders['Content-Type']='application/vnd.mozilla.xul+xml;charset='.$GLOBALS['gJConfig']->charset;
- $this->sendHttpHeaders();
- $this->doAfterActions();
- if($this->bodyTpl != '')
- $this->body->meta($this->bodyTpl);
- $this->outputHeader();
- $this->_headSent = true;
- echo implode('',$this->_bodyTop);
- if($this->bodyTpl != '')
- $this->body->display($this->bodyTpl);
-
- if($this->hasErrors()){
- if($GLOBALS['gJConfig']->error_handling['showInFirebug']){
- echo '<script type="text/javascript">if(console){';
- foreach( $GLOBALS['gJCoord']->errorMessages as $e){
- switch ($e[0]) {
- case 'warning':
- echo 'console.warn("[warning ';
- break;
- case 'notice':
- echo 'console.info("[notice ';
- break;
- case 'strict':
- echo 'console.info("[strict ';
- break;
- case 'error':
- echo 'console.error("[error ';
- break;
- }
- $m = $e[2]. ($e[5]?"\n".$e[5]:"");
- echo $e[1],'] ',str_replace(array('"',"\n","\r","\t"),array('\"','\\n','\\r','\\t'),$m),' (',str_replace('\\','\\\\',$e[3]),' ',$e[4],')");';
- }
- echo '}else{alert("there are some errors, you should activate Firebug to see them");}</script>';
- }else{
- echo '<vbox id="jelixerror" style="border:3px solid red; background-color:#f39999;color:black;">';
- echo $this->getFormatedErrorMsg();
- echo '</vbox>';
- }
- }
-
- echo implode('',$this->_bodyBottom);
-
- if(count($GLOBALS['gJCoord']->logMessages)) {
- if(count($GLOBALS['gJCoord']->logMessages['response'])) {
- echo '<vbox id="jelixlog">';
- foreach($GLOBALS['gJCoord']->logMessages['response'] as $m) {
- echo '<description>',htmlspecialchars($m),'</description>';
- }
- echo '</vbox>';
- }
- if(count($GLOBALS['gJCoord']->logMessages['firebug'])) {
- echo '<script type="text/javascript">if(console){';
- foreach($GLOBALS['gJCoord']->logMessages['firebug'] as $m) {
- echo 'console.debug("',str_replace(array('"',"\n","\r","\t"),array('\"','\\n','\\r','\\t'),$m),'");';
- }
- echo '}else{alert("there are log messages, you should activate Firebug to see them");}</script>';
- }
- }
-
- echo '</',$this->_root,'>';
- return true;
- }
-
- public function outputErrors(){
- if(!$this->_headSent){
- header("HTTP/1.0 500 Internal Server Error");
- header('Content-Type: application/vnd.mozilla.xul+xml;charset='.$GLOBALS['gJConfig']->charset);
- echo '<?xml version="1.0" encoding="'.$GLOBALS['gJConfig']->charset.'" ?>'."\n";
- echo '<',$this->_root,' title="Errors" xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">';
- }
- echo '<vbox>';
- if($this->hasErrors()){
- echo $this->getFormatedErrorMsg();
- }else{
- echo "<description style=\"color:#FF0000;\">Unknown error</description>";
- }
- echo '</vbox></',$this->_root,'>';
- }
-
- /**
- *
- * @return string formated errors
- */
- protected function getFormatedErrorMsg(){
- $errors='';
- foreach( $GLOBALS['gJCoord']->errorMessages as $e){
- $errors .= '<description style="color:#FF0000;">['.$e[0].' '.$e[1].'] ';
- $errors .= htmlspecialchars($e[2], ENT_NOQUOTES, $GLOBALS['gJConfig']->charset)." \t".$e[3]." \t".$e[4]."</description>\n";
- if ($e[5])
- $errors .= '<div xmlns="http://www.w3.org/1999/xhtml"><pre>'.htmlspecialchars($e[5], ENT_NOQUOTES, $GLOBALS['gJConfig']->charset).'</pre></div>';
- }
- return $errors;
- }
-
- /**
- * call it to add manually content before or after the main content
- * @param string $content xul content
- * @param boolean $beforeTpl true if you want to add before, false for after
- */
- function addContent($content, $beforeTpl = false){
- if($beforeTpl){
- $this->_bodyTop[]=$content;
- }else{
- $this->_bodyBottom[]=$content;
- }
- }
-
- /**
- * add a link to a xul overlay for the xul page
- * @param string $src url of a xul overlay
- */
- function addOverlay ($src){
- $this->_overlays[$src] = true;
- }
- /**
- * add a link to a javascript file
- * @param string $src url
- */
- function addJSLink ($src, $params=array()){
- if (!isset ($this->_JSLink[$src])){
- $this->_JSLink[$src] = $params;
- }
- }
- /**
- * add a link to a css stylesheet
- * @param string $src url
- */
- function addCSSLink ($src, $params=array ()){
- if (!isset ($this->_CSSLink[$src])){
- $this->_CSSLink[$src] = $params;
- }
- }
-
- /**
- * add a piece of javascript code
- * @param string $code javascript source code
- */
- function addJSCode ($code){
- $this->_JSCode[] = $code;
- }
-
- protected function outputHeader (){
- $charset = $GLOBALS['gJConfig']->charset;
-
- echo '<?xml version="1.0" encoding="'.$charset.'" ?>'."\n";
-
- // css link
- foreach ($this->_CSSLink as $src=>$param){
- if(is_string($param))
- echo '<?xml-stylesheet type="text/css" href="',htmlspecialchars($src,ENT_COMPAT, $charset),'" '.$param.'?>',"\n";
- else
- echo '<?xml-stylesheet type="text/css" href="',htmlspecialchars($src,ENT_COMPAT, $charset),'" ?>',"\n";
- }
- $this->_otherthings();
-
- echo '<',$this->_root;
- foreach($this->rootAttributes as $name=>$value){
- echo ' ',$name,'="',htmlspecialchars($value,ENT_COMPAT, $charset),'"';
- }
- echo " xmlns:html=\"http://www.w3.org/1999/xhtml\"
- xmlns=\"http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul\">\n";
-
- // js link
- foreach ($this->_JSLink as $src=>$params){
- echo '<script type="application/x-javascript" src="',htmlspecialchars($src),'" />',"\n";
- }
-
- // js code
- if(count($this->_JSCode)){
- echo '<script type="application/x-javascript">
- <![CDATA[
- '.implode ("\n", $this->_JSCode).'
- ]]>
- </script>';
- }
- }
-
- /**
- * The method you can overload in your inherited XUL response
- * overload it if you want to add processes (stylesheet, head settings, additionnal content etc..)
- * after all actions
- * @since 1.1
- */
- protected function doAfterActions(){
- }
-
- /**
- *
- */
- protected function _otherthings(){
- // overlays
-
- // browser sniffing, because "&" should be escaped in a xul-overlay PI in gecko 1.9+
- $escape = false;
- if(preg_match('!^Mozilla/5.0 \(.* rv:(\d)\.(\d).*\) Gecko/\d+.*$!',$_SERVER["HTTP_USER_AGENT"],$m)){
- if(version_compare($m[1].'.'.$m[2], '1.9') >= 0) {
- $escape = true;
- }
- }
-
- if($this->fetchOverlays){
- $sel = new jSelectorTpl($this->bodyTpl);
- $eventresp = jEvent::notify ('FetchXulOverlay', array('tpl'=>$sel->toString()));
- foreach($eventresp->getResponse() as $rep){
- if(is_array($rep)){
- $this->_overlays[jUrl::get($rep[0],$rep[1])]=true;
- }elseif(is_string($rep)){
- $this->_overlays[jUrl::get($rep)]=true;
- }
- }
- }
-
- foreach ($this->_overlays as $src=>$ok){
- echo '<?xul-overlay href="',($escape?htmlspecialchars($src):$src),'" ?>',"\n";
- }
-
- $this->rootAttributes['title']=$this->title;
- }
-
- /**
- * clear all header informations
- * @var array list of keyword
- */
- public function clearHeader ($what){
- $cleanable = array ('CSSLink', 'JSLink', 'JSCode', 'overlays');
- foreach ($what as $elem){
- if (in_array ($elem, $cleanable)){
- $name = '_'.$elem;
- $this->$name = array ();
- }
- }
- }
-
- public function getFormatType(){ return 'xul';}
- }
Documentation generated on Thu, 19 Sep 2013 00:07:06 +0200 by phpDocumentor 1.4.3