Gebruikersavatar
dannypje
Artikelen: 0
Berichten: 768
Lid geworden op: zo 27 mei 2012, 20:30

tabel data doorgeven in perl.cgi

Hallo,
 
ik schrijf een dingetje in perl.cgi, en ik lees data in van een bestand. Die data zou ik moeten kunnen wijzigen en terug opslaan.
 
Het gaat hier bvb. om 9 rijen met elk 6 gegevens.
 
Ik denk dat die gegevens dus zullen moeten getoond worden in een (html) tabel waarbij elk element van de tabel een input field is.
 
Maar ik zit dus met het probleem dat ik mogelijk 9 x 6 gegevens allemaal moet doorgeven naar een volgende pagina, en dan liefst nog met een druk op 1 knop.
 
Is er iemand die hiervoor een (betere) oplossing heeft ?
 
Alvast bedankt
 
D
 
In the beginning, there was nothing. Then he said:"Light". There was still nothing but you could see it a whole lot better now.
Benm
Artikelen: 0
Berichten: 12.262
Lid geworden op: za 21 okt 2006, 01:23

Re: tabel data doorgeven in perl.cgi

Wat is het probleem dan? Het zijn 54 inputs, dat kan gemakkelijk, maar je moet het formulier wel met de POST methode verzenden. Via de GET methode loop je mogelijk tegen de maximale lengte van de query string aan (verschilt per browser en mogelijk per server, maar IE doet "slechts" urls van 2k lang).
Victory through technology
Gebruikersavatar
dannypje
Artikelen: 0
Berichten: 768
Lid geworden op: zo 27 mei 2012, 20:30

Re: tabel data doorgeven in perl.cgi

Probleem is dat ik wel (een beetje) vertrouwd ben met de get methode, maar niet met post. Kan ik die 2 mixen in 1 en hetzelfde programma ?
Ook geen enkel idee hoe de post methode de data te weten komt die ze moet doorsturen. Bij get heb je een <input lijn voor elke variabele, maar de POST methode zou dat niet nodig hebben. Geen idee hoe het dan wel zou moeten.
In the beginning, there was nothing. Then he said:"Light". There was still nothing but you could see it a whole lot better now.
Gebruikersavatar
dannypje
Artikelen: 0
Berichten: 768
Lid geworden op: zo 27 mei 2012, 20:30

Re: tabel data doorgeven in perl.cgi

En bijkomend probleem is dat de tabel (uiteraard) dynamisch gegenereerd wordt vanuit een lus, afhankelijk van een startindex (de tabel is een subset uit een grotere tabel), dus de variabelen waaruit/waarin de data moet komen hebben afhankelijk van de run een andere waarde.
Geen idee hoe (zelfs met een get methode) de namen van zulke variabelen kan gebruiken om door te geven. Als ik dus namen van variabelen moet gaan gebruiken, verlies ik volgens mij de mogelijkheid om die lus te gebruiken.
In the beginning, there was nothing. Then he said:"Light". There was still nothing but you could see it a whole lot better now.
Gebruikersavatar
dannypje
Artikelen: 0
Berichten: 768
Lid geworden op: zo 27 mei 2012, 20:30

Re: tabel data doorgeven in perl.cgi

Dus, voor alle duidelijkheid met een stukje code. De code hieronder genereert een tabel met 15 lijnen waarbij telkens een hoeveelheid gegevens per lijn staan. Op dit moment is dit een gewone html tabel.
Bedoeling is dat elk van deze gegevens in een text field komen te staan, zodat ze kunnen aangepast worden, en dat al die gegevens met de druk op 1 knop kunnen worden doorgestuurd naar een andere page.
 
 print "<table border = \"1\">";

 

 @dagen=(niks,maandag, dinsdag, woensdag, donderdag, vrijdag, zaterdag, zondag);

 for ($i=$dispindex-$midpoint;$i<=$dispindex+$midpoint;$i++)

  {

   ($pday,$pmon,$pyear) = split('/',$rdate[$i]);

   if ($pday<10){$pday="0".$pday;}

  

   print "<tr>

       <td style=\"width:100px\" \"height:20px\">$dagen[(Day_of_Week($pyear,$pmon,$pday))]</td>

       <td style=\"width:100px\" \"height:20px\">$rdate[$i]</td>

       <td style=\"width:50px\" \"height:20px\">$rbegin[$i]</td>

       <td style=\"width:50px\" \"height:20px\">$rend[$i]</td>

       <td style=\"width:50px\" \"height:20px\">$rnoon[$i]</td>

       <td style=\"width:50px\" \"height:20px\">$rbreak[$i]</td>

       <td style=\"width:50px\" \"height:20px\">$rworkduration[$i]</td>

       <td style=\"width:50px\" \"height:20px\">$rweeksaldo[$i]</td>

       <td style=\"width:50px\" \"height:20px\">$rovertimeperweek[$i]</td>

       <td style=\"width:50px\" \"height:20px\">$rmonthsaldo[$i]</td>

       <td style=\"width:400px\" \"height:20px\">$rremark[$i]</td>

       </tr>"      

  }

 print "</table>";
