Source for file jResponseXul.class.php

Documentation is available at jResponseXul.class.php

  1. <?php
  2. /**
  3. @package     jelix
  4. @subpackage  core_response
  5. @author      Laurent Jouanneau
  6. @contributor Dominique Papin, Julien Issler
  7. @copyright   2005-2008 Laurent Jouanneau, 2007 Dominique Papin
  8. @copyright   2008 Julien Issler
  9. @link        http://www.jelix.org
  10. @licence     GNU Lesser General Public Licence see LICENCE file or http://www.gnu.org/licenses/lgpl.html
  11. */
  12.  
  13. /**
  14. *
  15. */
  16. require_once(JELIX_LIB_TPL_PATH.'jTpl.class.php');
  17.  
  18. /**
  19. * Generate a XUL window
  20. @package  jelix
  21. @subpackage core_response
  22. @see jResponse
  23. */
  24. class jResponseXul extends jResponse {
  25.     /**
  26.     * @var string 
  27.     */
  28.     protected $_type = 'xul';
  29.  
  30.     /**
  31.      * header content : list of overlay links
  32.      * @var array 
  33.      */
  34.     protected $_overlays  = array ();
  35.     /**
  36.      * header content : list of css file links
  37.      * @var array 
  38.      */
  39.     protected $_CSSLink = array ();
  40.     /**
  41.      * header content : list of javascript file links
  42.      * @var array 
  43.      */
  44.     protected $_JSLink  = array ();
  45.     /**
  46.      * header content : list of piece of javascript code
  47.      * @var array 
  48.      */
  49.     protected $_JSCode  = array ();
  50.  
  51.     /**
  52.      * root tag name.
  53.      * could be override into child class for other xul document
  54.      */
  55.     protected $_root = 'window';
  56.  
  57.     /**
  58.      * list of attributes and their values for the root element
  59.      * @var array 
  60.      */
  61.     public $rootAttributesarray();
  62.  
  63.     /**
  64.      * Title of the window
  65.      * @var string 
  66.      */
  67.     public $title = '';
  68.  
  69.     /**
  70.      * template engine to generate the window content
  71.      * @var jTpl 
  72.      */
  73.     public $body = null;
  74.  
  75.     /**
  76.      * selector of the template to use
  77.      * @var string 
  78.      */
  79.     public $bodyTpl = '';
  80.  
  81.     /**
  82.      * says if an event is sent to retrieve overlays url for the xul content
  83.      * @var boolean 
  84.      */
  85.     public $fetchOverlays=false;
  86.  
  87.     protected $_bodyTop = array();
  88.     protected $_bodyBottom = array();
  89.     protected $_headSent = false;
  90.  
  91.     /**
  92.     * constructor
  93.     */
  94.     function __construct (){
  95.         $this->body = new jTpl();
  96.         parent::__construct();
  97.     }
  98.  
  99.     /**
  100.      * generate the xul content.
  101.      * @return boolean    true if it's ok
  102.      */
  103.     public function output(){
  104.         $this->_headSent = false;
  105.  
  106.         $this->_httpHeaders['Content-Type']='application/vnd.mozilla.xul+xml;charset='.$GLOBALS['gJConfig']->charset;
  107.         $this->sendHttpHeaders();
  108.         $this->_commonProcess();
  109.         if($this->bodyTpl != '')
  110.             $this->body->meta($this->bodyTpl);
  111.         $this->outputHeader();
  112.         $this->_headSent = true;
  113.         echo implode('',$this->_bodyTop);
  114.         if($this->bodyTpl != '')
  115.             $this->body->display($this->bodyTpl);
  116.  
  117.         if($this->hasErrors()){
  118.             if($GLOBALS['gJConfig']->error_handling['showInFirebug']){
  119.                 echo '<script type="text/javascript">if(console){';
  120.                 foreach$GLOBALS['gJCoord']->errorMessages  as $e){
  121.                     switch ($e[0]{
  122.                       case 'warning':
  123.                         echo 'console.warn("[warning ';
  124.                         break;
  125.                       case 'notice':
  126.                         echo 'console.info("[notice ';
  127.                         break;
  128.                       case 'strict':
  129.                         echo 'console.info("[strict ';
  130.                         break;
  131.                       case 'error':
  132.                         echo 'console.error("[error ';
  133.                         break;
  134.                     }
  135.                     echo $e[1],'] ',str_replace(array('"',"\n","\r","\t"),array('\"','\\n','\\r','\\t'),$e[2]),' (',str_replace('\\','\\\\',$e[3]),' ',$e[4],')");';
  136.                 }
  137.                 echo '}else{alert("there are some errors, you should activate Firebug to see them");}</script>';
  138.             }else{
  139.                 echo '<vbox id="jelixerror" style="border:3px solid red; background-color:#f39999;color:black;">';
  140.                 echo $this->getFormatedErrorMsg();
  141.                 echo '</vbox>';
  142.             }
  143.         }
  144.  
  145.         echo implode('',$this->_bodyBottom);
  146.  
  147.         if(count($GLOBALS['gJCoord']->logMessages)) {
  148.             if(count($GLOBALS['gJCoord']->logMessages['response'])) {
  149.                 echo '<vbox id="jelixlog">';
  150.                 foreach($GLOBALS['gJCoord']->logMessages['response'as $m{
  151.                     echo '<description>',htmlspecialchars($m),'</description>';
  152.                 }
  153.                 echo '</vbox>';
  154.             }
  155.             if(count($GLOBALS['gJCoord']->logMessages['firebug'])) {
  156.                 echo '<script type="text/javascript">if(console){';
  157.                 foreach($GLOBALS['gJCoord']->logMessages['firebug'as $m{
  158.                     echo 'console.debug("',str_replace(array('"',"\n","\r","\t"),array('\"','\\n','\\r','\\t'),$m),'");';
  159.                 }
  160.                 echo '}else{alert("there are log messages, you should activate Firebug to see them");}</script>';
  161.             }
  162.         }
  163.  
  164.         echo '</',$this->_root,'>';
  165.         return true;
  166.     }
  167.  
  168.     public function outputErrors(){
  169.         if(!$this->_headSent){
  170.             header("HTTP/1.0 500 Internal Server Error");
  171.             header('Content-Type: application/vnd.mozilla.xul+xml;charset='.$GLOBALS['gJConfig']->charset);
  172.             echo '<?xml version="1.0" encoding="'.$GLOBALS['gJConfig']->charset.'" ?>'."\n";
  173.             echo '<',$this->_root,' title="Errors" xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">';
  174.         }
  175.         echo '<vbox>';
  176.         if($this->hasErrors()){
  177.             echo $this->getFormatedErrorMsg();
  178.         }else{
  179.             echo "<description style=\"color:#FF0000;\">Unknown error</description>";
  180.         }
  181.         echo '</vbox></',$this->_root,'>';
  182.     }
  183.  
  184.     /**
  185.      *
  186.      * @return string formated errors
  187.      */
  188.     protected function getFormatedErrorMsg(){
  189.         $errors='';
  190.         foreach$GLOBALS['gJCoord']->errorMessages  as $e){
  191.             $errors .=  '<description style="color:#FF0000;">['.$e[0].' '.$e[1].'] '.htmlspecialchars($e[2]ENT_NOQUOTES$GLOBALS['gJConfig']->charset)." \t".$e[3]." \t".$e[4]."</description>\n";
  192.         }
  193.         return $errors;
  194.     }
  195.  
  196.     /**
  197.      * call it to add manually content before or after the main content
  198.      * @param string $content xul content
  199.      * @param boolean $beforeTpl true if you want to add before, false for after
  200.      */
  201.     function addContent($content$beforeTpl false){
  202.         if($beforeTpl){
  203.             $this->_bodyTop[]=$content;
  204.         }else{
  205.             $this->_bodyBottom[]=$content;
  206.         }
  207.     }
  208.  
  209.     /**
  210.      * add a link to a xul overlay for the xul page
  211.      * @param string $src url of a xul overlay
  212.      */
  213.     function addOverlay ($src){
  214.         $this->_overlays[$srctrue;
  215.     }
  216.     /**
  217.      * add a link to a javascript file
  218.      * @param string $src url
  219.      */
  220.     function addJSLink ($src$params=array()){
  221.         if (!isset ($this->_JSLink[$src])){
  222.             $this->_JSLink[$src$params;
  223.         }
  224.     }
  225.     /**
  226.      * add a link to a css stylesheet
  227.      * @param string $src url
  228.      */
  229.     function addCSSLink ($src$params=array ()){
  230.         if (!isset ($this->_CSSLink[$src])){
  231.             $this->_CSSLink[$src$params;
  232.         }
  233.     }
  234.  
  235.     /**
  236.      * add a piece of javascript code
  237.      * @param string $code javascript source code
  238.      */
  239.     function addJSCode ($code){
  240.         $this->_JSCode[$code;
  241.     }
  242.  
  243.     protected function outputHeader (){
  244.         $charset $GLOBALS['gJConfig']->charset;
  245.  
  246.         echo '<?xml version="1.0" encoding="'.$charset.'" ?>'."\n";
  247.  
  248.         // css link
  249.         foreach ($this->_CSSLink as $src=>$param){
  250.             if(is_string($param))
  251.                 echo  '<?xml-stylesheet type="text/css" href="',htmlspecialchars($src,ENT_COMPAT$charset),'" '.$param.'?>',"\n";
  252.             else
  253.                 echo  '<?xml-stylesheet type="text/css" href="',htmlspecialchars($src,ENT_COMPAT$charset),'" ?>',"\n";
  254.         }
  255.         $this->_otherthings();
  256.  
  257.         echo '<',$this->_root;
  258.         foreach($this->rootAttributes as $name=>$value){
  259.             echo ' ',$name,'="',htmlspecialchars($value,ENT_COMPAT$charset),'"';
  260.         }
  261.         echo "  xmlns:html=\"http://www.w3.org/1999/xhtml\"
  262.         xmlns=\"http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul\">\n";
  263.  
  264.         // js link
  265.         foreach ($this->_JSLink as $src=>$params){
  266.             echo '<script type="application/x-javascript" src="',htmlspecialchars($src),'" />',"\n";
  267.         }
  268.  
  269.         // js code
  270.         if(count($this->_JSCode)){
  271.             echo '<script type="application/x-javascript">
  272. <![CDATA[
  273.  '.implode ("\n"$this->_JSCode).'
  274. ]]>
  275. </script>';
  276.         }
  277.     }
  278.  
  279.     /**
  280.      * override it into your own xul response object, to do
  281.      * all things commons to all xul actions
  282.      */
  283.     protected function _commonProcess(){
  284.  
  285.     }
  286.  
  287.     /**
  288.      *
  289.      */
  290.     protected function _otherthings(){
  291.         // overlays
  292.  
  293.         // browser sniffing, because "&" should be escaped in a xul-overlay PI in gecko 1.9+
  294.         $escape false;
  295.         if(preg_match('!^Mozilla/5.0 \(.* rv:(\d)\.(\d).*\) Gecko/\d+.*$!',$_SERVER["HTTP_USER_AGENT"],$m)){
  296.             if(version_compare($m[1].'.'.$m[2]'1.9'>= 0{
  297.                 $escape true;
  298.             }
  299.         }
  300.  
  301.         if($this->fetchOverlays){
  302.             $sel new jSelectorTpl($this->bodyTpl);
  303.             $eventresp jEvent::notify ('FetchXulOverlay'array('tpl'=>$sel->toString()));
  304.             foreach($eventresp->getResponse(as $rep){
  305.                 if(is_array($rep)){
  306.                     $this->_overlays[jUrl::get($rep[0],$rep[1])]=true;
  307.                 }elseif(is_string($rep)){
  308.                     $this->_overlays[jUrl::get($rep)]=true;
  309.                 }
  310.             }
  311.         }
  312.  
  313.         foreach ($this->_overlays as $src=>$ok){
  314.             echo  '<?xul-overlay href="',($escape?htmlspecialchars($src):$src),'" ?>',"\n";
  315.         }
  316.  
  317.         $this->rootAttributes['title']=$this->title;
  318.     }
  319.  
  320.     /**
  321.      * clear all header informations
  322.      * @var array list of keyword
  323.      */
  324.     public function clearHeader ($what){
  325.         $cleanable array ('CSSLink''JSLink''JSCode''overlays');
  326.         foreach ($what as $elem){
  327.             if (in_array ($elem$cleanable)){
  328.                 $name '_'.$elem;
  329.                 $this->$name array ();
  330.             }
  331.         }
  332.     }
  333.  
  334.     public function getFormatType()return 'xul';}
  335. }
  336.  
  337. ?>

Documentation generated on Wed, 07 Sep 2011 13:47:52 +0200 by phpDocumentor 1.4.3