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-2010 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->doAfterActions();
  105.         if($this->bodyTpl != ''{
  106.             $this->body->meta($this->bodyTpl);
  107.             $content $this->body->fetch($this->bodyTpl'xul'truefalse);
  108.         }
  109.         else
  110.             $content '';
  111.  
  112.         // retrieve errors messages and log messages
  113.         jLog::outputLog($this);
  114.  
  115.         $this->_httpHeaders['Content-Type']='application/vnd.mozilla.xul+xml;charset='.$GLOBALS['gJConfig']->charset;
  116.         $this->sendHttpHeaders();
  117.         $this->outputHeader();
  118.         echo implode('',$this->_bodyTop);
  119.         echo $content;
  120.         echo implode('',$this->_bodyBottom);
  121.         echo '</',$this->_root,'>';
  122.         return true;
  123.     }
  124.  
  125.     public function outputErrors(){
  126.         header("HTTP/1.0 500 Internal Server Error");
  127.         header('Content-Type: application/vnd.mozilla.xul+xml;charset='.$GLOBALS['gJConfig']->charset);
  128.         echo '<?xml version="1.0" encoding="'.$GLOBALS['gJConfig']->charset.'" ?>'."\n";
  129.         echo '<',$this->_root,' title="Errors" xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">';
  130.         echo '<vbox>';
  131.         $message $GLOBALS['gJCoord']->getGenericErrorMessage();
  132.         echo "<description style=\"color:#FF0000;\">".htmlspecialchars($messageENT_NOQUOTES$GLOBALS['gJConfig']->charset)."</description>";
  133.         echo '</vbox></',$this->_root,'>';
  134.     }
  135.  
  136.     /**
  137.      * call it to add manually content before or after the main content
  138.      * @param string $content xul content
  139.      * @param boolean $beforeTpl true if you want to add before, false for after
  140.      */
  141.     function addContent($content$beforeTpl false){
  142.         if($beforeTpl){
  143.             $this->_bodyTop[]=$content;
  144.         }else{
  145.             $this->_bodyBottom[]=$content;
  146.         }
  147.     }
  148.  
  149.     /**
  150.      * add a link to a xul overlay for the xul page
  151.      * @param string $src url of a xul overlay
  152.      */
  153.     function addOverlay ($src){
  154.         $this->_overlays[$srctrue;
  155.     }
  156.     /**
  157.      * add a link to a javascript file
  158.      * @param string $src url
  159.      */
  160.     function addJSLink ($src$params=array()){
  161.         if (!isset ($this->_JSLink[$src])){
  162.             $this->_JSLink[$src$params;
  163.         }
  164.     }
  165.     /**
  166.      * add a link to a css stylesheet
  167.      * @param string $src url
  168.      */
  169.     function addCSSLink ($src$params=array ()){
  170.         if (!isset ($this->_CSSLink[$src])){
  171.             $this->_CSSLink[$src$params;
  172.         }
  173.     }
  174.  
  175.     /**
  176.      * add a piece of javascript code
  177.      * @param string $code javascript source code
  178.      */
  179.     function addJSCode ($code){
  180.         $this->_JSCode[$code;
  181.     }
  182.  
  183.     protected function outputHeader (){
  184.         $charset $GLOBALS['gJConfig']->charset;
  185.  
  186.         echo '<?xml version="1.0" encoding="'.$charset.'" ?>'."\n";
  187.  
  188.         // css link
  189.         foreach ($this->_CSSLink as $src=>$param){
  190.             if(is_string($param))
  191.                 echo  '<?xml-stylesheet type="text/css" href="',htmlspecialchars($src,ENT_COMPAT$charset),'" '.$param.'?>',"\n";
  192.             else
  193.                 echo  '<?xml-stylesheet type="text/css" href="',htmlspecialchars($src,ENT_COMPAT$charset),'" ?>',"\n";
  194.         }
  195.         $this->_otherthings();
  196.  
  197.         echo '<',$this->_root;
  198.         foreach($this->rootAttributes as $name=>$value){
  199.             echo ' ',$name,'="',htmlspecialchars($value,ENT_COMPAT$charset),'"';
  200.         }
  201.         echo "  xmlns:html=\"http://www.w3.org/1999/xhtml\"
  202.         xmlns=\"http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul\">\n";
  203.  
  204.         // js link
  205.         foreach ($this->_JSLink as $src=>$params){
  206.             echo '<script type="application/x-javascript" src="',htmlspecialchars($src),'" />',"\n";
  207.         }
  208.  
  209.         // js code
  210.         if(count($this->_JSCode)){
  211.             echo '<script type="application/x-javascript">
  212. <![CDATA[
  213.  '.implode ("\n"$this->_JSCode).'
  214. ]]>
  215. </script>';
  216.         }
  217.     }
  218.  
  219.     /**
  220.      * The method you can overload in your inherited XUL response
  221.      * overload it if you want to add processes (stylesheet, head settings, additionnal content etc..)
  222.      * after all actions
  223.      * @since 1.1
  224.      */
  225.     protected function doAfterActions(){
  226.     }
  227.  
  228.     /**
  229.      *
  230.      */
  231.     protected function _otherthings(){
  232.         // overlays
  233.  
  234.         // browser sniffing, because "&" should be escaped in a xul-overlay PI in gecko 1.9+
  235.         $escape false;
  236.         if(preg_match('!^Mozilla/5.0 \(.* rv:(\d)\.(\d).*\) Gecko/\d+.*$!',$_SERVER["HTTP_USER_AGENT"],$m)){
  237.             if(version_compare($m[1].'.'.$m[2]'1.9'>= 0{
  238.                 $escape true;
  239.             }
  240.         }
  241.  
  242.         if($this->fetchOverlays){
  243.             $sel new jSelectorTpl($this->bodyTpl);
  244.             $eventresp jEvent::notify ('FetchXulOverlay'array('tpl'=>$sel->toString()));
  245.             foreach($eventresp->getResponse(as $rep){
  246.                 if(is_array($rep)){
  247.                     $this->_overlays[jUrl::get($rep[0],$rep[1])]=true;
  248.                 }elseif(is_string($rep)){
  249.                     $this->_overlays[jUrl::get($rep)]=true;
  250.                 }
  251.             }
  252.         }
  253.  
  254.         foreach ($this->_overlays as $src=>$ok){
  255.             echo  '<?xul-overlay href="',($escape?htmlspecialchars($src):$src),'" ?>',"\n";
  256.         }
  257.  
  258.         $this->rootAttributes['title']=$this->title;
  259.     }
  260.  
  261.     /**
  262.      * clear all header informations
  263.      * @var array list of keyword
  264.      */
  265.     public function clearHeader ($what){
  266.         $cleanable array ('CSSLink''JSLink''JSCode''overlays');
  267.         foreach ($what as $elem){
  268.             if (in_array ($elem$cleanable)){
  269.                 $name '_'.$elem;
  270.                 $this->$name array ();
  271.             }
  272.         }
  273.     }
  274.  
  275.     public function getFormatType()return 'xul';}
  276. }

Documentation generated on Wed, 24 Sep 2014 22:01:50 +0200 by phpDocumentor 1.4.3