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 (description and keywords), Dominique Papin
  7. @contributor Warren Seine
  8. @copyright   2005-2009 Laurent Jouanneau, 2006 Yann, 2007 Dominique Papin
  9. @copyright   2008 Warren Seine
  10. *               few lines of code are copyrighted CopixTeam http://www.copix.org
  11. @link        http://www.jelix.org
  12. @licence     GNU Lesser General Public Licence see LICENCE file or http://www.gnu.org/licenses/lgpl.html
  13. */
  14.  
  15. /**
  16. *
  17. */
  18. require_once(JELIX_LIB_TPL_PATH.'jTpl.class.php');
  19.  
  20. /**
  21. * HTML response
  22. @package  jelix
  23. @subpackage core_response
  24. */
  25. class jResponseHtml extends jResponse {
  26.     /**
  27.     * jresponse id
  28.     * @var string 
  29.     */
  30.     protected $_type = 'html';
  31.  
  32.     /**
  33.      * Title of the document
  34.      * @var string 
  35.      */
  36.     public $title = '';
  37.  
  38.     /**
  39.      * favicon url linked to the document
  40.      * @var string 
  41.      * @since 1.0b2
  42.      */
  43.     public $favicon = '';
  44.  
  45.     /**
  46.      * The template engine used to generate the body content
  47.      * @var jTpl 
  48.      */
  49.     public $body = null;
  50.  
  51.     /**
  52.      * selector of the main template file
  53.      * This template should contains the body content, and is used by the $body template engine
  54.      * @var string 
  55.      */
  56.     public $bodyTpl = '';
  57.  
  58.     /**
  59.      * Selector of the template used when there are some errors, instead of $bodyTpl
  60.      * @var string 
  61.      */
  62.     public $bodyErrorTpl = '';
  63.  
  64.     /**
  65.      * body attributes
  66.      * This attributes are written on the body tags
  67.      * @var array 
  68.      */
  69.     public $bodyTagAttributesarray();
  70.  
  71.     /**
  72.      * says what part of the html head has been send
  73.      * @var integer 
  74.      */
  75.     protected $_headSent = 0;
  76.  
  77.     /**
  78.      * the charset of the document
  79.      * @var string 
  80.      */
  81.     protected $_charset;
  82.  
  83.     /**
  84.      * the lang of the document
  85.      * @var string 
  86.      */
  87.     protected $_lang;
  88.  
  89.     /**
  90.      * properties of the head content
  91.      */
  92.  
  93.     /**#@+
  94.      * content for the head
  95.      * @var array
  96.      */
  97.     protected $_CSSLink = array ();
  98.     protected $_CSSIELink = array ();
  99.     protected $_Styles  = array ();
  100.     protected $_JSLink  = array ();
  101.     protected $_JSIELink  = array ();
  102.     protected $_JSCode  = array ();
  103.     protected $_Others  = array ();
  104.     protected $_MetaKeywords = array();
  105.     protected $_MetaDescription = array();
  106.     /**#@-*/
  107.  
  108.     /**#@+
  109.      * content for the body
  110.      * @var array
  111.      */
  112.     protected $_bodyTop = array();
  113.     protected $_bodyBottom = array();
  114.     /**#@-*/
  115.  
  116.     /**
  117.      * says if the document is in xhtml or html
  118.      */
  119.     protected $_isXhtml = true;
  120.     protected $_endTag="/>\n";
  121.  
  122.     /**
  123.      * says if xhtml content type should be send or not.
  124.      * it true, a verification of HTTP_ACCEPT is done.
  125.      * @var boolean 
  126.      */
  127.     public $xhtmlContentType = false;
  128.  
  129.  
  130.     /**
  131.     * constructor;
  132.     * setup the charset, the lang, the template engine
  133.     */
  134.     function __construct (){
  135.         global $gJConfig;
  136.         $this->_charset = $gJConfig->charset;
  137.         $this->_lang = $gJConfig->locale;
  138.         $this->body = new jTpl();
  139.         parent::__construct();
  140.     }
  141.  
  142.     /**
  143.      * output the html content
  144.      *
  145.      * @return boolean    true if the generated content is ok
  146.      */
  147.     final public function output(){
  148.         $this->_headSent = 0;
  149.         if($this->_isXhtml && $this->xhtmlContentType && strstr($_SERVER['HTTP_ACCEPT'],'application/xhtml+xml')){
  150.             $this->_httpHeaders['Content-Type']='application/xhtml+xml;charset='.$this->_charset;
  151.         }else{
  152.             $this->_httpHeaders['Content-Type']='text/html;charset='.$this->_charset;
  153.         }
  154.  
  155.         $this->sendHttpHeaders();
  156.         if($this->_isXhtml){
  157.             echo '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
  158. <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="',$this->_lang,'" lang="',$this->_lang,'">
  159. ';
  160.         }else{
  161.             echo '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">'"\n";
  162.             echo '<html lang="',$this->_lang,'">';
  163.         }
  164.         $this->_headSent = 1;
  165.         $this->_commonProcess();
  166.         if($this->bodyTpl != '')
  167.             $this->body->meta($this->bodyTpl);
  168.         $this->outputHtmlHeader();
  169.         echo '<body ';
  170.         foreach($this->bodyTagAttributes as $attr=>$value){
  171.             echo $attr,'="'htmlspecialchars($value),'" ';
  172.         }
  173.         echo ">\n";
  174.         $this->_headSent = 2;
  175.         echo implode("\n",$this->_bodyTop);
  176.         if($this->bodyTpl != '')
  177.             $this->body->display($this->bodyTpl);
  178.  
  179.         if($this->hasErrors()){
  180.             if($GLOBALS['gJConfig']->error_handling['showInFirebug']){
  181.                 echo '<script type="text/javascript">if(console){';
  182.                 foreach$GLOBALS['gJCoord']->errorMessages  as $e){
  183.                     switch ($e[0]{
  184.                       case 'warning':
  185.                         echo 'console.warn("[warning ';
  186.                         break;
  187.                       case 'notice':
  188.                         echo 'console.info("[notice ';
  189.                         break;
  190.                       case 'strict':
  191.                         echo 'console.info("[strict ';
  192.                         break;
  193.                       case 'error':
  194.                         echo 'console.error("[error ';
  195.                         break;
  196.                     }
  197.                     echo $e[1],'] ',str_replace(array('"',"\n","\r","\t"),array('\"','\\n','\\r','\\t'),$e[2]),' (',str_replace('\\','\\\\',$e[3]),' ',$e[4],')");';
  198.                 }
  199.                 echo '}else{alert("there are some errors, you should activate Firebug to see them");}</script>';
  200.             }else{
  201.                 echo '<div id="jelixerror" style="position:absolute;left:0px;top:0px;border:3px solid red; background-color:#f39999;color:black;">';
  202.                 echo $this->getFormatedErrorMsg();
  203.                 echo '<p><a href="#" onclick="document.getElementById(\'jelixerror\').style.display=\'none\';return false;">fermer</a></p></div>';
  204.             }
  205.         }
  206.         echo implode("\n",$this->_bodyBottom);
  207.         if(count($GLOBALS['gJCoord']->logMessages)) {
  208.             if(count($GLOBALS['gJCoord']->logMessages['response'])) {
  209.                 echo '<ul id="jelixlog">';
  210.                 foreach($GLOBALS['gJCoord']->logMessages['response'as $m{
  211.                     echo '<li>',htmlspecialchars($m),'</li>';
  212.                 }
  213.                 echo '</ul>';
  214.             }
  215.             if(count($GLOBALS['gJCoord']->logMessages['firebug'])) {
  216.                 echo '<script type="text/javascript">if(console){';
  217.                 foreach($GLOBALS['gJCoord']->logMessages['firebug'as $m{
  218.                     echo 'console.debug("',str_replace(array('"',"\n","\r","\t"),array('\"','\\n','\\r','\\t'),$m),'");';
  219.                 }
  220.                 echo '}else{alert("there are log messages, you should activate Firebug to see them");}</script>';
  221.             }
  222.         }
  223.         echo '</body></html>';
  224.         return true;
  225.     }
  226.  
  227.     /**
  228.      * The method you can overload in your inherited html response
  229.      * overload it if you want to add processes (stylesheet, head settings, additionnal content etc..)
  230.      * for all actions
  231.      */
  232.     protected function _commonProcess(){
  233.  
  234.     }
  235.  
  236.     /**
  237.      * output errors
  238.      */
  239.     final public function outputErrors(){
  240.         if($this->_headSent < 1){
  241.              if(!$this->_httpHeadersSent){
  242.                 header("HTTP/1.0 500 Internal Server Error");
  243.                 header('Content-Type: text/html;charset='.$this->_charset);
  244.              }
  245.             echo '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">'"\n<html>";
  246.         }
  247.         if($this->_headSent < 2){
  248.             echo '<head><title>Errors</title></head><body>';
  249.         }
  250.         if($this->hasErrors()){
  251.             echo $this->getFormatedErrorMsg();
  252.         }else{
  253.             echo '<p style="color:#FF0000">Unknown Error</p>';
  254.         }
  255.         echo '</body></html>';
  256.     }
  257.  
  258.  
  259.     /**
  260.      * create html error messages
  261.      * @return string html content
  262.      */
  263.     protected function getFormatedErrorMsg(){
  264.         $errors='';
  265.         foreach$GLOBALS['gJCoord']->errorMessages  as $e){
  266.            $errors .=  '<p style="margin:0;"><b>['.$e[0].' '.$e[1].']</b> <span style="color:#FF0000">'.htmlspecialchars($e[2]ENT_NOQUOTES$this->_charset)."</span> \t".$e[3]." \t".$e[4]."</p>\n";
  267.         }
  268.         return $errors;
  269.     }
  270.  
  271.     /**
  272.      * add content to the body
  273.      * you can add additionnal content, before or after the content generated by the main template
  274.      * @param string $content additionnal html content
  275.      * @param boolean $beforeTpl true if you want to add it before the template content, else false for after
  276.      */
  277.     function addContent($content$beforeTpl false){
  278.       if($beforeTpl){
  279.         $this->_bodyTop[]=$content;
  280.       }else{
  281.          $this->_bodyBottom[]=$content;
  282.       }
  283.     }
  284.  
  285.     /**
  286.      * add a link to a javascript script in the document head
  287.      *
  288.      * $forIe parameter exists since 1.0b2
  289.      *
  290.      * @param string $src the link
  291.      * @param array $params additionnals attributes for the script tag
  292.      * @param boolean $forIE if true, the script sheet will be only for IE browser
  293.      */
  294.     final public function addJSLink ($src$params=array()$forIE=false){
  295.         if($forIE){
  296.             if (!isset ($this->_JSIELink[$src])){
  297.                 $this->_JSIELink[$src$params;
  298.             }
  299.         }else{
  300.             if (!isset ($this->_JSLink[$src])){
  301.                 $this->_JSLink[$src$params;
  302.             }
  303.         }
  304.     }
  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.     final 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.     final public function addStyle ($selector$def=null){
  335.         if (!isset ($this->_Styles[$selector])){
  336.             $this->_Styles[$selector$def;
  337.         }
  338.     }
  339.  
  340.     /**
  341.      * add additional content into the document head
  342.      * @param string $content 
  343.      * @since 1.0b1
  344.      */
  345.     final public function addHeadContent ($content){
  346.         $this->_Others[$content;
  347.     }
  348.  
  349.     /**
  350.      * add inline javascript code (inside a <script> tag)
  351.      * @param string $code  javascript source code
  352.      */
  353.     final public function addJSCode ($code){
  354.         $this->_JSCode[$code;
  355.     }
  356.  
  357.     /**
  358.      * add some keywords in a keywords meta tag
  359.      * @author Yann
  360.      * @param string $content keywords
  361.      * @since 1.0b1
  362.      */
  363.     final public function addMetaKeywords ($content){
  364.         $this->_MetaKeywords[$content;
  365.     }
  366.     /**
  367.      * add a description in a description meta tag
  368.      * @author Yann
  369.      * @param string $content a description
  370.      * @since 1.0b1
  371.      */
  372.     final public function addMetaDescription ($content){
  373.         $this->_MetaDescription[$content;
  374.     }
  375.  
  376.     /**
  377.      * generate the content of the <head> content
  378.      */
  379.     final protected function outputHtmlHeader (){
  380.         echo '<head>'."\n";
  381.         if($this->_isXhtml && $this->xhtmlContentType && strstr($_SERVER['HTTP_ACCEPT'],'application/xhtml+xml')){      
  382.             echo '<meta content="application/xhtml+xml; charset='.$this->_charset.'" http-equiv="content-type"'.$this->_endTag;
  383.         else {
  384.             echo '<meta content="text/html; charset='.$this->_charset.'" http-equiv="content-type"'.$this->_endTag;
  385.         }
  386.         echo '<title>'.htmlspecialchars($this->title)."</title>\n";
  387.  
  388.         if(!empty($this->_MetaDescription)){
  389.             // meta description
  390.             $description implode(' ',$this->_MetaDescription);
  391.             echo '<meta name="description" content="'.htmlspecialchars($description).'" '.$this->_endTag;
  392.         }
  393.  
  394.         if(!empty($this->_MetaKeywords)){
  395.             // meta description
  396.             $keywords implode(',',$this->_MetaKeywords);
  397.             echo '<meta name="keywords" content="'.htmlspecialchars($keywords).'" '.$this->_endTag;
  398.         }
  399.  
  400.         // css link
  401.         foreach ($this->_CSSLink as $src=>$params){
  402.             //the extra params we may found in there.
  403.             $more '';
  404.             foreach ($params as $param_name=>$param_value){
  405.                 $more .= $param_name.'="'htmlspecialchars($param_value).'" ';
  406.             }
  407.             if(!isset($params['rel']))
  408.                 $more .='rel="stylesheet" ';
  409.             echo  '<link type="text/css" href="',htmlspecialchars($src),'" ',$more,$this->_endTag;
  410.         }
  411.  
  412.         if(count($this->_CSSIELink)){
  413.             foreach ($this->_CSSIELink as $src=>$params){
  414.                 // special params for conditions on IE versions
  415.                 if (!isset($params['_ieCondition']))
  416.                   $params['_ieCondition''IE' ;
  417.                 echo '<!--[if '.$params['_ieCondition'].' ]>';
  418.                 //the extra params we may found in there.
  419.                 $more '';
  420.                 foreach ($params as $param_name=>$param_value){
  421.                     if ($param_name=='_ieCondition')
  422.                       continue ;
  423.                     $more .= $param_name.'="'htmlspecialchars($param_value).'" ';
  424.                 }
  425.                 if(!isset($params['rel']))
  426.                     $more .='rel="stylesheet" ';
  427.                 echo  '<link type="text/css" href="',htmlspecialchars($src),'" ',$more,$this->_endTag;
  428.                 echo '<![endif]-->';
  429.             }
  430.         }
  431.  
  432.         if($this->favicon != ''){
  433.             $fav htmlspecialchars($this->favicon);
  434.             echo '<link rel="icon" type="image/x-icon" href="',$fav,'" ',$this->_endTag;
  435.             echo '<link rel="shortcut icon" type="image/x-icon" href="',$fav,'" ',$this->_endTag;
  436.         }
  437.  
  438.         // js link
  439.         foreach ($this->_JSLink as $src=>$params){
  440.             //the extra params we may found in there.
  441.             $more '';
  442.             foreach ($params as $param_name=>$param_value){
  443.                 $more .= $param_name.'="'htmlspecialchars($param_value).'" ';
  444.             }
  445.             echo '<script type="text/javascript" src="',htmlspecialchars($src),'" ',$more,'></script>',"\n";
  446.         }
  447.         if(count($this->_JSIELink)){
  448.             echo '<!--[if IE]>';
  449.             foreach ($this->_JSIELink as $src=>$params){
  450.                 //the extra params we may found in there.
  451.                 $more '';
  452.                 foreach ($params as $param_name=>$param_value){
  453.                     $more .= $param_name.'="'htmlspecialchars($param_value).'" ';
  454.                 }
  455.                 echo '<script type="text/javascript" src="',htmlspecialchars($src),'" ',$more,'></script>',"\n";
  456.             }
  457.             echo '<![endif]-->';
  458.         }
  459.  
  460.         // styles
  461.         if(count($this->_Styles)){
  462.             echo '<style type="text/css">
  463.             ';
  464.             foreach ($this->_Styles as $selector=>$value){
  465.                 if (strlen ($value)){
  466.                     //il y a une paire clef valeur.
  467.                     echo $selector.' {'.$value."}\n";
  468.                 }else{
  469.                     //il n'y a pas de valeur, c'est peut ĂȘtre simplement une commande.
  470.                     //par exemple @import qqchose, ...
  471.                     echo $selector"\n";
  472.                 }
  473.             }
  474.             echo "\n </style>\n";
  475.         }
  476.         // js code
  477.         if(count($this->_JSCode)){
  478.             echo '<script type="text/javascript">
  479. // <![CDATA[
  480.  '.implode ("\n"$this->_JSCode).'
  481. // ]]>
  482. </script>';
  483.         }
  484.         echo implode ("\n"$this->_Others)'</head>';
  485.     }
  486.  
  487.     /**
  488.      * used to erase some head properties
  489.      * @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.
  490.      */
  491.     final public function clearHtmlHeader ($what=null){
  492.         $cleanable array ('CSSLink''CSSIELink''Styles''JSLink','JSIELink''JSCode''Others','MetaKeywords','MetaDescription');
  493.         if($what==null)
  494.             $what$cleanable;
  495.         foreach ($what as $elem){
  496.             if (in_array ($elem$cleanable)){
  497.                 $name '_'.$elem;
  498.                 $this->$name array ();
  499.             }
  500.         }
  501.     }
  502.  
  503.     /**
  504.      * change the type of html for the output
  505.      * @param boolean $xhtml true if you want xhtml, false if you want html
  506.      */
  507.     final public function setXhtmlOutput($xhtml true){
  508.         $this->_isXhtml = $xhtml;
  509.         if($xhtml)
  510.             $this->_endTag = "/>\n";
  511.         else
  512.             $this->_endTag = ">\n";
  513.     }
  514.  
  515.     /**
  516.      * says if the response will be xhtml or html
  517.      * @return boolean true if it is xhtml
  518.      */
  519.     final public function isXhtml()return $this->_isXhtml}
  520.  
  521.     /**
  522.      * return the end of a html tag : "/>" or ">", depending if it will generate xhtml or html
  523.      * @return string 
  524.      */
  525.     final public function endTag()return $this->_endTag;}
  526.  
  527. }
  528. ?>

Documentation generated on Wed, 07 Sep 2011 13:47:45 +0200 by phpDocumentor 1.4.3