Obrazky, thumbnaily, cache

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

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

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

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

@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ě :-)

  1. Hned po napojení zahlásí chybu Extension. validateConfig musí být public (jako předek)
  2. Když jsem připojil provider, tak mě to řvalo na tom, že to není string. Po zakomentování to funguje.
  3. 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?
  4. 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
+
0
-

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

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

Co nejdřív plánuju s tím pohnout. @Felix Jakou upravenou verzi, smím li se zeptat?

Felix
Nette Core | 1245
+
+1
-

@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
+
+3
-

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

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

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)

Oli
Člen | 1215
+
0
-

No podle mě se tam to volání nedostane. Zkoušel jsem např Debugger::log('foo');, ale nic v logu nebylo. Jen nevím co mi uniká :-)

Vojtěch Dobeš
Gold Partner | 1316
+
0
-

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

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í…

akadlec
Člen | 1326
+
0
-

tak pak si ověř co tu routu zpracuje, pokud se ti tam nedostane, tak ti tu routu odchytí zřejmě něco jiného.

Oli
Člen | 1215
+
0
-

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

Oli
Člen | 1215
+
0
-

Udělal jsem sandbox toho, jak jsem pochopil, že bych to měl používat. Mohl by mě někdo nakopnout na co jsem zapomněl? @vojtech.dobes

Díky ;-)

Vojtěch Dobeš
Gold Partner | 1316
+
+1
-

Tady bys neměl filtrovat obrázkové přípony, viz dokumentace.

Oli
Člen | 1215
+
+1
-

Super, díky. Nevím proč, ten htaccess jsem viděl a ještě si říkal, že je zajímavý, že tam ty obrázky nejsou definovaný. Teď mě to dává dokonalej smysl, že to nefungovalo, ale nevím co za zatmění mě vedlo k tomu, že zrovna v tom problém nebude :-)