Perl-variabel -> Visas på HTML-sida. *Löst*

Elektronik- och mekanikrelaterad mjukvara/litteratur. (T.ex schema-CAD, simulering, böcker, manualer mm. OS-problem hör inte hit!)
Användarvisningsbild
JimmyAndersson
Inlägg: 26415
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Inlägg av JimmyAndersson »

> Dessa exempel har inte att smack att göra med vad du har talat om hittills !!

Jodå: Mitt perl-script snurrar visserligen på servern, men det ska presentera utdatan på en helt vanlig HTML-sida som visas lokalt. Därför fungerar dessa exempel alldeles utmärkt.
sodjan
EF Sponsor
Inlägg: 43231
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> Jodå:...

:-) Du är envis... :-)

Igen, nej, det är INTE samma sak.

Det som körs på klienten (t.ex i Javascript eller VBscript) kan göra vad den
vill med det som finns på skärmen, ungefär så som du visade.

Det som körs på servern kan *INTE* göra liknande uppdateringar.
Det som körs på servern (t.ex i perl, PHP, Java eller C) kan inte längre
komma åt klienten efter att sessionen har stängts.

Du blandar ihop "server-side" och "client-side". I och för sig väldigt
enkelt att blanda ihop det, innan man har sett "ljuset" och förstått
hur en http-session fungerar.

HTTP är state-less. Efter att en sida har skrivits ut bryts kontakten och det
finns inte längre någon "channel" att skriva något mer på. För att det ska
hända något mer måste *klienten* ta nästa kontakt.

Dina JavaScript exempel fungerar helt OK, men de har inget med server-
side perl script att göra, vilket är det du har talat om....

Du måste altså (precis som citaten du hade hittat någon annanstans)
skriva ut nya sidor där du har lagt in dina nya värden.

Mitt tidigare svar kvarstår.
Användarvisningsbild
vfr
EF Sponsor
Inlägg: 3515
Blev medlem: 31 mars 2005, 17:55:45
Ort: Kungsbacka

Inlägg av vfr »

Så lösningen på problemet kanske är en kombination av Perl och Javascript för att få till den där uppdateringen som behövs.
sodjan
EF Sponsor
Inlägg: 43231
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Nej, det hjälper inte.
Klienten kan inte veta när det nya värdet finns färdigt på servern.

Man *kan* göra en frame eller layer och javasript som som
accessar en speciell URL, viken ger html kod tillbaka som laddas
i ett dolt layer eller IFRAME. Seden kan javascripten läsa denna
dolda frame och plocka fram de nya värderna och skriva dom
till den synliga "bilden". Jäkligt snårigt blir det...

Ajax är en ny teknik som försöker lösa detta problem med
"interaktiva web applikationer". Se : http://en.wikipedia.org/wiki/AJAX

Det absolut enklaste är att helt enkelt skriva om sidan med de
nya värderna...
Användarvisningsbild
JimmyAndersson
Inlägg: 26415
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Inlägg av JimmyAndersson »

> Du är envis...

:) och det ska du prata om.. :)

Sant, jag är mycket envis tills någon förklarar och jag förstår varför jag har fel.
Nu förstår jag hur du menar med att det inte går.

> Du blandar ihop "server-side" och "client-side".

Nja, det hänger jag med på. Däremot visste jag inte detta:

> För att det ska hända något mer måste *klienten* ta nästa kontakt.


> Det absolut enklaste är att helt enkelt skriva om sidan med de
nya värderna...

Ok. Om jag beskriver hela kedjan från början:

*Man knappar in sajt.se i webläsaren och kommer till index.html med länkar.

*Där finns en länk som går till ett perl-script (script.cgi). Användaren klickar på länken.

*Perl-scriptet startas. och öppnar admin.html som alltså är en helt egen HTML-fil. (Koden för detta finns i ett tidigare inlägg.)

*På denna HTML-sida finns ett formulär med textinmatningsfält och kryssrutor. Användaren skriver något och kryssar i några rutor. När man trycker på 'Submit'-knappen så skickas (eller hur man ska säga) det inmatade till perl-scriptet. En kodsnutt förklarar detta bättre:

admin.html: (Exempel-kod)

Kod: Markera allt

<script language=javascript>
<!--
function validera()
 {
 var myvar;
 myvar=document.forms[0].bak.value;
 if(myvar.length>0)
   {
   document.forms[0].submit();
    }
 else
  {
  alert('Du måste ju fylla i något');
  }
 }
//-->
</script>

<body>

<form name="form1" method="post" action=script.cgi>
 <p>Skriv något: 
 <input name="data" type="text" id="data" value="----" size="4" maxlength="4">
 <input type="button" name="Submit" onClick=validera() value="Ok">
  </p>
</form>
Det inmatade datat läses i perl-scriptet med:

