ScriptLoader, řešení pro css a js

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
h4kuna
Backer | 740
+
0
-

Komponenta vyrostla




Obsah je zastaralý

Ahoj,
měl bych pro Vás další plugin, který řeší slepování css a js do jednoho.

  • ke stažení ScriptLoader
  • pro css je udělaná základní komprimace (moc se s ní neušetří (2–3%), doporučuji serverovou komprimaci např. gzip)
  • js většinou jdou k dostání v minimalizované verzi proto js jsou opravdu jen slepené do jednoho
  • klient stahuje jeden větší soubor, nikoliv několik malinkatých (cca 5× rychlejší změřeno přes YSlow – doplněk do Firefoxu)
  • pracujete s vašimi soubory a ScriptLoader vám sekunduje stejně jako velký bratr RobotLoader
  • automaticky prepisuje relativni cesty na absolutni v CSS, o to se starat nemusite
  • dodržuje pořadí které si definujete v metodách addJs a addCss
  • pro každý presenter lze definovat vlastní css sestavu nebo js

v0.2

  • pokud vyvyjite pomoci prvniho parametru zadate zda chcete slepovat soubory ci nokoliv, automaticky se pri vyvoji neslepuji, na produkci slepuji
  • lze definavat zda ma vysledek zabalit do tagu <link> nebo <javascript>
<?php
$loadScript    =new ScriptLoader(true);//nyni se budou slepovat vzdy
?>
<?php
$loadScript    ->setWebTemp(WWW_DIR .'/temp');//webovy temp musi to byt slozka povolena pro zapis a dostat se do ni z webu, zde se budou ukladat slepene css a js
?>

zmena oproti predchozi verzi: je potreba definovat celou cestu absolutne u vsech souboru, dosahlo se tim velikeho zrychleni.

<?php
$cssDir	=WWW_DIR .'/css/';

//-------- A)
$array =array($cssDir.'reset.css', $cssDir.'body.css', $cssDir.'menu.css', $cssDir.'middle_up.css', $cssDir.'middle.css', $cssDir.'quick_menu.css');
?>

dalsi zmena: global uz neexistuje

<?php
//-------- B)
//css maji vetsi moznost pripravenou pro atribut media
$cssAr  =array(
	'screen'    =>array('screen.css', 'base-min.css'),
	//'global'    =>'global.css',//vloží se vždy na začátek v našem případě screen a print
	'print'     =>array('print.css', 'base.css'),
);
?>

alias pro toto je i

<?php
$css   =$loadScript->addCss(array('screen'    =>array('screen.css', 'base-min.css')));
$css   .=$loadScript->addCss(array('print'     =>array('print.css', 'base.css')));
?>

nacteni html

<?php
//$css si nechate vypsat v sablone nebo tam kde ji potrebujete
$css   =$loadScript->addCss($cssAr);//vrati pole souboru nebo tagy <link> ktere das do hlavicky

//javascript
$js   =$loadScript->addJs('neco.js', 'dalsi.js');//vrati pole souboru nebo tagy <link> ktere das do hlavicky

?>
<?php
//sablona phtml
<html>
<head>
<?php echo $js;?>
<?php echo $css;?>
</head>

<body>
</body>
</html>
?>

Editoval matata (19. 9. 2009 16:41)

timbulko
Člen | 85
+
0
-

Super! Niečo podobné som mal v pláne vytvoriť, som rád, že už nemusím :-D. Ešte by sa určite hodili k tomu prirobiť nejaké makrá pre použitie priamo v šablóne, pretože tam podobná funkcia aj logicky patrí, napríklad {addJs „script.js“} apod. Takisto aj nejake makro pre pridanie javascriptu, ktorý je vložený priamo v šablóne (teda nie v *.js súbore), napríklad:

<?php
{addJs}
var x = ...;
if (..) {...}
{/addJs}
?>

Editoval timbulko (6. 7. 2009 13:21)

Honza Marek
Člen | 1664
+
0
-

