Vygenerovani obrazku a jeho zobrazeni v sablone

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

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

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)

vvoody
Člen | 910
+
0
-

vytvor si samostatnú akciu ktorá bude ten obrázok generovať (žiadna šablóna, len $image->send()) a potom v TopList.latte dáš do src makro link odkazujúce na tu akciu s generovaným obrázkom.

motorcb
Člen | 552
+
0
-

@vvoody:
Co je mysleno tou akci? Funkce? Hanhle?

motorcb
Člen | 552
+
0
-

@**vvoody**:
Prosim, action<Action>()?
To si vubec nedokazu predstavit jak volam v sablone komponenty action<Action>() pro vykresleni obrazku

mkoubik
Člen | 728
+
0
-

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?

vvoody
Člen | 910
+
0
-

Tak to kľudne hoď do nejakého signálu komponenty. A prečo vlastne neodkazuješ na obrázok priamo ako píše h4kuna?

motorcb
Člen | 552
+
0
-

@mkoubik:

To musi byt akce v presenteru? V renderu by to nejak neslo? Nebo handle?
Chci na miste kde zavolam komponentu, zobrazit obrazek do ktereho pridam informace

Editoval motorcb (18. 10. 2012 21:20)

mkoubik
Člen | 728
+
0
-

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