ugrás a tartalomhoz

Elveszett változó

pora · 2007. Feb. 23. (P), 14.24
Sziasztok!

Ha valakinek van ötlete, szánjon meg, kérem szépen:

Van egy osszerak() függvényem, ami az első paraméterben megadott fájlban lecserél bizonyos szövegrészeket include(...)-okra (hogy futási időben mondhassam meg, mi kerüljön bizonyos oldalak bizonyos helyeire). A lecserélés eredményét egy fájlba írom, ennek a fájlnak a nevével tér vissza az osszerak(). A felhasználás után ezt a fájlt törlöm a takarit() függvénnyel.

Van egy kirak() függvényem, ami előbb összerakja a kimeneti fájlt, include-olja, aztán le is törli, így néz ki:
function kirak(){
	$tempfvalt = func_get_arg(1);
	$master = func_get_arg(0);
	include(osszerak($master, $tempfvalt));
	takarit();
}
Az első paraméter a cserék előtti fájl neve, a második a cseréket leíró tömb.

Ha ezt írom:
$user="GipszJakab";
$valt["hely01"]="hellouser.php";
include(osszerak("foo.html", $valt));
takarit();
akkor a foo.html "hely01"-gyel jelölt pontján kiírja, hogy "Hello GipszJakab!"

Ha ezt írom:
$user="GipszJakab";
$valt["hely01"]="hellouser.php";
kirak("foo.html", $valt);
akkor a foo.html "hely01"-gyel jelölt pontján kiírja, hogy "Hello !"

Vagyis elveszett a változóm!

Illetve mégsem, mert, ha ezt írom:
$user="GipszJakab";
$valt["hely01"]="hellouser.php";
kirak("foo.html", $valt);
echo $user;
akkor a foo.html "hely01"-gyel jelölt pontján kiírja, hogy "Hello !", majd a lap aljára kiírja, hogy "GipszJakab".

Szóval $user változó megvan, de a (kétszeresen) include-olt kódrész üresnek látja. De csak akkor, ha a kirak() függvénnyel hívom meg. Ha a kirak függvény belsejét írom oda, akkor rendben fut le.

A gond csak a kirak() függvény körül lehet, de egyszerűen elképzelésem nincs, mi ott a gond, hiszen csak továbbadom a paramétereket, amelyek között nem is szerepel a $user nevű változó.

Ötletem nincs. Valaki? Előre is kösz.
 
1

Scope probléma?

vbence · 2007. Feb. 23. (P), 15.02
Háááát.... biztos, hogy nincs erre egyszerübb megoldás? Amúgy szerintem itt láthatósági (scope) hiba lesz. Ha az include-ot ott hívod meg, ahol a $user-t deklaráltad, akkor látni fogja a változót, viszont ha egy függvényben include-olsz, akkor az include-olt kód a függvény belsejében fut le, így nem látja a változódat, hacsak nem $GLOBALS["user"] -ként hivatkozik rá.

Mivel nem látom a hellouser.php tartalmát lehet, hogy tévedek. Amúgy mi ez a func_get_arg(1) agyrém?
2

biztos scope probléma

pora · 2007. Feb. 23. (P), 15.23
Nem esküszöm meg arra, hogy nincs erre egyszerűbb megoldás, de én ezt találtam ki... :)

a hellouser.php jelenleg annyi, hogy echo "Szia $user!";

Az agyrém a függvény paramétereinek kiolvasását végzi. Megnevezhettem volna a paramétereket a zárójelek között is, csak még mindig nem vagyok biztos benne, hogy hányan lesznek, és mire valók.

Nagyon köszönöm az ötletet, kipróbálom!
3

nagy-nagy köszönet

pora · 2007. Feb. 23. (P), 15.28
Kedves vbence!

Fogadd nagy-nagy köszönetemet! Ilyen egyszerűen megoldottad a problémámat, beírtam a kirak() mögé egy global $user-t, és vígan működik!

Köszönöm! :)))
4

Szivesen