Zní to užitečně. Nechceš to dát do extras? A třeba vyrobit i nějaké malé demo, abych viděl, co přesně ta třída způsobí?

Jod
Člen | 701
+
0
-

JJ, daj to do extras, je tu super :)

h4kuna
Backer | 740
+
0
-

Byl bych rád aby jste to otestovali.

Demo vyrobím, do extras přidám.

Předvedu co způsobí........

h4kuna
Backer | 740
+
0
-

timbulko:
Takisto aj nejake makro pre pridanie javascriptu, ktorý je vložený priamo v šablóne (teda nie v *.js súbore)

Nevím jak to myslíš, pač třídě musíš definovat všechny *.js a ona vraci <script src=„…“></script>, lze to i vypnout

h4kuna
Backer | 740
+
0
-

Trošku jsem se odmlčel,

avšak dodal jsem plugin do extras a v ukazce nahore jsem doplnil co je potreba dodat do sablony.

A.
Člen | 87
+
0
-

Diky, vypada to na prvni pohled skvele!

Chtel jsem si v budoucnu neco podobneho napsat, ale zatim je to moc dole v todo listu :-).

Jdu to otestovat.

h4kuna
Backer | 740
+
0
-

A. napsal(a):

Diky, vypada to na prvni pohled skvele!

Chtel jsem si v budoucnu neco podobneho napsat, ale zatim je to moc dole v todo listu :-).

Jdu to otestovat.

Super dej vedet jak to jde

Majkl578
Moderator | 1364
+
0
-

měl bych pro tebe ještě takové TODO pokud by se ti to líbílo.
jde o vložení externích obrázků přímo do CSS což sníží počet HTTP requestů
více ZDE v prvním příspěvku, řešení ve druhém (samozřejmě třeba upravit)

Editoval Majkl578 (6. 8. 2009 10:24)

Ondřej Mirtes
Člen | 1536
+
0
-

Majkl578 napsal(a):

měl bych pro tebe ještě takové TODO pokud by se ti to líbílo.
jde o vložení externích obrázků přímo do CSS což sníží počet HTTP requestů
více ZDE v prvním příspěvku, řešení ve druhém (samozřejmě třeba upravit)

Zabýval jsem se tím, dokonce si napsal funkční skript, co mi je tam „embedne“, ale řešení nefunguje v IEčkách :(

EDIT: lol, koukám, že linkuješ na jakpsatweb na můj thread z doby, kdy jsem se o to pokoušel :D

Editoval LastHunter (6. 8. 2009 23:23)

Majkl578
Moderator | 1364
+
0
-

LastHunter napsal(a):

Majkl578 napsal(a):

měl bych pro tebe ještě takové TODO pokud by se ti to líbílo.
jde o vložení externích obrázků přímo do CSS což sníží počet HTTP requestů
více ZDE v prvním příspěvku, řešení ve druhém (samozřejmě třeba upravit)

Zabýval jsem se tím, dokonce si napsal funkční skript, co mi je tam „embedne“, ale řešení nefunguje v IEčkách :(

EDIT: lol, koukám, že linkuješ na jakpsatweb na můj thread z doby, kdy jsem se o to pokoušel :D

takže zas IE kazí plány :S
<OT>psal jsem, nedal jsi vědět, zda to pomohlo :D</OT>

Editoval Majkl578 (6. 8. 2009 23:49)

h4kuna
Backer | 740
+
0
-

Majkl578 napsal(a):

takže zas IE kazí plány :S
<OT>psal jsem, nedal jsi vědět, zda to pomohlo :D</OT>

Ahoj,

nad tim jsem nepremejslel.

nedokazu si moc predstavit udelat to tak aby to bylo optimalni cena/vykon, spise by se na to melo myslel pri navrhu HTML layuotu, zatim to delat nebudu, avsak nezavrhuju a taky se mi nechce bojovat s IE :D

oktam
Člen | 25
+
0
-

Ďakujem za komponentu :)

Tip na optimalizáciu: z CSS pravidla je možné zmazať bodko-čiarku za posledným atribútom v rámci pravidla.

Ešte otázka: je ta medzera na začiatku vygenerovaného CSS zámerne?

h4kuna
Backer | 740
+
0
-

oktam napsal(a):

Ďakujem za komponentu :)

