File download – oncomplete > neproběhne
- lopikol
- Začátečník | 75
Presenter:
<?php
public function actionDownload($fileId)
{
// získání informací o souboru z databáze
$this->file = DownloadsModel::findOne(array('id' => $fileId));
// stažení
$download = new FileDownload;
$download->sourceFile = FILEDOWNLOAD . $this->file->file . '.' . $this->file->suffix; // cesta k souboru
$download->onComplete[] = array($this, 'FileDownloadComplete');
$download->download();
// ukončení scriptu
$this->terminate();
}
protected function FileDownloadComplete(FileDownload $download,IDownloader $downloader)
{
// získám aktuální informace o souboru
$file = DownloadsModel::findOne(array('id' => $this->file->id));
// přidám stažení
$file->downloads += 1;
// uložím
$this->DownloadsModel->save($file);
}
?>
Model:
<?php
public static function save($file)
{
return dibi::query('UPDATE [downloads] SET download = download+1 WHERE id = %i', $file);
}
?>
Stažení souboru proběhne, ale nepřidá se mi +1 k download (počet stažení)
- Honza Kuchař
- Člen | 1662
zkus si do té metody dát jen něco na styl file_put_content(…); Ať vyzkoušíš, jestli to běží.
Případně použij debuger
- lopikol
- Začátečník | 75
Honza Kuchař: Nevěděl by si prosím co stim je. Myslím si, že si ten
nejoprávněnější, když je to tvůj addon.
Pokud je to onComplete nefunkční, tak pak celý addon pro mne ztrácí smysl
:(, jelikož bych mohl rovnou házet link. Rád bych měl přehled o počtu
stažení.
Editoval lopikol (15. 1. 2011 13:15)
- Solution
- Člen | 50
Vždyt ty do té query předáváš objekt, tak jak ti z toho má dibi
extrahovat int?
Snad:
<?php
public static function save($file)
{
dibi::query('UPDATE [downloads] SET download = download+1 WHERE id = %i', $file->id);
}
?>
Pokud se mýlím, tak přidej do toho callbacku:
<?php
Debug::barDump(__METHOD__);
?>
A hned uvidíš v debug panelu, jestli se volá nebo ne.
- Solution
- Člen | 50
Omg, Já jsem vůl:
<?php
protected function FileDownloadComplete(FileDownload $download,IDownloader $downloader) //Místo toho:
public function FileDownloadComplete(FileDownload $download,IDownloader $downloader)
?>
BTW: Proč v té fci máš takové quanta kodu navíc?
<?php
public function FileDownloadComplete(FileDownload $download,IDownloader $downloader)
{
// uložím
$this->DownloadsModel->save($this->file->id);
}
public static function save($file)
{
dibi::query('UPDATE [downloads] SET download = download+1 WHERE id = %i', $file);
}
?>
Tohle je přirozenější :-P.
- lopikol
- Začátečník | 75
Odstaněno > beze změny.
Apache2.2
php-5.3.5
MySQL Server 5.5
Tak už to mám. Problém je v onComplete. Ostaní
callbacky fungují jak mají.
Vyřešil jsem zapsaní do db (+ odebraní) použitím
onBeforeDownloaderStarts a onAbort
Mohl bych tě proím poprosit o jedno vysvětlení?
<?php
DownloadsModel::save($this->file->id);
//vs.
$this->DownloadsModel->save($this->file->id); // toto vždy skončí s Cannot read an undeclared property
?>
Jaký je vnich rozdíl?
Editoval lopikol (15. 1. 2011 20:42)
- Matúš Matula
- Člen | 257
DownloadsModel je trieda s metodou save, preto 1.pripad funguje.
V 2.pripade sa snazis pristupit k nedeklarovanej property presenteru s nazvom
DownloadsModel, ako vidno aj z hlasky ;)
- Honza Kuchař
- Člen | 1662
Mrknu na to, ale teď máme pololetí, tak fakt nemám čas.
Ale mám jedno upozornění. Nevím přesně jak to je, ale setkal jsem se s tím, že se při odesílání souboru tímto způsobem nevypisují chyby. Tedy pokud vyvolám chybu po stažení souboru, tak smůla. Nevypíše do výstupu. Myslím, že Nette\Debug to bere, ale klasické hlášky PHPka, fakticky nefungují.
- Honza Kuchař
- Člen | 1662
PS: Díval jsem se, jestli funguje ten příklad z distribuce. Konkrétně
form. A funguje.
Callbacky se mi zavolají v tomto pořadí:
Con. #1295173892-16387 (Completed)
5: onComplete: 1 MB <->; position: 1 MB; http-range: 0 B-1024 kB; progress (con: 100% X file: 100%)
4: onStatusChange: 1 MB <->; position: 1 MB; http-range: 0 B-1024 kB; progress (con: 100% X file: 100%)
3: onStatusChange: 512 kB <->; position: 512 kB; http-range: 0 B-1024 kB; progress (con: 50% X file: 50%)
2: onNewTransferStart: 0 B <->; position: 0 B; http-range: 0 B-1024 kB; progress (con: 0% X file: 0%)
1: onBeforeOutputStarts: 0 B <->; position: 0 B; http-range: 0 B-1024 kB; progress (con: 0% X file: 0%)
0: onBeforeDownloaderStarts: 0 B <->;
- klimax
- Člen | 7
měl jsem podobný problém, který není vyřešen na php 5.2 nette
0.9.7
onComplete se mi nevolal,v BaseFileDownload jsem zakomentoval řádek 541
<?php
die(); // If all gone ok -> die
?>
a už mi onComplete fce funguje
každopádně mám jednu otázku, nefunguje mi volání flashMessage
<?php
public function onFileDownloadConnectionLost(FileDownload $download, IDownloader $downloader) {
$this->flashMessage('Spadlo spojení, stáhněte soubor znovu', 'error');
}
?>
chtěl bych uživatele upozorňovat, že se něco děje
Editoval klimax (17. 1. 2011 9:26)
- klimax
- Člen | 7
gmvasek napsal(a):
Musel bys přesměrovat, aby se flash zprávička zobrazila.
ano, to mi funguje napriklad v callbacku onBeforeDownloaderStarts
<?php
public function onBeforeDownloadStarts($file, IDownloader $downloader) {
$this->flashMessage('Soubor byl úspěšně stažen', 'success');
$this->redirect('Directive:');
}
?>
tim redirectem se mi ale samozrejmne soubor nestahne.
ale uz nefunguje v onComplete, tam mi funguje pouze nevizualni volani :(
idelani predstava, behem procesu bych do flashmessage daval hlasky a pri onComplete bych redirectoval a vsechny hlasky vypsal
- Honza Kuchař
- Člen | 1662
Nene, FileDownloader zablokuje sessions. Dá se to tuším někde vypnout, ale nedoporučuji to. Více zde: https://forum.nette.org/…iewtopic.php?…