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
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;}}
?>