ExampleUI und eigene Auswertungen

Hallo,

ich bin recht neu hier, kenne aber Piwik schon länger. Meine Kenntnisse mit PHP und so, sind zwar bescheiden, aber sehr wohl verstehe ich so einige Codezeilen und Zusammenhänge. Piwik ist ja sehr mächtig und bietet auch die Möglichkeit eigene Daten auszuwerten.

Und da fängt leider auch die Krux an.
Denn diese Möglichkeit ist; meiner Meinung nach; sehr schlecht beschrieben.

Unter piwik\plugins\ExampleUI\ kann man sich ja etwas austoben.
In der dort vorhandenen API.php finden sich ja folgende Codezeilen:


	public function getTemperaturesEvolution($date, $period)
	{
		$period = new Piwik_Period_Range($period, 'last30');
		$dateStart = $period->getDateStart()->toString('Y-m-d'); // eg. "2009-04-01"
		$dateEnd = $period->getDateEnd()->toString('Y-m-d'); // eg. "2009-04-30"
		
		// here you could select from your custom table in the database, eg.
		$query = "SELECT AVG(temperature)
					FROM server_temperatures
					WHERE date > ?
						AND date < ?
					GROUP BY date
					ORDER BY date ASC";
		//$result = Piwik_FetchAll($query, array($dateStart, $dateEnd));
		// to keep things simple, we generate the data

Doch warum wird nicht darauf eingegangen, wie man auf fremde Datenbanken & Tabellen zugreifen und dann diese Werte für sich nutzen kann:


		foreach($period->getSubperiods() as $subPeriod)
		{
			$server1 = rand(50,90);
			$server2 = rand(40, 110);
			$value = array('server1' => $server1, 'server2' => $server2);
			$temperatures[$subPeriod->getLocalizedShortString()] = $value;
		}


		$xAxis = array(
			'0h', '1h', '2h', '3h', '4h', '5h', '6h', '7h', '8h', '9h', '10h', '11h', 
			'12h', '13h', '14h', '15h', '16h', '17h', '18h', '19h', '20h', '21h', '22h', '23h',
		);
		$temperatureValues = array_slice(range(50,90), 0, count($xAxis));
		shuffle($temperatureValues);
		$temperatures = array();
		foreach($xAxis as $i => $xAxisLabel) {
			$temperatures[$xAxisLabel] = $temperatureValues[$i];
		}

Hat hier vielleicht jemand das Wissen & vor allem Lust und Zeit mir zu helfen?
Alleine die Tatsache dass Piwik ja auch fremde Datenquellen zur Auswertung bringt, macht dieses Tool ja noch viel mächtiger bzw. interessanter, oder?

Danke schon mal im Voraus,
lg
DeepX

Knappe acht Jahre später stand ich genau vor demselben Problem und habe nun einen Ansatz erarbeitet der ziemlich flüssig läuft, versch. Granularitäten/Perioden berücksichtigt und sich auch zur Ausgabe von akkumulierten Summen eignet. Keine Garantie für Vollständigkeit. Da Matomo und das Zielsystem bei mir auf unterschiedlichen Datenbanken liegen, habe ich eine kleine Schnittstelle erarbeitet die ich zu Beginn der Funktion anspreche:

// @file API.php
public function getUsersAmount(String $date, String $period)
{
        $dataTableData = array(); // Hier wird jede Woche als Key-Value-Paar gesammelt und am Ende an Matomo zurückgegeben
        $period = new Range($period, $date);

        $start = $period->getDateStart()->getTimestampUTC(); // Ziel-Attribut ist als Timestamp gespeichert
        $end = $period->getDateEnd()->getTimestampUTC();

        // Anzuzeigende Daten via API holen
        $ch = curl_init();

        curl_setopt($ch, CURLOPT_URL, "${host}/meine_tolle_api_methode?start=${start}&end=${end}");
       // ... setze curl settings, falls benötigt ...
       curl_close($ch);

       $users = json_decode($output);

Die Schnittstelle gibt nun das Ergebnis der folgenden zwei Queries zurück:

# 1. Alle pro Woche angelegten Nutzer mit genauem Yahr, Monat und Woche:
SELECT Year(FROM_UNIXTIME(created)) as year,
                MONTH(FROM_UNIXTIME(`created`)) as month,
                WEEK(FROM_UNIXTIME(`created`)) as week,
FROM_UNIXTIME(`created`, '%Y%m%d') as combined_date,
                count(*) as user_amount
FROM `tbl_users`
WHERE created >= '${start}' AND created <= '${end}'
GROUP BY combined_date

In diesem Beispiel erhalte ich die Summe aller jeweils pro Woche angelegten Nutzer (aber nicht automatisch für jede Woche im genannten Zeitraum, falls nämlich gar keiner angelgt wurde); combined_date ist hier eine Art pseudo-Schlüssel (YYYYMMDD), den wir, zurück im Matomo Plug-In, nutzen werden:

        // ... @file API.php ...
       $summed_user_memory = []; // Stelle sicher, dass jede Woche nur einmal ausgegeben wird

        foreach ($period->getSubperiods() as $subPeriod) {
            $user_amount = 0;
 
            $from = intval($subPeriod->getDateStart()->toString('Ymd'));
            $to = intval($subPeriod->getDateEnd()->toString('Ymd'));

            foreach ($users as $row) {
                $date_combi = intval($row->combined_date);
                
                if ($date_combi >= $from && $ist_date_combi <= $to && !isset($summed_user_memory[$date_combi])) {   
                        $user_amount += $row->ist;
                        $summed_user_memory[$date_combi] = true;
                }
            }

            $dataTableData[$subPeriod->getDateStart()->toString('Y m d')] = [
                'user_amount' => $user_amount // Der Key muss hier dem entsprechen, was Du im Report, genau genommen in der Funktion configureView unter $selectableColumns eingetragen hast ($selectableColumns = array('user_amount')
            ];
            
        }

        return DataTable::makeFromIndexedArray($dataTableData);

Nach demselben Prinzip könnte auch eine akkumulierte Summierung umgesetzt werden. In diesem Fall würdest Du $user_amount VOR der foreach-Schleife initialisieren mit dem Wert / der Summe an Nutzern, welche bereits vor dem Zeitraum angelegt wurden, d.h. im Sinne des Beispiels:

SELECT count(*) as user_previous_amount FROM `tbl_users` WHERE created < '${start}'"

Ich hoffe, geholfen zu haben und wünsche viel Erfolg beim ausprobieren!

1 Like