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-2012 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.      * - $BASEPATH: base path of the application, for links of your style sheets etc..
  103.      * @var string 
  104.      */
  105.     public $htmlFile = '';
  106.  
  107.     /**
  108.      * list of plugins
  109.      * @var array  array of jIHTMLResponsePlugin
  110.      * @since 1.3a1
  111.      */
  112.     protected $plugins = array();
  113.  
  114.     /**
  115.     * constructor;
  116.     * setup the charset, the lang
  117.     */
  118.     function __construct (){
  119.  
  120.         $this->_charset = jApp::config()->charset;
  121.         $this->_lang = jApp::config()->locale;
  122.  
  123.         // load plugins
  124.         $plugins jApp::config()->jResponseHtml['plugins'];
  125.         if ($plugins{
  126.             $plugins preg_split('/ *, */'$plugins);
  127.             foreach ($plugins as $name{
  128.                 if (!$name)
  129.                     continue;
  130.                 $plugin jApp::loadPlugin($name'htmlresponse''.htmlresponse.php'$name.'HTMLResponsePlugin'$this);
  131.                 if ($plugin)
  132.                     $this->plugins[$name$plugin;
  133.                 // do nothing if the plugin does not exist, we could be already into the error handle
  134.             }
  135.         }
  136.  
  137.         parent::__construct();
  138.     }
  139.  
  140.     /**
  141.      * return the corresponding plugin
  142.      * @param string $name the name of the plugin
  143.      * @return jIHTMLResponsePlugin|nullthe plugin or null if it isn't loaded
  144.      * @since 1.3a1
  145.      */
  146.     function getPlugin($name{
  147.         if (isset($this->plugins[$name]))
  148.             return $this->plugins[$name];
  149.         return null;
  150.     }
  151.  
  152.     /**
  153.      * add additional content into the document head
  154.      * @param string $content 
  155.      * @since 1.0b1
  156.      */
  157.     final public function addHeadContent ($content){
  158.         $this->_headBottom[$content;
  159.     }
  160.  
  161.     /**
  162.      * add content to the body
  163.      * you can add additionnal content, before or after the content of body
  164.      * @param string $content additionnal html content
  165.      * @param boolean $before true if you want to add it before the content, else false for after
  166.      */
  167.     function addContent($content$before false){
  168.         if ($before{
  169.             $this->_bodyTop[]=$content;
  170.         }
  171.         else {
  172.             $this->_bodyBottom[]=$content;
  173.         }
  174.     }
  175.  
  176.     /**
  177.      *  set the content-type in the http headers
  178.      */
  179.     protected function setContentType({
  180.         if($this->_isXhtml && $this->xhtmlContentType && strstr($_SERVER['HTTP_ACCEPT'],'application/xhtml+xml')){
  181.             $this->_httpHeaders['Content-Type']='application/xhtml+xml;charset='.$this->_charset;
  182.         }else{
  183.             $this->_httpHeaders['Content-Type']='text/html;charset='.$this->_charset;
  184.         }
  185.     }
  186.  
  187.     /**
  188.      * output the html content
  189.      *
  190.      * @return boolean    true if the generated content is ok
  191.      */
  192.     public function output(){
  193.  
  194.         if($this->_outputOnlyHeaders){
  195.             $this->sendHttpHeaders();
  196.             return true;
  197.         }
  198.     
  199.         foreach($this->plugins as $name=>$plugin)
  200.             $plugin->afterAction();
  201.  
  202.         $this->doAfterActions();
  203.  
  204.         if ($this->htmlFile == '')
  205.             throw new Exception('static page is missing');
  206.  
  207.         $this->setContentType();
  208.  
  209.         jLog::outputLog($this);
  210.  
  211.         foreach($this->plugins as $name=>$plugin)
  212.             $plugin->beforeOutput();
  213.  
  214.         $HEADBOTTOM implode("\n"$this->_headBottom);
  215.         $BODYTOP implode("\n"$this->_bodyTop);
  216.         $BODYBOTTOM implode("\n"$this->_bodyBottom);
  217.         $BASEPATH jApp::config()->urlengine['basePath'];
  218.  
  219.         ob_start();
  220.         foreach($this->plugins as $name=>$plugin)
  221.             $plugin->atBottom();
  222.         $BODYBOTTOM .= ob_get_clean();
  223.  
  224.         $this->sendHttpHeaders();
  225.         include($this->htmlFile);
  226.  
  227.         return true;
  228.     }
  229.  
  230.     /**
  231.      * The method you can overload in your inherited html response
  232.      * overload it if you want to add processes (stylesheet, head settings, additionnal content etc..)
  233.      * after any actions
  234.      * @since 1.1
  235.      */
  236.     protected function doAfterActions(){
  237.  
  238.     }
  239.  
  240.     /**
  241.      * output errors
  242.      */
  243.     public function outputErrors(){
  244.  
  245.         if (file_exists(jApp::appPath('responses/error.en_US.php')))
  246.             $file jApp::appPath('responses/error.en_US.php');
  247.         else
  248.             $file JELIX_LIB_CORE_PATH.'response/error.en_US.php';
  249.         // we erase already generated content
  250.         $this->_headBottom = array();
  251.         $this->_bodyBottom = array();
  252.         $this->_bodyTop = array();
  253.  
  254.         jLog::outputLog($this);
  255.  
  256.         foreach($this->plugins as $name=>$plugin)
  257.             $plugin->beforeOutputError();
  258.  
  259.         $HEADBOTTOM implode("\n"$this->_headBottom);
  260.         $BODYTOP implode("\n"$this->_bodyTop);
  261.         $BODYBOTTOM implode("\n"$this->_bodyBottom);
  262.         $BASEPATH jApp::config()->urlengine['basePath'];
  263.  
  264.         header("HTTP/{$this->httpVersion} 500 Internal jelix error");
  265.         header('Content-Type: text/html;charset='.$this->_charset);
  266.         include($file);
  267.     }
  268.  
  269.     /**
  270.      * change the type of html for the output
  271.      * @param boolean $xhtml true if you want xhtml, false if you want html
  272.      */
  273.     public function setXhtmlOutput($xhtml = true){
  274.         $this->_isXhtml = $xhtml;
  275.     }
  276.  
  277.     /**
  278.      * says if the response will be xhtml or html
  279.      * @return boolean true if it is xhtml
  280.      */
  281.     final public function isXhtml(){ return $this->_isXhtml}
  282.  

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