Neni zac jsem rad ze ji pouzivas :)

Tip na optimalizáciu: z CSS pravidla je možné zmazať bodko-čiarku za posledným atribútom v rámci pravidla.

Ted netusim co tim myslis, tyka se to ScriptLoaderu? Rozepis to vice.

Ešte otázka: je ta medzera na začiatku vygenerovaného CSS zámerne?

vsiml jsem si ji ona vznika pokud mas na zacatku css komentar nebo @..neco..

Vadi necemu?

Editoval matata (21. 8. 2009 9:57)

oktam
Člen | 25
+
0
-

Tip na optimalizáciu: z CSS pravidla je možné zmazať bodko-čiarku za posledným atribútom v rámci pravidla.

Ted netusim co tim myslis, tyka se to ScriptLoaderu? Rozepis to vice.

<script>
#trieda {attribut1:hodnota1;atribut2:hodnota2;}
#trieda {attribut1:hodnota1;atribut2:hodnota2}
</script>

Bodkočiarka (;) je v CSS oddeľovač (nie ukončovač atribútu), za posledným atribútom už nemá význam.
(Pozri na rozdiel v tomto kóde.)

Ešte otázka: je ta medzera na začiatku vygenerovaného CSS zámerne?

vsiml jsem si ji ona vznika pokud mas na zacatku css komentar nebo @..neco..

Vadi necemu?

Babka k babce, budú kapce :-)

Ja som závyslý na detailoch ale hádam mi ta zbytočná medzera neuberie na kvalite života :-)

Editoval oktam (21. 8. 2009 13:01)

h4kuna
Backer | 740
+
0
-

oktam napsal(a):
Bodkočiarka (;) je v CSS oddeľovač (nie ukončovač atribútu), za posledným atribútom už nemá význam.
(Pozri na rozdiel v tomto kóde.)

uz chapu, urcite mas pravdu a moc si tim nepomuzes (vykonostne), ale pridam to tam

>

Babka k babce, budú kapce :-)

Svata pravda, mrknu zda by to slo nejak lehce odstranit

oktam
Člen | 25
+
0
-

Prikladam link na sikovny JavaScript Packer. Mozno stiahnut PHP5 port JavaScript Packera.

oktam
Člen | 25
+
0
-

ScriptLoader nevklada cely JavaScript subor – ak najde znaky // tak oreze lomitka aj obsah suboru, ktory nasleduje za lomitkami.

oktam
Člen | 25
+
0
-

Mam dalsi tip: co keby sa nazov vystupneho spojeneho suboru generoval na zakalde casu poslednej zmeny vsetkych zdrojovych suborov (teraz sa robi hash z nazvu suborov)?

Tak by sa mohla nastavit expiracia aj na par mesiacov a zaroven by bola istota, ze browser vzdy stiahne aktualnu verziu – kedze pri zmene sa vygeneruje novy nazov.

h4kuna
Backer | 740
+
0
-

oktam napsal(a):

Mam dalsi tip: co keby sa nazov vystupneho spojeneho suboru generoval na zakalde casu poslednej zmeny vsetkych zdrojovych suborov (teraz sa robi hash z nazvu suborov)?

hash se tvori z nazvu souboru, ale soubory se obnovuji podle casu, mimo produkce tam je potreba smazat aplikacni temp

h4kuna
Backer | 740
+
0
-

oktam napsal(a):

ScriptLoader nevklada cely JavaScript subor – ak najde znaky // tak oreze lomitka aj obsah suboru, ktory nasleduje za lomitkami.

posli mi prosim te JS ktery nedokazal zpracovat na mail bo icq 343–667–264

