Vygenerovani obrazku a jeho zobrazeni v sablone
- motorcb
- Člen | 552
Zdravim.
Mam komponentu, ktera vygeneruje obrazek a ten obrazek bych chtel zobrazit
v sablone.
Ukladat obrazek mi prijde neefektivni a pomale, nebo se mylim?
Tady je kod:
<?php
use Nette;
use Nette\Image;
class TopListControl extends Nette\Application\UI\Control
{
public function __construct()
{
parent::__construct(); // vždy je potřeba volat rodičovský konstruktor
}
public function render()
{
$image = Image::fromFile( WWW_DIR."/pictures/toplist.gif" );
// $image->send();
//jak odeslu obrazek do sablony?
//ulozit obrazek mi prijde neefektivni a pomale, nebo se mylim?
$this->template->setFile( __DIR__ . '/TopList.latte' );
$this->template->render();
}
}
?>
Jaky kod mam pridat do sablony pro zobrazeni obrazku?
- h4kuna
- Backer | 740
Buď mi ta otázka připadá, že jsi narazil na základy které by jsi měl zvládat a asi nepatří úplně sem a nebo jsem to nepochopil.
<?php
use Nette;
class TopListControl extends Nette\Application\UI\Control
{
public function render()
{
$this->template->source = $this->presenter->template->basePath . '/pictures/toplist.gif';
$this->template->setFile( __DIR__ . '/TopList.latte' );
$this->template->render();
}
}
?>
Do šablony TopList.latte si dej
<img src="{$source}" alt="toplist.gif" />
Musíš si uvědomit rozdíl kdy použít filesystémovou cestu a kdy požít cestu pomocí url.
Editoval h4kuna (18. 10. 2012 20:10)
- mkoubik
- Člen | 728
Potřebuješ URL, které bude vracet ten obrázek, proto si dej do presenteru
akci, která bude volat ňejakou metodu té komponenty pro získání
$image
a pak zavolá ->send()
. No a pak na tu akci
normálně odkážeš v šabloně
(<img src="{plink ...}" />
). Jen nevím jestli je vhodné to
generování obrázku mít v komponentě (opravdu potřebuješ dědit
Control
?), nebylo by lepší na to mít nějakou
service třídu?
- mkoubik
- Člen | 728
Uvědom si, že jde o 2 různé HTTP requesty – jeden je samotné html,
ve kterém je tag img s adresou obrázku, druhý je samotné načtení
obrázku. Proto musí existovat URL, která vrací ten obrázek, ne html. Nejde
ten obrázek (binární data) jen tak vlepit do HTML (resp. jde, ale používá
se to jen u malých ikonek apod.).
Načítání obrázku, předpokládám, nijak nemění stav aplikace, proto to
nemůže být signál – metoda handle*()
, ale akce – tzn.
metoda action*()
nebo render*()
(rozdíl je
v pořadí ve kterém se volají).