|
| Session-bug eller er det bare mig? Fra : Thomas Lindgaard |
Dato : 15-10-02 16:33 |
|
Hejsa
Jeg er lige ved at kode noget, hvor man skal kunne logge ind, og det skal
være muligt at vælge mellem flere sprog.
Derfor har jeg lavet mig en sprog-klasse som læser tekster ind på det
rigtige sprog, og jeg kan kalde en metode for at skrive disse ud på
fornuftige tidspunkter. Jeg har en global instans af denne klasse kaldet
$language.
I min session har jeg gemt det sprog, som brugeren ønsker - dvs.
$_SESSION["language"] = "dk".
Mit problem er så, at når scriptet terminerer, så bliver strengen "dk"
overskrevet med mit $language-object, dvs. næste gang man loader en side,
så har man
$_SESSION["language"] = __PHP_Incomplete_Class Object ( blabla )
Er det en bug, en feature, en ting-man-kan-slå-til eller er det bare mig?
Mvh.
/Thomas
| |
Tinky Winky (15-10-2002)
| Kommentar Fra : Tinky Winky |
Dato : 15-10-02 16:36 |
|
> Jeg er lige ved at kode noget, hvor man skal kunne logge ind, og det skal
> være muligt at vælge mellem flere sprog.
>
> Derfor har jeg lavet mig en sprog-klasse som læser tekster ind på det
> rigtige sprog, og jeg kan kalde en metode for at skrive disse ud på
> fornuftige tidspunkter. Jeg har en global instans af denne klasse kaldet
> $language.
Jeg skal også til at lave noget med forskellige sprog. Hvordan opbevarer du
de forsk. sprog? I XML, php filer, tekst filer eller template filer? Og hvad
er fordele/ulemper ved det du har valgt?
| |
Thomas Lindgaard (15-10-2002)
| Kommentar Fra : Thomas Lindgaard |
Dato : 15-10-02 17:43 |
|
"Tinky Winky" <lksjdflkjzsdhflkajshrlkjaeshr@ksjdhskjdhfkshdfkshdf.com>
wrote in news:aohckt$19b$1@sunsite.dk:
> Jeg skal ogs† til at lave noget med forskellige sprog. Hvordan
> opbevarer du de forsk. sprog? I XML, php filer, tekst filer eller
> template filer? Og hvad er fordele/ulemper ved det du har valgt?
Davs
Jeg har valgt at opbevare mine tekster i noget pseudo-ml - det er hverken
særligt dybsindigt eller specielt smart tror jeg, men det virker.
Ideen var at jeg gerne ville kunne skrive HTML i tekstfilerne, og at jeg
helst ville undgå at lave en masse variable med strenge i. Til hvert
script hører der derfor en tekstfil med indhold i stil med følgende:
<id="første afsnit">
<h1>Et lille eventyr</h1>
<p>Der var engang en lille hund, som havde en gevaldig opvask...</p>
</id>
....
Den svend kan man parse med et enkelt kald til preg_match_all (reg.exps
er skønne :) - og så kan man konstruere sig et associativt array:
$lang_buffer = implode("", file($file));
$pattern = "/<id=\"(\w+)\">(.*)<\/id>/sU";
preg_match_all($pattern, $lang_buffer, $matches);
foreach ($matches[1] as $id => $text)
{
$language_array[$text] = $matches[2][$id];
}
Når det er gjort, er der så bare tilbage at skrive
$language->get("første afsnit")
hvor det er nødvendigt... og så at oversætte alt mellem <id> og </id> til
Volapyk og Mandarin og sårn.
Fordelen ved systemet er at det virker :) - og når først man har fundet
det rigtige regulære udtryk så kører det bare derudaf. Hvis man gemte det
i XML ville man nok få problemer med at opbevare HTML(?), men det kan vel
løses.
Vi havde engang en lignende diskussion i gruppen, hvor (jeg kan ikke
huske hvem det var) foreslog at gøre det på følgende måde (cirka):
1) Man definerer sig en funktion - f.eks. language($string).
2) Hver gang man skal skrive noget tekst ud, så bruger man bare
language("noget tekst");
3) Når man er færdig med at kode, så kører man alle sine PHP-filer gennem
et stort og lækkert reg.exp som finder alle kald til language() og
tilføjer strengen til et associativt array ala
$language_array = array($string => $string, ...)
4) Så oversætter man
$other_language_array = array($string => $oversættelse, ...)
5) Når man så har fået sine sprogfiler oversat og brugeren vil have
teksten på udenbysk, så vil kaldet til lang() finde dén streng (og
hvis ikke findes på det sprog, så udskrives parameteren til lang()
bare) - dvs. hvis man har oversat til engelsk så
lang("hej") == "hello"
men hvis man ikke har oversat til udenbysk så
lang("hej") == "hej"
Det synes jeg lyder ret så fiks, men jeg har aldrig fået tid til at prøve
det efter.
Håber du kan bruge noget af det...
Mvh.
/Thomas
| |
Tinky Winky (16-10-2002)
| Kommentar Fra : Tinky Winky |
Dato : 16-10-02 21:48 |
|
> Jeg har valgt at opbevare mine tekster i noget pseudo-ml - det er hverken
> særligt dybsindigt eller specielt smart tror jeg, men det virker.
> Når det er gjort, er der så bare tilbage at skrive
>
> $language->get("første afsnit")
>
> hvor det er nødvendigt... og så at oversætte alt mellem <id> og </id> til
> Volapyk og Mandarin og sårn.
Hmm har du så de forsk. sprog i forsk. Pseudo-ml filer? Eller bruger du et
oversættelsessystem ala http://babelfish.altavista.com ?
> Fordelen ved systemet er at det virker :) - og når først man har fundet
> det rigtige regulære udtryk så kører det bare derudaf. Hvis man gemte det
> i XML ville man nok få problemer med at opbevare HTML(?), men det kan vel
> løses.
I et konkret tilfælde jeg står overfor, behøver jeg ikke at gemme HTML, men
hvis man fx skal gemme
"Om $x dage vil fristen være udløbet". Og $x kan variere, skal man enten
gemme tingene som
<id="1">Om </id>
<id="2"> dage vil fristen være udløbet</id>
Eller have variablerne inde i sprog filen fx: "Om {DAGE} dage vil fristen
være udløbet".
> 3) Når man er færdig med at kode, så kører man alle sine PHP-filer gennem
> et stort og lækkert reg.exp som finder alle kald til language() og
> tilføjer strengen til et associativt array ala
Altså ændre i sine PHP filer? Det lyder som noget jeg ville være lidt
ængstelig for...
> Håber du kan bruge noget af det...
Ja, det kan jeg skam.
| |
Thomas Lindgaard (17-10-2002)
| Kommentar Fra : Thomas Lindgaard |
Dato : 17-10-02 11:24 |
|
"Tinky Winky" <lksjdflkjzsdhflkajshrlkjaeshr@ksjdhskjdhfkshdfkshdf.com>
wrote in news:aokj9m$5vn$1@sunsite.dk:
> I et konkret tilf‘lde jeg st†r overfor, beh›ver jeg ikke at gemme
> HTML, men
>
> hvis man fx skal gemme
>
> "Om $x dage vil fristen v‘re udl›bet". Og $x kan variere, skal man
> enten gemme tingene som
> <id="1">Om </id>
> <id="2"> dage vil fristen v‘re udl›bet</id>
>
> Eller have variablerne inde i sprog filen fx: "Om {DAGE} dage vil
> fristen v‘re udl›bet".
Det er præcis hvad jeg gør. Jeg har lavet mig en get-metode som man giver
ID på den tekst man vil have fat i, og hvis der er nogle huller som skal
udfyldes, så får den også et array med fyld:
<id="noget tekst">Hej med %hvem% :)</id>
echo $language-get("noget tekst", array("hvem" => "dig"));
giver outputtet
"hej med dig"
>
>> 3) N†r man er f‘rdig med at kode, s† k›rer man alle sine PHP-filer
>> gennem
>> et stort og l‘kkert reg.exp som finder alle kald til language() og
>> tilf›jer strengen til et associativt array ala
>
> Alts† ‘ndre i sine PHP filer? Det lyder som noget jeg ville v‘re lidt
> ‘ngstelig for...
Nej man skal ikke ændre i sine PHP-filer. Pointen med systemet er, at
hvis der er en sprogfil tilgængelig (dvs. man har kørt sin PHP gennem et
reg.exp. og genereret en sprogfil), så bruger man den.
Men hvis den ikke er, så er det ingen katastrofe, fordi language() så
blot skriver sit argument ud - det vil så evt. være på et forkert sprog,
men der vil altid være noget tekst.
Hmm... det ved jeg ikke om det blev bedre forklaret af - men så må du
råbe op igen :)
Mvh.
/Thomas
| |
Tinky Winky (19-10-2002)
| Kommentar Fra : Tinky Winky |
Dato : 19-10-02 09:59 |
|
> Det er præcis hvad jeg gør. Jeg har lavet mig en get-metode som man giver
> ID på den tekst man vil have fat i, og hvis der er nogle huller som skal
> udfyldes, så får den også et array med fyld:
>
> <id="noget tekst">Hej med %hvem% :)</id>
>
> echo $language-get("noget tekst", array("hvem" => "dig"));
>
> giver outputtet
>
> "hej med dig"
Hvis nu jeg ville lave det i XML, er der så en standard for hvordan man
ville skrive %hvem% ?
> Nej man skal ikke ændre i sine PHP-filer. Pointen med systemet er, at
> hvis der er en sprogfil tilgængelig (dvs. man har kørt sin PHP gennem et
> reg.exp. og genereret en sprogfil), så bruger man den.
>
> Men hvis den ikke er, så er det ingen katastrofe, fordi language() så
> blot skriver sit argument ud - det vil så evt. være på et forkert sprog,
> men der vil altid være noget tekst.
>
> Hmm... det ved jeg ikke om det blev bedre forklaret af - men så må du
> råbe op igen :)
Tjo, nu forstår jeg det lidt bedre...
| |
Thomas Lindgaard (20-10-2002)
| Kommentar Fra : Thomas Lindgaard |
Dato : 20-10-02 11:34 |
|
"Tinky Winky" <lksjdflkjzsdhflkajshrlkjaeshr@ksjdhskjdhfkshdfkshdf.com>
wrote in news:aor6sa$8n4$1@sunsite.dk:
> Hvis nu jeg ville lave det i XML, er der s† en standard for hvordan man
> ville skrive %hvem% ?
Øhhh... ikke en jeg kender :)
Mvh.
/Thomas
| |
Larz (15-10-2002)
| Kommentar Fra : Larz |
Dato : 15-10-02 19:12 |
|
Thomas Lindgaard wrote:
> I min session har jeg gemt det sprog, som brugeren ønsker - dvs.
>
> $_SESSION["language"] = "dk".
>
> Mit problem er så, at når scriptet terminerer, så bliver strengen "dk"
> overskrevet med mit $language-object, dvs. næste gang man loader en side,
> så har man
>
> $_SESSION["language"] = __PHP_Incomplete_Class Object ( blabla )
>
> Er det en bug, en feature, en ting-man-kan-slå-til eller er det bare mig?
Du skal blot require dit object før du bruger det:
<?php
require('lang.class.php');
session_start();
$sprog = $_SESSION['language'];
// viola
?>
--
-
Lars
http://coder.dk/sohofaq.php - Uofficiel WOL SOHO 77 FAQ
To mail me remove your pants.
| |
Thomas Lindgaard (15-10-2002)
| Kommentar Fra : Thomas Lindgaard |
Dato : 15-10-02 20:49 |
|
Larz <lp@your-pants.coder.dk> wrote in news:KTYq9.108549$Qk5.4819662
@news010.worldonline.dk:
> Du skal blot require dit object f›r du bruger det:
>
> <?php
>
> require('lang.class.php');
> session_start();
> $sprog = $_SESSION['language'];
> // viola
> ?>
Japs - det kunne jeg læse i manualen... men mit problem er, at jeg slet
ikke vil gemme objektet i min session.
Det viser sig bare, at PHP automagisk finder ud af, at jeg har en variabel
som tilfældigvis hedder det samme som en indgang i $_SESSION-arrayet, og
der fylder PHP så variablen ind. Jeg gik ud fra at for at noget blev gemt i
min session, så skulle jeg eksplicit proppe det derind... men det er ikke
tilfældet eller hvad?
Mvh.
/Thomas
| |
Martin Seebach (16-10-2002)
| Kommentar Fra : Martin Seebach |
Dato : 16-10-02 11:55 |
|
"Thomas Lindgaard" <thomas@it-snedkeren.BLACK_HOLE.dk> wrote in message
news:Xns92A8B2380444Fthomasitsnedkerendk@193.88.15.201...
> $_SESSION["language"] = "dk".
>
> Mit problem er så, at når scriptet terminerer, så bliver strengen "dk"
> overskrevet med mit $language-object, dvs. næste gang man loader en side,
> så har man
>
> $_SESSION["language"] = __PHP_Incomplete_Class Object ( blabla )
>
> Er det en bug, en feature, en ting-man-kan-slå-til eller er det bare mig?
Uden at have forstået dit problem 100% .. men kan du ikke bare kalde
objektet eller language variablen noget andet?
--
Venlig hilsen
Martin Seebach
- min email adresse virker..
| |
Thomas Lindgaard (16-10-2002)
| Kommentar Fra : Thomas Lindgaard |
Dato : 16-10-02 21:26 |
|
"Martin Seebach" <martin-nospam@g-bach.dk> wrote in news:aojghl$dhh$1
@sunsite.dk:
> Uden at have forst†et dit problem 100% .. men kan du ikke bare kalde
> objektet eller language variablen noget andet?
Jeps - det er osse blevet løsningen. Det kom bare bag på mig at min session
lige pludselig indeholdt noget andet end det jeg havde puttet i den
(register_globals har nemlig altid været slået fra i den tid jeg har leget
med sessions).
Mvh.
/Thomas
| |
Hans Lund (16-10-2002)
| Kommentar Fra : Hans Lund |
Dato : 16-10-02 14:06 |
|
Thomas Lindgaard wrote:
>
>I min session har jeg gemt det sprog, som brugeren ønsker - dvs.
>
> $_SESSION["language"] = "dk".
>
>Mit problem er så, at når scriptet terminerer, så bliver strengen "dk"
>overskrevet med mit $language-object, dvs. næste gang man loader en side,
>så har man
>
> $_SESSION["language"] = __PHP_Incomplete_Class Object ( blabla )
>
>Er det en bug, en feature, en ting-man-kan-slå-til eller er det bare mig?
>
Ja, det er en bug, feature og noget man kan slå fra.
jeg vil umiddelbart gætte på at der i php konfigurationen ( php.ini )
følgende linie:
register_globals = on
så på den måde en feature. problemet er blot at alle variable hermed for
global scope og
$_POST["name"] = $_GET["name"] = $_SESSION["name"] ....... = $NAME
eller rettere alle referere til samme globale interne variabel
først i php 4.2.0 er default værdien i php.ini sat til off.
| |
Thomas Lindgaard (16-10-2002)
| Kommentar Fra : Thomas Lindgaard |
Dato : 16-10-02 21:29 |
|
Hans Lund <halu@daimiNOSPAM.au.dk> wrote in news:aojo7s$12sg$1
@news.net.uni-c.dk:
> s† p† den m†de en feature. problemet er blot at alle variable hermed for
> global scope og
>
> $_POST["name"] = $_GET["name"] = $_SESSION["name"] ....... = $NAME
Det kan du jo godt have en vist formel ret i - sårn har jeg aldrig lige
fået det vendt oppe i mit hovede :)
Det har sjovt nok aldrig generet mig før (og jeg har kodet PHP hver dag i
over 2 år nu)... jeg syn's det er en bug - i hvert fald når det bider mig i
halen :)
Mvh.
/Thomas
| |
|
|