headerbanner

Odstranění systémově vkládaných elementů do sekce HEAD v J1.5 až J2.5 bez hacku jádra

Joomla vkládá do každé stránky skript pro titulkování obrázků, linky na RSS a další elementy. Mnohé lze odstranit úpravou šablony.

Joomla vytváří hlavičku direktivou šablony:

<jdoc:include type="head" />

Co všechno vkládá je možné zhruba zjistit například vložením PHP do příslušné šablony:

<?php
$headerstuff = $this->getHeadData();
foreach ($headerstuff as $key => $value){
    echo  "\n\n\n firstkey: " .$key;
    echo "\n firstvalue:" .$value;
      foreach ($value as $keyx => $valuex){
        echo "\n\t seckey: " .$keyx;
        echo "\n\t secvalue:" .$valuex;
        foreach ($valuex as $keyy => $valuey){
               echo "\n\t\t thirdkey: " .$keyy;
               echo "\n\t\t thirdvalue: " .$valuey;
        }
      }                                 
}
?>

Následný výpis zdrojového kódu stránky vypadá například:

Firstkey: title
 firstvalue:Dobře nalezitelné weby, PR, komunikace - Home


 Firstkey: description
 firstvalue:public relations, dobře nalezitelné weby


 Firstkey: link
 firstvalue:


 Firstkey: metaTags
 firstvalue:Array
	 seckey: http-equiv
	 secvalue:Array
		 thirdkey: content-type
		 thirdvalue: text/html
	 seckey: standard
	 secvalue:Array
		 thirdkey: keywords
		 thirdvalue: 
		 thirdkey: rights
		 thirdvalue: 


 Firstkey: links
 firstvalue:Array
	 seckey: /?format=feed&type=rss
	 secvalue:Array
		 thirdkey: relation
		 thirdvalue: alternate
		 thirdkey: relType
		 thirdvalue: rel
		 thirdkey: attribs
		 thirdvalue: Array
	 seckey: /?format=feed&type=atom
	 secvalue:Array
		 thirdkey: relation
		 thirdvalue: alternate
		 thirdkey: relType
		 thirdvalue: rel
		 thirdkey: attribs
		 thirdvalue: Array


 Firstkey: styleSheets
 firstvalue:Array
	 seckey: /components/com_jcomments/tpl/default/style.css?v=21
	 secvalue:Array
		 thirdkey: mime
		 thirdvalue: text/css
		 thirdkey: media
		 thirdvalue: 
		 thirdkey: attribs
		 thirdvalue: Array


 Firstkey: style
 firstvalue:Array


 Firstkey: scripts
 firstvalue:Array
	 seckey: /components/com_jcomments/js/jcomments-v2.3.js?v=8
	 secvalue:Array
		 thirdkey: mime
		 thirdvalue: text/javascript
		 thirdkey: defer
		 thirdvalue: 
		 thirdkey: async
		 thirdvalue: 
	 seckey: /components/com_jcomments/libraries/joomlatune/ajax.js?v=4
	 secvalue:Array
		 thirdkey: mime
		 thirdvalue: text/javascript
		 thirdkey: defer
		 thirdvalue: 
		 thirdkey: async
		 thirdvalue: 
	 seckey: /media/system/js/mootools-core.js
	 secvalue:Array
		 thirdkey: mime
		 thirdvalue: text/javascript
		 thirdkey: defer
		 thirdvalue: 
		 thirdkey: async
		 thirdvalue: 
	 seckey: /media/system/js/core.js
	 secvalue:Array
		 thirdkey: mime
		 thirdvalue: text/javascript
		 thirdkey: defer
		 thirdvalue: 
		 thirdkey: async
		 thirdvalue: 
	 seckey: /media/system/js/caption.js
	 secvalue:Array
		 thirdkey: mime
		 thirdvalue: text/javascript
		 thirdkey: defer
		 thirdvalue: 
		 thirdkey: async
		 thirdvalue: 
	 seckey: /media/system/js/mootools-more.js
	 secvalue:Array
		 thirdkey: mime
		 thirdvalue: text/javascript
		 thirdkey: defer
		 thirdvalue: 
		 thirdkey: async
		 thirdvalue: 


 Firstkey: script
 firstvalue:Array
	 seckey: text/javascript
	 secvalue:do_nothing( function() {
				
			});


 Firstkey: custom
 firstvalue:Array

Podle tohoto výpisu je možné zakázat libovolné položky. Stačí ještě před direktivu vkládající hlavičku vložit krátký kód. Ukázka odstraňuje element pro vložení caption.js a také "surový" kód, který s vkládáním titulků pod obrázky souvisí.

<?php
$headerstuff = $this->getHeadData();
foreach ($headerstuff as $key => $value){
  foreach ($value as $keyx => $valuex){
    //viz |A| dále
    if (($key == "scripts") and (strpos($keyx,"caption") !== false)) {
      unset ($headerstuff[$key][$keyx]);
    }
    //viz |B| dále
    if (($key == "script") and (strpos($keyx,"text/javascript") !== false)) {
      //strpos je rychlejší, než regulární výraz, proto nejprve následující test
      if (strpos($headerstuff[$key][$keyx],"caption") !== false) {
        $headerstuff[$key][$keyx] = preg_replace("~\s*window\.addEvent\s*\(\s*\'load\'\s*,\s*function\s*\(\s*\)\s*\{\s*new\s*JCaption[^;]*;[^;]*;\s*~m", '', $headerstuff[$key][$keyx]);        
 
      }
    }
  }                                 
}
$this->setHeadData($headerstuff);
//viz |C| dále
if (empty($this->_script['text/javascript'])){
    unset($this->_script['text/javascript']);
}
?>

Jednoduché kontroly na výskyt řetězců jsou rychlé, i když ne jednoznačné. |A| zajistí odstranění skriptu caption.js, |B| odstraní zdrojový kód pro caption, |C| pak odstraní celý element script, pokud v něm není další kód.

Alternativu pro odstranění caption najdete zde, jiné řešení s úplnou kontrolou hlavičky HEAD je zde.