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

Documentation generated on Mon, 26 Oct 2015 21:55:55 +0100 by phpDocumentor 1.4.3