Zapis zawartości określonego widoku jako html w Cakephp
Kolejny przykład z życia wzięty. Mamy za zadanie zapisać zawartość określonego widoku jako html, a następnie spakować go zipem i udostępnić do pobrania. Działać będziemy na wymyślonym kontrolerze Items. Napiszemy dla niego metodę generate, która będzie realizowała powyższe zadanie.
public function generate() { $zm = 'Zmienna jakas'; $this->set('zm', $zm); $view = new View($this); $viewdata = $view->render('html'); $path = 'files/html/pliczek.html'; $file = new File(WWW_ROOT.$path, true); $file->write($viewdata); return $path; }Należy pamiętać aby dodać plik widoku app/View/Item/html.ctp. Poniżej przykładowa zawartość tego pliku. Plik widoku.
<?php echo $zm; ?>Utworzymy teraz pomocniczą funkcję output, która będzie wykorzystywać funkcję generate oraz pakować plik do archiwum zip.
public function output() { $file = $this->generate(); $zip = new ZipArchive(); $zip->open('files/archiwum.zip', ZipArchive::CREATE); $zip->addFile($file,'pliczek_moj.html'); $zip->close(); //udostepnienie w przegladarce do pobrania header("Content-type: application/zip"); header("Content-Disposition: attachment; filename=archiwum.zip"); header("Pragma: no-cache"); header("Expires: 0"); readfile('files/archiwum.zip'); exit; }Pod zmienną $file jest przechowywana ścieżka do zapisanego pliku na serwerze. Do spakowania pliku do archiwum wykorzystujemy klasę php ZipArchive (http://php.net/manual/en/class.ziparchive.php). Następnie rozpoczyna się pobieranie pliku archiwum. Jeśli nie chcemy pozostawiać zapisanego archiwum na serwerze po funkcji readfile należy wykonać
unlink('files/archiwum.zip');