Postitie van item in submenu definieren in mySQL

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Lauren Zonneveld

Lauren Zonneveld

29/10/2009 17:15:00
Quote Anchor link
Ik heb een tabel met submenu items vanwaaruit het menu op een website wordt gegenereerd. Deze tabel wordt bijgewerkt zodra er nieuwe pagina's worden toegevoegd in het CMS. Alle nieuwe pagina's komen dus in een submenu. Tot zover geen probleem.

Mijn probleem zit hem in het ordenen van de submenuitems. Natuurlijk kan ik met ORDER BY "gewijzigd" of iets dergelijks werken. Maar ik wil echter dat de gebruiker kan bepalen op welke positie in het submenu een item komt. Heeft iemand een idee hoe ik dit het beste kan realiseren?

Alvast bedankt!
 
PHP hulp

PHP hulp

05/11/2024 11:41:14
 
Koen

koen

29/10/2009 17:17:00
Quote Anchor link
je kunt het menu vanuit een array laden, dan kun je in die array de volgorde aanpassen
 
Mitch X

Mitch X

29/10/2009 17:19:00
Quote Anchor link
Even een vraag ter verduidelijking: wil je dat elk item afzonderlijk een positie kan krijgen of dat de gebruiker de wijze waarop gesorteerd wordt aan kan passen?
 
Lauren Zonneveld

Lauren Zonneveld

29/10/2009 17:20:00
Quote Anchor link
@Koen: Dat zou mogelijk zijn, maar dat lost echter niks op. Het probleem is dat de gebruiker moet kunnen bepalen hoe het submenu geordend wordt.

@Mitch: Elk item moet afzonderlijk een positie aangewezen krijgen.
Gewijzigd op 01/01/1970 01:00:00 door Lauren Zonneveld
 

29/10/2009 17:23:00
Quote Anchor link
Je kunt deze manier gebruiken, of zoals die hier misschien wat duidelijker uitgelegd staat.

koen schreef op 29.10.2009 17:17:
je kunt het menu vanuit een array laden, dan kun je in die array de volgorde aanpassen

Volgens mij weet jij niet waarover je het hebt.
 
Lauren Zonneveld

Lauren Zonneveld

29/10/2009 17:25:00
Quote Anchor link
@Karl: Bedankt voor de snelle reactie, ik ga ermee aan de slag!
 
Mitch X

Mitch X

29/10/2009 17:27:00
Quote Anchor link
Ok.

Je wilt dus dat elke gebruiker de volgorde van elk item in het submenu kan bepalen.
Je moet dus per gebruiker voor elk item een index opslaan en bij het ophalen sorteren op die index.

Ter illustratie:
Mitch - Menuitem 1 - Index 2
Mitch - Menuitem 2 - Index 0
Mitch - Menuitem 3 - Index 1

Geeft als menu voor Mitch:
Menuitem 2, Menuiutem 3, Menuitem 1.
Gewijzigd op 01/01/1970 01:00:00 door Mitch X
 
Lauren Zonneveld

Lauren Zonneveld

29/10/2009 17:31:00
Quote Anchor link
@Karl: Het gestuurde item en de tutorial zijn heel netjes echter niet precies wat ik zoek.

@Mitch: Inderdaad dat is de bedoeling, maar nu moeten gebruikers dus ook een item tussen 2 en 3 in kunnen plaatsen bijvoorbeeld.
Gewijzigd op 01/01/1970 01:00:00 door Lauren Zonneveld
 
Mitch X

Mitch X

29/10/2009 17:44:00
Quote Anchor link
Dat kan.
Dan zul je de indices aan moeten passen.

Voorbeeld aan de hand van mijn eerdere voorbeeld.
Stel je wilt Menuitem 4 tussen 2 en 3 plaatsen. 2 blijft dan op z'n plek, daarna komt met index 1 Menuitem 4 en voor elk item dat daarna komt verhoog je de index met 1.

Mitch - Menuitem 1 - Index 2
Mitch - Menuitem 2 - Index 0
Mitch - Menuitem 3 - Index 1

wordt =>

Mitch - Menuitem 1 - Index 2+1 = 3
Mitch - Menuitem 2 - Index 0
Mitch - Menuitem 3 - Index 1+1 = 2
Mitch - Menuitem 4 - Index 1
 
Lauren Zonneveld

Lauren Zonneveld

29/10/2009 18:30:00
Quote Anchor link
Duidelijk, met 2 queries kan ik de INSERT dus voor elkaar krijgen. Nou is het ook de bedoeling dat de positie (Index in het voorbeeld) met een (of meer) UPDATE query(s) gewijzigd kan worden.

Ik wil bijvoorbeeld Menuitem 4 als laatste (Index 3) in het menu:
Mitch - Menuitem 1 - Index 3-1 =2
Mitch - Menuitem 2 - Index 0
Mitch - Menuitem 3 - Index 2-1 = 1
Mitch - Menuitem 4 - Index 3

Of Menuitem 1 als eerste:
Mitch - Menuitem 1 - Index 0
Mitch - Menuitem 2 - Index 0+1 = 1
Mitch - Menuitem 3 - Index 2+1 = 3
Mitch - Menuitem 4 - Index 1+1 = 2

Hoe ga ik dat voor elkaar krijgen met 1 of meer queries?

@Mitch: Bedankt voor je toewijding overigens.
 
Mitch X

Mitch X

29/10/2009 19:12:00
Quote Anchor link
Eerst ga je even kijken wat je wilt:

Definities:
X = huidige index
Y = nieuwe index

1. Je wilt een nieuw item toevoegen.
Als je een nieuw item toevoegt op plaats Y, moet je alle indices >= Y met 1 verhogen.