h4kuna
Backer | 740
+
0
-

Jeste bych chtel dodat ze neni primo ucelem komprimovat a odstranovat zbytecnosti z css a js, pac tim usetris opravdu minimum cca 3–5%, ale pokud mas hodne malinkatejch souboru a udelas z toho jeden velikej je cca 5× rychlejsi coz je zajimavejsi. A to je ukol ScriptLoaderu

Editoval matata (23. 8. 2009 19:45)

oktam
Člen | 25
+
0
-

matata napsal(a):

Jeste bych chtel dodat ze neni primo ucelem komprimovat a odstranovat zbytecnosti z css a js, pac tim usetris opravdu minimum cca 3–5%, ale pokud mas hodne malinkatejch souboru a udelas z toho jeden velikej je cca 5× rychlejsi coz je zajimavejsi. A to je ukol ScriptLoaderu

Som presvedceny, ze zlepenie 5 suborov do 1 sposobi v slusny narast v rychlosti stahovania. Usetrenie niekolko desiatok kB stahovanie este dalej urychli a zaroven usetri serveru, v nemalo pripadoch, aj radovo GB trafiku mesacne.

Puzivam trebars http://highslide.com/ na zvacsovanie obrazkov. Nekomprimovana verzia ma 55kB, „komprimovana“ 26kB.

Web s troskou features u klienta ma hoci aj niekolko 10kB JavaScript. Je fajn mat JavaScript krasne odsadeny, okomentovany, bez toho, aby dane komentare a whitespaces browser zbytocne stahoval.

To iste plati pre CSS.

Ak mam 1.000 ludi denne, kazdy z nich stiahne zbytocnych 30kB JavaScriptu, k tomu 5kB zbytocneho CSS, tak mesacne to spravi 1GB zbytocneho traffiku.

Ja sa o taku komponentu pokusim casom sam, hadam coskoro ziskam v Nette lepsi rozhlad.

h4kuna
Backer | 740
+
0
-

oktam napsal(a):
Ak mam 1.000 ludi denne, kazdy z nich stiahne zbytocnych 30kB JavaScriptu, k tomu 5kB zbytocneho CSS, tak mesacne to spravi 1GB zbytocneho traffiku.

Dobre mas pravdu ze ve vetsim meritku to ma smysl. Taky ber v potaz ze prohlizece si taky kesuji JS a CSS, budem brat ze nekesuji. Zajimalo by me kde si vzal zbytecny 30kB JS a 5kB CSS? To mas pred komprimaci a po komprimaci? A jaka je to komprimace?

Zkusil jsi taky zapojit GZIP? (usetri opravdu hodne)

ScripLoader umoznuje nacitat jen potrebne css a js na stranku. Vyuzivas to?

h4kuna
Backer | 740
+
0
-

Nova verze 0.2.1

  • rychlejsi (neprohledava filesystem)
  • lze zapinat a vypinat slepovani
  • inteligentneji obnovuje soubory
  • priklad na zacatku vlakna

Poděkování

Martin Džubák oktam

Editoval matata (27. 8. 2009 15:02)

h4kuna
Backer | 740
+
0
-

pridal jsem demo

Editoval matata (27. 8. 2009 15:00)

Honza Marek
Člen | 1664
+
0
-

Nemělo by demo třeba běžet někde na webu?

h4kuna
Backer | 740
+
0
-

Honza M. napsal(a):

Nemělo by demo třeba běžet někde na webu?

To si pak nebudes moci vyzkouset menit, pridavat a ubirat css a js. Moc k videni by toho nebylo

Nebo nejakej napad?

Chtelo by to tady nejaky piskoviste na vytvoreni ukazek pac web casem zlikviduju a nebude odkaz funkcni

Editoval matata (27. 8. 2009 16:09)

h4kuna
Backer | 740
+
0
-
jasir
Člen | 746
+
0
-

Zdravím!

