[addon webloader] Extras/webloader

pekelnik
Člen | 462
+
0
-

Potřeboval bych určit aby se do stránky vložil soubor z http://jquery-ui.googlecode.com/…electmenu.js

Nyní se zdá že takový soubor je ignorován.

Podle mě by ho to mělo vložit a o jeho zpracování se nijak nestarat.

nebo mi něco uniká?

Honza Marek
Člen | 1664
+
0
-

Zatím to neumí. Vlož jej přes <script>.

Honza Kuchař
Člen | 1662
+
0
-

Honza Marek napsal(a):

Zatím to neumí.

A má smysl vůbec podporu přidávat?

Honza Marek
Člen | 1664
+
0
-

Možná jedině pokud bude JavaScriptLoader obsahovat konstanty typu JavaScriptLoader::JQUERY_OD_GOOGLA. (Jen nápad…)

Honza Kuchař
Člen | 1662
+
0
-

Ha vidíš, to mě nenapadlo. :) Já to nepoužívám. Od všeho si dělám lokální kopie a potom mi z toho webloader udělá jeden soubor. Ale asi by to bylo trošku rozsáhlejší problematika. Asi by bylo fajn, kdyby to bylo jako plugin do webloader. Už jen proto, že to nejspíš bude vyžadovat https://componette.org/search/?… .

Honza Marek
Člen | 1664
+
0
-

Já bych to určitě nechtěl stahovat. jQuery od googlu se nevyplatí lokálně cachovat. Takový externí soubor by si prostě vytvořil vlastní značku script.

Honza Kuchař
Člen | 1662
+
0
-

Mno proč ne, ale proč to potom řešit přes web loader? :)

Honza Marek
Člen | 1664
+
0
-

Možná jsem se trochu unáhlil, ještě to promyslim. Ale využití si představit dokážu.

// presenter
$this["js"]->addFiles(array(
	JavaScriptLoader::JQUERY_OD_GOOGLA, "mych.js", "deset.js", "dalsich.js", "skriptu.js"
));
{* šablona *}
{widget js}
pekelnik
Člen | 462
+
0
-

Největší výhoda je patrná teprve při použití komponenty HeaderControl. tzn. header vůbec neřeším a není jak tam tohle dostat.

A proč to sosat od googlu? https://en.wikipedia.org/…very_network

Honza Kuchař
Člen | 1662
+
0
-

:) Já vám teda nevím, ale já si teda definuji které js soubory načíst až v šabloně. V presenteru to nemá co dělat. To je v podstatě taky jenom vec, která se týká vizuální části stránky.

Honza Marek
Člen | 1664
+
0
-

Úkol „načti všechna doplňková csska od všech zapnutých modulů cmska“ v šabloně nezařídíš.

Ondřej Mirtes
Člen | 1536
+
0
-

pekelnik napsal(a):

Největší výhoda je patrná teprve při použití komponenty HeaderControl. tzn. header vůbec neřeším a není jak tam tohle dostat.

A proč to sosat od googlu? https://en.wikipedia.org/…very_network

S HeaderControl to tam můžeš dostat. Pokud ji použiješ ve stylu WebLoaderu, tj.:

{widget header:begin}
	{widget header:css 'reset.css', 'default.css', 'screen.css'}
	<script type="text/javascript" src="http://cesta/do/googlu/jquery.js"></script>
	{widget header:js 'jquery.nette.js', 'jquery.ajaxform.js', 'jquery.antispam.js', 'web.js'}
	{widget header:rss 'Sample RSS Channel' => 'Rss:sample'}
{widget header:end}

Jinak sám mám radši javascript komprimovaný (minified + gzip) a u sebe, včetně jQuery. Cachování si umím pořešit a nemusím se spoléhat na Google, že mi tu knihovnu od sebe zrovna dopřeje.

pekelnik
Člen | 462
+
0
-

já používám HeaderControl takhle:

{widget head}

veškeré javascripty i styly tam dostanu programově: to jest z komponent a z aplikace samotné. V šabloně se nehodlám zatěžovat nějakými javascripty nebo styly :)

pta
Člen | 11
+
0
-

Caute, umi Webloader absolutizovat URL v javascriptu? Resp. jak by se to dalo resit nebo jak to resite?

Pr.: mam externi javascript, ktery pres jquery zapisuje do dokumentu html tag s obrazkem a odkazuje na nej relativne. Obrazek mam v document_root/images/obrazek.gif

