rtgx

Jednoduchá štatistika pre všetky typy stránok

Zadanie

Pri každom načítaní stránky vo FE zapísať záznam do databázy.
Popis položiek štatistickej tabuľky:

  • uid: jedinečný identifikátor
  • pid: číslo stránky
  • tstamp: čas uloženia záznamu
Tabuľka
CREATE TABLE `tx_rtgextpages_hits` (
`uid` int(11) NOT NULL auto_increment,
`pid` int(11) NOT NULL default '0',
`tstamp` int(11) NOT NULL default '0',
PRIMARY KEY (`uid`),
KEY `parent` (`pid`)
);
Postupnosť volania funkcií pri vytváraní stránky

Riešenie

Pôvodne bol zápis položky (hitu) do DB riešený vloženým PHP skriptom do objektu page.20 (typ objektu USER_INT). Toto však prebehne len vtedy, ak sa pre danú stránku generuje nejaký obsah, to znamená, že napr. pre stránky typu "Externá URL" alebo "Skratka" takáto štatistika nefunguje.

Riešením je "hook", ktorý prebehne po vytvorení spojenia s databázou vykonávaný v triede tslib_fe funkciou connectToDB po úspešnom pripojení k databáze (pozn.: hook v konštruktore triedy (tslib_fe-PostProc) sa nedá použiť, pretože ešte nie je vytvorené spojenie s DB, ktoré potrebujeme pre zápis hitu).

Postupnosť volania jednotlivých funkcií pri vytváraní stránky je názorne zobrazená na obrázku vpravo (skrátený výpis). Tu jasne vidieť, že hook connectToDB (krok č. 11) je posledná možnosť pre vloženie nášho skriptu predtým, ako bude vykonané presmerovanie v kroku č. 14 (send redirect), ktoré prebehne napr. pri stránke typu "Externá URL".

localconf.php
$TYPO3_CONF_VARS['SC_OPTIONS']['tslib/class.tslib_fe.php']['connectToDB']['tx_rtgextpages'] = 
'EXT:rtgextpages/class.tx_rtgextpages_hit.php:&tx_rtgextpages_hit->hook_eofe';
class.tx_rtgextpages_hit.php
/**
* Hit statistics
*
* @author Robert Gonda <robert.gonda@gmail.com>
* @package TYPO3
* @subpackage tx_rtgextpages
*/
class tx_rtgextpages_hit {

/**
* Hook
*
* @param array Parameters from frontend
* @param object TSFE object
* @return void
*/
function hook_eofe( &$params, $ref ) {

$conf['cookieExpire'] = 1;
$this->id = $params['pObj']->id;
if( !( $_COOKIE['HitCookie'.$this->id] == $this->id ) ) {
$time = time();
$insertArr = array( 'tstamp' => $time, 'pid' => intval( $this->id ) );
$res = $GLOBALS['TYPO3_DB']->exec_INSERTquery( 'tx_rtgextpages_hits', $insertArr );
if( $res ) {
if( $GLOBALS['TYPO3_DB']->sql_affected_rows() > 0 ) {
setcookie( 'HitCookie'.$this->id, $this->id, $time + ( intval( $conf['cookieExpire'] ) * 3600 ) );
}
}
}
}
}

Generátor typoscriptu

Vytvára typoscript pre bežné použitie. Generátor je jednoduchý na obsluhu, stačí vyplniť zopár položiek formulára.

Odkazy