[addon webloader] Extras/webloader
- 2bfree
- Člen | 248
Když má joinFiles hodnotu FALSE, zároveň je zdrojový a cílový adresář stejný a zároveň není žádný filtr, bylo by IMHO vhodné vracet beze změny ten samý soubor.
Podpořte prosím zavedení navrhované změny na GitHubu
Osobně toto používám pro Development prostředí.
Dále jsem narazil na problém, kdy se v šabloně zavolá komponenta s parametrem na externí soubor {control js ‚http://ajax.googleapis.com/ajax/libs/jquery/1.7/jquery.min.js‘}.
Podpořte prosím zavedení navrhované změny na GitHubu
Editoval 2bfree (9. 4. 2012 12:35)
- duskohu
- Člen | 778
Ahojte,
s nette len zacinam, vedeli by ste mi poradit co robim zle?
BasePresenter
/**
* CSS component
*/
protected function createComponentCss()
{
// připravíme seznam souborů
// FileCollection v konstruktoru může dostat výchozí adresář, pak není potřeba psát absolutní cesty
$files = new \WebLoader\FileCollection(WWW_DIR . '/css');
$files->addFile('css/a/site.css');
// kompilátoru seznam předáme a určíme adresář, kam má kompilovat
$compiler = \WebLoader\Compiler::createCssCompiler($files, WWW_DIR . '/temp');
$compiler->setJoinFiles(false);
// nette komponenta pro výpis <link>ů přijímá kompilátor a cestu k adresáři na webu
return new \WebLoader\Nette\CssLoader($compiler, $this->template->basePath . '/temp');
}
TestPresenter
$this->presenter['css']->addFile('css/a/site.css');
a vratilo mi to:
Call to undefined method WebLoader\Nette\CssLoader::addFile()
Ide mi vlastne o to aby som si vedel v presenteru pridat dodatocne css.
Co mam zle?
- Honza Marek
- Člen | 1664
Voláš addFile nad CssLoaderem, který tu metodu nemá. Třída FileCollection ji má.
Možná řešení:
- Vkládat vždy všechno CSS. Výhodou je, že pokud prohlížeč jednou stáhne CSS, má už ho v keši a nic dalšího nestahuje.
- Renderovat takto:
{control css} {control css 'css/a/site.css'}
– vyrenderuje se komponenta s defaultním css a podruhé už jen s tím jedním souborem. - Nejhorším řešením by bylo to, o co se asi snažíš. Pokud na každé jednotlivé podstránce přidáš do kolekce CSS jeden malý soubor, tak kvůli spojování souborů se vždy bude stahovat ta defaultní část CSS znova, přestože by to při použití způsobu 1 nebo 2 mohlo jít z cache.
- cryou
- Člen | 1
Zdravím,
je možné za použití webloaderu následující (přidání
řetězce CSS)?
<?php
protected function createComponentCss() {
$files = new \WebLoader\FileCollection(WWW_DIR . '/css');
$compiler = \WebLoader\Compiler::createCssCompiler($files, WWW_DIR . '/cache');
$compiler->addString($this['anotherComponent']->getCSS());//ADD STRING
$filter = new \WebLoader\Filter\VariablesFilter(array(
"imagesPath" => $this->template->basePath.'/images'));
$compiler->addFilter($filter);
$compiler->addFilter(function ($code) {
return \CssMin::minify($code,array("remove-last-semicolon"));
});
return new \WebLoader\Nette\CssLoader($compiler,$this->template->basePath . '/cache');
}
?>
Editoval cryou (29. 5. 2012 19:06)
- Honza Marek
- Člen | 1664
Jedině asi jako filtr.
//cca
$compiler->addFilter(function ($code) {
return $code . "body {background: red}";
});
- Jan Mikeš
- Člen | 771
Zdravim, mam takovy mirny problem s JSloaderem (u css mi to slape perfektne
bez problemu).
V pripade, ze vsechny soubory primo v sablone, vse slape tak jak ma, viz:
{control js 'netteForms.js', '../fancybox/jquery.fancybox.pack.js', 'jquery-ui-1.8.19.custom.min.js', 'mousewheel.js', 'ageblock.min.js', 'jlayers.min.js', 'jquery.cycle.js', 'jquery.nette.js', 'settings.js'}
Pokud ale necham nacitat soubory pomoci Nette\Utils\Finder vyhodi mi hned pri
prvni prilezitosti firebug chybu jQuery is not defined
a tim padem
schodi cely JS.
Kod tovarnicky:
public function createComponentJs()
{
$files = new \WebLoader\FileCollection(WWW_DIR . '/js');
$files->addRemoteFile('https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js');
$files->addFiles(\Nette\Utils\Finder::findFiles('*.js')->from( WWW_DIR . '/js' ));
$files->addFile(WWW_DIR . '/fancybox/jquery.fancybox.pack.js');
$compiler = \WebLoader\Compiler::createJsCompiler($files, WWW_DIR . '/webtemp');
// $compiler->addFilter(function ($code) { return JSMin::minify($code); });
return new \WebLoader\Nette\JavaScriptLoader($compiler, $this->template->basePath . '/webtemp');
}
Zkousel jsem to jak s externim CDN na google jquery, tak s vlastni knihovnou umistenou v /js/, take mam zakomentovany js minifier jestli to nahodou nezpusobuje on… vyzkousel jsem vechno mozne, a nedari se mi prijit proc to zlobi.
Jquery je nactene, viz vygenerovane html:
<link rel="stylesheet" type="text/css" href="/helsinki-new/webtemp/cssloader-d9aef7184c9d.css?1340742089" />
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
<script type="text/javascript" src="/helsinki-new/webtemp/jsloader-0b57bd78e505.js?1340743227"></script>
Jde mi jen o usnadneni prace, abych u kazdeho projektu nemusel pri pridani jakehokoliv js pluginu editovat kod {controlu}, ale aby se to samo nacetlo pres finder, u css to funguje bezvadne.
- Honza Marek
- Člen | 1664
Kouknul bych se na vygenerovaný JS, jestli nemůže problémy způsobovat špatné pořadí vložených souborů. Občas bývá třeba problém s tím, že na konci nějakého souboru chybí středník a další na to nějak špatně navazuje. Ale nevím.
- Jan Mikeš
- Člen | 771
Kouknu se na to a vyzkousim, nejde mi ale do hlavy proc kdyz predam presne nazvy to funguje a proc pri pouziti finderu ne.
Edit: nevim proc, nevim jak, zkusil jsem znova promazat cely webtemp i temp (to jsem delal predtim uz 20x), odpoznamkoval si kod abych to vyzkousel znova a z niceho nic to jede, to mi fakt nejde do hlavy :)
Editoval Lexi (27. 6. 2012 16:17)
- pekelnik
- Člen | 462
Problem s novou verzi
Disclaimer: Zkousel jsem to diskutovat na jabberu, ale podle reakci se zda ze tu novou verzi nikdo nepouziva :D
Tovarna:
public function createComponentCss()
{
$directory = $this->parameters['assetCacheDir'];
$basePath = $this->parameters['assetCacheUrl'];
$convention = new DefaultOutputNamingConvention();
$convention->setPrefix('');
$convention->setSuffix('.css');
$files = new FileCollection();
$compiler = new Compiler($files, $convention, $directory);
$compiler->setJoinFiles($this->parameters['productionMode']);
$filter = new CssUrlsFilter($directory, $basePath);
$compiler->addFilter($filter);
$loader = new CssLoader($compiler, $basePath);
return $loader;
}
Situace:
- v adresari
%wwwDir%/cache
mam adresar s jQuery (pouzivam vlastni „asset manager“, kterej tam ty soubory naleje – muzeme probrat zvlast – pokud by byl zajem) - do webloaderu pridam
%wwwDir%/cache/jquery/css/ui-lightness/jquery-ui-1.8.17.custom.css
- webloader z toho udela neco jako
%wwwDir%/cache/a214003c7f83-jquery-ui-1.8.17.custom.css
Problem:
- problem je s (ne)upravenim cest v
url("...")
vyrazech - driv to fungovalo jaksi samo – stacilo spravne nastavit parametry
$tempUri
,$tempPath
,$sourceUri
a$sourcePath
, ale ted at s tim filtrem nebo bez nej (zkousel jsem si hrat i s tema cestama) v tom cssku jsou poradurl("img/...")
, tj. absolutne beze zmeny - webloader proste vykopiruje to cssko do pryc a… nic
- Honza Marek
- Člen | 1664
Zkus $compiler->addFileFilter($filter);
. AddFilter se
aplikuje na celý spojený výstup, takže WebLoader pak nezná cesty
k jednotlivým souborům.
- tomasnikl
- Člen | 137
Muzu se zeptat, k cemu je „Použití pro deployment script“
https://componette.org/search/?…
Nic moc mi to nerika. :o)
Dekuju za info
- Siam
- Člen | 54
Zkoušel jsem přidat filter jsShrink pomocí tohoto kódu a při spuštění mi to vždycky ihned shodí apache (program přestal odpovídat…). Netuší někdo prosím vás, čím by to mohlo být?
- Tomáš Votruba
- Moderator | 1114
Filtr jsem nakonec vyhodil, jelikož některé skripty (myslím)
znefunkčnil. Ne-li celou stránku :)
Doporučuju napsat nový filtr, případně využít jsMin.
- ic
- Člen | 430
Siam napsal(a):
Zkoušel jsem přidat filter jsShrink pomocí tohoto kódu a při spuštění mi to vždycky ihned shodí apache (program přestal odpovídat…). Netuší někdo prosím vás, čím by to mohlo být?
Zkoušel jsem ho nasadit před pár týdny a to se nakonec povedlo, ale úspěšný moc nebyl. Funguje jen na opravdu jednoduché javascripty. Třeba jQuery vůbec neminimalizuje. Na většině z toho, co používám selže.
- Siam
- Člen | 54
Pokouším se zatím zprovoznit ten cssmin a pořád mi to vyhazuje chybu serveru. Webloader mám zcela funkční a přidal jsem akorát podle návodu řádek:
<?php
$compiler->addFilter(function ($code) {
return cssmin::minify($code, "remove-last-semicolon");
});
?>
a do složky libs nejnovější verzi toho pluginu. Co dělám špatně?
- ic
- Člen | 430
Tak se na to dívám… kód mám stejný, ale jeden rozdíl by tu byl. Mám asi hodně starý cssmin (200 řádků kódu), to co je tam dneska aktuální verze má 5000 řádků kódu (!). Návod asi taky počítá se starší verzí: https://dl-web.dropbox.com/…c/cssmin.php?… protože při použití verze 2, nebo 3 už to nefunguje.
- Honza Marek
- Člen | 1664
Nový cssmin má prý jako druhý (nepovinný) parametr pole.
CssMin::minify(string $source [, array $filters = array()][, array $plugins = array()]);
Takže bych zkusil to remove semicolons odmazat.
$compiler->addFilter(function ($code) {
return cssmin::minify($code);
});
- Honza Marek
- Člen | 1664
V bootstrap.php nastavit Nette\Utils\Html::$xhtml = FALSE;
. Jde
to i nějak přes config.neon, ale tam si nejsem jistej přesnou syntaxí.
- kedrigern
- Člen | 102
Zdravím,
mohu se zeptat jak to děláte s obrázky? Používám WebLoader a díky
tomu mám knihovny v adresáři libs
. WebLoader je schroustá a
css a js připraví do adresáře www/webtemp
. To funguje
skvěle.
Avšak co když má knihovna obrázky? Obrázky jsou většinou počítány
relativně od místa, kde je uložen css/js soubor čili stačí obrázky
nahrát do adresáře www/webtemp
.
To se mi však nezdá příliš elegantní a předpokládám, že mi něco uniká. Čili jak se to má dělat správně?
Příklad takové knihovny je třeba Bootstrap from Twitter.
- MartinitCZ
- Člen | 580
@**kedrigern**: Tohle řeší tvůj problém
$compiler->addFileFilter(new \Webloader\Filter\CssUrlsFilter($this->context->parameters["wwwDir"]));
Editoval martinit (30. 11. 2012 18:09)
- kedrigern
- Člen | 102
@178 martinit: Tohle používám. To nastaví root složku pro css. Ale jak tam ty obrázky dostat?
Samozřejmě je lze zkopírovat ručně. Ale to se pak vytrácí část
kouzla webloaderu :). Já bych rád nastavil, aby to fungovalo stejně jako
s css a js. Tedy webloader by zkontroloval, zda soubory existují ve
webtemp
, pokud ne, tak by je zkopíroval.
Čili by stačilo nahrát novou verzi knihovny do libs
a
automaticky by se aktualizovali i obrázky.
- MartinitCZ
- Člen | 580
@**kedrigern**: Tohle je filter na úpravu cest k obrázkům v css
(viz. zdroják)
a né nastavení root složky pro css. Automaticky veme cestu k css souboru,
zněj zjistí cestu k obrázkům a apk jí upraví tak, aby stále fungovala,
ikdyž css bude v /webtemp.
Sám to používám a funguje to jak má! Žádné stěhování obrázků se
tedy nekoná!
Editoval martinit (30. 11. 2012 18:11)
- kedrigern
- Člen | 102
Tak já asi dělám něco blbě. Mám to stejně a nefunguje mi to.
Používám nastavení v config.neon
:
common:
services:
wlCssFilter: WebLoader\Filter\CssUrlsFilter( %wwwDir% )
webloader:
css:
default:
remoteFiles:
- http://code.jquery.com/ui/1.9.1/themes/base/jquery-ui.css
files:
- %wwwDir%/../libs/Bootstrap/css/bootstrap.min.css
- %wwwDir%/../libs/Bootstrap/css/bootstrap-responsive.min.css
- %wwwDir%/../libs/TwitterControl/client-side/TwitterControl.css
- %wwwDir%/texyla/css/style.css
- %wwwDir%/texyla/themes/default/theme.css
filters:
- @wlCssFilter
což je stejně jako to máš ty, akorát v neonu, ne?
V BasePresenteru.php
mám:
/**
* Css loader factory
* @return CssLoader
*/
public function createComponentCss()
{
return new \WebLoader\Nette\CssLoader(
$this->context->webloader->cssDefaultCompiler, // service generated by extension
$this->template->basePath . '/webtemp'
);
}
A v css je např:
url("http://localhost/projekt/www/webtemp/img/glyphicons-halflings.png")
Editoval kedrigern (30. 11. 2012 19:55)
- MartinitCZ
- Člen | 580
@**kedrigern**: V tom případě, se ten filter nepoužije. Mimo jiné, já to mám vše řešeno v php a soubory předávám v latte. Možná je problém právě v použití neon.
- enumag
- Člen | 2118
Koukám, že CssUrlsFilter je označen jako deprecated. Co se má použít místo něj? Zajímá mne to hlavně z hlediska stylů třetích stran – Colorbox, jQueryUI, etc.
- Honza Marek
- Člen | 1664
V tom případě to není úplně veselá situace. Mělo by fungovat vyrobení symlinku v document_rootu a použití větve jm-normalize-path. V ní jsem dal pryč veškeré použití funkce realpath, která symlinky resolvuje, což je většinou kontraproduktivní.
- Jan Mikeš
- Člen | 771
Mam trosku problem s webloaderem – generuje mi rozdilne css na lokalu a na produkci, zaclo me to zlobit az po pridani tw bootstrapu, pri odebrani bootstrap css tento problem zmizne.
Moje tovarnicka na webloader:
public function createComponentCss()
{
$files = new \WebLoader\FileCollection(WWW_DIR . '/css');
$files->addFiles(\Nette\Utils\Finder::findFiles('*.css', '*.less')->exclude("*print*")->from( WWW_DIR . '/css'));
$compiler = \WebLoader\Compiler::createCssCompiler($files, WWW_DIR . '/webtemp');
$compiler->addFileFilter(new \Webloader\Filter\LessFilter());
$compiler->addFilter(function ($code) { return CssMin::minify($code); });
return new \WebLoader\Nette\CssLoader($compiler, $this->template->basePath . '/webtemp');
}
V kodu komponenty jsem nemenil nic. Tento kod pouzivam uz pekne dlouho a az nyni s bootstrapem zacal zlobit. Vypada to, ze po nacteni bootstrap.css ignoruje jakekoliv dalsi soubory a uz je ignoruje – priklad, mel jsem pouze screen.css a bootstrap.css, nacetl bootstrap.css ale screen.css ne. Kdyz jsem zkopiroval zdrojak bootstrapu primo do screen.css, tento soubor se nacetl. Pokud jsem tam ale k tomu pak jeste pridal fancybox.css, tak se nacetl opet pouze screen.css ve kterem byl nyni zdrojak bootstrapu. Nejake napady/rady?
Edit: toto chovani co popisuji se deje pouze na produkci, na lokalu jede vse tak jak ma… local w8, produkce linux.
Editoval Lexi (28. 12. 2012 11:11)
- matoni555
- Člen | 40
Lexi: Zkus odstranit tu minifikaci, jestli to není tím. Včera jsem měl s Bootstrapem stejný problém. Používám ale Less soubory Bootstrapu. Nakonec jsem zjistil, že problém dělal soubor progress-bars.less. Můžeš zkusit vyhledat v CSS sekci s progress bary a zkusit ji odstranit. Já je nepoužívám, takže jsem to tak vyřešil.
- kedrigern
- Člen | 102
Když používám Webloader v config.neon
, tak mám něco
takovéhoto:
webloader:
css:
default:
files:
- style.css
- {files: ["*.css", "*.less"], from: %appDir%/presenters} # Nette\Utils\Finder support
filters:
- @wlCssFilter
js:
default:
remoteFiles:
- http://ajax.googleapis.com/ajax/libs/jquery/1.7/jquery.min.js
- http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.16/jquery-ui.min.js
files:
- %appDir%/../libs/nette/nette/client-side/forms/netteForms.js
- web.js
Nechápu kdy mohu využít 3. úroveň odsazení – default. Co to označuje? Kdy se mi to vyplatí změnit? K čemu to je?
Děkuji za odpověď a informace.
- Honza Marek
- Člen | 1664
Default je název CSS nebo JS. Můžeš si třeba definovat jedno CSS pro frontend a druhé pro admin.
- MartinitCZ
- Člen | 580
Ahoj,
mám takový zajímavý problém s tímto doplnkem (Apache/2.2.22
(Win32) mod_ssl/2.2.22 OpenSSL/0.9.8t PHP/5.4.11)
Jde o to, že pro administraci je to pár desítek js souborů. V případě,
že je vepíše všechny do jedné komponenty, tak prohlížeč zobrazí chybu:
Spojení přerušeno – Spojení se serverem bylo v průběhu
načítání stránky ukončeno.
Příklad použití:
http://pastebin.com/9HnX6jgC
Abych obešel tuto chybu, tak musim použít více komponent. Příklad
použití:
http://pastebin.com/PP28K6mx
Osobně si spíš myslim, že mám něco špatně nastaveno, ale třeba se pletu. Nemáte někdo nápad na řešení?
- Michalek
- Člen | 211
Nejsem si jistý, asi se mi to taky stalo.
Teď mi to funguje takhle :-) Možná inspirace… Protože teď už se mi to neděje.
{var $css = array()}
{? $css[] = '../addons/bootstrap/css/bootstrap.css'}
{? $css[] = '../addons/highslide/css/highslide.css'}
{if $presenter->isAdmin} {* big script and style loading only for admins *}
{? $css[] = '../addons/plupload/css/jquery.plupload.queue.css'}
...
{/if}
{control css $css}
Ve výsledku se pak návštěvníkům načítá jedna verze skriptu a adminům druhá, větší.
Editoval Michalek (19. 1. 2013 15:11)
- Honza Marek
- Člen | 1664
martinit: V Latte šablonách nemůžeš použít takhle makro uvnitř makra. Zkus tam dát
{control js $basePath . '/js/jquery.js', $basePath . '/js/jinejSoubor.js'}
- MartinitCZ
- Člen | 580
@**Honza Marek**: Zkusil jsem to upravit dle tvého návrhu, ale je to stejné. Pokud použiju jednu komponentu, tak to ukončí spojení. Pokud jich použiji víc, tak je to OK. Takže v použití maker v makru problém nebude.
- Honza Marek
- Člen | 1664
V tom případě tam asi budeš mít problémů víc. „Makra v makru“ na 100% nefungují.
- Honza Marek
- Člen | 1664
Spojení přerušeno – Spojení se serverem bylo v průběhu načítání stránky ukončeno.
Něco takového obvykle ukazuje prohlížeč, když detekuje HTTP hlavičku 500. V Chrome třeba pomáhá zapnout si inspektora (F12) a pak se ukáže laděnka (pokud je zaplý development mód).
- Michalek
- Člen | 211
Já k tomu jen tolik, že jakmile počet souborů překročí 16 (ať už v css nebo js), tzn. dostane se na 17+, apache se se mnou docela nevybíravě rozloučí.
Pokud soubory předám polem, jak jsem psal výše, vše je ok. Klidně se tomu budu věnovat dál, ale nevím jak.
[Sat Jan 19 23:05:29.237008 2013] [mpm_winnt:notice] [pid 1524:tid 316] AH00428: Parent: child process exited with status 3221225725 -- Restarting.
[Sat Jan 19 23:05:30.860292 2013] [mpm_winnt:crit] [pid 1524:tid 316] AH00419: master_main: create child process failed. Exiting.
- MartinitCZ
- Člen | 580
@**Honza Marek**: Ano vim, že nefungují. Např foreach, if … tam to nefunguje, ale zde při předávaní do komponenty to není problém, resp. funguje to.
@**Michalek**: Je to přesně jak píšeš. Pokud předám 17+
souborů, tak to spadne (ukončí spojení) a v logu mám toto:
http://pastebin.com/BWeMzfmm
Editoval martinit (20. 1. 2013 11:03)
- Honza Marek
- Člen | 1664
Michalek napsal(a):
Já k tomu jen tolik, že jakmile počet souborů překročí 16 (ať už v css nebo js), tzn. dostane se na 17+, apache se se mnou docela nevybíravě rozloučí.
To se mi v životě nestalo. A spojených souborů běžně mívám mnohem víc.
- MartinitCZ
- Člen | 580
@Honza Marek: To mě ještě taky ne. Bohužel jsem ani nenalezl řešení. :/
Jinak když se toto stane, tak apache errorlog zaspamovává tato chyba:
Parent: child process exited with status 255 -- Restarting.
V event viewer (eventvwr.msc → Protokol systému windows → Aplikace) je tento error:
Název chybující aplikace: httpd.exe, verze: 2.4.3.0, časové razítko: 0x502f70a3
Název chybujícího modulu: php5ts.dll, verze: 5.4.11.0, časové razítko: 0x50f71257
Kód výjimky: 0xc00000fd
Posun chyby: 0x0003b312
ID chybujícího procesu: 0x17d0
Čas spuštění chybující aplikace: 0x01cdfcb7c61db15f
Cesta k chybující aplikaci: C:\Wamp\Bin\Apache\bin\httpd.exe
Cesta k chybujícímu modulu: C:\Wamp\Bin\php\php5ts.dll
ID zprávy: 04ef0581-68ab-11e2-8151-083e8ea7eb86
Zkusil jsem vše přinstalovat, ale je to stále stejné. :/
Editoval martinit (27. 1. 2013 19:08)