<script>
	$(document).ready(function()
	{
		$('#image').html("<img src='images/obrazek.gif' />");
	});
</script>

Dokud jsem na homepage presenteru, tak samozrejme vsechno funguje, protoze URL browseru ukazuje na baseUri, coz ale neni pripad jinych presenteru. Jak na to?

Honza Kuchař
Člen | 1662
+
0
-

Do nějaké proměnné si plácni $baseUri a pak to url při generování toho obrázku spoj.

pta
Člen | 11
+
0
-

Ano, funguje super. Diky!

Honza Kuchař
Člen | 1662
+
0
-

Ahoj, dnes jsem po upgrade na Nette 0.9.4 zjistil, že WebLoader používá fci fixCallback(), která byla v tomto commitu odstraněna. Řešení jsou dvě:

  1. Zakomentovat ten řádek (asi to nebude fungovat se staršími verzemi PHP)
  2. začít používat Callback

Dále bych chtěl poděkovat za to, že jsi vůbec WebLoader dělal, protože je to super věc!

Editoval honzakuchar (15. 4. 2010 18:28)

Honza Marek
Člen | 1664
+
0
-

Tak jsem to zrušil. Ale jenom v dev verzi, do 1.0 to neumim commitnout :) Nečekal jsem, že to tam bude. To mě určitě zas někdo nutil proti mé vůli :-D A Nette\Callback nebude, protože nechápu k čemu je ta věc dobrá.

Honza Kuchař
Člen | 1662
+
0
-

A Nette\Callback nebude, protože nechápu k čemu je ta věc dobrá.

Hlavně k tomu, že se to jemenuje callback. → je každému jasné, že je to callback. Kdežto nějaké takové pole, nemusí být jasné tak úplně všem.

Honza Marek
Člen | 1664
+
0
-

honzakuchar napsal(a):

A Nette\Callback nebude, protože nechápu k čemu je ta věc dobrá.

Hlavně k tomu, že se to jemenuje callback. → je každému jasné, že je to callback. Kdežto nějaké takové pole, nemusí být jasné tak úplně všem.

Někteří pak nechápou, co to tam je zase za magii.

Honza Kuchař
Člen | 1662
+
0
-

Upřímě řečeno doteď vlastně nějak nevím, jestli se má tedy psát

$callback[] = function(){};

nebo

$callback[] = callback(function(){});

Ale asi to 1. Je to kratší.

Honza Marek
Člen | 1664
+
0
-

Určitě to první. To druhé absolutně nemá význam.

Honza Kuchař
Člen | 1662
+
0
-

Teď jsem objevil, ta funkce pořád existuje, ale zde: https://api.nette.org/…amework.html#…

//EDIT: Dofám, že to dělá to samé co ta původní fce. :-)

Editoval honzakuchar (19. 4. 2010 10:04)

Honza Marek
Člen | 1664
+
0
-

Nový WebLoader je určen pro php 5.3 a tím se diskuze o nějakém fixNěco stávají naprosto bezpředmětné.

ic
Člen | 430
+
0
-

Nemohl by WebLoader tak jak přidává volitelně $css->media = "screen třeba"; přidávat taky titulek title?
Tento je pak vidět v FF při přepínání/zakazování stylů ( View / Page Style ), moc lidí na to asi nenarazí, ale nějak jsem si už zvykl psát k css nějaký ‚duchaplný‘ popisek.

Já už jsem si to tam samozřejmě dopsal, ale třeba by to využil ještě někdo.

EDIT:
neschází u popisu doplňku v addons s-ko: $css->filter[] = array($filter, "apply"); ? filters namísto filter ?

Editoval ic (23. 7. 2010 11:34)

na1k
Člen | 288
+
0
-

Možná bych měl drobný bugreport. U aktuální dev verze Nette je SafeStream přímo v namespace \Nette a ne \Nette\IO jak je použito v aktuálním commitu WebLoaderu.

Edit:
A ještě dotaz: Jak je možné, že u CssLoaderu se mi ze tří souborů do vygenerovaného csska zahrne jen jeden (datagrid.css)? Všechny soubory jsou ve stejné složce a volám je takto:
{widget css 'admin.css', 'datagrid.css', 'jquery-ui-1.8.2.custom.css'}

Editoval na1k (14. 8. 2010 22:17)

Honza Kuchař
Člen | 1662
+
0
-

Měly by se zahrnout všechny, zkus nají ve WebLoaderu co jako throwExceptions a dej true. Bude to pak při chybě vkládání souboru vyhazovat výjimku.

