[HTML / PHP] Gecompliceerde FORM.

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Voor een eigen CMSje heb ik een pagina waarop alle producten netje in een rij onder elkaar staan.

Aan de linkerkant van de rijen heb ik checkboxes geplaatst. Deze zijn bedoelt om een bewerking gelijk op meerdere items toe te kunnen passen. Dus vink aan product 1 t/m 4, klik onderaan op de knop verwijderen en ze worden allemaal verwijderd. Om dit te realiseren heb ik dus een FORM "lopen" van bovenaan de lijst, tot helemaal onder aan de lijst (tot na laatste checkbox). De checkboxen heb ik een array gemaakt: products[].

Dit werkt allemaal lekker, alleen heeft elk product aan de rechterzijde van de rij een mogelijkheid om verplaatst te worden. Hier kan de plaats worden aangegeven middels een selectbox en een aparte button per rij (zie screenie). Echter hoe zorg ik dat als er op deze knop word geklikt, bij het herladen van de pagina, bekend is welk product er naar welke plaats moet worden verwijderd?

Het is niet zo moeilijk om te registreren dat er op een knopje is gedrukt voor het verplaatsen. Maar hoe weet je over welk product het gaat en waar deze heen moet? FORMs nesten gaat helaas niet... en met arrays kom ik er ook niet uit.

Stel dat ik op naast het derde product op de knop klik... dan staat dat in de array op plaats [0] en daar kan ik dus niet aan aflezen welke selectbox ik moet kiezen.

Ik hoop dat mijn verhaal niet te warrig is, anders: please ask. Misschien dat de afbeelding het geheel ook iets duidelijker maakt.

Afbeeldingslocatie: http://www.hid.nl/forum/test.gif

Acties:
  • 0 Henk 'm!

Verwijderd

Moet de tweede "bewerk werk" niet "verplaats werk" zijn? B)

Anyhoo... 1 mogelijke oplossing: als je de buttons een naam geeft, dan is naderhand in je script te zien welke button ingedrukt is (door te checken of er een variabele met die naam bestaat).

Dus:

code:
1
<input type="submit" name="move[23]" value="Ok">


Zorgt dat de variabele

PHP:
1
  $_POST["move"][23]


gezet is, ALS er op die knop gedrukt is om het form te versturen. Je kunt nu dus zien welke knop er gebruikt is, en aan de hand daarvan een andere actie uitvoeren. (Overigens heeft die variabele de waarde van de tekst van de knop)

Catch: als de gebruiker niet echt op de knop klikt, maar ergens in het form op Enter drukt (en op die manier de default submit activeert), werkt dit niet. Er wordt dan namelijk geen knop-variabele meegestuurd.

[ Voor 6% gewijzigd door Verwijderd op 09-08-2004 11:40 ]


Acties:
  • 0 Henk 'm!

  • Shadowman
  • Registratie: Januari 2002
  • Niet online
Je kunt toch bij de value van een checkbox aangeven welke id het plaatje heeft? Dus op welke plek het plaatje staat voordat het plaatje wordt verplaatst.

Acties:
  • 0 Henk 'm!

  • GFoAP
  • Registratie: December 2002
  • Laatst online: 22-12-2024
inhoudelijk kan ik je niet helpen, maar als je de link van het plaatje wijzigt in http://www.hid.nl/forum/test.gif werkt het wel:
Afbeeldingslocatie: http://www.hid.nl/forum/test.gif

Acties:
  • 0 Henk 'm!

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
Je submit toch naar een page toe, op die page kun je de database toch aanpassen met de geposte data?

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ja het aanpassen is op zich ook niet het probleem, maar het verkrijgen van de juiste info, uit de juiste dropdown-box is het probleem.

Ik had dus van de knoppen al een array gemaakt. Alleen welke knop je ook indrukt, in de array staat dan altijd op plaats 0 een OK... dus ook al druk je op de 10e, er komt in bijv. $products[0] een OK te staan, waar ik dus niets mee kan.

Maar ik wist niet dat je een array van knoppen, ook al een waarde kon geven dus in de vorm van: name="move[3]" ... ik dacht dat de nummering altijd middels autonummering werd uitgevoerd dus bij mij ziet het er nu zo uit: "name=move[]".

Ik ga het met die nummers even proberen, en dan gewoon de array langs lopen om te kijken waar ik een OK tegen kom...

Acties:
  • 0 Henk 'm!

  • Room42
  • Registratie: September 2001
  • Niet online
Verwijderd schreef op 09 augustus 2004 @ 11:40:
Catch: als de gebruiker niet echt op de knop klikt, maar ergens in het form op Enter drukt (en op die manier de default submit activeert), werkt dit niet. Er wordt dan namelijk geen knop-variabele meegestuurd.
Dat is nog wel te voorkomen. Is dit niets:
code:
1
<button type="submit" name="move" id="move" value="23">Ok</button>
?

[ Voor 13% gewijzigd door Room42 op 09-08-2004 11:53 ]

"Technological advancements don't feel fun anymore because of the motivations behind so many of them." Bron


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Thnx voor de reacties... even om het topic compleet te maken de oplossing. De velden die interesant zijn voor deze bewerking heb ik nu als volgt beschreven:


code:
1
2
3
4
5
<select name="newOrder[' . $work[$i][0] . ']">

