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_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.                     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.      * The method you can overload in your inherited XUL response
  281.      * overload it if you want to add processes (stylesheet, head settings, additionnal content etc..)
  282.      * after all actions
  283.      * @since 1.1
  284.      */
  285.     protected function doAfterActions(){
  286.         $this->_commonProcess()// for compatibility with jelix 1.0
  287.     }
  288.  
  289.     /**
  290.      * same use as doAfterActions, but deprecated method. It is just here for compatibility with Jelix 1.0.
  291.      * Use doAfterActions instead
  292.      * @deprecated
  293.      */
  294.     protected function _commonProcess(){
  295.     }
  296.  
  297.     /**
  298.      *
  299.      */
  300.     protected function _otherthings(){
  301.         // overlays
  302.  
  303.         // browser sniffing, because "&" should be escaped in a xul-overlay PI in gecko 1.9+
  304.         $escape false;
  305.         if(preg_match('!^Mozilla/5.0 \(.* rv:(\d)\.(\d).*\) Gecko/\d+.*$!',$_SERVER["HTTP_USER_AGENT"],$m)){
  306.             if(version_compare($m[1].'.'.$m[2]'1.9'>= 0{
  307.                 $escape true;
  308.             }
  309.         }
  310.  
  311.         if($this->fetchOverlays){
  312.             $sel new jSelectorTpl($this->bodyTpl);
  313.             $eventresp jEvent::notify ('FetchXulOverlay'array('tpl'=>$sel->toString()));
  314.             foreach($eventresp->getResponse(as $rep){
  315.                 if(is_array($rep)){
  316.                     $this->_overlays[jUrl::get($rep[0],$rep[1])]=true;
  317.                 }elseif(is_string($rep)){
  318.                     $this->_overlays[jUrl::get($rep)]=true;
  319.                 }
  320.             }
  321.         }
  322.  
  323.         foreach ($this->_overlays as $src=>$ok){
  324.             echo  '<?xul-overlay href="',($escape?htmlspecialchars($src):$src),'" ?>',"\n";
  325.         }
  326.  
  327.         $this->rootAttributes['title']=$this->title;
  328.     }
  329.  
  330.     /**
  331.      * clear all header informations
  332.      * @var array list of keyword
  333.      */
  334.     public function clearHeader ($what){
  335.         $cleanable array ('CSSLink''JSLink''JSCode''overlays');
  336.         foreach ($what as $elem){
  337.             if (in_array ($elem$cleanable)){
  338.                 $name '_'.$elem;
  339.                 $this->$name array ();
  340.             }
  341.         }
  342.     }
  343.  
  344.     public function getFormatType()return 'xul';}
  345. }

Documentation generated on Thu, 22 Mar 2012 22:16:59 +0100 by phpDocumentor 1.4.3