[addon webloader] Extras/webloader

Honza Marek
Člen | 1664
+
0
-

Diskuse ke stránce addons/Webloader


Diskuzní stránka komponenty WebLoader.

(opravený odkaz na stránku s addonom)

Editoval kravčo (14. 7. 2011 10:10)

Ondřej Mirtes
Člen | 1536
+
0
-

Nešlo by do toho hashovaného názvu temp souboru zahrnout i změny cest? Když mám jednu aplikaci na dvou různých adresách a v jiných adresářových úrovních, tak mi funguje správně jen jedna (ta druhá špatně načte obrázky).

Honza Marek
Člen | 1664
+
0
-

asi by to šlo

Oggy
Člen | 306
+
0
-

jak se dá nastavit obsah atributu media ?

Honza Marek
Člen | 1664
+
0
-
$komponenta->media = "print";

Třeba v továrničce.

Honza Kuchař
Člen | 1662
+
0
-

Tak jsem sehnal funkční JS minifikátor: JSMin. (ten původn nějak nefungoval – rozbil JavaScript)
+ jsem sehnal funkční CSS minifikátor, ale musel jsem ho upravit, tak aby jel pod PHP 5.2.x

http://projekty.mujserver.net/…e%20my%20JS/
http://projekty.mujserver.net/…r/CssPacker/

Honza Marek
Člen | 1664
+
0
-

Ten původní JS minifikátor vyžaduje všude středníky. Já už jsem se ale naučil psát tak, aby to prošlo.

Honza Kuchař
Člen | 1662
+
0
-

Ten novej taky.

//EDIT: Kdyby někdo chtěl k tomu souboru připojit původní název, tak stačí přepsat tuhle metodu:

	/**
	 * Filename of generated file
	 * @param array $files
	 * @return string
	 */
	public function getGeneratedFilename(array $files = null)
	{
		if ($files === null) {
			$files = $this->files;
		}
		$name = $this->generatedFileNamePrefix . md5(implode("|", $files) . $this->getLastModified($files));
		if(count($files)===1) $name .= "-" . String::webalize($files[0]);
		return $name;
	}

Editoval honzakuchar (3. 10. 2009 12:57)

Honza Marek
Člen | 1664
+
0
-

Fičura bude k dispozici v příští verzi.

Editoval Honza M. (3. 10. 2009 14:43)

Matúš Matula
Člen | 257
+
0
-

planuje sa pridat podpora aj pre absolutne cesty k suborom? dajme tomu, ze chcem mat css aj js subory nejakej komponenty v 1 adresari pod /app/controls/ .

$this->presenter['smartJs']->addFile(dirname(__FILE__) . '/rating.js');

Ondřej Mirtes
Člen | 1536
+
0
-

Matúš Matula napsal(a):

planuje sa pridat podpora aj pre absolutne cesty k suborom? dajme tomu, ze chcem mat css aj js subory nejakej komponenty v 1 adresari pod /app/controls/ .

$this->presenter['smartJs']->addFile(dirname(__FILE__) . '/rating.js');

Takhle to mám, stačí si tak nastavit sourcePath (a sourceUri nastavit stejnou jako tempUri).

Honza Marek
Člen | 1664
+
0
-

Matúš Matula napsal(a):

planuje sa pridat podpora aj pre absolutne cesty k suborom?

Asi jo. Ale je tam takový problém, jak se chovat u přepisu url adres na absolutní v CSS souborech. Předpokládat umístění jakoby v source rootu? Nebo adresy nepřepisovat? Vždycky může nastat situace, kdy ten samý soubor přidaný relativně a absolutně se bude chovat jinak. To je potřeba vymyslet.

Honza Marek
Člen | 1664
+
0
-

honzakuchar napsal(a):

Tak jsem sehnal funkční JS minifikátor: JSMin. (ten původn nějak nefungoval – rozbil JavaScript)

http://projekty.mujserver.net/…e%20my%20JS/

Ve čtimě.txt stačí instalace taková:

