[addon webloader] Extras/webloader

Honza Marek
Člen | 1664
+
0
-

Knihovnu WebLoader lze načítat přes package manager Composer – http://packagist.org/…ek/WebLoader

2bfree
Člen | 248
+
0
-

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

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

Voláš addFile nad CssLoaderem, který tu metodu nemá. Třída FileCollection ji má.

Možná řešení:

  1. 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.
  2. 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.
  3. 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.
duskohu
Člen | 778
+
0
-

Dakujem,
no mne ide vlastne o to:

mam dajme tomu:

AdminModule
 –templates
 –Test module
 –templates

a pri template bude/nebude aj css pre presenter
a system by si sam nacital css pokial bude existovat,

Neviem ci je tato realizacia vhodna

cryou
Člen | 1
+
0
-

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

Jedině asi jako filtr.

//cca
$compiler->addFilter(function ($code) {
	return $code . "body {background: red}";
});
Jan Mikeš
Člen | 771
+
0
-

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

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

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

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:

  1. v adresari %wwwDir%/cache mam adresar s jQuery (pouzivam vlastni „asset manager“, kterej tam ty soubory naleje – muzeme probrat zvlast – pokud by byl zajem)
  2. do webloaderu pridam %wwwDir%/cache/jquery/css/ui-lightness/jquery-ui-1.8.17.custom.css
  3. 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 porad url("img/..."), tj. absolutne beze zmeny
  • webloader proste vykopiruje to cssko do pryc a… nic
Honza Marek
Člen | 1664
+
0
-

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

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

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

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

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

Díky za odpovědi. O nějakých zaručeně funkčních a vyzkoušených js/css minimalizátorech víte?

ic
Člen | 430
+
0
-

Aktuálně jsem tedy přešel na JSMin a cssmin a všechno už funguje (scripty se minimalizací nepoškodí), nevím, jestli by třeba jiné nezmenšovali lépe, průzkum jsem si nedělal, ale tak nějak to funguje a oproti původnímu kódu je nový výrazně menší.

Siam
Člen | 54
+
0
-

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

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

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);
});
Siam
Člen | 54
+
0
-

Dobrý den. Jde prosím nějak nastavit, aby to negenerovalo ty lomítka na konci tagů?

Honza Marek
Člen | 1664
+
0
-

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

Vojtěch Dobeš
Gold Partner | 1316
+
0
-
nette:
    xhtml: false
Siam
Člen | 54
+
0
-

Díky, přes ten bootstrap mi to jde. Přes config bohužel ne, asi je to buglý.

Editoval Siam (24. 10. 2012 12:43)

kedrigern
Člen | 102
+
0
-

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

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

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

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

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

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

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

Klidně to používej, asi to @deprecated zase sundám.

mkoubik
Člen | 728
+
0
-

Nojo, ale co když mám twitter bootstrap v libs/ (instaluju ho přes composer)? Pak obrázky stěhovat musím, protože jsou mimo document_root.

Honza Marek
Člen | 1664
+
0
-

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

kedrigern
Člen | 102
+
0
-

Na to jsem se ptal :).

Takže když mám JS a CSS knihovny v libs/, tak řešením je mít skript, který z nich vyextrahuje zdroje do www/webtemp/, je to tak?

Editoval kedrigern (10. 12. 2012 12:13)

Jan Mikeš
Člen | 771
+
0
-

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

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

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

Default je název CSS nebo JS. Můžeš si třeba definovat jedno CSS pro frontend a druhé pro admin.

MartinitCZ
Člen | 580
+
0
-

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

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

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

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

V tom případě tam asi budeš mít problémů víc. „Makra v makru“ na 100% nefungují.

Honza Marek
Člen | 1664
+
0
-

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

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.
castamir
Člen | 629
+
0
-

Ve firefoxu FireBug

MartinitCZ
Člen | 580
+
0
-

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

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.