[addon webloader] Extras/webloader

Honza Marek
Člen | 1664
+
0
-

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

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

@**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)

songoo
Člen | 13
+
0
-

Ak cez composer natiahnem bootsrap/ckeditor, pomocou webloaderu sa mi obrazky z css nacitat nepodari ? Alebo je k tomu uz neake riesenie ?

Filip Procházka
Moderator | 4668
+
0
-

Nevím jak s CSS ale zkus použít https://github.com/brabijan/images

akadlec
Člen | 1326
+
0
-

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

@**akadlec**: Protože na to rok nikdo nešáhl ;) #p93222 a #p93226

Editoval martinit (10. 1. 2014 12:22)

akadlec
Člen | 1326
+
0
-

@martinit: aha tak to potom jo ;) No ja jsem si ty filtry pořešil podle předchozích projektů včetně přidání filtru pro fixnutí @import aby byl vždy nahoře souboru.

songoo
Člen | 13
+
0
-

CSSUrlFilter obrazky z vendor/libs ale nevitiahne ?

MartinitCZ
Člen | 580
+
0
-

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

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

@dushoku: Přes cdn (http://fortawesome.github.io/…get-started/) v remoteFiles

Případně si přidej nějaký PathFilter.

duskohu
Člen | 778
+
0
-

@Tomáš Votruba samozrejme cez remoteFoles to ide, ale chcel som to mat lokalne, asi budem musiet pouzit ten filter, dakujem.

akadlec
Člen | 1326
+
0
-

Tak bez filtru to nemáš jak udělat. A ještě pozor linkování souborů musí být v CSS nahoře a to ty filtry neumí (nebo neuměly cca 1měs zpět)

mcmatak
Člen | 504
+
0
-

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?

romiix.org
Člen | 343
+
0
-

mcmatak napsal(a):

Pozri https://componette.org/search/?…

Jan Mikeš
Člen | 771
+
0
-

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

@Lexi ja pouzivam tento LESS processor mne funguje bez problemov, odporucaju ho aj tu

duskohu
Člen | 778
+
0
-

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)

Jan Mikeš
Člen | 771
+
0
-

@dukoshu: to je presne to na co jsem se ptal :) rad bych jej taky pouzival, namisto leafo/lessphp, nedari se mi ale rozbehnout file filter filtr do webloaderu (venoval jsem se tomu 20 minut a pak se na to vyprdl, protoze to pro me nebyla priorita)

duskohu
Člen | 778
+
0
-

@Lexi prepac, trosku som zle precital :-), hladas toto?

Jan Mikeš
Člen | 771
+
0
-

@duskohu: diky moc, easy a funguje i s novym bootstrapem :) k tomu tvojemu problemu, napada me ze $file je null, protoze mas filtr uvedeny jako filter a ne fileFilter v configu

Jan Mikeš
Člen | 771
+
0
-

@dushoku: tak bohuzel tve reseni nakonec nefunguje – spatne kompiluje @import, pokud mam napr mixins nebo cokoliv v importu a chci pouzit v parentovi tak nelze. s leafo/lessphp fungovalo bez problemu. Zkusim si s tim pohrat a uvidim jestli na neco prijdu.

Climber007
Člen | 105
+
0
-

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

Zdravím,
chci se zeptat na pár věcí:

  1. 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).
  2. Webloader i minifikuje? Jakým způsobem se případně minifikace zapíná? Nebo si ji musím vyřešit sám?
  3. 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“?
  4. Není v plánu nějaká obsáhlejší dokumentace?
  5. 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
+
-2
-

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

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

Díky za tip, já o bral podle addons.nette.org. Tohle je storpocentne lepší a hezčí

zimmi
Člen | 94
+
0
-

Zdravím,
daly by se s webloaderem nějak skloubit expires headery, nebo je to už spíš věc do htaccessu/configu apache? YSlow Firebugu mi hlásí, že bych si měl k css/js souborům přidat právě tyhle hlavičky.

flexroad
Člen | 117
+
0
-

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

Casper
Člen | 253
+
0
-

Jako callback:

webloader:
    css:
        default:
            filters:
                - [CssMin, minify]
flexroad
Člen | 117
+
0
-

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

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

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

zimmi napsal(a):

  1. 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'] = ...;
Tomáš Jacík
Člen | 147
+
0
-

Chci se zeptat, dělá někdo na verzi pro Nette 2.2?

Jiří Nápravník
Člen | 710
+
+1
-

Používám to bez problémů na Nette 2.2…

CZechBoY
Člen | 3608
+
0
-

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

Pavel Macháň
Člen | 282
+
0
-

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

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

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

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)

Tomáš Jacík
Člen | 147
+
0
-

Skvěle, díky za osvětlení

flexroad
Člen | 117
+
0
-

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

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

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;
}
  1. nenasel jsem nikde tridu cssmin
  2. 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
+
+1
-

Tirus91 napsal(a):

  1. nenasel jsem nikde tridu cssmin
  2. v latte mi to vrati sice link na css (v pripade vynechani cssmin), ale ten soubor neexistuje
  3. 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
+
0
-

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

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

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');
}