$js->filters[] = "JSMin::minify";
  • jsem sehnal funkční CSS minifikátor, ale musel jsem ho upravit, tak aby jel pod PHP 5.2.x

Tak teda ten CSSTidy mi rozbil celé CSS. To cssmin se chová mnohem slušněji!

Honza Kuchař
Člen | 1662
+
0
-

zalezi na nastaveni. Mam to nastaveno a zadny problem.

Honza Marek
Člen | 1664
+
0
-

Nastavil jsem to podle tvého čtimě.

Honza Kuchař
Člen | 1662
+
0
-

aktualizoval jsem README

hurvajs
Člen | 86
+
0
-

Zdravim, super věc, ale zajímalo by mě jestli je podporované pole jako parametr pro widget. V podstate nikdy nevím jaké CSS budu potřebovat načíst, takže bych mu předal jen pole se seznamem.

Honza Marek
Člen | 1664
+
0
-

Vnitřně to jako pole funguje, takže by šlo určitě použít

{? $control["css"]->render($pole)}

místo

{control css $soubor1, $soubor2}

Nebo se to taky dá vyřešit postupným přidáváním souborů už v presenteru a do šablony dát jen

{control css}
hurvajs
Člen | 86
+
0
-

Tohle funguje dekuji. Ale jeste mi to neparsuje sparvne jeden CSS soubor. Na metode absolutizeUrls mi to misto obsahu vraci null.

hurvajs
Člen | 86
+
0
-

Tak vyreseno. Mel jsem chybu v CSS. Dekuji za pomoc :)

Honza Kuchař
Člen | 1662
+
0
-

Ahoj, narazil jsem na takovou drobnost. V PHP 5.3 je deprecated ereg. tzn. prosím změnit řádek 27 v souboru CssLoader.php na

		if (preg_match('/^([a-z]+:\/)?\//', $url)) return $url;
mcmatak
Člen | 490
+
0
-

Myslíte, že neexistence stylu by měla shodit celou stránku?

mcmatak
Člen | 490
+
0
-

viděl bych to spíš na tichou chybu zaslanou emailem, ale web jede dál

pekelnik
Člen | 462
+
0
-

mcmatak napsal(a):

Myslíte, že neexistence stylu by měla shodit celou stránku?

co takhle podle prostředí:

V DEVELOPMENT prostředí shodit celou stránku
V PRODUCTION zapsat do logu a jet dál

:)

Honza Kuchař
Člen | 1662
+
0
-

@pekelnik: souhlas, ale nedělal bych to natvrdo. Udělal bych to nějak takhle:

class WebLoader {
	/**
	* @type bool
	*/
	var $throwExceptions;

	function __construct() {
		$this->throwExceptions = !Environment::isProduction();
	}
}

Editoval honzakuchar (25. 1. 2010 15:01)

Honza Marek
Člen | 1664
+
0
-

pekelnik napsal(a):

mcmatak napsal(a):

Myslíte, že neexistence stylu by měla shodit celou stránku?

co takhle podle prostředí:

V DEVELOPMENT prostředí shodit celou stránku
V PRODUCTION zapsat do logu a jet dál

:)

Já tuhle skrytou závislost na prostředí nechci provozovat. Ale ve verzi z githubu už je možné nastavit, jestli se mají vyhazovat výjimky při nenalezení souboru.

// třeba takhle
$loader->throwExceptions = Environment::isProduction();

Možná by šla taková výjimka zachytit a prohnat přes Debug::processException, to musim zkusit. Potom by to ani nemuselo shodit celou stránku.

mcmatak
Člen | 490
+
0
-
<?php
	/**
	 * Add file
	 * @param string $file filename
	 */
	public function addFile($file)
	{
		if (in_array($file, $this->files)) {
			return;
		}

		if (!file_exists($this->sourcePath . "/" . $file)) {
			if ($this->throwExceptions) {
				if (Environment::isProduction()) {
					Debug::processException(new FileNotFoundException("File '$this->sourcePath/$file' does not exist."));
					return;
				} else {
					throw new FileNotFoundException("File '$this->sourcePath/$file' does not exist.");
				}
			}
		}

		$this->files[] = $file;
		return true;
	}
