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-2009 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_PATH.'tpl/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->doAfterActions();
  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.                     $m $e[2]($e[5]?"\n".$e[5]:"");
  136.                     echo $e[1],'] ',str_replace(array('"',"\n","\r","\t"),array('\"','\\n','\\r','\\t'),$m),' (',str_replace('\\','\\\\',$e[3]),' ',$e[4],')");';
  137.                 }
  138.                 echo '}else{alert("there are some errors, you should activate Firebug to see them");}</script>';
  139.             }else{
  140.                 echo '<vbox id="jelixerror" style="border:3px solid red; background-color:#f39999;color:black;">';
  141.                 echo $this->getFormatedErrorMsg();
  142.                 echo '</vbox>';
  143.             }
  144.         }
  145.  
  146.         echo implode('',$this->_bodyBottom);
  147.  
  148.         if(count($GLOBALS['gJCoord']->logMessages)) {
  149.             if(count($GLOBALS['gJCoord']->logMessages['response'])) {
  150.                 echo '<vbox id="jelixlog">';
  151.                 foreach($GLOBALS['gJCoord']->logMessages['response'as $m{
  152.                     echo '<description>',htmlspecialchars($m),'</description>';
  153.                 }
  154.                 echo '</vbox>';
  155.             }
  156.             if(count($GLOBALS['gJCoord']->logMessages['firebug'])) {
  157.                 echo '<script type="text/javascript">if(console){';
  158.                 foreach($GLOBALS['gJCoord']->logMessages['firebug'as $m{
  159.                     echo 'console.debug("',str_replace(array('"',"\n","\r","\t"),array('\"','\\n','\\r','\\t'),$m),'");';
  160.                 }
  161.                 echo '}else{alert("there are log messages, you should activate Firebug to see them");}</script>';
  162.             }
  163.         }
  164.  
  165.         echo '</',$this->_root,'>';
  166.         return true;
  167.     }
  168.  
  169.     public function outputErrors(){
  170.         if(!$this->_headSent){
  171.             header("HTTP/1.0 500 Internal Server Error");
  172.             header('Content-Type: application/vnd.mozilla.xul+xml;charset='.$GLOBALS['gJConfig']->charset);
  173.             echo '<?xml version="1.0" encoding="'.$GLOBALS['gJConfig']->charset.'" ?>'."\n";
  174.             echo '<',$this->_root,' title="Errors" xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">';
  175.         }
  176.         echo '<vbox>';
  177.         if($this->hasErrors()){
  178.             echo $this->getFormatedErrorMsg();
  179.         }else{
  180.             echo "<description style=\"color:#FF0000;\">Unknown error</description>";
  181.         }
  182.         echo '</vbox></',$this->_root,'>';
  183.     }
  184.  
  185.     /**
  186.      *
  187.      * @return string formated errors
  188.      */
  189.     protected function getFormatedErrorMsg(){
  190.         $errors='';
  191.         foreach$GLOBALS['gJCoord']->errorMessages  as $e){
  192.             $errors .=  '<description style="color:#FF0000;">['.$e[0].' '.$e[1].'] ';
  193.             $errors .= htmlspecialchars($e[2]ENT_NOQUOTES$GLOBALS['gJConfig']->charset)." \t".$e[3]." \t".$e[4]."</description>\n";
  194.             if ($e[5])
  195.               $errors .= '<div xmlns="http://www.w3.org/1999/xhtml"><pre>'.htmlspecialchars($e[5]ENT_NOQUOTES$GLOBALS['gJConfig']->charset).'</pre></div>';
  196.         }
  197.         return $errors;
  198.     }
  199.  
  200.     /**
  201.      * call it to add manually content before or after the main content
  202.      * @param string $content xul content
  203.      * @param boolean $beforeTpl true if you want to add before, false for after
  204.      */
  205.     function addContent($content$beforeTpl false){
  206.         if($beforeTpl){
  207.             $this->_bodyTop[]=$content;
  208.         }else{
  209.             $this->_bodyBottom[]=$content;
  210.         }
  211.     }
  212.  
  213.     /**
  214.      * add a link to a xul overlay for the xul page
  215.      * @param string $src url of a xul overlay
  216.      */
  217.     function addOverlay ($src){
  218.         $this->_overlays[$srctrue;
  219.     }
  220.     /**
  221.      * add a link to a javascript file
  222.      * @param string $src url
  223.      */
  224.     function addJSLink ($src$params=array()){
  225.         if (!isset ($this->_JSLink[$src])){
  226.             $this->_JSLink[$src$params;
  227.         }
  228.     }
  229.     /**
  230.      * add a link to a css stylesheet
  231.      * @param string $src url
  232.      */
  233.     function addCSSLink ($src$params=array ()){
  234.         if (!isset ($this->_CSSLink[$src])){
  235.             $this->_CSSLink[$src$params;
  236.         }
  237.     }
  238.  
  239.     /**
  240.      * add a piece of javascript code
  241.      * @param string $code javascript source code
  242.      */
  243.     function addJSCode ($code){
  244.         $this->_JSCode[$code;
  245.     }
  246.  
  247.     protected function outputHeader (){
  248.         $charset $GLOBALS['gJConfig']->charset;
  249.  
  250.         echo '<?xml version="1.0" encoding="'.$charset.'" ?>'."\n";
  251.  
  252.         // css link
  253.         foreach ($this->_CSSLink as $src=>$param){
  254.             if(is_string($param))
  255.                 echo  '<?xml-stylesheet type="text/css" href="',htmlspecialchars($src,ENT_COMPAT$charset),'" '.$param.'?>',"\n";
  256.             else
  257.                 echo  '<?xml-stylesheet type="text/css" href="',htmlspecialchars($src,ENT_COMPAT$charset),'" ?>',"\n";
  258.         }
  259.         $this->_otherthings();
  260.  
  261.         echo '<',$this->_root;
  262.         foreach($this->rootAttributes as $name=>$value){
  263.             echo ' ',$name,'="',htmlspecialchars($value,ENT_COMPAT$charset),'"';
  264.         }
  265.         echo "  xmlns:html=\"http://www.w3.org/1999/xhtml\"
  266.         xmlns=\"http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul\">\n";
  267.  
  268.         // js link
  269.         foreach ($this->_JSLink as $src=>$params){
  270.             echo '<script type="application/x-javascript" src="',htmlspecialchars($src),'" />',"\n";
  271.         }
  272.  
  273.         // js code
  274.         if(count($this->_JSCode)){
  275.             echo '<script type="application/x-javascript">
  276. <![CDATA[
  277.  '.implode ("\n"$this->_JSCode).'
  278. ]]>
  279. </script>';
  280.         }
  281.     }
  282.  
  283.     /**
  284.      * The method you can overload in your inherited XUL response
  285.      * overload it if you want to add processes (stylesheet, head settings, additionnal content etc..)
  286.      * after all actions
  287.      * @since 1.1
  288.      */
  289.     protected function doAfterActions(){
  290.     }
  291.  
  292.     /**
  293.      *
  294.      */
  295.     protected function _otherthings(){
  296.         // overlays
  297.  
  298.         // browser sniffing, because "&" should be escaped in a xul-overlay PI in gecko 1.9+
  299.         $escape false;
  300.         if(preg_match('!^Mozilla/5.0 \(.* rv:(\d)\.(\d).*\) Gecko/\d+.*$!',$_SERVER["HTTP_USER_AGENT"],$m)){
  301.             if(version_compare($m[1].'.'.$m[2]'1.9'>= 0{
  302.                 $escape true;
  303.             }
  304.         }
  305.  
  306.         if($this->fetchOverlays){
  307.             $sel new jSelectorTpl($this->bodyTpl);
  308.             $eventresp jEvent::notify ('FetchXulOverlay'array('tpl'=>$sel->toString()));
  309.             foreach($eventresp->getResponse(as $rep){
  310.                 if(is_array($rep)){
  311.                     $this->_overlays[jUrl::get($rep[0],$rep[1])]=true;
  312.                 }elseif(is_string($rep)){
  313.                     $this->_overlays[jUrl::get($rep)]=true;
  314.                 }
  315.             }
  316.         }
  317.  
  318.         foreach ($this->_overlays as $src=>$ok){
  319.             echo  '<?xul-overlay href="',($escape?htmlspecialchars($src):$src),'" ?>',"\n";
  320.         }
  321.  
  322.         $this->rootAttributes['title']=$this->title;
  323.     }
  324.  
  325.     /**
  326.      * clear all header informations
  327.      * @var array list of keyword
  328.      */
  329.     public function clearHeader ($what){
  330.         $cleanable array ('CSSLink''JSLink''JSCode''overlays');
  331.         foreach ($what as $elem){
  332.             if (in_array ($elem$cleanable)){
  333.                 $name '_'.$elem;
  334.                 $this->$name array ();
  335.             }
  336.         }
  337.     }
  338.  
  339.     public function getFormatType()return 'xul';}
  340. }

Documentation generated on Thu, 19 Sep 2013 00:07:06 +0200 by phpDocumentor 1.4.3