WebLoader jako asset manager?

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

Jedním z nepříjemných problémů pro vývojáře doplňků frameworku nebo různých modulů CMS a podobně je správa statických obrázků, CSS a JS souborů. Css a Js soubory už WebLoader obstojně řeší, ale teď mi napadlo, jestli by nemohl pomáhat i s těma obrázkama.

Než to začnu programovat, chtěl bych podiskutovat o tom, jak by to mělo být přesně realizované.

Zatím mám zhruba takovou představu:

// spravované adresáře bude registrovat asset manager
$assetManager->addDir('muj-super-plugin', APP_DIR . '/muj-super-plugin');

// bude umět vrátit cestu k souboru z www tempu
$assetManager->getPath('muj-super-plugin/logo.png');
// vrací $wwwDir/temp/muj-super-plugin/logo.png

// umí vyblejt všechny soubory do tempu
$assetManager->dumpAll();

Pro šablony by existoval helper, který by vracel cestu do tempu a případně ten soubor uměl zkopírovat.

<img src="{= 'muj-super-plugin/logo.png'|assetPath}">

Pak by se šiknul možná ještě filtr pro CssLoader.

Ještě něco by bylo potřeba? Myslím, že na implementaci by to mělo být celkem jednoduché, takže se dá předpokládat, že bych to moh realizovat.

Taky se těšim na tu bájnou situaci, až bude WebLoader mít Nettí container extension. Pak to bude fakt silnej nástroj. Hlásí se nějakej dobrovolník? :D

Aearsis
Člen | 57
+
0
-

Jak si představuješ tu extension? Co by měla umět? Neumím si představit nic co by nezvládla definice v services :)

P.S. Do WebLoaderu sem si přidal možnost „live“ kódu – že nepřidávám název souboru, ale přímo kód, obzvlášť u pluginů se to hodí např. na kód pro G. analytics – feature request, nebo mám poslat vlastní fuj fuj řešení?

Editoval Aearsis (10. 3. 2012 0:11)

newPOPE
Člen | 648
+
0
-

Privital by som este moznost invalidacie cache napr u JS a CSS a mozno aj obrazkov (pokial to tam uz nie je)

<?php
	<img src="{= 'muj-super-plugin/logo.png'|assetPath}">
?>

vygeneruje nieco ako (ku vsetkym takymto suborom)

<?php
	<img src=".../logo.png?c=123456789" /> //c=... je len example
?>

a po uprave sa len napr. prepisu subory + pregenrovanie identifikatora a mam istotu (domnievam sa) ze browsery cache invaliduju.

Filip Procházka
Moderator | 4668
+
0
-

Co takhle

<img n:src="img/picture.png" alt='' />

nebo lépe

<img n:src="myExtension/img/picture.png" alt='' />
Honza Marek
Člen | 1664
+
0
-

Aearsis napsal(a):

Jak si představuješ tu extension?

webloader:
	tempPath: %wwwDir%/temp
	css:
		rootPath: %appDir%/css
		default:
			files:
				- main.css
		print:
			files:
				- print.css
	js:
		js:
			files:
				- web.js

Měla by umět generovat více webloaderů podle nějakého společného nastavení. To by mohlo mít i nějaké defaultní hodnoty. Pak by to umělo vyplivnout službu, kterou požádáš třeba o ->getControl('print') a máš hotovou komponentu. Prostě by to mělo maličko usnadnit nastavování, ale nemám to úplně do detailů promyšlené.

P.S. Do WebLoaderu sem si přidal možnost „live“ kódu

Nestačilo by použít něco jako toto?

$compiler->addFilter(function ($code) {
	return $code . '/* muj GA kod */';
});

newPope

u css a js už to je

Aearsis
Člen | 57
+
0
-

Tohle všechno už jde přes setup, nebo ne?

A tím filtrem si nejsem jist, vždyť se fileFiltery volají na každém načteném souboru, a ostatní filtery při každém výstupu – jak pak zabránit aby se to náhodou nevypsalo víckrát?

juzna.cz
Člen | 248
+
0
-

@HosipLan: nedela to same tvuj Assetic? Nechces popsat, jak to delas ty?

Filip Procházka
Moderator | 4668
+
0
-

Já to mám založené na balíčcích.

{js '@packageName/js/main.js'}

zeptám se manageru, kde je balíček (třída dědící od Kdyby\Packages\Package, což je root balíčku) a pak z jeho složky Resources předám soubory do Assetic. S tím že tam kolem toho mám ještě nějaké čarování, aby to v devu běhalo přes router a soubory se obnovovaly v cachi. A na produkci se to vygeneruje jako statický soubor do veřejné složky a odkazuje se ten.