ako vratit obrazok v prezenteri
- Ondřej Mirtes
- Člen | 1536
Napiš si ImageResponse, inspiruj se třeba DownloadResponse a pak v Presenteru volej:
$this->terminate(new ImageResponse('absolutniCestaKObrazku'));
- Vyki
- Člen | 388
Zcela v pohodě funguje i když v presenteru provedeš vytvoření obrázku pomocí třídy Image a potom jej vypíšeš v šabloně.
<?php
class MyPresenter
{
public function renderDefault()
{
$this->template->image = Image::fromFile(WWW_DIR.'/images/fotka.jpg')->resize(500, 500);
}
}
?>
a v šabloně:
{extends none}
{$image->send()}
Výhodou je, že se nemusíš starat o hlavičku. Image samo zjistí s jakým typem obrázku pracuješ a podle toho zvolí hlavičku jpeg, png nebo gif.
Editoval Vyki (4. 4. 2010 21:53)
- Honza Marek
- Člen | 1664
Vyki: I kdyby se ti třeba Response nelíbila, tak nechápu, proč do toho motáš šablonu.
- sodae
- Nette Evangelist | 250
Ondřej Mirtes: proč vytvářet ImageResponse? když stačí použít
$this->terminate(new DownloadResponse($path, NULL, 'image/jpeg'));
edit: ten 2. parametr, pokud chceš jiný název souboru, změn na (např.) image.jpg, pokud chceš zachovat původní tak NULL :-)
Editoval sodae (5. 4. 2010 14:40)
- sodae
- Nette Evangelist | 250
Majkl578: máš pravdu :-), trochu jsem si hrál :-)
/**
* Image response.
*
* @copyright Copyright (c) 2010 Martin Sadovy
*/
class ImageResponse extends /*Nette\*/Object implements IPresenterResponse
{
/** @var string|Nette\Image */
private $image;
/** @var string */
private $type;
/**
* @param string image path or Nette\Image instance
* @param string image type
*/
public function __construct($image, $type = 'jpg')
{
if (is_string($image) AND !is_file($image)) {
throw new BadRequestException("File '$image' doesn't exist.");
} elseif (!$image instanceof /*Nette\*/Image AND !is_string($image) ) {
throw new InvalidArgumentException('Image must be instance Nette\Image or image path');
}
if (is_string($image)) {
$type = strtolower(pathinfo($image, PATHINFO_EXTENSION));
}
$this->image = $image;
$this->type = $type;
}
/**
* Returns the path to a file or Nette\Image instance.
* @return string|Nette\Image
*/
final public function getImage()
{
return $this->image;
}
/**
* Returns the type of a image.
* @return string
*/
final public function getType()
{
return $this->type;
}
/**
* Sends response to output.
* @return void
*/
public function send()
{
if ($this->image instanceof /*Nette\*/Image) {
echo $this->image->send($this->type, 100);
} else {
readfile($this->file);
}
}
}
Editoval sodae (5. 4. 2010 15:49)
- Honza Marek
- Člen | 1664
Od cca 90% kvalita narůstá naprosto minimálně, ale hodně se začíná zvětšovat datová velikost.
- Martin
- Člen | 171
sodae: Dík, asi to použiju tak, jak jsi to napsal, jen tu kvalitu přidám do konstruktoru.
Honza Marek: Zrovna na mém webu poožívám jak 70% (náhledy), 92% (běžné zobrazení), tak 100% (stažení pro tisk). Je to sice výjimečný požadavek, ale občas se také vyskytne. Samozřejmě pro kvalitní výstup jsou jiné formáty, ale weby děláme i pro uživatele, kteří mají omezenou rychlost stahování, chtějí co nejlepší kvalitu při tisku a jiné formáty ani neznají (případně mají je na Windows asociovány s bůhvíčím).
Editoval Martin (28. 4. 2011 11:25)
- Mikulas Dite
- Člen | 756
Pokuď je to 3rd party, tak to dávám do
'/libs/něco, jinak do `/app/models/něco
. Taky záleží na
velikosti, třeba FileDownloader a Datagrid mi přijdou pro umístění do
app
moc robustní, ale TemplateMacros
by mi tam
nevadila (/app/wrappers/...
).