Avatar billede hald. Nybegynder
24. marts 2003 - 21:02 Der er 4 kommentarer og
1 løsning

Navigation i kategorier (med én tabel i mysql)

Hey allesammen !

Går lige til sagen:

Jeg har tabellen 'kategori' (mysql), som jeg ønsker at kunne lave en eller anden form for navigation ud fra alá:
"Her er du: Foride -> Programmering -> Java"

Tabellen ser pt. således ud:

| id | parent_id | group_id |    name      |

| 1  |    0    |    0    |  Programmering |
| 2  |    1    |    0    |      Java      |
| 3  |    0    |    1    |  Webservere  |
| 4  |    3    |    1    |    Apache    |


Alle hovedkategorier har så værdien '0' i 'parent_id' og 'group_id' tænkte jeg så på at bruge til at se hvilken hovedkategori den pågældende kategori så nedstammer fra.... og så var det at jeg gik død ;o)

Har i nogle ideer til hvordan jeg løser mit lille problem ?
(Er jeg fuldstændig på afveje, oder was ?!##??)

Med mange tiggende hilsener
/Lord Spejl-Blank
Avatar billede tefcke Nybegynder
24. marts 2003 - 21:52 #1
jeg bruger noget lignende:

Jeg har en category tabel som indeholder mappe strukturen:
| id | name | parent_id |

| 1 | "Forside" | NULL |
| 2 | "Programmering" | 1 |
| 3 | "PHP" | 2 |
| 4 | "HTML" | 2 |
| 5 | "CSS" | 4 |


Så har jeg en tabel med links/sider i kategorierne:
| id | cat | name | ref | clicks |

| 1 | 3 | "<Viewable name>" | "<referrence to file>" | 17 |
| 2 | 2 | "<Viewable name>" | "<referrence to file>" | 2 |
| 3 | 4 | "<Viewable name>" | "<referrence to file>" | 123 |


Så har jeg en funktion til at printe menuen ud (som en træ-struktur), en til at lave navigation bar og en til at printe linkene ud i hver category!


Håber det giver lidt inspiration! ;-)
Avatar billede hald. Nybegynder
24. marts 2003 - 22:02 #2
Yep,...det er også noget i den stil jeg har tænkt mig at gøre det.

Men jeg kunne vel ikke, sådan rent hypotetisk, lokke scriptet ud af dig, vel ?

Stort colgate smil
Hald ;o)
Avatar billede tefcke Nybegynder
24. marts 2003 - 22:52 #3
Tjoo, men det ser nok mega syret ud, da jeg ikke har været så flittig med kommentarerne :D

So, here goes!
++++++++++++++++++++
filname - buildmenu.php

<?
/*
* $_CONFIG er et array som indeholder alle mulige
* configurationer til hele siden, f.eks. farver
* tekst størrelser osv. den er global for hele siden!
*
* Dessuden bruger jeg min egen database klasse, hvor
* objektet ligeledes er global for hele siden, da den
* indsamler statestik SQL forspørgelser!
*/
function buildMenu( $DIRS )
{

  global $_CONFIG;

  if ( is_array($DIRS) ) {

    function parseDirs( $DIRS, $INDENT = 0, $URL = "." )
    {
      global $dbObj, $_CONFIG;
      foreach ( $DIRS as $A_DIR ) {
?>
<table border="0" width="100%" bgcolor="<?=$_CONFIG['MENU_BACKGROUND_COLOR_SUBJECT'];?>" cellspacing="0" cellpadding="0" class="borderSides">
<tr>
  <td>

  <table cellspacing="0" cellpadding="0" class="menuSubject">
  <tr>
    <td width="<?=$INDENT;?>"><br /></td>
    <td><i><a href="<?=$URL."/".strtolower(preg_replace("/( )/", "_", $A_DIR['name']));?>" class="subjectLink"><?=$A_DIR['name'];?></a></i></td>
  </tr>
<?
        $SUB_DIRS = $dbObj->get("SELECT ID, name, parent_dir FROM category WHERE parent_dir = {$A_DIR['ID']}");
        $CURRENT_DIR = strtolower(preg_replace("/( )/", "_", $A_DIR['name']));
        $NEXT_URL = $URL."/".$CURRENT_DIR;
        if ( is_array($SUB_DIRS) ) {
          $NEXT_INDENT_LEVEL = $INDENT + 15;
?>
  </table>

  </td>
</tr>
</table>
<?
          parseDirs( $SUB_DIRS, $NEXT_INDENT_LEVEL, $NEXT_URL );
        } else {
          $FILES_IN_DIR = $dbObj->get("SELECT ID, name, ref, clicks FROM links WHERE cat = {$A_DIR['ID']}");
?>
  </table>

  </td>
</tr>
</table>
<?
          if ( is_array($FILES_IN_DIR) ) {
            $NEXT_INDENT_LEVEL = $INDENT + 15;
?>
<table border="0" width="100%" bgcolor="<?=$_CONFIG['MENU_BACKGROUND_COLOR_ITEM'];?>" cellspacing="0" cellpadding="0" class="borderAll">
<tr>
  <td>

  <table cellspacing="0" cellpadding="0" class="menuItem">
<?
            foreach ( $FILES_IN_DIR as $A_FILE ) {
?>
  <tr>
    <td width="<?=$NEXT_INDENT_LEVEL;?>"><br /></td>
    <td><a href="<?=$URL."/".$CURRENT_DIR."/".$A_FILE['ref']."?ID=".$A_FILE['ID'];?>" class="menuItemLink"><?=$A_FILE['name'];?></a> [ <?=$A_FILE['clicks'];?> hits ]</td>
  </tr>
<?
            }
?>
  </table>

  </td>
</tr>
</table>
<?
          }
        }
      }

    }
    /* Start Parsing Dirs */
    parseDirs( $DIRS );

  } else {
?>
<table border="0" width="100%" bgcolor="<?=$_CONFIG['MENU_BACKGROUND_COLOR_SUBJECT'];?>" cellspacing="0" cellpadding="0">
<tr class="menuSubject">
  <td class="borderSidesBottom"><b>No menu has been created yet</b></td>
</tr>
</table>
<?
  }

}
?>



