ako vratit obrazok v prezenteri

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

Potrebujem v prezenteri vratit obrazok ked mam jeho subor.
Keby som to robil bez nette otvoril by som obrazok, nastavil by som header

<?php
header('Content-type: image/jpeg');
?>

a vypisal, ako na to ist v nette?

Ondřej Mirtes
Člen | 1536
+
0
-

Napiš si ImageResponse, inspiruj se třeba DownloadResponse a pak v Presenteru volej:

$this->terminate(new ImageResponse('absolutniCestaKObrazku'));
Vyki
Člen | 388
+
0
-

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)

Majkl578
Moderator | 1364
+
0
-

Vyki: to je ale prasárna. Response je vhodnější řešení.

Honza Marek
Člen | 1664
+
0
-

Vyki: I kdyby se ti třeba Response nelíbila, tak nechápu, proč do toho motáš šablonu.

sodae
Nette Evangelist | 250
+
0
-

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)

Majkl578
Moderator | 1364
+
0
-

sodae: To ho ale pošle ke stažení namísto zobrazení v prohlížeči, není to tak?

sodae
Nette Evangelist | 250
+
0
-

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

Jedině blázen by posílal jpg s kvalitou 100%.

sodae
Nette Evangelist | 250
+
0
-

Honza Marek: to je inviduální, třeba fotograf co potřebuje kvalitu chce kvalitní, je to fakt jak každý zvolí ;-)

Honza Marek
Člen | 1664
+
0
-

Od cca 90% kvalita narůstá naprosto minimálně, ale hodně se začíná zvětšovat datová velikost.

Martin
Člen | 171
+
0
-

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)

OK3
Člen | 91
+
0
-

Otázka: do jaké složky (v /app?) ukládáte ty třídy, které extendují třídy frameworku? Jako třeba tu ImageResponse?

Aurielle
Člen | 1281
+
0
-

RobotLoader ji najde kdekoliv. Je to tedy jen tvoje záležitost, ukládej si třídy tam, kam se ti to hodí.

Mikulas Dite
Člen | 756
+
0
-

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

OK3
Člen | 91
+
0
-

Díky za reakce,
šlo mi spíš o to, jestli existuje nějaká konvence, kam tyhle svoje třídy ukládat. Třeba do models bych zrovna tuhle třídu (která extenduje Response) asi nedal :-) Možná do app/(my)classes..