?>

hmmm koukám, že už tě to ale taky nepadlo

Editoval mcmatak (25. 1. 2010 15:41)

Honza Kuchař
Člen | 1662
+
0
-

Mno fajn, jak se tak dívám, tak přesně jak jsem si to představoval, tak WebLoader funguje. :-D

iguana007
Člen | 970
+
0
-

pekelnik napsal(a):

mcmatak napsal(a):

Myslíte, že neexistence stylu by měla shodit celou stránku?

co takhle podle prostředí:

V DEVELOPMENT prostředí shodit celou stránku
V PRODUCTION zapsat do logu a jet dál

:)

Určitě souhlas … v production je to nesmysl. Já osobně někde načítám externí zdroje z několika míst (z důvodu optimalizace webu) – vetšinou domén a při dočasném výpadku jedné domény tj. absence jednoho z nich by se mi neměl shodit celý web.

mcmatak
Člen | 490
+
0
-

pro kompresi css mne ještě nikdy nezklamalo tohle

<?php
	public function minifyCss($content)
	{
		$content = preg_replace('!/\*[^*]*\*+([^/][^*]*\*+)*/!', '', $content);// remove comments
		$content = str_replace(array("\r\n", "\r", "\n", "\t", '  '), '', $content);// remove tabs, spaces, newlines, etc.
		$content = str_replace('{ ', '{', $content);// remove unnecessary spaces.
		$content = str_replace(' }', '}', $content);
		$content = str_replace('; ', ';', $content);
		$content = str_replace(', ', ',', $content);
		$content = str_replace(' {', '{', $content);
		$content = str_replace('} ', '}', $content);
		$content = str_replace(': ', ':', $content);
		$content = str_replace(' ,', ',', $content);
		$content = str_replace(' ;', ';', $content);
		return $content;

	}
?>
iguana007
Člen | 970
+
0
-

Mě nejde ani o kompresi (tu taky používám), ale spíše o to, že se načítá obsah z více zdrojů najednou …
více zde: http://developer.yahoo.com/…e/rules.html

Co se týče třeba jQuery apod. knihoven, načítám je přímo přes google apis, příjde mi to rozumnější a jistou mírou to i přispěje k rychlejšímu načtení stránky – http://code.google.com/…cumentation/

Editoval iguana007 (26. 1. 2010 13:23)

mcmatak
Člen | 490
+
0
-

no tak sem si ten webloader trochu přepsal, kod asi budete považovat za prasacky nicméně pokusím se popsat funkčnost

kdyb to někoho zajímalo
https://github.com/matak/WebLoader

  1. to jestli se bude javascript minifikovat se nenastavuje na tovarnicku, ale primo ke kazdemu souboru,
  2. stejně tak pro css jsem potřeboval nastavovat typ media přímo k danému souboru,
  3. jo a ještě jsem potřeboval přidat funkci pro javascriptové bloky, právě pro případ že potřebuji něco takovéhho nastavit v presenteru

použití pak vypadá nějak takto