<input type="submit" value="Ok" name="replace[' . $work[$i][0] . ']" />

etc.


Hierin is de waarde $work[$i][0] het ID van het product in de database. Vervolgens kan ik dit afvangen in bij het herladen middels:

code:
1
2
3
4
5
6
foreach ($replace as $wrkID => $replace)
{
    $curOrder = $_POST["curOrder"][$wrkID];
    $newOrder = $_POST["newOrder"][$wrkID];                 
    wrkMove ($catID, $wrkID, $curOrder, $newOrder);
}


Dit werkt nu perfect. Dus mijn hartelijke dank voor alle hulp! _/-\o_


Verder wat betreft de knoppen waar je dan wel echt op moet drukken... ik denk dat je dat zowieso wel moet willen, want volgens mij reageren niet alle browsers hetzelfde op een ENTER, in één van de vele veldjes van deze FORM. Plus dat het een goede gewoonte is. Desnoods vang ik het nog even af in de code, waarbij ik gelijk een melding kan geven in de trend van "Klik altijd op de knopjes.".

Nogmaals bedankt!

[ Voor 16% gewijzigd door Verwijderd op 09-08-2004 12:16 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Room42 schreef op 09 augustus 2004 @ 11:52:
[...]

Dat is nog wel te voorkomen. Is dit niets:
code:
1
<button type="submit" name="move" id="move" value="23">Ok</button>
?
D'oH! 8)7

Dat is natuurlijk een veel betere manier... :)

Acties:
  • 0 Henk 'm!

  • coelho
  • Registratie: Augustus 2000
  • Laatst online: 17-09 14:48
Misschien is mijn commentaar wat overbodig, maar is het bij je afbeelding niet zo dat er nu meerdere rijen dezelfde waarde mee kunnen krijgen? dus dat je zowel afbeelding 1 als 2 op "verplaats werk = 2" kunt zetten? Wat gebeurt er dan?

Een directe andere oplossing heb ik niet. Soms zie je een kolom gegevens, waarbij je dmv een pijltje omhoog en omlaag de volgorde kunt veranderen. Hoe dat technisch werkt, geen idee.

PVoutput 7.700Wp ZZO (50°)


Acties:
  • 0 Henk 'm!

Verwijderd

Hoewel ik de TS niet ben denk ik dat ik beide vragen kan beantwoorden:
coelho schreef op 09 augustus 2004 @ 12:27:
Misschien is mijn commentaar wat overbodig, maar is het bij je afbeelding niet zo dat er nu meerdere rijen dezelfde waarde mee kunnen krijgen? dus dat je zowel afbeelding 1 als 2 op "verplaats werk = 2" kunt zetten? Wat gebeurt er dan?
Nou, niets, aangezien je maar op 1 Ok knop tegelijk kunt drukken.
Een directe andere oplossing heb ik niet. Soms zie je een kolom gegevens, waarbij je dmv een pijltje omhoog en omlaag de volgorde kunt veranderen. Hoe dat technisch werkt, geen idee.
Vaak middels een URL (GET request) wat het ID van het te moven item opgeeft en de richting. In de code is het dan redelijk triviaal om het `volgorde' attribuut van de betreffende items aan te passen.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
coelho schreef op 09 augustus 2004 @ 12:27:
Misschien is mijn commentaar wat overbodig, maar is het bij je afbeelding niet zo dat er nu meerdere rijen dezelfde waarde mee kunnen krijgen? dus dat je zowel afbeelding 1 als 2 op "verplaats werk = 2" kunt zetten? Wat gebeurt er dan?

Een directe andere oplossing heb ik niet. Soms zie je een kolom gegevens, waarbij je dmv een pijltje omhoog en omlaag de volgorde kunt veranderen. Hoe dat technisch werkt, geen idee.
In het geval je op de HTML doelt:
In de selectiebox is allereerst al de eigen positie weggenomen. Dus je kan hem al niet naar dezelfde positie verplaatsen. Daarnaast kan je maar één product tegelijk verplaatsen... dus je kan er nooit 2 op dezelfde plek in de database zetten.

In het geval je meer op de technische (PHP) kant doelt:
In de database heeft elk artikel een "order" nummer. Dus een artikel staat op "order" 1 en er staat er één op "order" 2.. etc. Als je bijv. in dit voorbeeld product 2 wilt verplaatsen naar de eerste positie, dan zorgt de code eerst dat je eerste product de "order" 2 krijgt. Zie code:

code:
1
2
3
4
5
6
7
8
9
10
11
12
function wrkMove ($catID, $wrkID, $curOrder, $newOrder)
{
    $link = connect2DB();
    $query = "UPDATE werken SET wrkOrder = wrkOrder - 1 WHERE
             wrkOrder > $curOrder AND catid = $catID";
    mysql_query($query, $link);     
    $query = "UPDATE werken SET wrkOrder = wrkOrder + 1 WHERE
             wrkOrder >= $newOrder AND catid = $catID";
    mysql_query($query, $link);
    $query = "UPDATE werken SET wrkOrder = $newOrder WHERE id = $wrkID";
    mysql_query($query, $link);
}


Eerst had ik ook een pijltje omhoog / omlaag staan. Echter als je lijst erg groot word, en je wilt toch wel dat laatste artikel op de eerste plaats.... dan ben je even bezig :) Dus dit leek me een mooiere oplossing.
Pagina: 1