Wer es noch nicht kennt sollte es umbedingt einmal ausprobieren. Piwik ist eine Open Source Alternative zu Google Analytics, ist mittlerweile in der Version 1.4 erschienen und in PHP geschrieben. Dabei liegen die Vorteile in der offenen Datenbankstruktur und der Möglichkeit Plugins selber zu schreiben. Auch die Integration in das eigene System gestaltet sich durch die Widgets sehr einfach. Mächtig wird das ganze jedoch erst duch seine API zur Segmentierung. Um die Integration in das eigene System zu erleichtern, habe ich die PHP API Klasse erweitert und auch um die Möglichkeit erweitert mit Zielmetriken zu arbeiten. Da diese eigentlich immer erst in Piwik erstellt werden müssen habe ich einen etwas anderen Weg genommen. Wenn man ein Ziel tracken möchte und dieses existiert noch nicht wird die Klasse diese erstellen und die nötigen Assoziationen in einer lokalen Tabelle speichern.
create table `piwikGoals` (
`id` INT NOT NULL auto_increment primary key,
`goalId` INT NOT NULL,
`goalName` VARCHAR(255) NOT NULL UNIQUE
) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_general_ci
Anschließend habe ich die vorhanden Piwik Tracker Klasse erweitert. Das ganze basiert auf Zend …
<?php
/**
* Description of Tracker
*
* @author matthiaslaug
*/
class My_Piwik_Tracker extends Piwik_Tracker{
/**
*
* @param string $name
* @param integer $revenue
*/
static function trackGoal($name, $revenue = 0){
//add to your config
//piwik.id = YOUR_PIWIK_ID
//piwik.url = URL_TO_YOUR_PIWIK_INSTALLATION
//piwik.token = YOUR_PIWIK_AUTH_TOKEN
$config = Zend_Registry::get('configuration');
try {
$t = new Yourdelivery_Model_Piwik_Tracker($config->piwik->id, $config->piwik->url);
$result = $t->doTrackGoalAndCreate($name, $revenue);
} catch (Exception $e) {
}
}
/**
* track a goal but create relation if not existent
* @author mlaug
* @since 08.06.2011
* @param string $name
* @param integer $revenue
* @return boolean
*/
public function doTrackGoalAndCreate($name, $revenue = 0) {
$table = new DbTable_Piwik_Goals();
$row = $table->fetchRow('goalName="' . $name . '"');
if ( !$row ){
$goalId = $this->createGoal($name);
if ( $goalId <= 0 ){
return false;
}
$table->createRow(array(
'goalId' => $goalId,
'goalName' => $name
))->save();
}
else{
$goalId = (integer) $row->goalId;
if ( $goalId <= 0 ){
return false;
}
}
$this->doTrackGoal($goalId, $revenue);
return $goalId;
}
/**
* create a goal
* @author mlaug
* @since 08.06.2011
* @param string $name
* @param string $pattern
* @param string $matchAttr
* @param string $patternType
* @param boolean $caseSensitive
* @param integer $revenue
* @param boolean $allowMultipleConversionsPerVisit
* @return integer
*/
public function createGoal($name, $pattern = '/', $matchAttr = 'manually', $patternType = 'contains', $caseSensitive = false, $revenue = 0, $allowMultipleConversionsPerVisit = false){
$config = Zend_Registry::get('configuration');
$url = self::$URL . '?idSite=' . $this->idSite;
$url .= '&module=API';
$url .= '&method=Goals.addGoal';
$url .= '&matchAttribute=' . $matchAttr;
$url .= '&patternType=' . $patternType;
$url .= '&pattern=' . $pattern;
$url .= '&name=' . $name;
$url .= '&token_auth=' . $config->piwik->auth;
$ret = $this->sendRequest($url);
try{
$xml = new DOMDocument();
$xml->loadXML($ret);
if ( $xml->getElementsByTagName('error')->length > 0 ){
return 0;
}
$goalId = (integer) $xml->getElementsByTagName('result')->item(0)->nodeValue;
return $goalId;
}
catch ( Exception $e ){
return 0;
}
}
/**
* @author mlaug
* @since 08.06.2011
* @param integer $idGoal
* @return boolean
*/
public function deleteGoal($idGoal){
$config = Zend_Registry::get('configuration');
$url = self::$URL . '?idSite=' . $this->idSite;
$url .= '&module=API';
$url .= '&method=Goals.deleteGoal';
$url .= '&idGoal=' . $idGoal;
$url .= '&token_auth=' . $config->piwik->token;
$ret = $this->sendRequest($url);
try{
$xml = new DOMDocument();
$xml->loadXML($ret);
if ( $xml->getElementsByTagName('error')->length > 0 ){
return false;
}
if ( $xml->getElementsByTagName('success')->length > 0 ){
$table = new Yourdelivery_Model_DbTable_Piwik_Goals();
$table->delete('goalId='.$idGoal);
return true;
}
return false;
}
catch ( Exception $e ){
return false;
}
}
}
?>
Und noch die DbTable Klasse
/**
* Description of Goals
*
* @author matthiaslaug
*/
class DbTable_Piwik_Goals extends Zend_Db_Table {
/**
* name of the table
* @param string
*/
protected $_name = 'piwikGoals';
//put your code here
}
Ich hoffe das nützt jemandem
{ 2 comments… read them below or add one }
Hallo Matthias,
ja das nützt jemand
Bin gerade auf der Suche nach so etwas gewesen, um in einem Formular den Focus auf Eingabefelder als Ziel mitzutracken.
Nur wieso legst du eine Extra-Tabelle an? Es würde doch genügen das neue Ziel direkt in die goal-Tabelle von Piwik zu schreiben?
Viele Grüße
Ziel war es dieses Feature auf einem anderen Server einzusetzen. Um SQL Abfragen über lange Strecke und perfomant zu gestalten (d.h. lokal absetzen zu können) habe ich diese Tabelle angelegt. Ansonsten müsste ja wirklich für jedes Ziel, dass von einem Benutzer erreicht wird eine Abfrage an den Piwik SQL Server abgesetzt werden. Uncool