ScriptLoader jsem vyzkoušel a je to pěkné.
Mám ale pocit, že jsem narazil na dva problémy:

  1. v metodě addScript při sestavování jména jako md5 časů participujících souborů může dojít při k vytvoření stejného jména pro různé soubory, pokud soubory budou mít všechny nastaven stejný čas vytvoření. Navrhuji změnu:
<?php
			/* --- Build filename from files --- */

			foreach ($value as $file) {
				$time = filemtime($file);
				if ($time === FALSE) {
					throw new FileNotFoundException('This file "' . $file . '" does\'t exists.');
				}
				//zmena: přidat do jména i jméno souboru
				$name .= $time . $file;
			}

			$fileName = self::md5Name($name . $media) . $this->type;

?>
  1. v metodě clearTemp() by asi mělo být použito getMtime(), takhle se mi při dvojnásobném volání generování scriptu při druhém průchodu (první průchod pro css, druhý pro js) mazal výsledek prvního průchodu (na windowsech). Chyba se u mě dala snadno nasimulovat při změně $this->clearTemp(3600); na $this->clearTemp(5)

Edit: A ještě jedna poznámka k názvům metod addCss a addJs, myslím, že přesnější by asi bylo combineCss()combineJavascript()

Editoval jasir (31. 8. 2009 14:52)

h4kuna
Backer | 740
+
0
-

jasir napsal(a):

Zdravím!

ScriptLoader jsem vyzkoušel a je to pěkné.
Mám ale pocit, že jsem narazil na dva problémy:

  1. jasny ted mi dochazi proc jsem to me v predchozi verzi delany podle jmena, musi se podle obojiho.
  2. budu muset na to mrknout ale vim co myslis.

Edit: A ještě jedna poznámka k názvům metod addCss a addJs, myslím, že přesnější by asi bylo combineCss()combineJavascript()

proc myslis? vzdyt pomoci metod pridavas css nebo js, myslim si ze to je kratky a vystizny nazev

kdyz uz tak v Iteratorech je setOffset() → ktera bud vytvori neexistujici nebo prepise stavajici, takze by bylo asi lepsi setCss, setJs

Editoval matata (31. 8. 2009 15:53)

jasir
Člen | 746
+
0
-

Okej, zkratky/nezkratky je asi jedno, jde mi o to sloveso add.
Od metody addCss($files) bych spíš očekával, že do nějakého objektu přidám soubory. To, že je zároveň i spojí a vrátí výsledek je neintuitivní.

Při addCss() bych očekával, že to bude fungovat nějak jako:

<?php
	$loader->addCss($file1);
	$loader->addCss($file2);
	echo $loader->generate();
?>

Editoval jasir (31. 8. 2009 15:59)

h4kuna
Backer | 740
+
0
-

jasir napsal(a):

Okej, zkratky/nezkratky je asi jedno, jde mi o to sloveso add.
Od metody addCss($files) bych spíš očekával, že do nějakého objektu přidám soubory. To, že je zároveň i spojí a vrátí výsledek je neintuitivní.

jsem pro zmenit to na set…

viz komentar

Při addCss() bych očekával, že to bude fungovat nějak jako:

<?php
	$loader->addCss($file1);
	$loader->addCss($file2);
	echo $loader->generate();// je tam: $loader->getCss();
?>
jasir
Člen | 746
+
0
-

matata napsal(a):

jsem pro zmenit to na set…

Tak to bych řekl že už vůbec ne, set<property> bych doporučil jen pro settery. A od setterů bych neočekával, že spustí generování a vrátí výsledek.

h4kuna
Backer | 740
+
0
-

jasir napsal(a):

matata napsal(a):

jsem pro zmenit to na set…

Tak to bych řekl že už vůbec ne, set<property> bych doporučil jen pro settery. A od setterů bych neočekával, že spustí generování a vrátí výsledek.

tak v tech metodach add smazu „return“ a k vysledku se dostanes pres get, ale rikal jsem si ze se return muze hodit