westrem
Člen | 398
+
0
-

Da sa niekde stiahnut aj verzia pre PHP 5.2.x alebo sa pre tuto verziu uz prestalo vyvijat? Ide mi najme o pozutie closures v preg_replace_callbackoch, ktore ma nenapada ako rozumne prepisat do PHP 5.2. podoby, namespaces a prepisanie na prefixed verziu je otazka par minut.

Honza Marek
Člen | 1664
+
0
-

Ve vývoji WebLoaderu pro 5.2.x již nepokračuju, ale má stabilní a osvědčenou verzi, která se dá stáhnout na https://github.com/…der/tree/1.1.

LuKo
Člen | 116
+
0
-

V prvním příspěvku tohoto vlákna je chybný odkaz na extras. Jinak by mohlo být drobným vylepšením, pokud komponenta poznala javascript umístěný na CDN (jQuery atd.) a nalinkovala ho z Google.

maarlin
Člen | 207
+
0
-

Chvíli jsem v duchu nadával proč mi WebLoader dělá bordel v temp složce – tedy při každé změně vygeneruje nový soubor, ale pak jsem pochopil, že to je asi jeden z mála způsobů, jak některé agresivně kešující (Chrome) prohlížeče donutit si vzít novou verzi CSS.

Každopádně si přesto myslím, že by byla vhodná nějaká integrace garbage collectoru, protože mít za každou změnou CSS/JS nový soubor mi přijde trochu bordelářské

Honza Marek
Člen | 1664
+
0
-

maarlin napsal(a):

Každopádně si přesto myslím, že by byla vhodná nějaká integrace garbage collectoru, protože mít za každou změnou CSS/JS nový soubor mi přijde trochu bordelářské

Když někdo vymyslí, jak to elegantně udělat, bylo by to fajn.

Možná bych měl drobný bugreport. U aktuální dev verze Nette je SafeStream přímo v namespace \Nette a ne \Nette\IO jak je použito v aktuálním commitu WebLoaderu.

Vím o tom. Otázka, kdy je vhodný čas to změnit? WebLoader by měl fungovat i na stabilní verzi Nette.

Ide mi najme o pozutie closures v preg_replace_callbackoch, ktore ma nenapada ako rozumne prepisat do PHP 5.2. podoby

Closures jdou přepsat jako callback.

maarlin
Člen | 207
+
0
-

Sám jsem si udělal takový rychlý workaround:

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

	$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($files));

		$this->collectGarbage($name); // Added
	}

	return $name;
    }

    /**
     * Delete all unnecessary files
     * @param string $exceptFile
     */
    protected function collectGarbage($exceptFile)
    {
        $unlinked = FALSE;
        $suffix = preg_quote($this->getGeneratedFileNameSuffix(), '/');
        $exceptions = array ('.', '..', $exceptFile);

        if ($handle = opendir($this->getTempPath())) {
            while (FALSE !== ($file = readdir($handle))) {
                if (!in_array($file, $exceptions) &&
                        preg_match ('/.*'.$suffix.'$/is', $file) === 1) {
                    unlink ($this->getTempPath() . '/' . $file);
                    $unlinked = TRUE;
                }
            }
            closedir($handle);
        }
        return $unlinked;
    }

Pokud někoho napadá lepší řešení, sem s ním! :-)

Vím, že to není úplně to pravé ořechové detekovat staré soubory podle suffixu, ale jediné další řešení, které mě napadá je, že by CssLoader a JavaScriptLoader musely generovat vždy správné koncovky – tzn. suffix by nebylo úplně všechno na konci názvu, ale všechno na konci před koncovkou (tzn. nestalo by se, že bych nějak omylem vygeneroval něco jiného než *.css nebo *.js).

Editoval maarlin (4. 9. 2010 17:17)

westrem
Člen | 398
+
0
-

Honza Marek napsal:
Closures jdou prepsat jako callbacky

No minimalne pri tomto ma to nevedelo napadnut.

Cifro
Člen | 245
+
0
-

Ten generovaný bordeľ, vadí aj mne. A podľa mňa by bolo jednoduchšie namiesto tých generovaných súborov a toho garbage collectoru generovať súbory s pôvodným (prefixovaným názov) a nakoniec dať hash alebo timestamp. In da code like this:

<link rel="stylesheet" type="text/css" href="/.webtemp/css/webloader-style.css?v=1283700550">
Honza Marek
Člen | 1664
+
0
-

