altes Thema aktuell: Gibt es ein empfehlenswertes Modul/AddOn, welches zählt, wie oft eine Datei heruntergeladen wurde? Wie ich im Forum recherchiert habe, gab es so etwas für ältere REDAXO-Versionen mal HIER.
Ich habe mir jetzt selbst etwas gebastelt auf Basis des Downloadmodul Medialist r3.0:
Ich habe hier beim generierten Download-Link eine Zähler-PHP (download.php) dazwischen geschaltet, die zählt u. schreibt.
Ursprünglicher Code (Ausgabe):
Code: Alles auswählen
<div class="list_content"><a href=<? echo $REX[HTDOCS_PATH]."files/".$value; ?> target="_blank"><img src="<? echo $parsed_icon ?>" alt="Download"> </a> <? echo $value ?> - <?php echo Dateigroesse ($REX[HTDOCS_PATH]."files/".$value); ?> </div>
<? If ($fileDescription != "") { ?> <div class="list_content3"><? echo $fileDescription; ?></div> <? } } ?>
Code: Alles auswählen
<div class="list_content"><a href=<? echo $REX[HTDOCS_PATH].'download.php?to='.$REX[SERVER].'files/'.$value; ?> target="_blank"><img src="<? echo $parsed_icon ?>" alt="Download"></a> <a href=<? echo $REX[HTDOCS_PATH].'download.php?to='.$REX[SERVER].'files/'.$value; ?> target="_blank"><? echo $value ?></a><br /> Dateigröße: <?php echo Dateigroesse ($REX[HTDOCS_PATH]."files/".$value); ?></div>
<br /><? } } ?>
Code: Alles auswählen
<?php
// verzeichnis in dem die log-datei liegt, ohne schrägstriche
$dir = "files";
// name der log-datei
$db = "downloadzaehler.db";
$newlink = 1;
$url = "";
$file = $dir."/".$db;
// hier wird versucht das verzeichnis zur zähler-datei zu erstellen. das könnte man aber auch per hand...
if (!file_exists($dir)){
mkdir($dir) or die ("can't create directory!");
}
// den zu zählenden link aus der GET-übergabe fischen...
$url = $_GET['to'];
// die auszuwertende url darf nicht leer sein und muss aus mindestens vier zeichen bestehen
if ((isset($url)) && (!empty($url)) && (strlen($url)>4)){
// falls die übergebene url nicht mit http:// oder https:// oder ftp:// beginnt wird automatisch ein http:// davorgesetzt
if (!preg_match("(^(http://|https://|ftp://))i", $url)){
$url = "http://".$url;
}
// die zähler-datei wird geöffnet und gesperrt - zwei gleichzeitige zugriffe würden die sache nur durcheinanderbringen
$getstats = fopen($file, "r+");
flock($getstats, LOCK_EX);
// die zähler-datei wird eingelesen...
$filecontent = fread($getstats, filesize($file));
$fileline = explode("\n", $filecontent);
$lines = count($fileline)-1;
rewind($getstats);
// in jeder zeile ist der auszuwertende link und die klicksumme vermerkt. das wird hier getrennt und zeilenweise abgearbeitet
for ($n = 0; $n < $lines; $n++){
$entry = explode(" $ ", $fileline[$n]);
// falls der eintrag der aktuellen zeile mit der übergebenen url übereinstimmt wird der entsprechende klick-zähler erhöht...
if ($entry[0] == $url){
$entry[1]++;
} else {
// ...andernfalls wird ein script-interner zähler zur ermittlung neuer links verwendet
$newlink++;
}
$writeline = "$entry[0] \$ $entry[1]\n";
fwrite($getstats, $writeline);
}
// falls bei allen einträgen keine übereinstimmung auftrat handelt es sich wohl um einen neuen link - dann wird dieser eben angehängt
if ($newlink > $lines){
$newline = "$url \$ 1\n";
fwrite($getstats, $newline);
}
// abschließend geben wir die zähler-datei wieder frei...
flock($getstats, LOCK_UN);
fclose($getstats);
// ... und lotsen den besucher zur gewünschten ressource
header("Location:" .$url);
exit;
// und für den fall dass wirklich alles schiefgeht:
} else {
header("Location: http://deinedomain.tld");
}
?>
Dann gibt's noch ein kleines Modul, um die Download-Statistik auszugeben (Ausgabe):
Code: Alles auswählen
<div id="download-statistik" style="font-size:8px;">
<?php
echo '<h2>Download-Statistik:</h2>';
$zeilen = file ('./files/downloadzaehler.db');
foreach ($zeilen as $zeile) {
echo $zeile.'<br />';
}
?>
</div>
Meine Lösung funktioniert soweit auch einwandfrei. Wer es sich mal anschauen will, kann sie hier downloaden
Frage: Wäre es nicht eleganter, sowas als AddOn anzulegen und dann die Ergebnisse in die DB zu speichern?
Weitere Frage: Gibt es ggf. bereits eine (elegantere) AddOn-Lösung, um Downloads zu countern?!