Honza Marek
Člen | 1664
+
0
-

Tak. Jelikož jsem nerozuměl zdrojáku této extrasy, tak při svojí nedůvěřivosti mi nezbylo než naprogramovat vlastní konkurenční… říkám tomu WebLoader, abych se odlišil.

1) Navnadění

Takhle to může fungovat:

{control css 'screen.css', 'ui.css'}
{control js 'jquery.js', 'jquery.livequery.js', 'nette.js', 'web.js'}
{if $user->isAuthenticated()}
	{control js 'jquery.ui.js', 'texyla/texyla.js', 'logged.js'}
{/if}

Další výhody:

  • při aktualizaci jednoho ze souborů se změní adresa souboru (hashují se názvy souborů a datum poslední změny nejnovějšího), takže cache prohlížeče nikoho obtěžovat nebude
  • zdroják je cca 10× menší
  • ovladatelné z presenteru i šablony (metody addFile(s) a removeFile(s) nebo způsob s widgetem výše)
  • zkusil jsem zakomponovat Nette\SafeStream, tak by to snad mohlo být thread safe

Vlastnosti:

  • cache je potřeba při změně ručně smazat… někdy při chybějící záloze se to může i hodit, co si budeme povídat ;)
  • metody pro správu souborů: addFile, removeFile, addFiles, removeFiles, clear
  • gettery: getLastModified, getGeneratedFilename, getContent
  • metoda render pro widgetování – pokud dostane v argumentech soubory, tak zruší ty co už má a vezme za svoje ty z argumentů
  • složky jsou ovladatelné přes veřejné proměnné $sourcePath, $tempPath, $tempBaseUri

2) Plácnutý zdroják

Abstraktní třída WebLoader s potomky JavaScriptLoader a CssLoader.

<?php

/**
 * Web loader
 *
 * @author Jan Marek
 * @license MIT
 */
abstract class WebLoader extends Control
{
	public $sourcePath;

	public $tempPath;

	public $tempBaseUri;

	protected $files = array();

	abstract public function getElement($source);

	public function addFile($filename)
	{
		if (in_array($filename, $this->files)) return;

		$this->files[] = $filename;
	}

	public function addFiles(array $files)
	{
		foreach ($files as $filename) {
			$this->addFile($filename);
		}
	}

	public function removeFile($filename)
	{
		$this->removeFiles(array($filename));
	}

	public function removeFiles($files)
	{
		$this->files = array_diff($this->files, $files);
	}

	public function clear() {
		$this->files = array();
	}

	public function render()
	{
		if (func_num_args() > 0) {
			$this->clear();
			$this->addFiles(func_get_args());
		}

		if (empty($this->files)) return;

		$filename = $this->generate();

		echo $this->getElement($this->tempBaseUri . "/" . $filename);
	}

	public function getContent()
	{
		$content = "";

		foreach ($this->files as $file) {
			$path = $this->sourcePath . "/" . $file;
			$content .= file_get_contents($path);
		}

		return $content;
	}

	public function getLastModified()
	{
		$modified = 0;

		foreach ($this->files as $file) {
			$path = $this->sourcePath . "/" . $file;
			$modified = max($modified, filemtime($path));
		}

		return $modified;
	}

	public function getGeneratedFilename()
	{
		return md5(implode("|", $this->files) . $this->getLastModified());
	}

	protected function generate()
	{
		$name = $this->getGeneratedFilename();

		$path = $this->tempPath . "/" . $name;

		if (!file_exists($path)) {
			if (!in_array(SafeStream::PROTOCOL, stream_get_wrappers())) {
				SafeStream::register();
			}
			file_put_contents("safe://" . $path, $this->getContent());
		}

		return $name;
	}
}
<?php

/**
 * Css loader
 *
 * @author Jan Marek
 * @license MIT
 */
class CssLoader extends WebLoader
{
	public $media;

	public function getGeneratedFilename()
	{
		return parent::getGeneratedFilename() . ".css";
	}

