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

Komentarze 0

Dodaj komentarz