ScriptLoader, řešení pro css a js
- h4kuna
- Backer | 740
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
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
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í?
- Ondřej Mirtes
- Člen | 1536
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
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
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
- h4kuna
- Backer | 740
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
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
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
Prikladam link na sikovny JavaScript Packer. Mozno stiahnut PHP5 port JavaScript Packera.
- oktam
- Člen | 25
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
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
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
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
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
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
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)
- jasir
- Člen | 746
Zdravím!
ScriptLoader jsem vyzkoušel a je to pěkné.
Mám ale pocit, že jsem narazil na dva problémy:
- 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;
?>
- v metodě
clearTemp()
by asi mělo být použitogetMtime()
, 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()
a combineJavascript()
Editoval jasir (31. 8. 2009 14:52)
- h4kuna
- Backer | 740
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:
- jasny ted mi dochazi proc jsem to me v predchozi verzi delany podle jmena, musi se podle obojiho.
- budu muset na to mrknout ale vim co myslis.
Edit: A ještě jedna poznámka k názvům metod
addCss
aaddJs
, myslím, že přesnější by asi bylocombineCss()
acombineJavascript()
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
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
jasir napsal(a):
Okej, zkratky/nezkratky je asi jedno, jde mi o to sloveso
add
.
Od metodyaddCss($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(); ?>
- h4kuna
- Backer | 740
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
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
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
_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
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
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
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)
- Ondřej Mirtes
- Člen | 1536
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
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
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
Aha, sorry, ani jednu z těch tříd jsem zatím nezkoumal. Ale tohle mě praštilo do očí :)
- Honza Marek
- Člen | 1664
I tak nastává otázka jak poznat absolutní cestu. Že začíná
/
anebo písmeno:\
?