Source for file jResponseBasicHtml.class.php

Documentation is available at jResponseBasicHtml.class.php

  1. <?php
  2. /**
  3.  * @package     jelix
  4.  * @subpackage  core_response
  5.  * @author      Laurent Jouanneau
  6.  * @contributor Julien Issler, Brice Tence
  7.  * @copyright   2010 Laurent Jouanneau
  8.  * @copyright   2011 Julien Issler, 2011 Brice Tence
  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.  * interface for plugins for jResponseBasicHtml or jResponseHtml, which allows
  16.  * to make changes in the response at several step
  17.  */
  18. interface jIHTMLResponsePlugin {
  19.  
  20.     public function __construct(jResponse $c);
  21.  
  22.     /**
  23.      * called just before the jResponseBasicHtml::doAfterActions() call
  24.      */
  25.     public function afterAction();
  26.  
  27.     /**
  28.      * called just before the final output. This is the opportunity
  29.      * to make changes before the head and body output. At this step
  30.      * the main content (if any) is already generated.
  31.      */
  32.     public function beforeOutput();
  33.  
  34.     /**
  35.      * called when the content is generated, and potentially sent, except
  36.      * the body end tag and the html end tags. This method can output
  37.      * directly some contents.
  38.      */
  39.     public function atBottom();
  40.  
  41.     /**
  42.      * called just before the output of an error page
  43.      */
  44.     public function beforeOutputError();
  45. }
  46.  
  47. /**
  48.  * Basic HTML response. the HTML content should be provided by a simple php file.
  49.  * @package  jelix
  50.  * @subpackage core_response
  51.  */
  52. class jResponseBasicHtml extends jResponse {
  53.     /**
  54.     * jresponse id
  55.     * @var string 
  56.     */
  57.     protected $_type = 'html';
  58.  
  59.     /**
  60.      * the charset of the document
  61.      * @var string 
  62.      */
  63.     protected $_charset;
  64.  
  65.     /**
  66.      * the lang of the document
  67.      * @var string 
  68.      */
  69.     protected $_lang;
  70.  
  71.     /**
  72.      * says if the document is in xhtml or html
  73.      */
  74.     protected $_isXhtml = true;
  75.  
  76.     /**
  77.      * says if xhtml content type should be send or not.
  78.      * it true, a verification of HTTP_ACCEPT is done.
  79.      * @var boolean 
  80.      */
  81.     public $xhtmlContentType = false;
  82.  
  83.     /**
  84.      * content for head
  85.      */
  86.     protected $_headBottom  = array ();
  87.  
  88.     /**#@+
  89.      * content for the body
  90.      * @var array
  91.      */
  92.     protected $_bodyTop = array();
  93.     protected $_bodyBottom = array();
  94.     /**#@-*/
  95.  
  96.     /**
  97.      * full path of php file to output. it should content php instruction
  98.      * to display these variables:
  99.      * - $HEADBOTTOM: content before th </head> tag
  100.      * - $BODYTOP: content just after the <body> tag, at the top of the page
  101.      * - $BODYBOTTOM: content just before the </body> tag, at the bottom of the page
  102.      * @var string 
  103.      */
  104.     public $htmlFile = '';
  105.  
  106.     /**
  107.      * list of plugins
  108.      * @var array  array of jIHTMLResponsePlugin
  109.      * @since 1.3a1
  110.      */
  111.     protected $plugins = array();
  112.  
  113.     /**
  114.     * constructor;
  115.     * setup the charset, the lang
  116.     */
  117.     function __construct (){
  118.         global $gJConfig;
  119.         $this->_charset = $gJConfig->charset;
  120.         $this->_lang = $gJConfig->locale;
  121.  
  122.         // load plugins
  123.         $plugins $gJConfig->jResponseHtml['plugins'];
  124.         if ($plugins{
  125.             $plugins preg_split('/ *, */'$plugins);
  126.             foreach ($plugins as $name{
  127.                 if (!$name)
  128.                     continue;
  129.                 $plugin jApp::loadPlugin($name'htmlresponse''.htmlresponse.php'$name.'HTMLResponsePlugin'$this);
  130.                 if ($plugin)
  131.                     $this->plugins[$name$plugin;
  132.                 // do nothing if the plugin does not exist, we could be already into the error handle
  133.             }
  134.         }
  135.  
  136.         parent::__construct();
  137.     }
  138.  
  139.     /**
  140.      * return the corresponding plugin
  141.      * @param string $name the name of the plugin
  142.      * @return jIHTMLResponsePlugin|nullthe plugin or null if it isn't loaded
  143.      * @since 1.3a1
  144.      */
  145.     function getPlugin($name{
  146.         if (isset($this->plugins[$name]))
  147.             return $this->plugins[$name];
  148.         return null;
  149.     }
  150.  
  151.     /**
  152.      * add additional content into the document head
  153.      * @param string $content 
  154.      * @since 1.0b1
  155.      */
  156.     final public function addHeadContent ($content){
  157.         $this->_headBottom[$content;
  158.     }
  159.  
  160.     /**
  161.      * add content to the body
  162.      * you can add additionnal content, before or after the content of body
  163.      * @param string $content additionnal html content
  164.      * @param boolean $before true if you want to add it before the content, else false for after
  165.      */
  166.     function addContent($content$before false){
  167.         if ($before{
  168.             $this->_bodyTop[]=$content;
  169.         }
  170.         else {
  171.             $this->_bodyBottom[]=$content;
  172.         }
  173.     }
  174.  
  175.     /**
  176.      *  set the content-type in the http headers
  177.      */
  178.     protected function setContentType({
  179.         if($this->_isXhtml && $this->xhtmlContentType && strstr($_SERVER['HTTP_ACCEPT'],'application/xhtml+xml')){
  180.             $this->_httpHeaders['Content-Type']='application/xhtml+xml;charset='.$this->_charset;
  181.         }else{
  182.             $this->_httpHeaders['Content-Type']='text/html;charset='.$this->_charset;
  183.         }
  184.     }
  185.  
  186.     /**
  187.      * output the html content
  188.      *
  189.      * @return boolean    true if the generated content is ok
  190.      */
  191.     public function output(){
  192.  
  193.         foreach($this->plugins as $name=>$plugin)
  194.             $plugin->afterAction();
  195.  
  196.         $this->doAfterActions();
  197.  
  198.         if ($this->htmlFile == '')
  199.             throw new Exception('static page is missing');
  200.  
  201.         $this->setContentType();
  202.  
  203.         jLog::outputLog($this);
  204.  
  205.         foreach($this->plugins as $name=>$plugin)
  206.             $plugin->beforeOutput();
  207.  
  208.         $HEADBOTTOM implode("\n"$this->_headBottom);
  209.         $BODYTOP implode("\n"$this->_bodyTop);
  210.         $BODYBOTTOM implode("\n"$this->_bodyBottom);
  211.  
  212.         ob_start();
  213.         foreach($this->plugins as $name=>$plugin)
  214.             $plugin->atBottom();
  215.         $BODYBOTTOM .= ob_get_clean();
  216.  
  217.         $this->sendHttpHeaders();
  218.         include($this->htmlFile);
  219.  
  220.         return true;
  221.     }
  222.  
  223.     /**
  224.      * The method you can overload in your inherited html response
  225.      * overload it if you want to add processes (stylesheet, head settings, additionnal content etc..)
  226.      * after any actions
  227.      * @since 1.1
  228.      */
  229.     protected function doAfterActions(){
  230.  
  231.     }
  232.  
  233.     /**
  234.      * output errors
  235.      */
  236.     public function outputErrors(){
  237.  
  238.         if (file_exists(jApp::appPath('responses/error.en_US.php')))
  239.             $file jApp::appPath('responses/error.en_US.php');
  240.         else
  241.             $file JELIX_LIB_CORE_PATH.'response/error.en_US.php';
  242.         // we erase already generated content
  243.         $this->_headBottom = array();
  244.         $this->_bodyBottom = array();
  245.         $this->_bodyTop = array();
  246.  
  247.         jLog::outputLog($this);
  248.  
  249.         foreach($this->plugins as $name=>$plugin)
  250.             $plugin->beforeOutputError();
  251.  
  252.         $HEADBOTTOM implode("\n"$this->_headBottom);
  253.         $BODYTOP implode("\n"$this->_bodyTop);
  254.         $BODYBOTTOM implode("\n"$this->_bodyBottom);
  255.         $basePath $GLOBALS['gJConfig']->urlengine['basePath'];
  256.  
  257.         header("HTTP/{$this->httpVersion} 500 Internal jelix error");
  258.         header('Content-Type: text/html;charset='.$this->_charset);
  259.         include($file);
  260.     }
  261.  
  262.     /**
  263.      * change the type of html for the output
  264.      * @param boolean $xhtml true if you want xhtml, false if you want html
  265.      */
  266.     public function setXhtmlOutput($xhtml = true){
  267.         $this->_isXhtml = $xhtml;
  268.     }
  269.  
  270.     /**
  271.      * says if the response will be xhtml or html
  272.      * @return boolean true if it is xhtml
  273.      */
  274.     final public function isXhtml(){ return $this->_isXhtml}
  275.  

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