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(JELIX_LIB_CORE_PATH.'response/jResponseBasicHtml.class.php');
  21. require_once(JELIX_LIB_PATH.'tpl/jTpl.class.php');
  22.  
  23. /**
  24. * HTML 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.      * says if the document uses a Strict or Transitional Doctype
  153.      * @var boolean 
  154.      * @since 1.1.3
  155.      */
  156.     protected $_strictDoctype = true;
  157.  
  158.     /**
  159.     * constructor;
  160.     * setup the charset, the lang, the template engine
  161.     */
  162.     function __construct (){
  163.         $this->body = new jTpl();
  164.         parent::__construct();
  165.     }
  166.  
  167.     /**
  168.      * output the html content
  169.      *
  170.      * @return boolean    true if the generated content is ok
  171.      */
  172.     public function output(){
  173.     
  174.         if($this->_outputOnlyHeaders){
  175.             $this->sendHttpHeaders();
  176.             return true;
  177.         }
  178.  
  179.         foreach($this->plugins as $name=>$plugin)
  180.             $plugin->afterAction();
  181.  
  182.         $this->doAfterActions();
  183.  
  184.         $this->setContentType();
  185.         // let's get the main content for the body
  186.         // we don't output yet <head> and other things, to have the
  187.         // opportunity for any components called during the output,
  188.         // to add things in the <head>
  189.         if ($this->bodyTpl != ''{
  190.             $this->body->meta($this->bodyTpl);
  191.             $content $this->body->fetch($this->bodyTpl'html'truefalse);
  192.         }
  193.         else $content '';
  194.  
  195.         // retrieve errors messages and log messages
  196.         jLog::outputLog($this);
  197.  
  198.         foreach($this->plugins as $name=>$plugin)
  199.             $plugin->beforeOutput();
  200.  
  201.         // now let's output the html content
  202.         $this->sendHttpHeaders();
  203.         $this->outputDoctype();
  204.         $this->outputHtmlHeader();
  205.         echo '<body ';
  206.         foreach($this->bodyTagAttributes as $attr=>$value){
  207.             echo $attr,'="'htmlspecialchars($value),'" ';
  208.         }
  209.         echo ">\n";
  210.         echo implode("\n",$this->_bodyTop);
  211.         echo $content;
  212.         echo implode("\n",$this->_bodyBottom);
  213.  
  214.         foreach($this->plugins as $name=>$plugin)
  215.             $plugin->atBottom();
  216.  
  217.         echo '</body></html>';
  218.         return true;
  219.     }
  220.  
  221.     /**
  222.      * add a generic link to the head
  223.      * 
  224.      * @param string $href  url of the link
  225.      * @param string $rel   relation name
  226.      * @param string $type  mime type of the ressource
  227.      * @param string $title 
  228.      */ 
  229.     public function addLink($href$rel$type=''$title=''{
  230.         $this->_Link[$hrefarray($rel$type$title);
  231.     }
  232.  
  233.     /**
  234.      * add a link to a javascript script in the document head
  235.      *
  236.      * $forIe parameter exists since 1.0b2
  237.      *
  238.      * @param string $src the link
  239.      * @param array $params additionnals attributes for the script tag
  240.      * @param boolean $forIE if true, the script sheet will be only for IE browser. string values possible (ex:'lt IE 7')
  241.      */
  242.     public function addJSLink ($src$params=array()$forIE=false){
  243.         if($forIE){
  244.             if (!isset ($this->_JSIELink[$src])){
  245.                 if (!is_bool($forIE&& !empty($forIE))
  246.                     $params['_ieCondition'$forIE;
  247.                 $this->_JSIELink[$src$params;
  248.             }
  249.         }else{
  250.             if (!isset ($this->_JSLink[$src])){
  251.                 $this->_JSLink[$src$params;
  252.             }
  253.         }
  254.     }
  255.  
  256.     /**
  257.      * returns all JS links
  258.      * @return array  key = url, value=link attributes
  259.      */
  260.     public function getJSLinks(return $this->_JSLink}
  261.  
  262.     /**
  263.      * set all JS links
  264.      * @param array  $list key = url, value=link attributes
  265.      */
  266.     public function setJSLinks($list$this->_JSLink = $list}
  267.  
  268.     /**
  269.      * returns all JS links for IE
  270.      * @return array  key = url, value=link attributes + optional parameter _iecondition
  271.      */
  272.     public function getJSIELinks(return $this->_JSIELink}
  273.  
  274.     /**
  275.      * set all JS links for IE
  276.      * @param array  $list key = url, value=link attributes
  277.      */
  278.     public function setJSIELinks($list$this->_JSIELink = $list}
  279.  
  280.      /**
  281.      * returns all CSS links
  282.      * @var array  key = url, value=link attributes
  283.      */
  284.     public function getCSSLinks(return $this->_CSSLink}
  285.  
  286.     /**
  287.      * set all CSS links
  288.      * @param array  $list key = url, value=link attributes
  289.      */
  290.     public function setCSSLinks($list$this->_CSSLink = $list}
  291.  
  292.     /**
  293.      * returns all CSS links for IE
  294.      * @var array  key = url, value=link attributes + optional parameter _iecondition
  295.      */
  296.      public function getCSSIELinks(return $this->_CSSIELink}
  297.  
  298.     /**
  299.      * set all CSS links for IE
  300.      * @param array  $list key = url, value=link attributes
  301.      */
  302.     public function setCSSIELinks($list$this->_CSSIELink = $list}
  303.  
  304.     /**
  305.      * add a link to a css stylesheet in the document head
  306.      *
  307.      * $forIe parameter exists since 1.0b2
  308.      *
  309.      * @param string $src the link
  310.      * @param array $params additionnals attributes for the link tag
  311.      * @param mixed $forIE if true, the style sheet will be only for IE browser. string values possible (ex:'lt IE 7')
  312.      */
  313.     public function addCSSLink ($src$params=array ()$forIE=false){
  314.         if($forIE){
  315.             if (!isset ($this->_CSSIELink[$src])){
  316.                 if (!is_bool($forIE&& !empty($forIE))
  317.                     $params['_ieCondition'$forIE;
  318.                 $this->_CSSIELink[$src$params;
  319.             }
  320.         }else{
  321.             if (!isset ($this->_CSSLink[$src])){
  322.                 $this->_CSSLink[$src$params;
  323.             }
  324.         }
  325.     }
  326.  
  327.     /**
  328.      * add inline css style into the document (inside a <style> tag)
  329.      * @param string $selector css selector
  330.      * @param string $def      css properties for the given selector
  331.      */
  332.     public function addStyle ($selector$def=null){
  333.         if (!isset ($this->_Styles[$selector])){
  334.             $this->_Styles[$selector$def;
  335.         }
  336.     }
  337.  
  338.     /**
  339.      * add inline javascript code (inside a <script> tag)
  340.      * @param string $code  javascript source code
  341.      * @param boolean $before will insert the code before js links if true
  342.      */
  343.     public function addJSCode ($code$before false){
  344.         if ($before)
  345.             $this->_JSCodeBefore[$code;
  346.         else
  347.             $this->_JSCode[$code;
  348.     }
  349.  
  350.     /**
  351.      * add some keywords in a keywords meta tag
  352.      * @author Yann
  353.      * @param string $content keywords
  354.      * @since 1.0b1
  355.      */
  356.     public function addMetaKeywords ($content){
  357.         $this->_MetaKeywords[$content;
  358.     }
  359.     /**
  360.      * add a description in a description meta tag
  361.      * @author Yann
  362.      * @param string $content a description
  363.      * @since 1.0b1
  364.      */
  365.     public function addMetaDescription ($content){
  366.         $this->_MetaDescription[$content;
  367.     }
  368.     /**
  369.      * add author(s) in a author meta tag
  370.      * @author Olivier Demah
  371.      * @param string $content author(s)
  372.      * @since 1.2
  373.      */
  374.     public function addMetaAuthor($content){
  375.         $this->_MetaAuthor = $content;
  376.     }
  377.     /**
  378.      * add generator a generator meta tag
  379.      * @author Olivier Demah
  380.      * @param string $content generator
  381.      * @since 1.2
  382.      */
  383.     public function addMetaGenerator($content){
  384.         $this->_MetaGenerator = $content;
  385.     }
  386.     /**
  387.      * generate the doctype. You can override it if you want to have your own doctype, like XHTML+MATHML.
  388.      * @since 1.1
  389.      */
  390.     protected function outputDoctype (){
  391.         if($this->_isXhtml){
  392.             echo '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 '.($this->_strictDoctype?'Strict':'Transitional').'//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-'.($this->_strictDoctype?'strict':'transitional').'.dtd">
  393. <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="',$this->_lang,'" lang="',$this->_lang,'">
  394. ';
  395.         }else{
  396.             echo '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01'.($this->_strictDoctype?'':' Transitional').'//EN" "http://www.w3.org/TR/html4/'.($this->_strictDoctype?'strict':'loose').'.dtd">'"\n";
  397.             echo '<html lang="',$this->_lang,'">';
  398.         }
  399.     }
  400.  
  401.     protected function outputJsScriptTag$fileUrl$scriptParams {
  402.         $params '';
  403.         foreach ($scriptParams as $param_name=>$param_value){
  404.             if ($param_name=='_ieCondition')
  405.                 continue ;
  406.             $params .= $param_name.'="'htmlspecialchars($param_value).'" ';
  407.         }
  408.  
  409.         echo '<script type="text/javascript" src="',htmlspecialchars($fileUrl),'" ',$params,'></script>',"\n";
  410.     }
  411.  
  412.  
  413.     protected function outputCssLinkTag$fileUrl$cssParams {
  414.         $params '';   
  415.         foreach ($cssParams as $param_name=>$param_value){
  416.             if ($param_name=='_ieCondition')
  417.                 continue ;
  418.             $params .= $param_name.'="'htmlspecialchars($param_value).'" ';
  419.         }
  420.  
  421.         if(!isset($cssParams['rel']))
  422.             $params .='rel="stylesheet" ';
  423.         echo '<link type="text/css" href="',htmlspecialchars($fileUrl),'" ',$params,$this->_endTag,"\n";
  424.     }
  425.  
  426.     /**
  427.      * generate the content of the <head> content
  428.      */
  429.     protected function outputHtmlHeader (){
  430.  
  431.         echo '<head>'."\n";
  432.         if($this->_isXhtml && $this->xhtmlContentType && strstr($_SERVER['HTTP_ACCEPT'],'application/xhtml+xml')){      
  433.             echo '<meta content="application/xhtml+xml; charset='.$this->_charset.'" http-equiv="content-type"'.$this->_endTag;
  434.         else {
  435.             echo '<meta content="text/html; charset='.$this->_charset.'" http-equiv="content-type"'.$this->_endTag;
  436.         }
  437.         echo '<title>'.htmlspecialchars($this->title)."</title>\n";
  438.  
  439.         if(!empty($this->_MetaDescription)){
  440.             // meta description
  441.             $description implode(' ',$this->_MetaDescription);
  442.             echo '<meta name="description" content="'.htmlspecialchars($description).'" '.$this->_endTag;
  443.         }
  444.  
  445.         if(!empty($this->_MetaKeywords)){
  446.             // meta description
  447.             $keywords implode(',',$this->_MetaKeywords);
  448.             echo '<meta name="keywords" content="'.htmlspecialchars($keywords).'" '.$this->_endTag;
  449.         }
  450.         if (!empty($this->_MetaGenerator)) {
  451.             echo '<meta name="generator" content="'.htmlspecialchars($this->_MetaGenerator).'" '.$this->_endTag;
  452.         }
  453.         if (!empty($this->_MetaAuthor)) {
  454.             echo '<meta name="author" content="'.htmlspecialchars($this->_MetaAuthor).'" '.$this->_endTag;
  455.         }
  456.  
  457.         // css link
  458.         foreach ($this->_CSSLink as $src=>$params){
  459.             $this->outputCssLinkTag($src$params);
  460.         }
  461.  
  462.         foreach ($this->_CSSIELink as $src=>$params){
  463.             // special params for conditions on IE versions
  464.             if (!isset($params['_ieCondition']))
  465.               $params['_ieCondition''IE' ;
  466.             echo '<!--[if '.$params['_ieCondition'].' ]>';
  467.             $this->outputCssLinkTag($src$params);
  468.             echo '<![endif]-->';
  469.         }
  470.  
  471.         if($this->favicon != ''){
  472.             $fav htmlspecialchars($this->favicon);
  473.             echo '<link rel="icon" type="image/x-icon" href="',$fav,'" ',$this->_endTag;
  474.             echo '<link rel="shortcut icon" type="image/x-icon" href="',$fav,'" ',$this->_endTag;
  475.         }
  476.         
  477.         // others links
  478.         foreach($this->_Link as $href=>$params){
  479.             $more array();
  480.             if!empty($params[1]))
  481.                 $more['type="'.$params[1].'"';
  482.             if (!empty($params[2]))
  483.                 $more['title = "'.htmlspecialchars($params[2]).'"';
  484.             echo '<link rel="',$params[0],'" href="',htmlspecialchars($href),'" ',implode($more' '),$this->_endTag;
  485.         }
  486.  
  487.         // js code
  488.         if(count($this->_JSCodeBefore)){
  489.             echo '<script type="text/javascript">
  490. // <![CDATA[
  491.  '.implode ("\n"$this->_JSCodeBefore).'
  492. // ]]>
  493. </script>';
  494.         }
  495.  
  496.         // js link
  497.         foreach ($this->_JSLink as $src=>$params){
  498.             $this->outputJsScriptTag($src$params);
  499.         }
  500.  
  501.         foreach ($this->_JSIELink as $src=>$params){
  502.             if (!isset($params['_ieCondition']))
  503.                 $params['_ieCondition''IE' ;
  504.             echo '<!--[if '.$params['_ieCondition'].' ]>';
  505.             $this->outputJsScriptTag($src$params);
  506.             echo '<![endif]-->';
  507.         }
  508.  
  509.         // styles
  510.         if(count($this->_Styles)){
  511.             echo "<style type=\"text/css\">\n";
  512.             foreach ($this->_Styles as $selector=>$value){
  513.                 if (strlen ($value)){
  514.                     // there is a key/value
  515.                     echo $selector.' {'.$value."}\n";
  516.                 }else{
  517.                     // no value, it could be simply a command
  518.                     //for example @import something, ...
  519.                     echo $selector"\n";
  520.                 }
  521.             }
  522.             echo "\n </style>\n";
  523.         }
  524.         // js code
  525.         if(count($this->_JSCode)){
  526.             echo '<script type="text/javascript">
  527. // <![CDATA[
  528.  '.implode ("\n"$this->_JSCode).'
  529. // ]]>
  530. </script>';
  531.         }
  532.         echo implode ("\n"$this->_headBottom)'</head>';
  533.     }
  534.  
  535.     /**
  536.      * used to erase some head properties
  537.      * @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.
  538.      */
  539.     public function clearHtmlHeader ($what=null){
  540.         $cleanable array ('CSSLink''CSSIELink''Styles''JSLink','JSIELink''JSCode''Others','MetaKeywords','MetaDescription');
  541.         if($what==null)
  542.             $what$cleanable;
  543.         foreach ($what as $elem){
  544.             if (in_array ($elem$cleanable)){
  545.                 $name '_'.$elem;
  546.                 $this->$name array ();
  547.             }
  548.         }
  549.     }
  550.  
  551.     /**
  552.      * change the type of html for the output
  553.      * @param boolean $xhtml true if you want xhtml, false if you want html
  554.      */
  555.     public function setXhtmlOutput($xhtml true){
  556.         $this->_isXhtml = $xhtml;
  557.         if($xhtml)
  558.             $this->_endTag = "/>\n";
  559.         else
  560.             $this->_endTag = ">\n";
  561.     }
  562.  
  563.     /**
  564.      * activate / deactivate the strict Doctype (activated by default)
  565.      * @param boolean $val true for strict, false for transitional
  566.      * @since 1.1.3
  567.      */
  568.     public function strictDoctype($val true){
  569.         $this->_strictDoctype = $val;
  570.     }
  571.  
  572.     /**
  573.      * return the end of a html tag : "/>" or ">", depending if it will generate xhtml or html
  574.      * @return string 
  575.      */
  576.     public function endTag()return $this->_endTag;}
  577.  
  578. }

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