	public function getElement($source)
	{
		return Html::el("link")
			->rel("stylesheet")
			->type("text/css")
			->media($this->media)
			->href($source);
	}
}
<?php

/**
 * JavaScript loader
 *
 * @author Jan Marek
 * @license MIT
 */
class JavaScriptLoader extends WebLoader
{
	public function getGeneratedFilename()
	{
		return parent::getGeneratedFilename() . ".js";
	}

	public function getElement($source)
	{
		return Html::el("script")->type("text/javascript")->src($source);
	}
}

3) Příklad presenteru

class BasePresenter extends Presenter
{
	// ...

	protected function createComponentJs()
	{
		$js = new JavaScriptLoader;
		$js->sourcePath = WWW_DIR . "/js";
		$js->tempBaseUri = Environment::getVariable("baseUri") . "webtemp";
		$js->tempPath = WWW_DIR . "/webtemp";
		return $js;
	}

	protected function createComponentCss()
	{
		$css = new CssLoader;
		$css->sourcePath = WWW_DIR . "/css";
		$css->tempBaseUri = Environment::getVariable("baseUri") . "webtemp";
		$css->tempPath = WWW_DIR . "/webtemp";
		return $css;
	}
}

4) Plány do budoucna

  • Přidat podporu pro filtry (například komprimace JS)
  • Spojit se s autorem původní extrasy, zjistit co ta umí líp a vybrat z obou to lepší (pokud bude souhlasit)
  • A taky dokumentační komentáře :-D

Editoval Honza M. (2. 9. 2009 23:18)

_Martin_
Generous Backer | 679
+
0
-

Honza M. napsal(a):

Tak. Jelikož jsem nerozuměl zdrojáku této extrasy, tak při svojí nedůvěřivosti mi nezbylo než naprogramovat vlastní konkurenční… říkám tomu WebLoader, abych se odlišil.

Až do této chvíle jsem byl k podobné komponentně zaujatý, protože se mi nelíbilo míchat styly a JavaScript (věci související výhradně s jedním druhem pohledu) s presenterem. Ovšem toto řešení – přes widget přímo v šabloně – to je cesta=)

h4kuna
Backer | 740
+
0
-

_Martin_ napsal(a):
Ovšem toto řešení – přes widget přímo v šabloně – to je cesta=)

Taky to bylo v planu resili jsme to s jasirem na posledni sobote v praze, ovsem jsem rad ze uz si s tim nemusim lamat hlavu a zapojil se nekdo dalsi.

Honza M. napsal(a):
Spojit se s autorem původní extrasy, zjistit co ta umí líp a vybrat z obou to lepší (pokud bude souhlasit)

Souhlasim :) komunikace viz ICQ bo mail nebo tu na foru

na1k
Člen | 288
+
0
-

Honzo, to je parádní! :-)

Teď nic proti autorovi původní extrasy, ale to widgetové volání je super. Osobně bych ale ocenil do nové komponenty přidat komprimaci, ať je výsledek ještě efektivnější. No a kdyby snad někde existoval port YUI Compressoru (pro JS) do PHP tak to bych úplně slintal :)

Honza Marek
Člen | 1664
+
0
-

Důležitější než komprimace bude přepisování relativních url adres obrázků v CSS. To má kolega, já to mám v rané fázi rozpracování.

Napadlo mě, že když už s tím budu dělat taková kouzla, tak určitě nebude složité přidat podporu pro CSS proměnné, což by mohl být příjemný bonus oproti normálním CSS souborům.

Příklad s JS packerem od Deana Edwardse zveřejním do několika dnů, až budu mít čas.

jasir
Člen | 746
+
0
-

S Css proměnnými je to velmi zajímavý nápad, také jsem o tom přemýšlel.
Co by ale bylo dobré, kdyby se dala cesta k css/js souborům zapsat také absolutně, tj. např

{control css screen.css, APP_DIR . '/components/Datagrid/css/datagrid.css'}