In the beginning, there was nothing. Then he said:"Light". There was still nothing but you could see it a whole lot better now.
Gebruikersavatar
physicalattraction
Moderator
Artikelen: 0
Berichten: 4.163
Lid geworden op: do 30 mar 2006, 15:37

Re: tabel data doorgeven in perl.cgi

Ik ben onbekend met Perl, met heb wel wat ervaring met PHP. Kun je niet alle data in een array (zie bijv. hier) zetten, deze in JSON omzetten (zie bijv. hier) en deze als waarde van een parameter meegeven in een POST request? De ontvanger moet de JSON dan weer decoderen in een array en hier de losse waarden uithalen. Voordeel is dat, wanneer je programma wijzigt, je de communicatie niet hoeft te wijzigen als er plotseling 10x5 i.p.v. 9x6 elementen doorgegeven moeten worden.
Gebruikersavatar
dannypje
Artikelen: 0
Berichten: 768
Lid geworden op: zo 27 mei 2012, 20:30

Re: tabel data doorgeven in perl.cgi

physicalattraction schreef: Ik ben onbekend met Perl, met heb wel wat ervaring met PHP. Kun je niet alle data in een array (zie bijv. hier) zetten, deze in JSON omzetten (zie bijv. hier) en deze als waarde van een parameter meegeven in een POST request? De ontvanger moet de JSON dan weer decoderen in een array en hier de losse waarden uithalen. Voordeel is dat, wanneer je programma wijzigt, je de communicatie niet hoeft te wijzigen als er plotseling 10x5 i.p.v. 9x6 elementen doorgegeven moeten worden.
Bedankt voor je reactie. Omzetten in een array zou kunnen, zelfs in een string door alles te concateneren als je het mij vraagt.
Mijn probleem is echter: als die waarden op het scherm getoond worden, moeten ze nog veranderd kunnen worden, en daarna met een druk op de (submit of zo) knop doorgestuurd worden.
Die submit knop werkt in een form waarmee je die gegevens kan doorsturen, maar dat is ook alles wat je kan doen. Ik heb dus geen 'tijd' of mogelijkheid de eventueel gewijzigde data nog in een array of string op te slaan als er op die knop gedrukt wordt.
(de originele gegevens opslaan in een variabele en die doorgeven is dus niet het probleem, want dat zou ik ruim op voorhand kunnen doen terwijl de tabel op het scherm geprint wordt).
In the beginning, there was nothing. Then he said:"Light". There was still nothing but you could see it a whole lot better now.
Benm
Artikelen: 0
Berichten: 12.262
Lid geworden op: za 21 okt 2006, 01:23

Re: tabel data doorgeven in perl.cgi

Zelfde verhaal rond kennis van php en perl hier - al heb ik in het verleden wel dingen met perl gedaan en vermoed ik dat de oplossing gelijkaardig is aan die voor php.

Je neemt in je formulier velden op als

<input name='a[a][0]' value='...'>
<input name='a[a][1]' value='...'>
<input name='a[0]' value='...'>
<input name='a[1]' value='...'>

Als je dat formulier submit krijg je in php arrays als

$_REQUEST[a] met elementen 1 en 2 voor de eerste twee regels, en $_REQUEST voor de volgende twee.

Uiteraard is $_REQUEST zelf ook een array die gewoon de twee andere arrays bevat. Voor zover ik weet moet je in perl die arrays assignen, maar daarna zou het gelijkaardig moeten werken.

Dat het als methode goed werkt weet ik uit persoonlijke ervaring, je kunt zo vrij eenvoudig spreadsheet achtige interfaces maken met arrays van veel inputs, honderden is geen probleem. Als je richting de duizenden wilt (bijv 100 rijen met 10 kolommen ieder) moet je gaan oppassen ivm het maximaal aantal POST variabelen (kan 1000 zijn, maar ook gerust 32k afhnankelijk van configuratie), maar dat is niet iets om je bij 9x6 (of 90x10 oid) druk om te maken.
Victory through technology
Gebruikersavatar
dannypje
Artikelen: 0
Berichten: 768
Lid geworden op: zo 27 mei 2012, 20:30

