Source for file jResponseHtml.class.php

Documentation is available at jResponseHtml.class.php

  1. <?php
  2. /**
  3. @package     jelix
  4. @subpackage  core_response
  5. @author      Laurent Jouanneau
  6. @contributor Yann, Dominique Papin
  7. @contributor Warren Seine, Alexis Métaireau, Julien Issler, Olivier Demah, Brice Tence
  8. @copyright   2005-2012 Laurent Jouanneau, 2006 Yann, 2007 Dominique Papin
  9. @copyright   2008 Warren Seine, Alexis Métaireau
  10. @copyright   2009 Julien Issler, Olivier Demah
  11. @copyright   2010 Brice Tence
  12. *               few lines of code are copyrighted CopixTeam http://www.copix.org
  13. @link        http://www.jelix.org
  14. @licence     GNU Lesser General Public Licence see LICENCE file or http://www.gnu.org/licenses/lgpl.html
  15. */
  16.  
  17. /**
  18. *
  19. */
  20. require_once(__DIR__.'/jResponseBasicHtml.class.php');
  21. require_once(JELIX_LIB_PATH.'tpl/jTpl.class.php');
  22.  
  23. /**
  24. * HTML5 response
  25. @package  jelix
  26. @subpackage core_response
  27. */
  28. class jResponseHtml extends jResponseBasicHtml {
  29.     /**
  30.     * jresponse id
  31.     * @var string 
  32.     */
  33.     protected $_type = 'html';
  34.  
  35.     /**
  36.      * Title of the document
  37.      * @var string 
  38.      */
  39.     public $title = '';
  40.  
  41.     /**
  42.      * favicon url linked to the document
  43.      * @var string 
  44.      * @since 1.0b2
  45.      */
  46.     public $favicon = '';
  47.  
  48.     /**
  49.      * The template engine used to generate the body content
  50.      * @var jTpl 
  51.      */
  52.     public $body = null;
  53.  
  54.     /**
  55.      * selector of the main template file
  56.      * This template should contains the body content, and is used by the $body template engine
  57.      * @var string 
  58.      */
  59.     public $bodyTpl = '';
  60.  
  61.     /**
  62.      * Selector of the template used when there are some errors, instead of $bodyTpl
  63.      * @var string 
  64.      */
  65.     public $bodyErrorTpl = '';
  66.  
  67.     /**
  68.      * body attributes
  69.      * This attributes are written on the body tags
  70.      * @var array 
  71.      */
  72.     public $bodyTagAttributesarray();
  73.  
  74.     /**
  75.      * list of css stylesheet
  76.      * @var array  key = url, value=link attributes
  77.      */
  78.     protected $_CSSLink = array ();
  79.  
  80.     /**
  81.      * list of css stylesheet for IE
  82.      * @var array  key = url, value=link attributes + optional parameter _iecondition
  83.      */
  84.     protected $_CSSIELink = array ();
  85.  
  86.     /**
  87.      * list of CSS code
  88.      */
  89.     protected $_Styles  = array ();
  90.  
  91.     /**
  92.      * list of js script
  93.      * @var array  key = url, value=link attributes
  94.      */
  95.     protected $_JSLink  = array ();
  96.  
  97.     /**
  98.      * list of js script for IE
  99.      * @var array  key = url, value=link attributes + optional parameter _iecondition
  100.      */
  101.     protected $_JSIELink  = array ();
  102.  
  103.     /**
  104.      * inline js code to insert before js links
  105.      * @var array list of js source code
  106.      */
  107.     protected $_JSCodeBefore  = array ();
  108.  
  109.     /**
  110.      * inline js code to insert after js links
  111.      * @var array list of js source code
  112.      */
  113.     protected $_JSCode  = array ();
  114.  
  115.     /**
  116.      * list of keywords to add into a meta keyword tag
  117.      * @var array  array of strings
  118.      */
  119.     protected $_MetaKeywords = array();
  120.  
  121.     /**
  122.      * list of descriptions to add into a meta description tag
  123.      * @var array  array of strings
  124.      */
  125.     protected $_MetaDescription = array();
  126.  
  127.     /**
  128.      * content of the meta author tag
  129.      * @var string 
  130.      */
  131.     protected $_MetaAuthor = '';
  132.  
  133.     /**
  134.      * content of the meta generator tag
  135.      * @var string 
  136.      */
  137.     protected $_MetaGenerator = '';
  138.  
  139.     /**
  140.      * list of information to generate link tags
  141.      * @var array keys are the href value, valu is an array ('rel','type','title')
  142.      */
  143.     protected $_Link = array();
  144.  
  145.     /**
  146.      * the end tag to finish tags. it is different if we are in XHTML mode or not
  147.      * @var string 
  148.      */
  149.     protected $_endTag="/>\n";
  150.  
  151.     /**
  152.     * constructor;
  153.     * setup the charset, the lang, the template engine
  154.     */
  155.     function __construct (){
  156.         $this->body = new jTpl();
  157.         parent::__construct();
  158.     }
  159.  
  160.     /**
  161.      * output the html content
  162.      *
  163.      * @return boolean    true if the generated content is ok
  164.      */
  165.     public function output(){
  166.     
  167.         if($this->_outputOnlyHeaders){
  168.             $this->sendHttpHeaders();
  169.             return true;
  170.         }
  171.  
  172.         foreach($this->plugins as $name=>$plugin)
  173.             $plugin->afterAction();
  174.  
  175.         $this->doAfterActions();
  176.  
  177.         $this->setContentType();
  178.         // let's get the main content for the body
  179.         // we don't output yet <head> and other things, to have the
  180.         // opportunity for any components called during the output,
  181.         // to add things in the <head>
  182.         if ($this->bodyTpl != ''{
  183.             $this->body->meta($this->bodyTpl);
  184.             $content $this->body->fetch($this->bodyTpl'html'truefalse);
  185.         }
  186.         else $content '';
  187.  
  188.         // retrieve errors messages and log messages
  189.         jLog::outputLog($this);
  190.  
  191.         foreach($this->plugins as $name=>$plugin)
  192.             $plugin->beforeOutput();
  193.  
  194.         // now let's output the html content
  195.         $this->sendHttpHeaders();
  196.         $this->outputDoctype();
  197.         $this->outputHtmlHeader();
  198.         echo '<body ';
  199.         foreach($this->bodyTagAttributes as $attr=>$value){
  200.             echo $attr,'="'htmlspecialchars($value),'" ';
  201.         }
  202.         echo ">\n";
  203.         echo implode("\n",$this->_bodyTop);
  204.         echo $content;
  205.         echo implode("\n",$this->_bodyBottom);
  206.  
  207.         foreach($this->plugins as $name=>$plugin)
  208.             $plugin->atBottom();
  209.  
  210.         echo '</body></html>';
  211.         return true;
  212.     }
  213.  
  214.     /**
  215.      * set the title of the page
  216.      * 
  217.      * @param string $title 
  218.      */ 
  219.     public function setTitle($title{
  220.         $this->title = $title;
  221.     }
  222.  
  223.     /**
  224.      * add a generic link to the head
  225.      * 
  226.      * @param string $href  url of the link
  227.      * @param string $rel   relation name
  228.      * @param string $type  mime type of the ressource
  229.      * @param string $title 
  230.      */ 
  231.     public function addLink($href$rel$type=''$title=''{
  232.         $this->_Link[$hrefarray($rel$type$title);
  233.     }
  234.  
  235.     /**
  236.      * add a link to a javascript script in the document head
  237.      *
  238.      * $forIe parameter exists since 1.0b2
  239.      *
  240.      * @param string $src the link
  241.      * @param array $params additionnals attributes for the script tag
  242.      * @param boolean $forIE if true, the script sheet will be only for IE browser. string values possible (ex:'lt IE 7')
  243.      */
  244.     public function addJSLink ($src$params=array()$forIE=false){
  245.         if($forIE){
  246.             if (!isset ($this->_JSIELink[$src])){
  247.                 if (!is_bool($forIE&& !empty($forIE))
  248.                     $params['_ieCondition'$forIE;
  249.                 $this->_JSIELink[$src$params;
  250.             }
  251.         }else{
  252.             if (!isset ($this->_JSLink[$src])){
  253.                 $this->_JSLink[$src$params;
  254.             }
  255.         }
  256.     }
  257.  
  258.     /**
  259.      * returns all JS links
  260.      * @return array  key = url, value=link attributes
  261.      */
  262.     public function getJSLinks(return $this->_JSLink}
  263.  
  264.     /**
  265.      * set all JS links
  266.      * @param array  $list key = url, value=link attributes
  267.      */
  268.     public function setJSLinks($list$this->_JSLink = $list}
  269.  
  270.     /**
  271.      * returns all JS links for IE
  272.      * @return array  key = url, value=link attributes + optional parameter _iecondition
  273.      */
  274.     public function getJSIELinks(return $this->_JSIELink}
  275.  
  276.     /**
  277.      * set all JS links for IE
  278.      * @param array  $list key = url, value=link attributes
  279.      */
  280.     public function setJSIELinks($list$this->_JSIELink = $list}
  281.  
  282.      /**
  283.      * returns all CSS links
  284.      * @var array  key = url, value=link attributes
  285.      */
  286.     public function getCSSLinks(return $this->_CSSLink}
  287.  
  288.     /**
  289.      * set all CSS links
  290.      * @param array  $list key = url, value=link attributes
  291.      */
  292.     public function setCSSLinks($list$this->_CSSLink = $list}
  293.  
  294.     /**
  295.      * returns all CSS links for IE
  296.      * @var array  key = url, value=link attributes + optional parameter _iecondition
  297.      */
  298.      public function getCSSIELinks(return $this->_CSSIELink}
  299.  
  300.     /**
  301.      * set all CSS links for IE
  302.      * @param array  $list key = url, value=link attributes
  303.      */
  304.     public function setCSSIELinks($list$this->_CSSIELink = $list}
  305.  
  306.     /**
  307.      * add a link to a css stylesheet in the document head
  308.      *
  309.      * $forIe parameter exists since 1.0b2
  310.      *
  311.      * @param string $src the link
  312.      * @param array $params additionnals attributes for the link tag
  313.      * @param mixed $forIE if true, the style sheet will be only for IE browser. string values possible (ex:'lt IE 7')
  314.      */
  315.     public function addCSSLink ($src$params=array ()$forIE=false){
  316.         if($forIE){
  317.             if (!isset ($this->_CSSIELink[$src])){
  318.                 if (!is_bool($forIE&& !empty($forIE))
  319.                     $params['_ieCondition'$forIE;
  320.                 $this->_CSSIELink[$src$params;
  321.             }
  322.         }else{
  323.             if (!isset ($this->_CSSLink[$src])){
  324.                 $this->_CSSLink[$src$params;
  325.             }
  326.         }
  327.     }
  328.  
  329.     /**
  330.      * add inline css style into the document (inside a <style> tag)
  331.      * @param string $selector css selector
  332.      * @param string $def      css properties for the given selector
  333.      */
  334.     public function addStyle ($selector$def=null){
  335.         if (!isset ($this->_Styles[$selector])){
  336.             $this->_Styles[$selector$def;
  337.         }
  338.     }
  339.  
  340.     /**
  341.      * set attributes on the body tag
  342.      * @param array $attrArray  an associative array of attributes and their values
  343.      */
  344.     public function setBodyAttributes $attrArray ){
  345.         ifis_array($attrArray) ) {
  346.             foreach$attrArray as $attr => $value {
  347.                 if(!is_numeric($attr)) {
  348.                     $this->bodyTagAttributes[$attr]=$value;
  349.                 }
  350.             }
  351.         }
  352.     }
  353.  
  354.     /**
  355.      * add inline javascript code (inside a <script> tag)
  356.      * @param string $code  javascript source code
  357.      * @param boolean $before will insert the code before js links if true
  358.      */
  359.     public function addJSCode ($code$before false){
  360.         if ($before)
  361.             $this->_JSCodeBefore[$code;
  362.         else
  363.             $this->_JSCode[$code;
  364.     }
  365.  
  366.     /**
  367.      * add some keywords in a keywords meta tag
  368.      * @author Yann
  369.      * @param string $content keywords
  370.      * @since 1.0b1
  371.      */
  372.     public function addMetaKeywords ($content){
  373.         $this->_MetaKeywords[$content;
  374.     }
  375.     /**
  376.      * add a description in a description meta tag
  377.      * @author Yann
  378.      * @param string $content a description
  379.      * @since 1.0b1
  380.      */
  381.     public function addMetaDescription ($content){
  382.         $this->_MetaDescription[$content;
  383.     }
  384.     /**
  385.      * add author(s) in a author meta tag
  386.      * @author Olivier Demah
  387.      * @param string $content author(s)
  388.      * @since 1.2
  389.      */
  390.     public function addMetaAuthor($content){
  391.         $this->_MetaAuthor = $content;
  392.     }
  393.     /**
  394.      * add generator a generator meta tag
  395.      * @author Olivier Demah
  396.      * @param string $content generator
  397.      * @since 1.2
  398.      */
  399.     public function addMetaGenerator($content){
  400.         $this->_MetaGenerator = $content;
  401.     }
  402.     /**
  403.      * generate the doctype. You can override it if you want to have your own doctype, like XHTML+MATHML.
  404.      * @since 1.1
  405.      */
  406.     protected function outputDoctype (){
  407.         echo '<!DOCTYPE HTML>'"\n";
  408.         $lang str_replace('_''-'$this->_lang);
  409.         if($this->_isXhtml){
  410.             echo '<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="',$lang,'" lang="',$lang,'">
  411. ';
  412.         }else{
  413.             echo '<html lang="',$lang,'">';
  414.         }
  415.     }
  416.  
  417.     protected function outputJsScriptTag$fileUrl$scriptParams {
  418.         $params '';
  419.         foreach ($scriptParams as $param_name=>$param_value){
  420.             if ($param_name=='_ieCondition')
  421.                 continue ;
  422.             $params .= $param_name.'="'htmlspecialchars($param_value).'" ';
  423.         }
  424.  
  425.         echo '<script type="text/javascript" src="',htmlspecialchars($fileUrl),'" ',$params,'></script>',"\n";
  426.     }
  427.  
  428.  
  429.     protected function outputCssLinkTag$fileUrl$cssParams {
  430.         $params '';   
  431.         foreach ($cssParams as $param_name=>$param_value){
  432.             if ($param_name=='_ieCondition')
  433.                 continue ;
  434.             $params .= $param_name.'="'htmlspecialchars($param_value).'" ';
  435.         }
  436.  
  437.         if(!isset($cssParams['rel']))
  438.             $params .='rel="stylesheet" ';
  439.         echo '<link type="text/css" href="',htmlspecialchars($fileUrl),'" ',$params,$this->_endTag,"\n";
  440.     }
  441.  
  442.     /**
  443.      * generate the content of the <head> content
  444.      */
  445.     protected function outputHtmlHeader (){
  446.  
  447.         echo '<head>'."\n";
  448.         echo implode ("\n"$this->_headTop);
  449.         if($this->_isXhtml && $this->xhtmlContentType && strstr($_SERVER['HTTP_ACCEPT'],'application/xhtml+xml')){      
  450.             echo '<meta content="application/xhtml+xml; charset='.$this->_charset.'" http-equiv="content-type"'.$this->_endTag;
  451.         else {
  452.             echo '<meta content="text/html; charset='.$this->_charset.'" http-equiv="content-type"'.$this->_endTag;
  453.         }
  454.         echo '<title>'.htmlspecialchars($this->title)."</title>\n";
  455.  
  456.         if(!empty($this->_MetaDescription)){
  457.             // meta description
  458.             $description implode(' ',$this->_MetaDescription);
  459.             echo '<meta name="description" content="'.htmlspecialchars($description).'" '.$this->_endTag;
  460.         }
  461.  
  462.         if(!empty($this->_MetaKeywords)){
  463.             // meta description
  464.             $keywords implode(',',$this->_MetaKeywords);
  465.             echo '<meta name="keywords" content="'.htmlspecialchars($keywords).'" '.$this->_endTag;
  466.         }
  467.         if (!empty($this->_MetaGenerator)) {
  468.             echo '<meta name="generator" content="'.htmlspecialchars($this->_MetaGenerator).'" '.$this->_endTag;
  469.         }
  470.         if (!empty($this->_MetaAuthor)) {
  471.             echo '<meta name="author" content="'.htmlspecialchars($this->_MetaAuthor).'" '.$this->_endTag;
  472.         }
  473.  
  474.         // css link
  475.         foreach ($this->_CSSLink as $src=>$params){
  476.             $this->outputCssLinkTag($src$params);
  477.         }
  478.  
  479.         foreach ($this->_CSSIELink as $src=>$params){
  480.             // special params for conditions on IE versions
  481.             if (!isset($params['_ieCondition']))
  482.               $params['_ieCondition''IE' ;
  483.             echo '<!--[if '.$params['_ieCondition'].' ]>';
  484.             $this->outputCssLinkTag($src$params);
  485.             echo '<![endif]-->';
  486.         }
  487.  
  488.         if($this->favicon != ''){
  489.             $fav htmlspecialchars($this->favicon);
  490.             echo '<link rel="icon" type="image/x-icon" href="',$fav,'" ',$this->_endTag;
  491.             echo '<link rel="shortcut icon" type="image/x-icon" href="',$fav,'" ',$this->_endTag;
  492.         }
  493.         
  494.         // others links
  495.         foreach($this->_Link as $href=>$params){
  496.             $more array();
  497.             if!empty($params[1]))
  498.                 $more['type="'.$params[1].'"';
  499.             if (!empty($params[2]))
  500.                 $more['title = "'.htmlspecialchars($params[2]).'"';
  501.             echo '<link rel="',$params[0],'" href="',htmlspecialchars($href),'" ',implode($more' '),$this->_endTag;
  502.         }
  503.  
  504.         // js code
  505.         if(count($this->_JSCodeBefore)){
  506.             echo '<script type="text/javascript">
  507. // <![CDATA[
  508.  '.implode ("\n"$this->_JSCodeBefore).'
  509. // ]]>
  510. </script>';
  511.         }
  512.  
  513.         // js link
  514.         foreach ($this->_JSLink as $src=>$params){
  515.             $this->outputJsScriptTag($src$params);
  516.         }
  517.  
  518.         foreach ($this->_JSIELink as $src=>$params){
  519.             if (!isset($params['_ieCondition']))
  520.                 $params['_ieCondition''IE' ;
  521.             echo '<!--[if '.$params['_ieCondition'].' ]>';
  522.             $this->outputJsScriptTag($src$params);
  523.             echo '<![endif]-->';
  524.         }
  525.  
  526.         // styles
  527.         if(count($this->_Styles)){
  528.             echo "<style type=\"text/css\">\n";
  529.             foreach ($this->_Styles as $selector=>$value){
  530.                 if (strlen ($value)){
  531.                     // there is a key/value
  532.                     echo $selector.' {'.$value."}\n";
  533.                 }else{
  534.                     // no value, it could be simply a command
  535.                     //for example @import something, ...
  536.                     echo $selector"\n";
  537.                 }
  538.             }
  539.             echo "\n </style>\n";
  540.         }
  541.         // js code
  542.         if(count($this->_JSCode)){
  543.             echo '<script type="text/javascript">
  544. // <![CDATA[
  545.  '.implode ("\n"$this->_JSCode).'
  546. // ]]>
  547. </script>';
  548.         }
  549.         echo implode ("\n"$this->_headBottom)'</head>';
  550.     }
  551.  
  552.     /**
  553.      * used to erase some head properties
  554.      * @param array $what list of one or many of this strings : 'CSSLink', 'CSSIELink', 'Styles', 'JSLink', 'JSIELink', 'JSCode', 'Others','MetaKeywords','MetaDescription'. If null, it cleans all values.
  555.      */
  556.     public function clearHtmlHeader ($what=null){
  557.         $cleanable array ('CSSLink''CSSIELink''Styles''JSLink','JSIELink''JSCode''Others','MetaKeywords','MetaDescription');
  558.         if($what==null)
  559.             $what$cleanable;
  560.         foreach ($what as $elem){
  561.             if (in_array ($elem$cleanable)){
  562.                 $name '_'.$elem;
  563.                 $this->$name array ();
  564.             }
  565.         }
  566.     }
  567.  
  568.     /**
  569.      * change the type of html for the output
  570.      * @param boolean $xhtml true if you want xhtml, false if you want html
  571.      */
  572.     public function setXhtmlOutput($xhtml true){
  573.         $this->_isXhtml = $xhtml;
  574.         if($xhtml)
  575.             $this->_endTag = "/>\n";
  576.         else
  577.             $this->_endTag = ">\n";
  578.     }
  579.  
  580.     /**
  581.      * return the end of a html tag : "/>" or ">", depending if it will generate xhtml or html
  582.      * @return string 
  583.      */
  584.     public function endTag()return $this->_endTag;}
  585.  
  586. }

Documentation generated on Wed, 04 Jan 2017 22:56:16 +0100 by phpDocumentor 1.4.3