[phpBB Debug] PHP Warning: in file [ROOT]/ext/tas2580/seourls/event/listener.php on line 213: Undefined array key "FORUM_NAME"
Downloadmodul mit Counter-Funktion - REDAXO Forum
Hallo,

Wir haben in letzter Zeit festgestellt, dass die Kommunikation via Slack viel schneller und zielführender ist als ein Beitrag im Forum. Aufgrund der neuen und besseren Möglichkeiten der Kommunikation haben wir uns entschlossen das Forum nur noch als Archiv zur Verfügung zu stellen. Somit bleibt es weiterhin möglich hier nach Lösungen zu suchen. Neue Beiträge können nicht mehr erstellt werden.

Wir empfehlen, für deine Fragen/Probleme Slack zu nutzen. Dort sind viele kompetente Benutzer aktiv und beantworten jegliche Fragen, gerne auch von REDAXO-Anfängern! Slack wird von uns sehr intensiv und meistens "rund um die Uhr" benutzt :-)
Selbst einladen kannst Du dich hier: https://redaxo.org/slack/
Benutzeravatar
karlnappmitdenasskap
Beiträge: 116
Registriert: 18. Aug 2012, 20:30
Kontaktdaten: Website

Downloadmodul mit Counter-Funktion

2. Mär 2015, 17:40

Hi,

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> <? }  } ?>
Geänderter Code(Ausgabe):

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 /><? }  } ?>
Die download.php sieht, wie folgt aus:

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");
}
?> 
Die Downloads werden dann in eine beliebige Statistik-Datei (hier: downloadzaehler.db) geschrieben.

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>
Sprich: Das Modul arbeitet mit einer Datenbank unabhängigen Datei.
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?!

Ingo
Beiträge: 782
Registriert: 24. Jun 2010, 00:34

Re: Downloadmodul mit Counter-Funktion

3. Mär 2015, 03:15

karlnappmitdenasskap hat geschrieben:Frage: Wäre es nicht eleganter...
Eleganter wärs das per Google Analytics oder Piwik zu machen...

Zurück zu „Allgemeines [R4]“