[addon webloader] Extras/webloader
- Honza Marek
- Člen | 1664
Celá tahle nešťastná situace vzniká kvůli tomu, že do presenteru nejde (pokud je mi známo) injectnout služba podle názvu. Pak by context potřeba nebyl.
Do WebLoaderu by asi šla přidat služba, která by si pamatovala všechny loadery vytvořené container extenžnou. Ale použití contextu mi v tomhle případě v praxi nepřineslo žádné potíže, tak se mi to nechtělo dělat.
- Jan Suchánek
- Člen | 404
@Honza Marek: jasnačka, tak bylo to v době, kdy se context používal nejvíc, ale chápu averzi k továrničkám.
Editoval jenicek (14. 11. 2013 14:18)
- MartinitCZ
- Člen | 580
@**Honza Marek**: Kdybys to udělal, tak by to bylo super :) Klidně se pokusim i nějak pomoc, jelikož jsem sám zkoušel tu extension upravit právě tímto směrem.
Uložil jsem si názvy services, předal do \Weoblader\Nette\Instances, toto injectnul a zavolal daný compiler. Bohužel vždy vracel jen název nikoli potomka \Webloader\Compiler ten jsem z toho nikdy nedostal :/
Editoval martinit (14. 11. 2013 16:39)
- akadlec
- Člen | 1326
@songoo: tipnu si že se ti špatně udělají cesty k obrázkům, resp zustanou ti takové jaké jsou v CSS ale soubor obsahující kolekci CSS je jinde a tak cesty nesedí. Musíš použít CSSUrlFilter akorát tedy nevím proč je daný jako deprecated
- MartinitCZ
- Člen | 580
songoo napsal(a):
CSSUrlFilter obrazky z vendor/libs ale nevitiahne ?
Však je samozřejmé, že obrázky musí být někde, kde knim můžeš přes prohlížeč. Na tom se nic nezměnilo!
- duskohu
- Člen | 778
Caute, skusam tento doplnok, chcel by som vediet ako riesite vkladanie napr: fortawesome ? Sice css mi vlozilo, ale url nesadia.
webloader:
css:
default:
joinFiles: FALSE
files:
- %themeDir%/AdminModule/resources/css/bootstrap.min.css
- %themeDir%/AdminModule/resources/css/font-awesome.min.css
A otazka c.2, ako riesite taketo situacie?
<!--[if IE 7]>
<link rel="stylesheet" href="assets/css/font-awesome-ie7.min.css" />
<![endif]-->
Editoval duskohu (26. 1. 2014 19:36)
- Tomáš Votruba
- Moderator | 1114
@dushoku: Přes cdn (http://fortawesome.github.io/…get-started/) v
remoteFiles
Případně si přidej nějaký PathFilter.
- mcmatak
- Člen | 504
neměl by někdo tip jak přidávat js na základě renderování nějaké komponenty,
např. použiji komponentu na slimbox, lightbox, jcarousel, nejaky counter a cokoli dalsiho, kazda komponenta vyzaduje urcity typ javascriptu
nemate nekdo napad jak to udelat?
co je horsi tak jeste nektere komponenty vyzaduji required js, pro zjednodušení např. jquery, a to zase musi byt prvni nactene, navic nechceme nacitat duplicitne, jquery bylo jen pro zjednoduseni, ale treba takovy cookies plugin nejaky, nebo nejak url hash convertor, to potrebuji dve komponenty a jinak ne, nelze moc odhadnout dopredu co vse nacitat
neresil to někdo?
- Jan Mikeš
- Člen | 771
Pls, nepsal jste si nekdo fileFilter pro https://github.com/…rge/less.php ? Leafo/lessphp nefunguje s bootstrapem vyssim nez 3.0.0 (uz je verze 3.1.1 se spoustou fixu). Diky
- duskohu
- Člen | 778
@Lexi ja pouzivam tento LESS processor mne funguje bez problemov, odporucaju ho aj tu
- duskohu
- Člen | 778
Caute neviete mi poradit? mam less a v nom mam nieco taketo:
@font-face {
font-family: 'Open Sans';
font-style: normal;
font-weight: 300;
src: local('Open Sans Light'), local('OpenSans-Light'), url(../font/lGh-uXM.woff) format('woff');
}
Predpoklad riesenia je: ze nejako identifukujem path, tento subor prekopirujem do webtempu a prepisem path na subor ktory som prekopiroval do webTempu. neviem ci toto riesenie je spravne. Ak ano, tak ma neviete niekto nakopnut ako to riesit? nemam ani sajnu, dakujem.
Takze som sa dostal tu: https://github.com/…lsFilter.php#L93
Ide mi o to aby som subor v ktorom definujem path k fontom vedel
identifikovat, lenze __invoke dostane $code vo $file mam null, ako by som vedel
identifikovat subor? jeho cestu? v ktorom sa moja definicia fontu nachadza? Aby
som nasledne na zaklade relativnej cesty vedel urcit absolutnu cestu k fontom,
a mohol ich prekopirovat do webTempu.
Ked si dumpnem \WebLoader\Compiler $loader, tak je tam : collection >> files, ale neda sa identifikovat ktory je prave ten ktory sa spracuvava.
Editoval duskohu (27. 2. 2014 18:59)
- Climber007
- Člen | 105
Mám dotaz, který by se dal možná použít i jako dobré vylepšení.
Pokud si vytvořím například několik balíčků přichází nutnost všechny
definovat jako komponenty. Dalo by se využít více render metod komponenty pro
vykreslení daného balíčku?
{control css:package}
Editoval Climber007 (11. 3. 2014 18:36)
- zimmi
- Člen | 94
Zdravím,
chci se zeptat na pár věcí:
- Jaký je nejlehčí způsob vytvoření nějakých balíků? Mám teď aplikaci rozdělenou na front a admin, které využívají jiné JS a CSS. A i v rámci těchto modulů se vyskytují presentery, které jsou zase specifické (např. využívají Grido).
- Webloader i minifikuje? Jakým způsobem se případně minifikace zapíná? Nebo si ji musím vyřešit sám?
- ve složce webtemp se mi řečeno s klasikem hromadí horníci. To je požadované chování? Neměly by se ty soubory mazat, když dojde k jejich „invalidaci“?
- Není v plánu nějaká obsáhlejší dokumentace?
- Při snaze použít něco jako
- {files: ["*.css", "*.less"], exclude: ['*awesome*'] ,from: %wwwDir%/css/front}
mi Nette Tester vyhodíNette\InvalidArgumentException: Unable to concatenate non-scalar parameter 'wwwDir' into '%wwwDir%/css/front'
. Tohle je akorát otravné, jinak v aplikaci to funguje, dá se to nějak obejít? Nette 2.2.
Díky moc za odpovědi.
Editoval zimmi (9. 6. 2014 18:28)
- Jiří Nápravník
- Člen | 710
1. Např. takhle:
webloader:
css:
admin:
files:
- {files: ["*.css", "*.less"], from: %wwwDir%/css/vendor/}
- %wwwDir%/css/admin/bootstrap.min.css
- %wwwDir%/css/admin/main.less
front:
files:
- {files: ["*.css", "*.less"], from: %wwwDir%/css/vendor/}
- %wwwDir%/css/front/bootstrap.min.css
- %wwwDir%/css/front/main.less
a v presenteru si potom vytahnes ten konkretni balik, např:
protected function createComponentCss()
{
return new CssLoader(
$this->context->getService('webloader.cssAdminCompiler'), $this->template->basePath . '/webtemp'
);
}
2. Pokud vim tak defaultne ne, ale je jednoduchy si to tam dodělat. Třeba
takhle jednoduchý
css minifikator . Případně jsou i nějaký cssmin a jsshrink apod, ktery
muzes vyuzit, jen je das do toho __invoke($code).
3. taky se mi tam tvori a byl jsem prekvapen, ale jednou za cas promaznu…
- Tomáš Votruba
- Moderator | 1114
Jen bych doplnil, že komponentu lze vytvořit snadněji:
/** @var \WebLoader\Nette\LoaderFactory @inject */
public $webLoader;
/** @return CssLoader */
protected function createComponentCss()
{
return $this->webLoader->createCssLoader('default');
}
/** @return JavaScriptLoader */
protected function createComponentJs()
{
return $this->webLoader->createJavaScriptLoader('default');
}
Viz git
- Jiří Nápravník
- Člen | 710
Díky za tip, já o bral podle addons.nette.org. Tohle je storpocentne lepší a hezčí
- flexroad
- Člen | 117
Ahoj, zacal jsem si hrat s webloaderem a vypada, ze funguje skvele.
Poradi mi prosim nekdo, jak do nasledujiciho neonu pridam filter
CssMin::minify($code)?
webloader:
css:
default:
files:
- {files: ["*.css", "*.less"], from: %wwwDir%/assets/css}
fileFilters:
- @lessFilter
- @wlCssFilter
A toto pak mam v basepresenteru:
/** @return CssLoader */
protected function createComponentCss()
{
return $this->webLoader->createCssLoader('default');
}
Diky moc!
@flexroad
- flexroad
- Člen | 117
Diky moc @Casper!
To vypada dobre. Snazi se to volat:
public static function minify($source, array $filters = null, array $plugins = null)
Vrati mi to ale chybu:
Argument 2 passed to CssMin::minify() must be of the type array, object given.
Jsem zacatecnik a moc netusim, jak to funguje. Nevim, jak mu ma predat to co po me chce:( Musim jeste nekam neco registrovat? Muzete prosim nekdo poradit?
Diky,
@flexroad
- Casper
- Člen | 253
Webloader těm filtrům předává content a instanci Compileru, viz Github. Můžeš buďto vytvořit vlastní wrapper nad tímto minifierem a správně předat parametry a nebo použít jiný, který toto volání z Webloaderu zvládne. Můžeš zkusit třeba tento. Callback bys potom měl na metodu minify nad instancí CssMinifier.
webloader:
css:
front:
filters:
- [@\CssMinifier, minify]
services:
- CssMinifier
- flexroad
- Člen | 117
@Casper: Fantasticke, funguje to!!! Mnohokrat dekuji!
Kdyby nejaky nette lama jako ja potreboval, tak jsem dle doporuceni pouzil Tento minifier
a muj config.neon vypada nejak takto:
services:
- CssMinifier
webloader:
css:
default:
files:
- {files: ["*.css", "*.less"], from: %wwwDir%/assets/css} # Nette\Utils\Finder support
fileFilters:
- @lessFilter
- @wlCssFilter
filters:
- [@\CssMinifier, minify]
@flexroad
- Tomáš Votruba
- Moderator | 1114
zimmi napsal(a):
- Při snaze použít něco jako
- {files: ["*.css", "*.less"], exclude: ['*awesome*'] ,from: %wwwDir%/css/front}
mi Nette Tester vyhodíNette\InvalidArgumentException: Unable to concatenate non-scalar parameter 'wwwDir' into '%wwwDir%/css/front'
. Tohle je akorát otravné, jinak v aplikaci to funguje, dá se to nějak obejít? Nette 2.2.Díky moc za odpovědi.
Také jsem při testování potřeboval %wwwDir%
a dostával
jsem stejnou chybu. Řešení:
Jelikož ji Configurator
určuje z hodnoty $_SERVER['SCRIPT_FILENAME']
, která v CLI
není přítomná, je potřeba ji přidat do bootstrap.php
před
vytvoření $containeru
.
$_SERVER['SCRIPT_FILENAME'] = ...;
- Pavel Macháň
- Člen | 282
CZechBoY napsal(a):
Včera jsem to nasazoval na nejnovější nette a přidával jsem si css/js minifikátory a ještě less a v pohodě všechno :-)
Co používáš na JS jako minifikátor?
- CZechBoY
- Člen | 3608
Pavel Macháň napsal(a):
Co používáš na JS jako minifikátor?
Radši se neptej… zkoušel jsem nějakej jShrink a kurvil mi kod tak že JS
házel errory…
Takže jsem nahodil nějakej JSMin, kterej se už nevyvíjí
a není doporučený ho používat. Funguje, já si nestěžuju. Nicméně
udělal jsem si filtr ve WebLoaderu a není problém na jednom místě změnit
jaká se bude používat knihovna.
Editoval CZechBoY (5. 9. 2014 23:08)
- Tomáš Jacík
- Člen | 147
Zřejmě špatně chápu jak funguje require v composeru.
Nainstalovat se mi samozřejmě podařilo, ale nejde mi to do hlavy.
V GITu je tohle: „nette/nette“: "~2.0@rc"
Podle toho bych hádal že to Nette 2.2 nepustí.
- Pavel Macháň
- Člen | 282
Tomáš Jacík napsal(a):
Zřejmě špatně chápu jak funguje require v composeru.
Nainstalovat se mi samozřejmě podařilo, ale nejde mi to do hlavy.
V GITu je tohle: „nette/nette“: "~2.0@rc"
Podle toho bych hádal že to Nette 2.2 nepustí.
@TomášJacík ~2.0 znamená, že to loadne verze 2.0 až 2.n … ~ udává, že se jede od daného posledního čísla až n verze… kdyby bylo ~2.2.0 tak se bude loadovat 2.2.0, 2.2.1, 2.2.2 atd…
~2.0@rc = 2.2 vyhovuje
Editoval Pavel Macháň (6. 9. 2014 16:00)
- flexroad
- Člen | 117
Zdravim,
potreboval bych poradit jak udelat override funkce v nejakem existujicim filtru. Napriklad bych potreboval prepsat public funkci __invoke v tride CssUrlsFilter. Pochopitelne to nechci prepisovat primo ve vendor.
Poradi nekdo korektni „nette way“, jak na to?
Diky,
@flexroad
- David Matějka
- Moderator | 6445
@flexroad zdedit a prekryt tu metodu. Pokud sis myslis, ze by tvoje zmena mohla byt uzitecna i pro ostatni, muzes vytvorit pull request do webloaderu
- Tirus91
- Člen | 199
Zkusil jsem si pridat tento doplnek, ovsem asi jsem ho moc nepochopil.
Do BasePresenteru jsem si pridal nasledujici kus kodu
protected function createComponentCss()
{
$files = new WebLoader\FileCollection(WWW_DIR . 'front/css');
$compiler = WebLoader\Compiler::createCssCompiler($files, WWW_DIR . '/temp');
$compiler->addFilter(function ($code) {
return cssmin::minify($code, "remove-last-semicolon");
});
$control = new WebLoader\Nette\CssLoader($compiler, '/webtemp');
$control->setMedia('screen');
return $control;
}
- nenasel jsem nikde tridu cssmin
- v latte mi to vrati sice link na css (v pripade vynechani cssmin), ale ten soubor neexistuje
Zda jsem to ale jinak pochopil, on si nacte vsechny CSS ve slozce www/front/css vytvori min verzi a tu ulozi do webtempu (predpokladam, ze to bere rekurzivne [vcetne podslozek]) a to same dela i s JS
Je pro to vsechno potreba neco jeste na serveru (Grunt)?
- iguana007
- Člen | 970
Tirus91 napsal(a):
- nenasel jsem nikde tridu cssmin
- v latte mi to vrati sice link na css (v pripade vynechani cssmin), ale ten soubor neexistuje
- Je pro to vsechno potreba neco jeste na serveru (Grunt)?
1. To je na tobě, jakou classu na minifikaci si do projektu vložíš, mě osobně se nepodařilo rozchodit žádnou co jsem našel, aníž by mi to rozbilo nějaké styly na webu, takže jsem použil regulární výraz, který mi ta css minifikuje, aníž by mi to něco rozbilo:
$compiler->addFilter(function ($code) {
$code = preg_replace('!/\*[^*]*\*+([^/][^*]*\*+)*/!', '', $code);
$code = str_replace(array("\r\n", "\r", "\n", "\t", ' ', ' '), '', $code);
return $code;
});
2. Máš povolen zápis do té složky, kam ti to ty minifikované styly
ukládá? Já s tím žádný problém neměl …
3. Já nic na server nepřidával a funguje to …
- Tirus91
- Člen | 199
@iguana007
Super, jen mám problém s JS, když ho minifikuji, tak mi to následně do
konzole háže
http://i.imgur.com/50Me0AA.png
protected function createComponentJavascripts() {
$files = new WebLoader\FileCollection(WWW_DIR . $this->system->customer . '/js');
$files->addFile('jquery-2.1.1.min.js');
$files->addFile('jquery-ui.min.js');
$files->addFile('bootstrap.min.js');
$files->addFile('netteForms.js');
$files->addFile('nette.ajax.js');
$files->addFile('history.ajax.js');
$files->addFile('../../lightbox/js/lightbox.min.js');
$compiler = WebLoader\Compiler::createJsCompiler($files, WWW_DIR . 'js');
$compiler->addFilter(function ($code) {
return \JShrink\Minifier::minify($code);
});
$control = new WebLoader\Nette\JavaScriptLoader($compiler, '/js');
return $control;
}
Editoval Tirus91 (3. 10. 2014 0:09)
- iguana007
- Člen | 970
Tirus91 napsal(a):
@iguana007
Super, jen mám problém s JS, když ho minifikuji, tak mi to následně do konzole háže
http://i.imgur.com/50Me0AA.png
Máš určitě správně název souboru s jQuery? To vypadá, že se ti to jQuery nenačte a tím pádem ti to hlásí tyto chyby.
- castamir
- Člen | 629
s tímto jsem se taky setkal – u větších knihoven (jQuery, bs3 apod) se při minifikaci vyskytují nejspíš potlačené chyby, proto mám v aplikaci více komponent z webloaderu – na vlastní skripty, které minifikuji, a na už minifikované velké knihovny mám prostě druhou komponentu, která je jen slučuje.
Mimochodem doporučuju použití Compiler Extension, které je součástí webloaderu. Příklad jednoho takového konfiguráku:
extensions:
webloader: WebLoader\Nette\Extension
services:
wlCssFilter: WebLoader\Filter\CssUrlsFilter(%wwwDir%)
lessFilter: WebLoader\Filter\LessFilter
cssMin: Joseki\Webloader\CssMinFilter
jsMin: Joseki\Webloader\JsMinFilter
webloader:
css:
default:
files:
- octicons.css
- design.css
- tables.css
- forms.css
filters:
- @wlCssFilter
- @cssMin
libs:
files:
- bootstrap.css
js:
default:
files:
- %libsDir%/composer/nette/forms/src/assets/netteForms.js
- datepicker-init.js
- form-formats.js
- form-selections.js
- form-navigation.js
- main.js
filters:
- @jsMin
libs:
files:
- jquery/jquery.js
- jquery/jquery.ui.js
- jquery/jquery.ui.lang.js
- bootstrap/bootstrap.js
BasePresenter.php
/** @var \WebLoader\LoaderFactory @inject */
public $webLoader;
/** @return CssLoader */
protected function createComponentCss()
{
return $this->webLoader->createCssLoader('default');
}
/** @return JavaScriptLoader */
protected function createComponentJs()
{
return $this->webLoader->createJavaScriptLoader('default');
}
/** @return CssLoader */
protected function createComponentCssLibs()
{
return $this->webLoader->createCssLoader('libs');
}
/** @return JavaScriptLoader */
protected function createComponentJsLibs()
{
return $this->webLoader->createJavaScriptLoader('libs');
}