2. Je wilt een item naar boven (een lagere index) verplaatsen.
Eerst doe je een boundary test. Een item met index 0 kan gewoon niet lager.
Alle indices >=Y èn <X doe je +1 en verander je X naar Y.

3. Je wilt een item naar beneden (een hogere index) verplaatsen.
Ook hier wellicht een boundary test. Er zit vast wel een limiet aan 't menu?
Alle indices >X èn <=Y doe je -1 en verander je X naar Y.

Succes!
 
Roel -

Roel -

29/10/2009 19:14:00
Quote Anchor link
Gewoon een veld 'positie' aanmaken en dan ORDER BY positie DESC.
 
Lauren Zonneveld

Lauren Zonneveld

29/10/2009 21:06:00
Quote Anchor link
@Mitch: De opzet is duidelijk morgen ga ik proberen het uit te werken.

@Hoithebest: Met gewoon een veld postitie aan maken ben je er bij lange na nog niet. Lees de reacties van Mitch, dan wordt duidelijk waar ik naartoe wil.

Nu de grootste uitdaging: queries maken van dit verhaal... morgen ga ik ermee aan de slag, ik zal de queries hier posten als het gelukt is.
 
Jan Koehoorn

Jan Koehoorn

29/10/2009 21:16:00
Quote Anchor link
Misschien nog een tussenoplossing. Er is een handig MooTools object, Sortables geheten. Daarmee kun je de onderdelen van een list verslepen.

Die gebruik ik vaak in mijn CMS-en. Je laat de user de items in de goedevolgorde slepen, en daarna verzend je een formulier waarin de volgorde van de items meegenomen wordt (bijvoorbeeld met een hidden field).
 
Lauren Zonneveld

Lauren Zonneveld

29/10/2009 21:48:00
Quote Anchor link
@Jan: Dat is ook een idee natuurlijk. Ik gebruik zelf jQuery maar ik heb een dergelijke toepassing ook gezien voor jQuery. Het ziet er natuurlijk goed uit, een nadeel is dat ik deze mogelijkheid niet in mijn huidige (HTML)tabel kan integreren. Ik moet dan een nieuwe pagina aan maken voor de volgorde van de menuitems. Ik ga zeker ook naar deze optie kijken.

Edit: Ik heb zojuist een script met tekst en uitleg gevonden die zo ongeveer doet wat Jan suggereerde. Kan het jammergenoeg nog niet testen in mijn eigen CMS (lokaal op de laptop!).

http://www.wil-linssen.com/demo/jquery-sortable-ajax/
Gewijzigd op 01/01/1970 01:00:00 door Lauren Zonneveld
 
Jan Koehoorn

Jan Koehoorn

29/10/2009 22:02:00
Quote Anchor link
Die Sortables van Mootools werkt ook op tables. Mijn code:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
    var i = 0;
    window.addEvent ('domready', function () {
        var mySortables = new Sortables('pages');
        $$('table.records tr.sortable').each (function (item) {
            mySortables.addItems (item);
        });

        $('order').addEvent ('click', function (e) {
            new Event (e).preventDefault ();
            $$('table.records tr.sortable').each (function (item) {
                var curval = $('pages').get ('value');
                if (i) {
                    $('pages').set ('value', curval + ',' + item.getFirst ().innerHTML);
                }
                else {
                    $('pages').set ('value', curval + item.getFirst ().innerHTML);
                }
                i++;
            });
            $('form_pages').submit ();
        });
    });
Gewijzigd op 01/01/1970 01:00:00 door Jan Koehoorn
 
Lauren Zonneveld

Lauren Zonneveld

30/10/2009 10:30:00
Quote Anchor link
Het toevoegen van berichten met een bepaalde postitie in het submenu werkt nu. Voor de geinterreseerden, ik gebruik de volgende queries:

UPDATE menu SET
index = index + 1
WHERE index >= $index

INSERT INTO menu SET
page_id = $page_id,
index = $index
...

De postitie(index) wordt door de gebruiker geselecteerd uit een select veld. De maximale postitie hierin is het aantal submenuitems van de geselecteerde pagina + 1.

Edit: Ook de UPDATE query is gelukt, ik post hem even voor degene die met hetzelfde probleem zit. Ik heb het probleem simpel opgelost en er moet nog aan gesleuteld worden.

In het paginaoverzicht kan de index van een pagina met een knopje omhoog of omlaag worden gezet. De knop voor omlaag verschijnt niet als de index 1 is en dus niet lager kan, de knop voor omhoog verschijnt niet als de index gelijk is aan de max (het aantal items in het submenu).

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?php
public function setIndex($item_id, $page_id, $index, $direction) {
  if($direction == up) {
    $query_a = 'UPDATE menu
                      SET index = index - 1
                      WHERE index = "'
.($index + 1).'"
                      AND page_id = "'
.$page_id.'"';
    $query_b = 'UPDATE menu
                      SET index = "'
.($index + 1).'"
                      WHERE menu_id = "'
.$item_id.'"';
  }
else {
   $query_a = 'UPDATE menu
                      SET index = index + 1
                      WHERE index = "'
.($index - 1).'"
                      AND page_id = "'
.$page_id.'"';    
   $query_b = 'UPDATE menu
                      SET index = "'
.($index - 1).'"
                      WHERE content_id = "'
.$item_id.'"';    
  }


  $result = mysql_query($query_a);
  $result = mysql_query($query_b);

  header('location: '.$this->location);
}

?>


En een plaatje ter verduidelijking:
http://img251.imageshack.us/img251/1529/cmspositionering.jpg

@Jan: Bedankt voor het script, ik ga kijken of ik deze oplossing kan gebruiken voor het updaten van de posities.
Gewijzigd op 01/01/1970 01:00:00 door Lauren Zonneveld
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.