[addon webloader] Extras/webloader
- pekelnik
- Člen | 462
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
Možná jedině pokud bude JavaScriptLoader obsahovat konstanty typu
JavaScriptLoader::JQUERY_OD_GOOGLA
. (Jen nápad…)
- Honza Kuchař
- Člen | 1662
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
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 Marek
- Člen | 1664
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
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
:) 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
Úkol „načti všechna doplňková csska od všech zapnutých modulů cmska“ v šabloně nezařídíš.
- Ondřej Mirtes
- Člen | 1536
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.
- pta
- Člen | 11
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
Do nějaké proměnné si plácni $baseUri a pak to url při generování toho obrázku spoj.
- Honza Kuchař
- Člen | 1662
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ě:
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
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
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
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
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 Kuchař
- Člen | 1662
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
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
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
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
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.
- Honza Marek
- Člen | 1664
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.
- maarlin
- Člen | 207
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
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
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)
- Cifro
- Člen | 245
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
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í.
- Honza Marek
- Člen | 1664
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
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.
- Honza Marek
- Člen | 1664
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.
- Lopo
- Člen | 277
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
- Honza Marek
- Člen | 1664
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
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;
}
?>
- uestla
- Backer | 799
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().