1 van 1

tabel data doorgeven in perl.cgi

Geplaatst: do 27 aug 2015, 13:56
door dannypje
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
 

Re: tabel data doorgeven in perl.cgi

Geplaatst: do 27 aug 2015, 14:57
door Benm
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).

Re: tabel data doorgeven in perl.cgi

Geplaatst: do 27 aug 2015, 15:48
door dannypje
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.

Re: tabel data doorgeven in perl.cgi

Geplaatst: do 27 aug 2015, 17:16
door dannypje
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.

Re: tabel data doorgeven in perl.cgi

Geplaatst: do 27 aug 2015, 18:24
door dannypje
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>";

Re: tabel data doorgeven in perl.cgi

Geplaatst: do 27 aug 2015, 21:14
door physicalattraction
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.

Re: tabel data doorgeven in perl.cgi

Geplaatst: do 27 aug 2015, 22:39
door dannypje
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).

Re: tabel data doorgeven in perl.cgi

Geplaatst: vr 28 aug 2015, 02:28
door Benm
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.

Re: tabel data doorgeven in perl.cgi

Geplaatst: vr 28 aug 2015, 08:22
door dannypje
@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>";

Re: tabel data doorgeven in perl.cgi

Geplaatst: vr 28 aug 2015, 13:56
door Benm
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.