vbence · 2007. Feb. 23. (P), 15.45
Érdekes template megoldás. Had ragadjam meg az alkalmat egy kis hittérítésre: gondoltál már arra, hogy a template "lefordítása" után keletkező dolgot elmented? Ez úgy funkcionálna, mint egy cache, és így megszabadítanád a php a pluszmunkától, hogy a template-et minden alkalommal lefordítsa.
5

ASP.NET

pora · 2007. Feb. 24. (Szo), 16.22
Igazából az ASP.NET masterpage technológiáját szerettem volna utánozni. Van egy masterpage, ahol van egy struktúra, meg saját vezérlők, meg minden kutyafüle, és vannak ContentPlaceHolder-ek, amelyek helyére bekerülnek az aktuális hívásnak megfelelő tartalmak. És azt szerettem volna megvalósítani, hogy bármely kódrészlet bekerülhessen bármelyik pontjára az oldalnak.

Biztos van rá egyszerűbb megoldás, de nem jutott más az eszembe.

Elgondolkodtató, amit írsz, hogy mondjuk session elején fordítsam össze, amit lehet, és azt használjam később, de félek, ha sok a felhasználóm, elveszek a sok összefordított fájl között...
6

Függvények?

vbence · 2007. Feb. 24. (Szo), 16.53
Én függvényeket hazsnálok erre a célra :) Ha beírod valahova az oldalra, hogy <? username () ?> majdhogynem ugyaez lesz a hatása.

A cache-elésnél nem arra gondolok, hogy HTML-re fordítsd az egészet, és úgy cache-eld, hanem a template feldolgozása után keletkezzenek PHP-k, amik valódi kéréseket kiszolgálják. Ha változtatsz a template-en, akkor újragenerálod ezeket a futó php-ket. Így a template nem fog futni az éles kiszolgálás során, ami radikálisan csökkenti az erőforrásigényt, még is megmarad a könnyebbség, amivel a template használata jár.
7

Függvények???

pora · 2007. Feb. 25. (V), 14.40
És akkor hogyha ugyanannak az oldalnak ugyanarra a pontjára egy másik fájlt akarsz beolvasni, akkor átírod a függvényedet? Ez is egy érdekes gondolat.

Az én gondolatom az, hogy van egy komplex oldal, itt egy tánlázat. ott egy form, amott egy másik, megint máshol egy cikk, satöbbi, és ha teszem azt az egyik formot kitölti a felhasználó, és elküldi, akkor az oldal egésze változatlan marad, kivéve az adott form helye, ahol megjelenik helyette megint valami más.

Eredetileg arra gondoltam, hogy az erőforrásigényesebb részeket cache-lem nem az egészet egyben, mert akkor hogy változtatom meg csak egy részét? Mondjuk, ha ott hagyom a ContentPlaceHoldereket, és vizsgálom, hogy változtatni kell-e a tartalmukon, az tudna jó lenni...

Köszi, ezek csupa jó ötletek! :)
8

Prado

Hodicska Gergely · 2007. Feb. 25. (V), 14.57
Ha komponenes alapú oldalkialakítást szeretnél, akkor érdemes lehet megnézned a Prado keretrendszert.


Üdv,
Felhő
9

értelmetlen

sotetbarna · 2007. Feb. 26. (H), 13.36
Nekem csak egy megjegyzésem lenne, ha már a függvénynek a paraméterezését opcionálisra veszed, akkor a global-lal szépen ki is nyírod ezt a logikát. Gondolj bele, majd minden változó, amit használni akarsz, az globál lesz, meg majd a paraméterekre számokkal hivatkozol... ez szerintem nem jó gyakorlat. Ennél találtak ki jobbat is.

Például ha már dinamikusra akarod venni a függvényparamétereket, adj inkább át egy tömböt, amiben a változóid vannak. Kerüld a globalt, mert a globállal csak bonyolítod a kódot, használj inkább objektumokat.

És ha templatet akarsz, akkor válassz egyet inkább. Én a smarty-t használom már 4 éve. Csak ajánlani tudom.