Stažení souboru a redraw snippetu
- microcz
- Člen | 62
Ahoj
vytvořil jsem si snippet pro stahování souborů. V tomto snippetu se nachází download link a výpis počtu stažení. Pokud uživatel klikne na download, zvýší se počet stažení a zakáže se (zmizí) download link po dobu následujících 5 minut.
Co dělám blbě? – Volám z jednoho místa redrawControl a zároveň se snažím uživateli v response poslat soubor pomocí FileResponse. Bohužel nevím jak jinak obojího docílit. Výsledek je takový, že se uživateli pošle soubor, ale snippet se nepřekreslí. Poradíte?
public function handleDownload() {
// Log download
try {
$this->image->logDownloaded($this->getAppUser()->getId());
$this->reloadDownloadData();
$this->redrawControl('downloadContainer');
} catch (\Exception $e) {
$this->db->rollback();
throw new \Exception("Failed to download image", null, $e);
}
$this->db->commit();
// Download file
$url = $this->image->getUrl();
$name = $this->image->getUName() . ".svg";
$this->sendResponse(new FileResponse($url, $name, 'image/svg+xml'));
}
protected function reloadDownloadData() {
// Check if image can be downloaded by current user
$userId = $this->getUser()->isLoggedIn() ? $this->getUser()->getId() : null;
$this->template->canBeDownloaded = $this->image->canBeDownloaded($userId);
// Load download statistics
$q = 'SELECT downloads FROM view_full_image WHERE id = %i';
$r = $this->db->fetchSingle($q, $this->image->getId());
$this->template->downloads = intval($r);
}
- duke
- Člen | 650
K překreslení snippetů je zapotřebí, aby aplikace vrátila odpověď typu JsonResponse a k downloadu, aby aplikace vrátila FileResponse, z čehož je patrné, že jedno vylučuje druhé. Požadovaného efektu nicméně můžeš docílit tak, že akci rozdělíš na dvě, v první vrátíš JsonResponse, a download iniciuješ následně z javascriptu nastavením window.location na url druhé akce (řešící vlastní download).