vypsaní obrázku v šabloně v jiné velikosti

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

Čau potřeboval bych v šabloně vykreslit fotku, kterou zmensim na pozadovanou velikost(napr aby max sirka*vyska byla 160*100)

https://doc.nette.org/cs/utils/images

Tady jsem nasel jak upravit fotku, ale toto asi ma byt v presenteru, tak pořád nevím jak to mam propojit s tou šablonou kde to chcu vypsat.

Jak to musím udělat?

a nazev fotky predavam do sablony v promeny s tím ze tam pak musim ete doplnit .jpg

Ot@s
Backer | 476
+
0
-

Už se to tu ve fóru mockrát řešilo (1, 2).

Udělej si v bootstrap.php speciální routu na presenter, který bude řešit zmenšování a kešování náhledů. Třeba:

new Route('upload/images/<size>/<filename>', array(
    'presenter' => 'Images',
    'action' => 'resize'
));

V šablonách pak

<img src="upload/images/80x80/topol.jpg" />

Presenter

class ImagesPresenter extends Nette\Application\UI\Presenter
{
	public function actionResize()
	{
		$param = $this->getParam();
		// provedes resize + kesovani podle toho, co mas v $param
	}
}
Domki
Člen | 310
+
0
-

No ja už sem na forum koukal ale sem začátečník a moc sem tomu nerozměl

Ty dva odkazy to je jakoby hotovy už to cos psal niž?

a ten kod cos jsi psal :

tento kod

$param = $this->getParam();
 // provedes resize + kesovani podle toho, co mas v $param

tak ten parametr myslis
‚upload/images/<size>/<filename>‘ ty tucny?
a tato cesta je cesta k tomu obrazku?

Editoval Domki (27. 7. 2012 11:58)

Ot@s
Backer | 476
+
0
-

Domki napsal(a):

Ty dva odkazy to je jakoby hotovy už to cos psal niž?

Jsou pro inspiraci. Ten druhý, resp. odkaz v příspěvku obsahuje hotové řešení.

tak ten parametr myslis
‚upload/images/<size>/<filename>‘ ty tucny?
a tato cesta je cesta k tomu obrazku?

Skutečná cesta ke zdrojovému obrázku na FTPku je ve skutečnosti jiná. Raději tedy komentovaná ukázka ImagePresenteru (netestovano, neobsahuje kontroly vstupu atd…):

const REL_IMG_PATH = '/upload/images/'; // relativni cesta fyzickeho uloziste obrazku vzhledem k WWW_DIR
public function actionResize()
{
	$param = $this->getParam();
	// overeni fyzicke existence souboru (obrazky jsou fyzicky v WWW_DIR.$this::REL_IMG_PATH)
	$imgpath = WWW_DIR.$this::REL_IMG_PATH.$param['filename']; // hodnota $this::REL_IMG_PATH by mela byt v config.neon
	if (!is_file($imgpath))
	    throw new Nette\Application\BadRequestException('File not found');
	// soubor existuje, zmensim ho
	$image = Image::fromFile($imgpath);
	list ($w, $h) = explode('x', $param['size']); // bylo by vhodne kontrolovat hodnotu $param['size'] na nesmysly
	$image->resize($w, $h);
	$image->send();
	// pro jistotu
	$this->terminate();
}
22
Člen | 1478
+
0
-

@Ot@s: moc se mi ten kód nelíbí, co tu uvádíš, například proč BadRequestException, když máme FileNotFound?
Proč vlastní routa? Úplně zbytečně imho…

Ot@s
Backer | 476
+
0
-

BadRequestException je omyl z nepozornosti. $this->getParam() má být $this->getParameter() atd…
Použití routy jsem uvedl jako příklad (proč ne?). Buď se budu snažit psát best howto (už 2 lidi se neshodnou, co je bestof practice), nebo rychle nastřelím kód pro inspiraci a jdu rychle dál.

22
Člen | 1478
+
0
-

Každá routa navíc je ztráta výkonu, na co routa, když ti na to stačí jedna metoda teoreticky, pokud na to nemáš model.

Ot@s
Backer | 476
+
0
-

22 napsal(a):

Každá routa navíc je ztráta výkonu, na co routa, když ti na to stačí jedna metoda teoreticky, pokud na to nemáš model.

