De:Dateigröße ausgeben mit PAXPHP

From phpCMS

Jump to: navigation, search

Contents

[edit] Dateigröße bestimmen und ausgeben mit PAXPHP und PAXTAGS

[edit] Einführung

Stellt man Dateien zum Download bereit, ist es sinnvoll die Dateigröße anzugeben.

Da es sehr mühselig ist, die Dateigröße für jede Datei manuell zu bestimmen und in die Seite einzutragen, bietet sich hier eine automatisierte Lösung an. Die automatische Ausgabe der Dateigröße kann in statischen HTML Seiten z.B. mit SHTML erreicht werden, im PHPCMS bedient man sich eines PAXTAGS, der ähnlich verwendet wird.

Der Tag wird wie folgt verwendet:

<!-- PAXFSIZE file="filename.download" -->

Leider ist der Tag (derzeit) nicht Bestandteil der PAXPHP Klasse, sodass er erst eingebunden werden muss.

[edit] Der Tag PAXFSIZE

[edit] Einbinden des Tags

Um den Tag in die PAXPHP Klasse einzubinden, editiert man die Datei class.pax_phpcms.php und fügt die eine neue Funktion _setPAXFSIZE ein:

class.pax_phpcms.php:


/*********************************************
   fsize for files
*********************************************/
function _setPAXFSIZE($contentfile)
{
  global $DEFAULTS, $PAGE;

  // Determine replacement text
  $no_such_file = "PAXFSIZE_FileNotFound";
  foreach ($PAGE->tagfile->tags as $tag)
    if ($tag[0] == $no_such_file)
    {
      $no_such_file = $tag[1];
      break;
    }

  // Iterate over content
  $countcontentfile = count($contentfile);
  for($contcount = 0; $contcount < $countcontentfile; $contcount++)
  {
    if(preg_match_all('/<!-- PAXFSIZE file="([a-zA-Z0-9_+-.\/]+)" -->/', $contentfile[$contcount], $matches))
    {
      foreach($matches[1] as $fname)
      {
        $full_path = $DEFAULTS->DOCUMENT_ROOT."/".$fname;
        if(!file_exists($full_path))
        {
          $fsize = $no_such_file;
        }
        else
        {
          $size =  filesize($full_path);
          $fsize = ($size > 512)
                    ? (($size /1024 > 512)
                        ? sprintf("%.02f MB",($size /1024)/1024)
                        : sprintf("%.02f kB",$size /1024)
                      )
                    : sprintf("%d B",$size);
        }

        $contentfile[$contcount] = str_replace('<!-- PAXFSIZE file="'.$fname.'" -->', $fsize, $contentfile[$contcount]);
      }
    }
  }
  return $contentfile;
}

Die neue Funktion wird nun wie folgt in der Funktion setPAXTAGS verwiesen:

/*********************************************
   replace all PAXTAGS with their values
*********************************************/
function setPAXTAGS(&$template) {
     _getPAXMENU();
     $template = _setPAXINC($template);
     $template = _setPAXRTF($template);
     $template = _setPAXHIGHLIGHT($template);
     $template = _setPAXMENU($template);
     $template = _setPAXCOMBO($template);
     $template = _setPAXCOMBOALL($template);
     $template = _setPAXLASTMOD($template);

     $template = _setPAXFSIZE($template);

     $template =  _change_phpCMS_TAGS($template);
     return $template;
 }

[edit] Funktionsweise des Tags

Die Funktion _setPAXFSIZE durchsucht mittels eines regulären Ausdrucks die Content-Seite zeilenweise nach dem PAXTAG.

Die Funktion preg_match_all gibt alle gefundenen PAXTAGS in Form eines Arrays zurück, das nun mittels einer FOR-Schleife durchlaufen wird. Besonderheit des regulären Ausdrucks ist, dass er nur den Inhalt des file-parameters zurückliefert, was die weitere Verarbeitung erheblich erleichtert.

Innerhalb der FOR-Schleife wird zunächst geprüft, ob die Datei überhaupt existiert. Ist dies der Fall, wird die Dateigröße erfragt und mit sprintf lesbar formatiert.

Der ursprüngliche PAXTAG wird in der Content-Datei gesucht und durch die formatierte Größe ersetzt - fertig.

[edit] Aufruf des Tags

<!-- PAXFSIZE file="/downloads/willkommen.pdf" -->

Der Dateipfad muss relativ zum "document root" sein; sollte die Datei nicht gefunden werden, wird PAXFSIZE_FileNotFound ausgegeben.

[edit] Einstellen der Fehlermeldung

Um die Funktion sprachunabhängig zu halten, liefert sie im Falle des nichtauffindens einer Datei das Tag PAXFSIZE_FileNotFound zurück. Um statt dieses Wortungetüms eine sinnvolle Fehlermeldung zu liefern, muss man lediglich in die Tag-Datei eine Zeile aufnehmen wie zum Beispiel

 PAXFSIZE_FileNotFound := Datei nicht gefunden

[edit] Anmerkung

Es gilt zu beachten, dass PAXTAGS statisch sind - d.h. wenn Caching verwendet wird, werden Änderungen an der Ausgabe oder im Tag-Script erst nach Flushen des Caches oder Bearbeiten der nutzenden Datei sichtbar. Wichtig ist natürlich auch, dass PAXTAGS (und PAXPHP) überhaupt aktiviert sind, damit diese Funktion aufgerufen wird.

Main Page: Tutorials MainPage | Top Page: De:MiniHowTos

This page in other languages: English

Personal tools