Multi-level menu met producten uit 2e tabel

Pagina: 1
Acties:

Onderwerpen


  • WingsOfFury
  • Registratie: Februari 2004
  • Laatst online: 16-10-2018
Laat ik allereerst even vermelden dat ik mijn programeer "kennis" heb verzameld uit boeken, internet en het nodige trial & error werk. Momenteel ben ik aan de studie Informatica begonnen op HBO niveau, maar we zijn pas 2 maanden bezig en nog niet aan het programmeren. Ik heb er dus nooit les in gehad en ken daardoor alleen de dingen die ik ooit zelf nodig heb gehad.

Adhv het script van de tweakblog van crisp (Crisp's blog: Formatting a multi-level menu using only one query) heb ik mijn menu structuur ontwikkelt in mijn CMS. Echter wil ik nu dat script ook gebruiken voor een webshop.

In principe zijn de categorien op de website ook menu items, dus in zo verre klopt het gewoon. Alleen, zoals de titel al aangeeft, wil ik er dus producten onder kunnen plaatsen.

Ik kom er alleen helemaal niet uit, en snap nog niet eens alles van het originele script eigenlijk. Het kan dus zijn dat mijn aanpassingen aan het origineel niet altijd even netjes zijn.

Wat ik tot nu toe heb:
PHP:
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
<?php
$menu = mysql_query("SELECT id, name, title, parent_id, order_id FROM categories WHERE ID != 4 ORDER BY order_id, parent_id, name ASC");

$product= mysql_query("SELECT id, name, title, categories FROM products ORDER BY name ASC");

$menuData = array( 
    'items' => array(), 
    'parents' => array(), 
    'products' => array()
); 

while ($menuItem = mysql_fetch_assoc($menu)) 
{ 
    $menuData['items'][$menuItem['id']] = $menuItem;
    $menuData['parents'][$menuItem['parent_id']][] = $menuItem['id'];
} 
while ($menuItem = mysql_fetch_assoc($product)) 
{ 
    $menuData['products'][$menuItem['id']] = $menuItem;
} 

function buildMenu2($parent_id, $menuData, $depth=0) {
    
    $html = '';
    
    if (isset($menuData['parents'][$parent_id])) {
      
      foreach ($menuData['parents'][$parent_id] as $itemId) {
        
        $jump = 24 * $depth;
        if ($depth == '0') {
          $open = '<div style="float: left; width: 853px; height: 30px; line-height: 30px; font-weight: bold; padding-left: 5px; background-color: #d9f2cc; border-right: 1px solid #d9d9d9;">';
          $close = '</div><div style="float: left; width: 80px; height: 30px; line-height: 30px; text-align: center; background-color: #d9f2cc; border-right: 1px solid #d9d9d9;">XX</div>';
        } else {
            $width = 858 - $jump;
            $open = '<div style="float: left; width: '.$width.'px; height: 30px; line-height: 30px; font-weight: bold; padding-left: '.$jump.'px; background-color: #e5e5e5; border-right: 1px solid #d9d9d9;">';
            $close = '</div><div style="float: left; width: 80px; height: 30px; line-height: 30px; text-align: center; background-color: #d9f2cc; border-right: 1px solid #d9d9d9;">XX</div>';
        }
        $html .= $open . $menuData['items'][$itemId]['title'] . $close;

        $html .= buildMenu2($itemId, $menuData, $depth+1);
      }
    }
    return $html;
  }
  echo buildMenu2(0, $menuData);
?>


Met een print_r($menuData); krijg ik van alle 3 de array's de waarden goed te zien. Maar ik krijg met geen mogelijkheid de producten onder de menu-kopjes (categorien).

Ik ben er al uren mee bezig geweest, maar kom er gewoon niet uit. Vanwege het ontbreken van een opleiding mis ik ook nog de nodige basiskennis. Sommige dingen zag ik in dit script pas voor het eerst, en zijn dan erg lastig te begrijpen. Bijvoorbeeld:
PHP:
1
2
3
4
5
<?php
if (isset($menuData['parents'][$parent_id])) {
      
    foreach ($menuData['parents'][$parent_id] as $itemId) {
?>

Is niet zo 1, 2, 3 te snappen met http://php.net/manual/en/function.isset.php en http://php.net/manual/en/control-structures.foreach.php als voorbeelden.

Ik heb al heel veel geprobeerd met het vervangen van de array parents door products, maar er moet dan een 0 waarde zijn, en de producten zitten nou eenmaal niet aan een categorie met parent_id 0 gekoppeld, dus volgens mij gaat dit nooit werken.

De categorien staan dus in de ene tabel, en de producten in de andere. In de tabel products staan in de kolom categories de id's (momenteel overal nog 1, maar worden er meerdere) van de categorien waar ze bij horen.

Los van te omschrijven wat mijn einddoel is, wat ik hierboven heb gedaan, weet ik niet goed waar ik om moet vragen, ik zit gewoon vast op het moment.
Een kant-en-klaar script is altijd makkelijk :+ maar daar ben ik niet naar op zoek. Ik hoop er met wat tips en aanwijzingen zelf uit te kunnen komen. Eventueel links naar (gedeeltelijke) oplossingen zijn dus welkom, zodat ik zelf daarna verder kan puzzelen.

Als er nog meer informatie nodig is hoor ik het graag. Hopelijk kan iemand mij verder helpen. Bij voorbaat dank!

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
Net als de nederlands of engels moet je eerst eens proberen om het php script te ontleden, zodat je wel snap wat dingen als foreach en isset doen. Als je die basis niet hebt zul je geen code van andere kunnen lezen, en dus zeker ook niet aanpassen zodat het werkt zoals je wilt.

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


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
WingsOfFury schreef op donderdag 24 november 2011 @ 06:26:Vanwege het ontbreken van een opleiding mis ik ook nog de nodige basiskennis.
Als je je toch al bewust bent waar 't probleem ligt, waarom doe je daar dan niets aan? Eerst leren zwemmen in 't ploeterbadje en dan pas in 't diepe bad springen ;) Of "learn to walk before you try to run".

Als deze code (of het principe) je boven de pet gaat zul je éérst het principe moeten zien te doorgronden, dan bijbehorende code proberen te begrijpen en dan pas gaan denken aan 't bouwen van een webshop etc.

Ik zie in je topic geen concrete vraag; graag had ik die wél gezien want ik zou niet weten wat we anders met dit topic moeten. Je kunt niet van ons verwachten dat we je de basics gaan uitleggen of het script regel-voor-regel met je door gaan nemen oid. Verder moet je met debuggen ook gewoon een heel eind kunnen komen: Debuggen: Hoe doe ik dat?

[ Voor 25% gewijzigd door RobIII op 24-11-2011 10:23 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • WingsOfFury
  • Registratie: Februari 2004
  • Laatst online: 16-10-2018
RobIII schreef op donderdag 24 november 2011 @ 10:17:
[...]

Als je je toch al bewust bent waar 't probleem ligt, waarom doe je daar dan niets aan?
Uhm, dat doe ik toch:
WingsOfFury schreef op donderdag 24 november 2011 @ 06:26:
Momenteel ben ik aan de studie Informatica begonnen op HBO niveau, maar we zijn pas 2 maanden bezig en nog niet aan het programmeren.
Ben in september aan de opleiding begonnen dus.

Mijn einddoel is dat ik onder iedere categorie de producten in een div krijg, zodat ik deze met none/block kan weergeven en verbergen. Maar in eerste instantie is de vraag dus hoe ik de producten uberhaupt te zien krijg?

Bijvoorbeeld met een 2e foreach? Ik roep maar wat... Er is toch wel een tip mogelijk die mij de goede richting op stuurt?
En nog belangrijker: kan het uberhaupt wel met de opzet zoals ik hem nu heb? Of zit ik helemaal op het verkeerde spoor met die 3e array voor products?

  • martin149
  • Registratie: Augustus 2009
  • Laatst online: 10-09 08:19
Heb je al opgemerkt dat je een diepte ($depth) niet meegeeft, deze wordt door de functie daardoor automatisch 0 gemaakt en krijg je waarschijnlijk niet het gewenste resultaat
* martin149 Moet beter opletten

[ Voor 10% gewijzigd door martin149 op 24-11-2011 11:38 ]


  • WingsOfFury
  • Registratie: Februari 2004
  • Laatst online: 16-10-2018
martin149 schreef op donderdag 24 november 2011 @ 11:32:
Heb je al opgemerkt dat je een diepte ($depth) niet meegeeft, deze wordt door de functie daardoor automatisch 0 gemaakt en krijg je waarschijnlijk niet het gewenste resultaat
Edit: je hebt je bericht doorgestreept :P

[ Voor 23% gewijzigd door WingsOfFury op 24-11-2011 11:35 ]


  • martin149
  • Registratie: Augustus 2009
  • Laatst online: 10-09 08:19
Sorry, was mijn fout... had het over het hoofd gezien.
Echter zie ik ook netgens de products voorbijkomen, terwijl je ze er wel in hebt gezet...

  • console
  • Registratie: September 2002
  • Laatst online: 15:45
Als ik jou was zou ik kijken naar een Nested Set Model en niet naar je huidige methode wat een Adjacency List is. Met een Nested Set Model is het veel fijner werken. Je kan bijvoorbeeld met één query je hele boomstructuur laten zien of één query om bijvoorbeeld je breadcrumb op te bouwen.

  • WingsOfFury
  • Registratie: Februari 2004
  • Laatst online: 16-10-2018
martin149 schreef op donderdag 24 november 2011 @ 11:37:
Sorry, was mijn fout... had het over het hoofd gezien.
Echter zie ik ook netgens de products voorbijkomen, terwijl je ze er wel in hebt gezet...
Ah, gelukkig :)

Overigens als aanvulling op mijn eerdere berichten:
De principes en werking van foreach en isset snap ik wel, maar dan op het niveau van de php.net site. Dus zonder database. Het probleem zit hem niet in die 2 onderdelen, maar de combinatie met de array's uit de database. En in dit script zitten de array's van de individuele onderdelen ook nog eens in de array $menuData.

Edit:
console schreef op donderdag 24 november 2011 @ 11:49:
Als ik jou was zou ik kijken naar een Nested Set Model en niet naar je huidige methode wat een Adjacency List is. Met een Nested Set Model is het veel fijner werken. Je kan bijvoorbeeld met één query je hele boomstructuur laten zien of één query om bijvoorbeeld je breadcrumb op te bouwen.
Thanks, hier ga ik zsm mee aan de slag! Heb er al vaker iets over gelezen, maar nog nooit nodig gehad. Ik zal me er eens in gaan verdiepen dus.

[ Voor 30% gewijzigd door WingsOfFury op 24-11-2011 11:51 ]


  • cariolive23
  • Registratie: Januari 2007
  • Laatst online: 18-10-2024
console schreef op donderdag 24 november 2011 @ 11:49:
Als ik jou was zou ik kijken naar een Nested Set Model en niet naar je huidige methode wat een Adjacency List is. Met een Nested Set Model is het veel fijner werken. Je kan bijvoorbeeld met één query je hele boomstructuur laten zien of één query om bijvoorbeeld je breadcrumb op te bouwen.
Voor MySQL klopt dit wel, voor databases zoals SQL Server, Oracle en PostgreSQL klopt dit zeker niet: Die kennen recursieve queries en dan wordt een boomstructuur (Adjacency List) wel heel erg eenvoudig én snel. Een Nested Set is dan juist een slechte oplossing omdat deze complex en relatief langzaam is. Daarnaast kun je met een Nested Set geen foreign keys gebruiken, wat weer tot andere problemen kan leiden.

MySQL kent geen CTE's (Common Table Expression), dan valt er weinig te kiezen.

  • WingsOfFury
  • Registratie: Februari 2004
  • Laatst online: 16-10-2018
cariolive23 schreef op donderdag 24 november 2011 @ 20:39:
[...]

Voor MySQL klopt dit wel, voor databases zoals SQL Server, Oracle en PostgreSQL klopt dit zeker niet: Die kennen recursieve queries en dan wordt een boomstructuur (Adjacency List) wel heel erg eenvoudig én snel. Een Nested Set is dan juist een slechte oplossing omdat deze complex en relatief langzaam is. Daarnaast kun je met een Nested Set geen foreign keys gebruiken, wat weer tot andere problemen kan leiden.

MySQL kent geen CTE's (Common Table Expression), dan valt er weinig te kiezen.
Het gaat om een MySQL database, dus dan zit het goed.

Ik ga morgen met het Nested Set Model aan de slag, tenzij iemand in de tussentijd mij nog een duwtje in de goede richting kan geven met de opzet die ik nu al heb..?

  • cariolive23
  • Registratie: Januari 2007
  • Laatst online: 18-10-2024
Is dit misschien iets voor jou?
http://pear.php.net/package/DB_NestedSet/docs
Pagina: 1