Jeg kan desværre ikke poste koden til database objektet, men jeg kan vise dig nogenlunde hvordan data hevet ud af databasen er repræsenteret!

  function get($QUERY)
  {
      $resultFromQuery = mysql_query($QUERY);
      while($row = mysql_fetch_array($resultFromQuery)) {
        $resultArray[] = $row;
      }
      if (isset($resultArray)) {
        return $resultArray;
      } else {
        return FALSE;
      }
  }

returntype er så et multideminsionalt array som kunne se ud som flg.:
Array
(
    [0] => Array
        (
            [0] => 1
            [ID] => 1
            [1] => Info
            [name] => Info
            [2] =>
            [parent_dir] =>
        )

    [1] => Array
        (
            [0] => 2
            [ID] => 2
            [1] => Artikler
            [name] => Artikler
            [2] =>
            [parent_dir] =>
        )

    [2] => Array
        (
            [0] => 3
            [ID] => 3
            [1] => Tutorials
            [name] => Tutorials
            [2] =>
            [parent_dir] =>
        )

    [3] => Array
        (
            [0] => 4
            [ID] => 4
            [1] => PHP
            [name] => PHP
            [2] => 3
            [parent_dir] => 3
        )

)



Jeg ved det virker fantastisk uversueligt og, men jeg har en masse standard klasser og funktioner jeg har lavet i årenes løb, som jeg sidder og hiver på, hver gang jeg laver noget!

Jeg havde faktisk tænkt mig at lave den menu funktion offentlig, men jeg har ikke haft sindsyg meget tid på det seneste, så den har været lidt på stand by!

Jeg kan se at jeg ikke har fået lavet den funktion til at lave en navigation menu endnu, men det er vel bare at tage den side man er på (smid i array), finde id til dens parent_id (smid i array) rekursivt indtil parent_id er NULL. Flippe arrayet og gennmløb alle dets elementer!


Jeg håber sgu du kan finde hoved og hale i det!
(Skulle måske lige nævne hvordan man sætter det hele i gang :-)

<?
// Get 'Basis Dirs' (parent_dir = NULL)
$basis_dirs = $dbObj->get("SELECT ID, name, parent_dir FROM category WHERE parent_dir IS NULL ORDER BY ID");
// Call function to build menu!
buildMenu($basis_dirs)
?>
Avatar billede hald. Nybegynder
24. marts 2003 - 23:29 #4
Takker mange gange (og ydmygt) for din hjælp, tefcke - det var lige hvad jeg havde brug for ;o)
(Går dog først i krig med det engang imorgen)!

Smider du lige et svar, så vi kan lukke spørgsmålet...



Ps.
Du skal da forresten være mere end velkommen til at poste din navigations-metode, når du engang får den bisket færdig - om ikke andet så bare så jeg kan sammenligne med min egen rekursive lille tingest.

/Hald
Avatar billede tefcke Nybegynder
25. marts 2003 - 01:58 #5
ja, det skal jeg nok, når den er færdig ;)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester