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');
