Stažení souboru a redraw snippetu

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
microcz
Člen | 62
+
0
-

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
+
+1
-

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).