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

Documentation generated on Mon, 19 Sep 2011 14:13:23 +0200 by phpDocumentor 1.4.3