read(STDIN, $minnet, $ENV{'CONTENT_LENGTH'});


*Efter att perl-scriptet har behandlat datan så behöver jag alltså skriva om HTML-sidan med de nya värdena.

Hur man laddar om HTML-sidan med antingen perl, HTML eller javascript är inga problem.
Men: Hur får jag innehållet i perl-scriptets variabler att visas på HTML-sidan?

Samma fråga som i mitt första inlägg alltså. :)
sodjan
EF Sponsor
Inlägg: 43231
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> Efter att perl-scriptet har behandlat datan så behöver jag alltså skriva om HTML-sidan med de nya värdena.

Just det !
Du kan alltså inte *enbart* skicka tillbaka värden, eftersom browsern nu
väntar på en hel http/html session med <HTML>, <BODY"> o.s.v.

> Hur man laddar om HTML-sidan med antingen perl, HTML eller javascript är inga problem.

Jag tror att jag förstår vad du menar, men det är lite blandning av äpplen och päron här...
Både perl och javascript använder ju HTML för själva kodningen av sidan.

> Hur får jag innehållet i perl-scriptets variabler att visas på HTML-sidan?

Genom att perl scriptet ändrar på lämpliga ställen i HTML koden
*innan* den skickas tillbaka till browsern. Använd de vanliga
stränghanterings funktionerna.

Jag saknar fortfarande steget där din HTML fil skickas till browsern.
Du säger bara att du "öppnar" filen i ditt perl script. När och hur skickas
den till browsern ?

För övrigt är det en vanlig POST av fomuläret.
Är "script.cgi" alltså ditt perl script ?

Eller, är det kanske så att "RVF" i "read(RVF,$ml,$fsize1);" är en "kanal"
tillbaka till browsern ? Och att du alltså inte "ser" HTML koden i ditt perl
script ?

Använder du något speciellt "HTML-verktyg" i ditt perl-script ?
Användarvisningsbild
JimmyAndersson
Inlägg: 26415
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Inlägg av JimmyAndersson »

Ok, då förstår jag.

> Jag tror att jag förstår vad du menar, men det är lite blandning av äpplen och päron här...
> Både perl och javascript använder ju HTML för själva kodningen av sidan.

Sant. Jag ville bara förtydliga att jag vet hur man gör för att sidan ska skrivas om. (Dvs, visas igen.) :)

> Jag saknar fortfarande steget där din HTML fil skickas till browsern.
> Du säger bara att du "öppnar" filen i ditt perl script. När och hur skickas den till browsern ?

Det sker precis i början av perl-scriptet. Hela koden för att skicka HTML-filen till browsern ser ut såhär:

Kod: Markera allt

sub visa_sida
{
 $fsize1 = (-s "/sökväg/test/test.html");
 open (RVF, "/sökväg/test/test.html");
	read(RVF,$ml,$fsize1);
 close (RVF);

 print $ml
}
Denna rutin startas för tillfället på raden efter sub-rutinen med &visa_sida


Jag tror jag förstår nu:
Raden print $ml skriver ju ut HTML-sidan till browsern. Enligt tidigare resonemang vet jag nu att jag måste ändra HTML-koden *innan* raden print $ml.

Alltså ska jag stoppa in kod som ändrar koden mellan close(RVF); och print $ml. Det borde väl bli rätt?


edit: Oj, jag glömde några frågor:

> För övrigt är det en vanlig POST av fomuläret.

Jepp.

> Är "script.cgi" alltså ditt perl script ?

Japp.

Eller, är det kanske så att "RVF" i "read(RVF,$ml,$fsize1);" är en "kanal"
tillbaka till browsern ? Och att du alltså inte "ser" HTML koden i ditt perl
script ?

Precis! (Om jag inte missförstått frågan, men du kanske förstår av min kod ovan.)

Använder du något speciellt "HTML-verktyg" i ditt perl-script ?

Nop.

:)
sodjan
EF Sponsor
Inlägg: 43231
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> print $ml

Men va f.... :-)
*Den* delen var väl aldrig med i dina tidigare inlägg !!??

> Alltså ska jag stoppa in kod som ändrar koden mellan close(RVF); och print $ml . Det borde väl bli rätt?

Japp. Som det ser ut *NU* (där du alltså har tillgång till hela HTML filen
i $ml), så är det en baggis att ändra variablen med något av perl's
sträng substituerings kommando. Jag har det inte i huvudet, men detta
är ju perl's starka sida (stränghantering) så det finns säkert något bra.

Lägg bara ditt något unikt i HTML filen som subst kommandot kan ha
som "target".

Något i stil med :

$ml =~ s/__myvar__/$new_value/g;

Där "__myvar__" är placeholdern i HTML filen och "$new_value" är ditt nya värde.

Kolla perl documentationen...