Tak na to nemám co napsat. Škálovatelnost, co? Kdybych měl takto uvažovat, tak jsem zůstal u simplerouteru :-(

Jan Tvrdík
Nette guru | 2595
+
0
-

22 wrote:

@Ot@s: moc se mi ten kód nelíbí, co tu uvádíš, například proč BadRequestException, když máme FileNotFound?

Neraď nesmysly. Použití BadRequestException je v pořádku. Použití FileNotFoundException je chyba.

Domki
Člen | 310
+
0
-

Aha. sem to zkusil

Tak v šabloně mám: ({$detailZbozi->foto} je název souboru)

<img src="upload/images/80x80/{$detailZbozi->foto}.jpg" />

do bootstrap sem pridal routu

$container->router[] = new Route('upload/images/<size>/<filename>', array(
    'presenter' => 'Image',
    'action' => 'resize'
));

a adresu k fotkam mam takto: const REL_IMG_PATH = ‚../../../images/foto_zbozi/‘;

nachazí se to v images je hned v rootu tam kde mam slozky app ,lib… a mam to v presenteru ktery je v app/presenter/ImagesPresenter.php

Ale fotku to nezobrazi, jen tu ikonku tagu img
Co musím upravit? To upload v routu a adrese tam ma byt nebo ne?

Ot@s
Backer | 476
+
0
-
  1. Přesuň složku na obrázky do www/, tj. bude existovat WWW_DIR.'/images'. Obecně veškeré veřejné soubory určené pro prohlížeč patří striktně do www/.
  2. Routu uprav na
$container->router[] = new Route('images/<size>/<filename>', array(
    'presenter' => 'Image',
    'action' => 'resize'
));
  1. Uprav si adekvátně REL_IMG_PATH

Zobraz si přímo v prohlížeči nějaký existující obrázek, třeba images/80×80/zbozi_xyz.jpg. Co uvidíš?

Pokud chybu:

  • je to laděnka? – řiď se tím, co píše (v případě produkčního módu rovnou do adresáře log/)
  • pokud vyhozenou vyjímku z ImagePresenteru, tak jdi na konkrétní místo skriptu

Editoval Ot@s (27. 7. 2012 16:29)

Domki
Člen | 310
+
0
-

Tak routu jsem upravil
cestu jsem zmenil na REL_IMG_PATH = ‚/../../www/images/foto_zbozi/‘

a kdyz zadam:
http://localhost/…9780/obr.jpg
Tak mi to vypise Objekt nenalezen! eror 404
?
Ten presenter ma být ImagesPresenter Images se s?

Ot@s
Backer | 476
+
0
-

Ano mám tam překlep. Názvy presenterů ti musí sedět v definici routy i názvu presenteru.
Jestli máš výchozí .htaccess, tak si z něj (tj. z pdf|js|ico|gif|jpg|png|css|rar|zip|tar) vyhoď koncovky souborů, které chceš měnit (tj. jpg a png).

Domki
Člen | 310
+
0
-

Jo tak ted to v ladence vyhodilo

Nette\Application\BadRequestException #404

File not found search►

Jestli to chapu tak je spatna cesta k tomu obrazku?

jak udelam kdyz se chcu vratit o uroven niz nebo vys proste bliz k rootu
pomoci /../ ?

Editoval Domki (27. 7. 2012 17:02)

Ot@s
Backer | 476
+
0
-

Uf, je to vyhozená vyjímka z ImagePresneteru. Zkontroluj si obsah $imgpath, jestli obsahuje správnou (fyzickou) cestu k souboru (třeba pomocí Nette\Diagnostics\Debugger::dump($imgpath);). Už jsi skoro v cíli, teď už se snaž sám.

Domki
Člen | 310
+
0
-

no ta je „D:\Petr\Programovani\Web\stranky\nette\www/../../www/images/foto_zbozi/obr.jpg“

jak mam tedy udelat aby se vratil o dve urnovne niz sem myslel ze to je pomoci tech dvojtecek

Ot@s
Backer | 476
+
0
-

Nj, widle! Tak si alespoň převeď lomítka v REL_IMG_PATH na zpětné. Promiň, ale to už s Nette nesouvisí, takže na dotazy tohoto typu nejsem ochoten odpovídat.

Editoval Ot@s (27. 7. 2012 17:13)

Domki
Člen | 310
+
0
-

Ale v lomítkach to není ty už sem změnil

Ot@s
Backer | 476
+
0
-

Zkus opravit cestu REL_IMG_PATH na '\images\foto_zbozi\‘.

Editoval Ot@s (27. 7. 2012 17:18)

Domki
Člen | 310
+
0
-

Tak když sem tam dal cestu napevno tak to funguje

Ale v ladence mi ted vyskocilo ze nemam definovany offset 1

na tomto radku
list ($w, $h) = explode(‚x‘, $param[‚size‘]);

a dump($param[‚size‘]);
vypise
„80×80“

a pritom v sabloně i v explode mám všude x

Editoval Domki (27. 7. 2012 17:27)

Ot@s
Backer | 476
+
0
-

Není ×, jako x. Jestli s tím máš problém, zakomentuj explode $param[‚size‘] a dej si tam rozměr ručně v číslech. Grrrr :-(

Domki
Člen | 310
+
0
-

no všude píšu x

Jo dal jsem to ručně a už to funguje.
Ještě se nak popasovat s tou adresou nebo ji tam taky dam rucne

Díky moc.

Ot@s
Backer | 476
+
0
-

Domki napsal(a):
Ještě se nak popasovat s tou adresou nebo ji tam taky dam rucne

Čéče, já ti vůbec nerozumím… Budu tedy hádat. Dumpni si WWW_DIR a REL_IMG_PATH. Dohromady to musí dávat něco jako D:\Petr\Programovani\Web\stranky\nette\www\images\foto_zbozi\..... Pak toto bude fungovat:

// prece nemuze byt nic sloziteho na spojeni retezcu za ucelem vytvoreni cesty na filesytemu
$imgpath = WWW_DIR.$this::REL_IMG_PATH.$param['filename'];

V šabloně pak používej <img src="images/80x80/{$detailZbozi->foto}.jpg" /> (pohlidej si, aby se ti na konci negenerovalo „…jpg.jpg“).

Domki
Člen | 310
+
0
-

No už je to dobrý už sem to nak poupravil a funguje to i primo v ty sablone
moc dík

Domki
Člen | 310
+
0
-

22 napsal(a):

Každá routa navíc je ztráta výkonu, na co routa, když ti na to stačí jedna metoda teoreticky, pokud na to nemáš model.

Mohu se zeptat jak by to vypadalo pomocí tý metody?
Děkuju