<?php

	/**
	 * Add files
	 *
	 * Three ways how to set css files.
	 *
	 * 1. Media is not set, this type of files will be packed/minimized to file with media = screen,
	 *
	 * 	{assign css=>
	 * 		array(
	 * 			'web/screen.css',
	 * 			'web/menu.css',
	 * 		)
	 * 	}
	 *
	 * 2. Media is set, files will be separated by media, there will be to much packs as much is types of media (every pack will be minimized),
	 *
	 *	{assign css=>
	 * 		array(
	 * 			'web/screen.css'=>'screen,projection,tv',
	 * 			'web/print.css'=>'print',
	 * 		)
	 * 	}
	 *
	 * 3. You can combine ways.
	 * 	{assign css=>
	 * 		array(
	 * 			'web/screen.css',
	 * 			'web/print.css'=>'print',
	 * 		)
	 * 	}
	 *
	 *  	{$control['css']->addFiles($css)}
	 *
	 * At the end you can render all saved files with widget
	 *
	 *	{control css}
	 *
	 * Alternatively you can render files directly, the same result like the lines above is:
	 *
	 * 	{control css 'web/screen.css'}
	 * 	{control css 'web/screen.css', 'web/menu.css'}
	 * 	{control css 'web/screen.css', 'web/print.css'=>'print'}
	 * 	{control css 'web/screen.css'=>'screen,projection,tv', 'web/print.css'=>'print'}
	 *
	 * But in this case you render files set only in render, not the before saved files from presenter etc.
	 *
	 * Adding of javascript files is similar, but if there is not set type of processing, there is automaticaly set default type COMPACT, actually it means compact without minimizing.
	 *
	 * 	{assign js=>
	 * 		array(
	 * 			'datagrid.js',
	 * 			'mootools.nette.js',
	 * 		)
	 * 	}
	 *
	 * 	{assign js=>
	 * 		array(
	 * 			'datagrid.js',
	 * 			'mootools.nette.js'=>JavaScriptLoader::MINIFY,
	 * 		)
	 * 	}
	 *
	 * 	{$control['js']->addFiles($js)}
	 *
	 * 	{control js}
	 *
	 * 	{control js 'datagrid.js'}
	 * 	{control js 'datagrid.js', 'jquery.nette.js'}
	 * 	{control js 'datagrid.js', 'mootools.nette.js'=>JavaScriptLoader::MINIFY}
	 *
	 * @param array $files list of files
	 */

?>

kritiku na to jak je to prasácky napsaný nebo to nepotřebujete a je to blbost stačí jednou větou, zbytečně rozšiřovat flame, já to tak používám už hodně dlouho akorát jsem to teď přepsal do webloader (takže asi jsem měl v minulosti k tomu důvod)

romansklenar
Člen | 655
+
0
-

Nebylo by lepší udělat fork a až do něj zanést změny? Lépe by se to udržovalo a změny by byly patrné.

Ondřej Mirtes
Člen | 1536
+
0
-

Souhlas, určitě na GitHubu udělat fork, ať je patrná vazba na původní WebLoader.

mcmatak
Člen | 490
+
0
-

ok, souhlas, a jak to teď udělám? s gitem se moc nebavíme

Honza Marek
Člen | 1664
+
0
-

Klikneš u mého webloaderu na githubu na tlačítko fork a je to. Předtím asi ale budeš muset smazat ten svuj repozitář, jmenuje se moc stejně.

Ondřej Mirtes
Člen | 1536
+
0
-

Přejdeš na repozitář WebLoaderu a nahoře (na řádku janmarek / WebLoader) vpravo budeš mít tlačítko Fork.

mcmatak
Člen | 490
+
0
-

tak snad je to tam

Cifro
Člen | 245
+
0
-

Chcem upozorniť, že ak používate PHP 5.3 a namespace tak nezabudnite pridať namespace aj tu:

		return preg_replace_callback(
			$regexp,
			create_function(
				'$matches',
				'return "url(\'" . \Projekt\Components\WebLoader\CssLoader::absolutizeUrl($matches[2], $matches[1], "' .
				addslashes($file) . '", "' . addslashes($this->sourceUri) .
				'") . "\')";'
			),
			$s
		);

Editoval Cifro (2. 3. 2010 14:30)

Majkl578
Moderator | 1364
+
0
-

Jestli používáte 5.3, použijte raději Closure:

$uri = $this->sourceUri;
return preg_replace_callback(
		$regexp,
		function ($matches) use ($file, $uri) {
			return "url('" . \Projekt\Components\WebLoader\CssLoader::absolutizeUrl($matches[2], $matches[1], addslashes($file), addslashes($uri)) . "')";
		}, $s);

