vypsaní obrázku v šabloně v jiné velikosti
- Domki
- Člen | 310
Č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
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
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
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
@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
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.
- Jan Tvrdík
- Nette guru | 2595
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
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
- 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/. - Routu uprav na
$container->router[] = new Route('images/<size>/<filename>', array(
'presenter' => 'Image',
'action' => 'resize'
));
- 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
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?
- Domki
- Člen | 310
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
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“).