To je fakt. Vygenerovat název, uložit timestamp do cache. Při změně timestampu přepsat soubor. To by mohlo být řešení.

Panda
Člen | 569
+
0
-

Timestamp bych do cache necpal. Spíš bych použil filemtime na vygenerovaný soubor, pokud by byl některý ze zahrnutých souborů novější, tak bych soubor přegeneroval.

Honza Marek
Člen | 1664
+
0
-

Panda napsal(a):

Timestamp bych do cache necpal. Spíš bych použil filemtime na vygenerovaný soubor, pokud by byl některý ze zahrnutých souborů novější, tak bych soubor přegeneroval.

Supr. Tak až budu mít chvíli čas, tak tohle řešení naklepu.

Honza Marek
Člen | 1664
+
0
-

Změnil jsem pár řádků, že by to člověk skoro na prstech jedné ruky spočítal, a ejhle – je po bordelu v temp složce.

Lopo
Člen | 277
+
0
-

tak som pred chvilou pushol LessFilter pre WebLoader v BailIff -e

bez nejakych velkych problemov by mal byt pouzitelny aj v original WebLoader-i

Honza Marek
Člen | 1664
+
0
-

Lopo

Less filter taky chystám, akorát mi nepřijde dobrý nápad kopírovat kód toho less kompilátoru, když tu třídu můžu normálně použít.

Honza Marek
Člen | 1664
+
0
-

Můj LESS filter pro WebLoader.

Lopo
Člen | 277
+
0
-

Honza Marek napsal(a):
Less filter taky chystám, akorát mi nepřijde dobrý nápad kopírovat kód toho less kompilátoru, když tu třídu můžu normálně použít.

Je mi jasne ze sa to dalo urobit vytvorenim wrapovacej triedy ako si to urobil (a najprv som to tak aj mal) … ale ja planujem prekopavanie v momente ked do webloaderu doportujem Sass a C-css … a pripadne xcss …

Ale rovnako je mozne ze napr prave ten less nakonec prerobim tiez len na pouzitie wrapovacej triedy a original preprocesoru …

Vsetko zalezi na tom ako bude vyzerat samotny webloader pri dokonceni spomenutych portov

Lopo
Člen | 277
+
0
-

zase som trosku prekopal webloader a doplnil dalsi filter, vid. BailIff

knyttl
Člen | 196
+
0
-

Jan Marek: Nepřemýšlel jsi nad implementací Finderu do Webloaderu? Např.:

{control css ‚base*‘, ‚subfolder/*‘}

Honza Marek
Člen | 1664
+
0
-

Nemám rád přechytralé věci. Myslím, že není problém v presenteru v továrničce WebLoaderu ten Finder použít a ty soubory tam nacpat.

Oggy
Člen | 306
+
0
-

Honza Marek napsal(a):

Můj LESS filter pro WebLoader.

můžu poprosit o radu, kde dělám chybu ..

<?php
 protected function createComponentCss() {
       $css = new CssLoader;
	...
	$css->fileFilters[] = new LessFilter;
	...
}
?>

Less filtr neaplikuje.. stáhnul jsem si nejnovější lessc.inc.php ..

kde bych mohl být problém?

a ještě jsem se chtěl zeptat, kam bych mohl umístit aplikování mixins.css ?

něco jako

<?php
/**
     * Apply filters to a string
     * @param string $s
     * @return string
     */
    protected function applyFilters($s) {
        $this->appendMixins($s);
        $l = new lessc();
        return $l->parse($s);
    }

    /**
     * Appends common css3 mixins
     * @param string $s
     * @return string
     */
    private function appendMixins(&$s)
    {
        $s = file_get_contents(dirname(__FILE__) . '/mixins.css') . $s;
    }
?>
2bfree
Člen | 248
+
0
-

Asi jsem něco nepochopil, nebo nenašel, ale umí tenhle zázrak minifikovat i výstupní renderované HTML?

Pokud ano, jak se to dělá?
Pokud ne, mohlo by. ;)

2bfree
Člen | 248
+
0
-

Ještě dotaz, kterak přesvědčit CssLoader, aby při development mode vracel původní css a jen v production mode vracel minifikovanou verzi?

uestla
Backer | 796
+
0
-

Např. takhdlenc:

$css = new CssLoader();
if (Environment::isProduction()) {
	$css->filters[] = array($this, 'packCss');
}

ad komprimace výstupního HTML – použij např. helper TemplateHelpers::strip().