Intuitivně jsem to přepsal, ale nezkoušel.

Editoval Majkl578 (2. 3. 2010 14:51)

pekelnik
Člen | 462
+
0
-

Zajímalo by mě jak je řešená změna URL v CSS souborech.

Pokud mám styl v adresáři %web%/css/foo.css a v něm odkaz na obrázek ‚img/foo.png‘,

po zpracování(a spojení) souborů mám soubor %webDir%/cache/generatedxxxxxxxxxxxxxxxxxxxxx.css odkaz na obrázek je mimo mísu.

Jak se tohle řeší?

Napadlo mě do adresáře %webDir%/cache umístit soubor .htaccess a přesměrovat obrázky na původní umístění ve %webDir%/css. Ale systémovější by mi přišlo kdyby došlo k přepsání URL obrázků v css souborech.

Vzhledem k tomu že veškerá URL, URI a cesty jsem nastavil při vytváření komponenty – čekal jsem, že něco takového proběhne.

Honza Kuchař
Člen | 1662
+
0
-

To si web loader řeší sám.

Ondřej Mirtes
Člen | 1536
+
0
-

Osobně to řeším tak, že do CSS uvádím takové cesty, které jsou shodné jak pro složku css, tak pro složku cache. Tedy prostě hledám adresář „img“ nebo podobný o složku výš – url('../img/obrazek.png');

Honza Marek
Člen | 1664
+
0
-

Ondřej Mirtes, pekelnik: vám se nezabsolutizovávají cesty? Jakto? Nemáte nějakou předpotopní verzi?

pekelnik
Člen | 462
+
0
-

Kde se dá sehnat nejnovější verze? Já jsem stáhl archiv. Pokud je git budu rád :)

Honza Marek
Člen | 1664
+
0
-

https://github.com/…ek/WebLoader

A nejnovější verze se mi válí samozřejmě ještě na disku :)

Nicméně zabsolutizování adres v css by mělo fungovat i na verzi, která byla ke stažení v addons.

Editoval Honza Marek (16. 3. 2010 11:36)

pekelnik
Člen | 462
+
0
-

děkuju :)

stáhnul jsem si nejnovější verzi a absolutizování URL funguje bezvadně.

pro ostatní uvedu příklad nastavení, pokud máte takouvouhle strukturu adresářů:

/app
/web
  /cache
    // ... zde budou generované soubory
  /css
    /images
      /logo.png
    /style.css
  /js
    /jquery
      /ui
        /css
          /images
            /ui-icon-foo.png
          /jquery-ui.css
$css->sourcePath = Environment::expand('%webDir%');
$css->sourceUri  = Environment::expand('%baseUri%../');
$css->tempPath   = Environment::expand('%webDir%/cache');
$css->tempUri    = Environment::expand('%baseUri%cache');

pro java script loader je to to samý…

Ondřej Mirtes
Člen | 1536
+
0
-

Koukám, že mi to cesty taky absolutizuje:

background: white url('/temp/../g/ajax-loader.gif') no-repeat 50% 50%;

Každopádně nevím, jak to funguje a proč je to vůbec potřeba, protože když odtrhnu ten začátek, který to přidalo (/temp/), tak se obrázek stále nalinkuje správně :) A neumím si představit, v jakým případě je to přidání „absolutního“ začátku potřeba :)

Honza Marek
Člen | 1664
+
0
-

Neni to potřeba, ale má to jednodušší implementaci než předělání relativní cesty na jinou složku ;-) Každopádně by mě zajímalo, proč tam máš to ../, to se tam vůbec nemá objevit.

Ondřej Mirtes
Člen | 1536
+
0
-

To ../ je moje, v originálním CSS souboru, aby se ten obrázek našel i bez nějaký absolutizace cesty.

Takhle vypadá moje složková struktura:

- document_root
  - g
  - images
  - temp //tady jsou generované soubory z WebLoaderu
  - css //tady bych měl moje CSS soubory, kdybych je neměl někde pod app/templates ;)