Obrazky, thumbnaily, cache
- flexroad
- Člen | 117
Ahoj,
co pouzivate na generovani obrazku v ruznych velikostech?
Nasel jsem:
https://github.com/…stry-Images/
https://github.com/…e-webimages/
tak si rikam, jestli nahodou nekdo nepouziva neco dotazenejsiho.
Diky za jakekoliv info,
@flexroad
- looky
- Člen | 99
Kdysi jsem se pokoušel nějak rozumně dotáhnout DotBlue\WebImages: pull, ale tak trochu umřela diskuze a už jsem to nedoladil. Nicméně mám to na jednom malém projektu nasazené a funguje to bez problémů..
EDIT: To WebChemistry vypadá na první pohled docela zajímavě!
Editoval looky (10. 2. 2015 16:01)
- flexroad
- Člen | 117
To vypada hodne dobre. Na cem to ted vazne? @vojtech.dobes Nedala by se pripojit tato vetev na master?
https://github.com/…tree/formats
@flexroad
- Oli
- Člen | 1215
@looky Zkoušel jsem tu tvou refactor větev. Měl bych k tomu pár připomínek. (Zkoušel jsem to na Nette 2.3, takže v dřívějších verzích to mohlo fungovat dobře tak jak to bylo).
Nastavení
webimages:
providers:
- DefaultImageProvider(%wwwDir%)
routes:
- 'gallery/photos/<width>x<height>/<id>.jpg'
rules:
- [width: 300, height: 200, flags: 2]
- [width: 50, height: 30]
Postupoval jsem intuitivně podle examples, testů a toho co jsem vyčetl v kodu, takže to možná používám blbě :-)
- Hned po napojení zahlásí chybu Extension. validateConfig musí být public (jako předek)
- Když jsem připojil provider, tak mě to řvalo na tom, že to není string. Po zakomentování to funguje.
- Jak vygeneruju novou fotku? Pokud je fotka na
www/gallery/photos/300x200/foo.jpg
, tak se zobrazí, jinak to vrací 404. Přitom bych řekl, že se to do toho DefaultImageProvideru vubec nedostane. Předpokládám, že to je kvůli tomu, že nikde nenastavuju metadata. Kde bych je měl prosím nastavovat? - Pokud nechám všechno defaultní, tak se jako flags použije 2 a pokud to nemám v rules, tak to vrátí, že to nemůžu použít. Nemělo by to defaultně vracet flags NULL?
A nazávěr se ujistím, že to chápu správně. Prvně se zkusí zavolat ten obrázek na té adrese. Pokud se nenajde, tak se zavolá provider, kterej vezme nějakej defaultní obrázek upravího a uloží podle cesty, která je definovaná v routeru. Takže příště se vrátí už ten uloženej obázek. Pokud neexituje ani originál tak se vrátí 404. Je to tak?
Díky
- Felix
- Nette Core | 1245
flexroad napsal(a):
To vypada hodne dobre. Na cem to ted vazne? @vojtech.dobes Nedala by se pripojit tato vetev na master?
https://github.com/…tree/formats
@flexroad
Pouzivam podobne upravenou verzi. Mohlo by se to nejak pohnout, pripadne by @vojtech.dobes mohl rict, jake s tim ma plany.
- Vojtěch Dobeš
- Gold Partner | 1316
Oli napsal(a):
A nazávěr se ujistím, že to chápu správně. Prvně se zkusí zavolat ten obrázek na té adrese. Pokud se nenajde, tak se zavolá provider, kterej vezme nějakej defaultní obrázek upravího a uloží podle cesty, která je definovaná v routeru. Takže příště se vrátí už ten uloženej obázek. Pokud neexituje ani originál tak se vrátí 404. Je to tak?
Přesně tak :).
- Vojtěch Dobeš
- Gold Partner | 1316
Co nejdřív plánuju s tím pohnout. @Felix Jakou upravenou verzi, smím li se zeptat?
- Felix
- Nette Core | 1245
@vojtech.dobes: Neni to uplne ona (tu svoji nemam verejnou), ale je to vesmes podobne. https://github.com/…mages/pull/9
- Vojtěch Dobeš
- Gold Partner | 1316
@Felix @Oli @flexroad @looky Vydána nová verze 2.0 kompatibilní s Nette 2.3. Přidána podpora pro různé formáty, předávání všech parametrů z rout do providerů, výchozí kompatibilita se Sandboxem…
- Oli
- Člen | 1215
@vojtech.dobes
Asi jsem to z toho kodu nepochopil a používám to blbě. Každopádně
nemůžu přijít na to, jak ty obrázky generovat. Mám to v podstatě podle
examples.
Má se udělat ještě něco jinýho? Konkrétně to mám takhle:
webimages:
providers:
- DefaultImageProvider(%wwwDir%)
routes:
- 'gallery/photos/<width>x<height>/<id>.jpg'
rules:
- [width: 300, height: 200]
v routeru
$router[] = new DotBlue\WebImages\Route('gallery/photos/<width>x<height>/<id>.jpg', [
'id' => [
DotBlue\WebImages\Route::FILTER_IN => function ($slug) {
return $slug;
},
DotBlue\WebImages\Route::FILTER_OUT => function ($id) {
return $id;
},
],
], $this->imageGenerator);
Pokud jsem to neměl v routeru, tak $defaults byl vždycky null.
Nevím ale, jak se dostat do Generator::generateImage
. Chápu,
že se to volá v __invoke v Route, ale nevím co udělat proto, aby se to
zavolalo.
Díky za jakékoli nakopnutí.
- looky
- Člen | 99
Oli napsal(a):
@looky Zkoušel jsem tu tvou refactor větev. Měl bych k tomu pár připomínek. (Zkoušel jsem to na Nette 2.3, takže v dřívějších verzích to mohlo fungovat dobře tak jak to bylo).
Na Nette 2.3 to opravdu nepojede, jde o příšerně starý a neudržovaný kód :)
Tobě se vůbec nevolá Generator::generateImage?
Editoval looky (26. 2. 2015 8:48)
- Vojtěch Dobeš
- Gold Partner | 1316
Generator::generateImage
se volá na těch obrázkových
routách. Tzn. pokud mám routu <id>.png
a půjdu na
www.myweb.com/1.png
, tak se zavolá generateImage
.
Pokud nějaký provider úspěšně vrátí Nette\Utils\Image
,
generateImage
ten obrázek uloží na danou adresu, takže
příště už se generateImage
nezavolá, protože server vrátí
obrázek rovnou, bez spolupráce s PHPčkem.
- Oli
- Člen | 1215
No a v tom je právě ten problém, mě se ten provider ani nezavolá.
Respektive nezavolá se tam ten Debugger::log('foo');
. Ještě
upřesním, obrázek mám v www/gallery/photos/2.jpg
a chci po něm
aby mě po zavolání
<img n:src="2, 300, 200">
vrátil www/gallery/photos/300x200/2.jpg
. V default provideru
to mám takhle:
public function getImage(\DotBlue\WebImages\ImageRequest $request)
{
$id = $request->getId();
$width = $request->getWidth();
$height = $request->getHeight();
$parameters = $request->getParameters();
\Tracy\Debugger::log($id);
$algorithm = isset($parameters['algorithm'])
? $parameters['algorithm']
: self::FIT;
$path = $this->wwwDir . '/gallery/photos/' . $id . '.jpg';
if (is_file($path)) {
$image = Image::fromFile($path);
$image->resize($width, $height, $algorithm);
return $image;
}
}
Ale jak jsem psal, tam se nedostanu. On se vubec nezavolá ten __invoke, kterej jsem pochopil, že se zavolat musí aby se ten obrázek vytvořil. Pokud ten obrázek umístím tam, kde má být, tak se vykreslí…
- Oli
- Člen | 1215
Sakra, jsem se blbě vyjádřil. Ono to do té routy vleze, ale výsledek se snaží najít rovnou v té masce. Když to tam nenajde, tak vrátí 404. Nesnaží se vubec ten obrázek vytvořit.
Jinak Pokud routu neuvedu žádnou, tak by se měla tahle zavolat před všema ostatníma a pokud ji uvádím, tak ji mám na prvním místě, takže to žádná jiná nestihne. :-)