Re: tabel data doorgeven in perl.cgi

@Benm en physicalattraction.
 
Bedankt voor jullie reacties. Ik had eigenlijk zelf een beetje last om mijn eigen probleem te begrijpen/uit te drukken, maar het ging hem dus inderdaad over het feit dat mijn tabel met een lus uitgeprint wordt, en dat je dus voor elke variabele die je wil doorgeven een unieke naam moet hebben.
Jouw oplossing, Benm, met die $_REQUEST array is idd dynamisch en dus heel geschikt voor grote hoeveelheden data. Zelf had ik onderstaande methode bedacht om mijn variabelen telkens een unieke naam te geven (een nachtje slapen helpt dikwijls, en zoveel data moet ik niet doorgeven dus het hoeft allemaal niet zo ultra-dynamisch). Ik gebruik dan ook een extra teller ($j) om variabelenamen te maken zoals b1, b2, e1, e2 etc, en die dan door te geven.
POST werkt hier idd ook dus die methode zal ik gebruiken.
 
Bedankt voor jullie hulp !
 
 $j=0;

   print "<form action=saskia.cgi method=post>";

 @dagen=(niks,maandag, dinsdag, woensdag, donderdag, vrijdag, zaterdag, zondag);

print "dispindex = ",$dispindex,"midpoint=",$midpoint;

 for ($i=$dispindex-$midpoint;$i<=$dispindex+$midpoint;$i++)

  {

   $j++; #namecounter starts at 1

   ($pday,$pmon,$pyear) = split('/',$rdate[$i]);

   if ($pday<10){$pday="0".$pday;}

   #print "pdays here:", $pday,"&nbsp",$pmon,"&nbsp",$pyear,"<br>";

   print "<tr>

       <td style=\"width:100px\" \"height:20px\">$dagen[(Day_of_Week($pyear,$pmon,$pday))]</td>

       <td style=\"width:100px\" \"height:20px\">$rdate[$i]</td>

       <td style=\"width:50px\" \"height:20px\"><input style=\"width:60px\;text-align: center\" type=text name=b$j value=$rbegin[$i]></td>

       <td style=\"width:50px\" \"height:20px\"><input style=\"width:60px\;text-align: center\" type=text name=e$j value=$rend[$i]></td>

       <td style=\"width:50px\" \"height:20px\"><input style=\"width:50px\;text-align: center\" type=text name=n$j value=$rnoon[$i]></td>

       <td style=\"width:50px\" \"height:20px\"><input style=\"width:50px\;text-align: center\" type=text name=p$j value=$rpauze[$i]></td>

       <td style=\"width:50px\" \"height:20px\">$rworkduration[$i]</td>

       <td style=\"width:50px\" \"height:20px\">$rweeksaldo[$i]</td>

       <td style=\"width:50px\" \"height:20px\">$rovertimeperweek[$i]</td>

       <td style=\"width:50px\" \"height:20px\">$rmonthsaldo[$i]</td>

       <td style=\"width:400px\" \"height:20px\"><input style=\"width:400px\" type=text name=r$j value=$rremark[$i]></td>

       </tr>"       

   #print $dagen[(Day_of_Week($pyear,$pmon,$pday))],"&emsp;",$rdate[$i],"<br>";

  }

 print "</table>";

 print "<input type=hidden name=action value='check'>";

 print "<input type=hidden name=midp value=$midpoint>";

 print "<input type=hidden name=disind value=$dispindex>";

 print "<input type=submit value='Aanpassen'>";

 print "</form>";
In the beginning, there was nothing. Then he said:"Light". There was still nothing but you could see it a whole lot better now.
Benm
Artikelen: 0
Berichten: 12.262
Lid geworden op: za 21 okt 2006, 01:23

Re: tabel data doorgeven in perl.cgi

Dat kan natuurlijk ook. Mijn voorkeur gaat uit naar <input name='a[0][0]'> zodat het terugkomt als array $_REQUEST['a']['0'] met alle waarden, maar dat is denk ik meer uit gewoonte. Je kunt uiteraard de variabelen namen geven zoals jij doet, maar dan moet je ze bij het verwerken weer splitsen.
Victory through technology

Terug naar “Informatica en programmeren”