Pak by se při „instalaci“ komponent nemusely její js a css otrocky kopírovat pod document_root.

Také by pak šlo i něco takového v komponentě:

<?php
$this->presenter['css']->addFile(dirname(__FILE__) . '/css/component.css');
?>

Čili komponenta by si sama uměla zaregistrovat potřebné CSS soubory.

Bohužel pak nastává další problém – v každém presenteru můžou být jiné použité komponenty s jinými CSS, čili by se CSS měnilo pro každý presenter.
Možná by to šlo řešit zavedením „namespaces“ do tohoto loaderu, tzn. že by se negenerovalo jedno CSS, ale pro každý namespace jeden.

A nebo nějak zajistit registraci CSS/JS souborů ode všech component v projektu.

Editoval jasir (3. 9. 2009 19:57)

vlki
Člen | 218
+
0
-

Vyvíjí se to suprově! Ve spojení s novými šablonami, kde bude blok výchozích stylů a skriptů a každá šablona si to bude moct podědit a změnit nebo doplnit, se to stane dost killing featurou!

Ondřej Mirtes
Člen | 1536
+
0
-

jasir napsal(a):

S Css proměnnými je to velmi zajímavý nápad, také jsem o tom přemýšlel.
Co by ale bylo dobré, kdyby se dala cesta k css/js souborům zapsat také absolutně, tj. např

{control css screen.css, APP_DIR . '/components/Datagrid/css/datagrid.css'}

Pak by se při „instalaci“ komponent nemusely její js a css otrocky kopírovat pod document_root.

Také by pak šlo i něco takového v komponentě:

<?php
$this->presenter['css']->addFile(dirname(__FILE__) . '/css/component.css');
?>

Čili komponenta by si sama uměla zaregistrovat potřebné CSS soubory.

Bohužel pak nastává další problém – v každém presenteru můžou být jiné použité komponenty s jinými CSS, čili by se CSS měnilo pro každý presenter.
Možná by to šlo řešit zavedením „namespaces“ do tohoto loaderu, tzn. že by se negenerovalo jedno CSS, ale pro každý namespace jeden.

A nebo nějak zajistit registraci CSS/JS souborů ode všech component v projektu.

Tady máš bezpečnostní problém. Do APP_DIR nesmí mít Apache, potažmo uživatel, přístup.

Honza Marek
Člen | 1664
+
0
-

LastHunter napsal(a):
Tady máš bezpečnostní problém. Do APP_DIR nesmí mít Apache, potažmo uživatel, přístup.

Leda pokud použije v cestě globálně ovladatelnou proměnnou. Což asi ne.

jasir
Člen | 746
+
0
-

Tady máš bezpečnostní problém. Do APP_DIR nesmí mít Apache, potažmo uživatel, přístup.

??? To je nesmysl, vždyť je to přeci podobné jako se šablonama, ScriptLoader dá dohromady soubory a výsledek pak dá do document_root/js/temp nebo kam. Uživatel přístup na originální soubory nemá.

Editoval jasir (3. 9. 2009 21:41)

Ondřej Mirtes
Člen | 1536
+
0
-

Aha, sorry, ani jednu z těch tříd jsem zatím nezkoumal. Ale tohle mě praštilo do očí :)

Honza Marek
Člen | 1664
+
0
-

I tak nastává otázka jak poznat absolutní cestu. Že začíná / anebo písmeno:\?

jasir
Člen | 746
+
0
-

Honza M. napsal(a):

I tak nastává otázka jak poznat absolutní cestu. Že začíná / anebo písmeno:\?

Asi nejsnazší řešení… Myslím, že to bude fungovat všude.

h4kuna
Backer | 740
+
0
-

Honza M. napsal(a):

I tak nastává otázka jak poznat absolutní cestu. Že začíná / anebo písmeno:\?

Navrh:

Ja to mam resene ze nepoznavam absolutni cestu ale poznavam relativni a ta vsude zacina „.“ a zbytek je absolutni