>> Eller, är det kanske så att "RVF" i "read(RVF,$ml,$fsize1);" är en "kanal"
>> tillbaka till browsern ? Och att du alltså inte "ser" HTML koden i ditt perl
>> script ?
>
> Precis! (Om jag inte missförstått frågan, men du kanske förstår av min
> kod ovan.)

Ser inte ut så nu, du har ju en extra "print" för att skriva ut det...

Har du inte med något extra i början på scriptet som *öppnar* en
väg tillbaka till browsern ? Eller är det redan gjort när din egen kod startar ?
print måste ju så att säga "veta" vart den ska skriva...
Användarvisningsbild
JimmyAndersson
Inlägg: 26415
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Inlägg av JimmyAndersson »

>> print $ml

> Men va f....
> *Den* delen var väl aldrig med i dina tidigare inlägg !!??

Nej, då skrev jag bara raderna som hämtar HTML-filen för behandling i perl-scriptet. Print-raden är förstås nödvändig, men tidigare visste jag inte att samma rad även kunde användas för att i princip lösa mitt problem.


> Har du inte med något extra i början på scriptet som *öppnar* en väg tillbaka
> till browsern ? Eller är det redan gjort när din egen kod startar ?
> print måste ju så att säga "veta" vart den ska skriva...

Jag tänkte prova att låta scriptet leta upp markeringar i HTML-filen och ersätta med rätt info. Vet inte om det kommer fungera än.
T.ex om en markering är !!kod!! så skriver jag t.ex såhär i HTML-filen:

Koden är !!kod!! .

Sedan ersätter scriptet !!kod!! med innehållet i $kod när sidan skrivs ut (med print $ml).

Det borde kanske räcka?

edit: Ja, det var ju förresten så du skrev. :)
Men tror du att jag behöver öppna en väg tillbaka? Räcker det inte att läsa in html-koden med sub-rutinen och bara printa ut innehåller i webläsaren?
sodjan
EF Sponsor
Inlägg: 43231
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> Nej, då skrev jag bara raderna som hämtar HTML-filen för behandling i perl-scriptet.

Och jag frågade två eller tre gånger efter steget där HTML koden
skickades till browsern. Det kom till slut... :-)

> Sedan ersätter scriptet !!kod!! med innehållet i $kod när sidan skrivs ut (med print $ml).

Inte *när* sidan skrivs ut, utan *innan*...
Men jo, det var så jag skrev. Och hade skrivit från första början om
bara din "print $ml" hade varit med från början... :-)

Prova med :

Kod: Markera allt

open (RVF, "/sökväg/test/test.html");
read(RVF,$ml,$fsize1);
close (RVF);
$ml =~ s/!!kod!!/$kod/g;
print $ml;
så får vi se vad som händer...

> Men tror du att jag behöver öppna en väg tillbaka? Räcker det inte att
> läsa in html-koden med sub-rutinen och bara printa ut innehåller i
> webläsaren?

Alltså, för att skriva något tillbaka till browsern så måste det finnas en
öppnad nätverkslänk. Antingen öppnas den av webservern *innan*
perlscriptet anropas (verkar så i detta fall) eller så får man göra det själv...
Användarvisningsbild
JimmyAndersson
Inlägg: 26415
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Inlägg av JimmyAndersson »

Det fungerade!
Vad kul det är när man lär sig något nytt! :)

> Och jag frågade två eller tre gånger efter steget där HTML koden
> skickades till browsern. Det kom till slut...

Jo.. :) I ett annat fall kunde jag visat koden från början till slut. Men det var lite knepigt att välja ut rätt delar att visa ur denna kod. Dels eftersom den är så lång och dels för att merparten är hemlig. Hela sidan ska användas till bl.a administration av mina sajter och ska även fungera som filter för mail och gästböcker. Allt är i princip klart. Det var bara denna lilla detalj som fattades.


> Alltså, för att skriva något tillbaka till browsern så måste det finnas en
> öppnad nätverkslänk. Antingen öppnas den av webservern *innan*
> perlscriptet anropas (verkar så i detta fall) eller så får man göra det själv...

Jo, den måste nog öppnas av webservern innan, för jag har inte gjort det. :)

Men nu fungerar det som sagt.
Tack för hjälpen! :)
sodjan
EF Sponsor
Inlägg: 43231
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> Jo, den måste nog öppnas av webservern innan, för jag har inte gjort det.

OK, det där beror lite på hur web-servern hanterar det.
På vissa plattformar får man en "handle" som man måste göra
"open" på innan man skriver till den...

Kul att det fungerar i alla fall...

> Men det var lite knepigt att välja ut rätt delar att visa ur denna kod.
> Dels eftersom den är så lång och dels för att merparten är hemlig.

I ett sådant fall är det enklast att göra ett helt separat "test-case" som
enbart testar just denna funktion. Då kan man ju även posta hela
koden...
Skriv svar