[addon webloader] Extras/webloader
- Honza Marek
- Člen | 1664
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
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 Kuchař
- Člen | 1662
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
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
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
Fičura bude k dispozici v příští verzi.
Editoval Honza M. (3. 10. 2009 14:43)
- Matúš Matula
- Člen | 257
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
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
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
honzakuchar napsal(a):
Tak jsem sehnal funkční JS minifikátor: JSMin. (ten původn nějak nefungoval – rozbil JavaScript)
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 Marek
- Člen | 1664
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}
- Honza Kuchař
- Člen | 1662
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;
- Honza Kuchař
- Člen | 1662
@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
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 | 504
<?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
Mno fajn, jak se tak dívám, tak přesně jak jsem si to představoval, tak WebLoader funguje. :-D
- iguana007
- Člen | 970
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 | 504
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
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 | 504
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
- to jestli se bude javascript minifikovat se nenastavuje na tovarnicku, ale primo ke kazdemu souboru,
- stejně tak pro css jsem potřeboval nastavovat typ media přímo k danému souboru,
- 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
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
Souhlas, určitě na GitHubu udělat fork, ať je patrná vazba na původní WebLoader.
- Honza Marek
- Člen | 1664
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
Přejdeš na repozitář WebLoaderu a nahoře (na řádku janmarek / WebLoader) vpravo budeš mít tlačítko Fork.
- Cifro
- Člen | 245
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
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
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.
- Ondřej Mirtes
- Člen | 1536
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
Ondřej Mirtes, pekelnik: vám se nezabsolutizovávají cesty? Jakto? Nemáte nějakou předpotopní verzi?
- Honza Marek
- Člen | 1664
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
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
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
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
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 ;)