Zdroj: http://prochazka.clanweb.eu/index.php?a=php/hcm-modul-download-objekt  •  Vydáno: 2.3.2013 19:36  •  Autor: hacesoft

HCM modul Download OBJEKT

icons pic Modul pro RS (redakční systém) SunLight CMS 7.5.x. na počítání staženích souborů.

Instalace je velice jednoduchá. Stažený soubor uložíte na Váš web do adresáře: \plugins\hcm. Tam vytvoříte adresář hacesoft a do něho uložíte soubor download.php.
Nakopírovat na web adresář Install_download a v prohlížeči spustit v tomto adresáři skript. Nesledně postupovat dle instrukcí. Upozornění heslo je stejné, jaké používá RS pro přihlášení do databáze. Po instalaci databáze, důrazně upozorňuji, smažte tento adresář z ostrého webu!

Počítací HCM modul se použije v RS následovně:

PHP code
[ hcm ]hacesoft/download,"code.php.zip","code.php"[ /hcm ]

První parametr určuje co stáhnout, popřípadě i část cesty k souboru.
Druhy parametr je proste zobrazované jméno, které uvidíte na webu.

Skript obsahuje konstanty, které lze měnit:

Skript je napsaný jako objekt. Některé parametry lze objektu změnit, změny mají význam dokud nezavoláte funkci DataBind(). Přímo v konstruktoru objektu, jako třetí parametr je cesta, která ukazuje, kde se nacházejí požadované soubory. Pokud byste používaly více tabulek počítaní stahovaní, tak změnu nazvu tabulky provedete v objektu pomocí veřejné proměnné $sNameTable.

Na konci skriptu u funkce header je zajímavá podmínka. Jelikož funkce header je obrovská díra do systému a lze ji využít na stažení čehokoliv a tedy i na samotné skripty webu, je zde podmínka že stahovaný soubor nesmí bejt s příponou *.PHP. Tato podmínka je důsledek odstranění kódování a session předávání požadovaného parametru přes url, viz stará verze stahovacího skriptu download.

Tento skript je pouze jen počitadlo stažených souborů, neobsahuje administraci a souhrny výpis souboru. Tyto funkce budou dostupné časem v dalším samostatným HCM modulu. Když je žádost o stažení souboru poprvé, automaticky se vytvoří v databázi odpovídající záznam z dostupných informaci.

Upozornění: pokud na webu nastane chyba, která je hlášena na začátku stránky, typicky E_NOTICE, tak skript nadále počítá stažené soubory ale soubor nejde stáhnout. Soubor je poslán formou HEADER.

Stáhnout HCM modul: download_object.php.

HCM kód download modulu:

PHP code
<?php
// Autor www.prochazka.zde.cz
// verze souboru  v3.0.0.    -objekt
// dne 31.12.2012 - vytvoreni modulu
// dne 25.2.2013 - predelani na objekt

if(!defined('_core')) exit;
function _HCM_hacesoft_download($SPatchFile='', $SshowFile='')
{
     $download = new HCM_download($SPatchFile,$SshowFile, _indexroot."web/download");
     $download->DataBind();
     $sBuffer = $download->GetUrl();
     return $sBuffer;}

class HCM_download {
    Private $nazev_tabulky="";
    Private $sNazevSouboru;
    Private $sFullPatchFile;  
    private $first = 0;
    public $SPatchFile="";
    public $SshowFile="";
    public $sAdrScript;
    public $UrlParameterName="download";  
    public $cesta_k_souborum;
    public $sNameTable ="download";
    public $cat_title_seo="list";
    public $title="";  
   
    public function __construct($SPatchFile="",$SshowFile="",$cesta_k_souborum=""){
        $this->SPatchFile = $SPatchFile;
        $this->SshowFile = $SshowFile;
        $this->sAdrScript = $this->GetAdrScript();
        $this->cesta_k_souborum = $cesta_k_souborum;
        if (isset($GLOBALS['query']['cat_title_seo'])){$this->cat_title_seo = $GLOBALS['query']['cat_title_seo'];}
        $this->title = $GLOBALS['query']['title'];
        $this->nazev_tabulky = _mysql_prefix."-".$this->sNameTable."-hac";}
   
    public function GetUrl (){
        if (!isset($_GET[$this->UrlParameterName])){
             return "<a href='".$this->sAdrScript.'&'.$this->UrlParameterName.'='.$this->SPatchFile."' >".$this->SshowFile."</a>";}}
             
    public function DataBind (){
        if (isset($_GET[$this->UrlParameterName])){
            $this->sNazevSouboru = $_GET[$this->UrlParameterName];
            $this->sFullPatchFile = $this->cesta_k_souborum."/".$this->sNazevSouboru;
            unset ($_GET[$this->UrlParameterName]);
            if (file_exists($this->sFullPatchFile)){
                $sDatumNew = date ("j.n.Y H:i:s");    
                $query = DB::query_row('SELECT * FROM `'.$this->nazev_tabulky.'` WHERE `soubor`="'.$this->sNazevSouboru.'"');    
                if (is_bool($query) === false){
                        $pocet_stazeni =  $query['stazeni'] + 1;
                        $query = DB::query('UPDATE `'.$this->nazev_tabulky.'` SET `stazeni` ="'.$pocet_stazeni.'", `naposledy_stazen` ="'.$sDatumNew.'" WHERE `soubor` ="'.$this->sNazevSouboru.'"');}
                else{ //Soubor existuje ale doposud neni veden v databazi, tak ho do databaze zapisem
                   $sDatumfile = date ("j.n.Y H:i:s", filemtime($this->sFullPatchFile));
                   $sSize = $this->nFormatFileSize(FileSize($this->sFullPatchFile));      
                   $query = DB::query("INSERT INTO `".$this->nazev_tabulky."` (soubor,rubrika,velikost,datum,verze,popis,stazeni,naposledy_stazen,hodnoceni,pocet_hodnotitelu)
                   VALUES ('$this->sNazevSouboru', '$this->cat_title_seo', '$sSize', '$sDatumfile', '', '$this->title', 1, '$sDatumNew','0','0')"
);    
                }
                $sBuffer= substr ($this->sFullPatchFile,-4);//(délka není zadána, pozice prvního znaku je záporná, proto se počítá od konce)
                if ($sBuffer != ".php"){header("location: $this->sFullPatchFile");} //Posly soubor -posly jakykoliv jen ne s priponou php, ochrana aby utocnik si neposlal nejaky script
            }}}
    private function nFormatFileSize($a){
    $unim = array("B", "KB", "MB", "GB", "TB", "PB");$c = 0;
    while ($a >= 1024){$c++;$a = $a / 1024;}
    return number_format($a,($c ? 2 : 0), ",", ".")." ".$unim[$c];}
   
    private function GetAdrScript(){
        $hrefprefix = $_SERVER['SCRIPT_NAME'];
        $this->first=1;
        foreach ( $_GET as $key=>$value){
          if ($key == $this->UrlParameterName)
            continue;
            if ($this->first){
             $hrefprefix .= "?".$key."=".$value;
             $this->first = 0;}
            else
             $hrefprefix .= "&".$key."=".$value;}
    return $hrefprefix;}}
?>