Avatar billede synonymer Nybegynder
27. maj 2010 - 22:08 Der er 15 kommentarer og
1 løsning

Subpages i navigations der hentes fra MySQL db

Hej alle!

jeg måtte oprette en ny bruger da det er ved at være en menneske alder jeg sidst har været herinde.

Here goes:


Jeg har en funktion der udskriver en ganske enkelt HTML menu med en løkke:

$result = mysql_query("SELECT * FROM sider ORDER BY prio ASC")or die(mysql_error()); 
    while($row = mysql_fetch_array($result)){
   
        echo '<li><a href="'.$url.'">'.$row['title'].'</a></li>';   
       
    }

-- hvis nogle af variablerne ikke giver mening, er det fordi jeg har fjernet ligegyldig fyld-kode --


Der hvor jeg går i stå er når jeg gerne vil hente en underpunkt til det menu punkt der hentes.

HTMLen ser således ud:

<li><a href="#hovedpunkt">Hovedpunkt</a> // punktet der blev hentet i løkken
                <ul>
                    <li><a href="#underpunkt">Underpunkt</a></li>
                </ul>
            </li>


Hvordan henter jeg underpunktet, i den løkke jeg har stående ovenfor?

Hver side har en felt i DBen der hedder 'parent', hvor 'parent' er id'et på, ja, parent siden.


På forhånd tak :-)
Avatar billede synonymer Nybegynder
27. maj 2010 - 22:10 #1
PS. Jeg har søgt efter lignende problemstillinger uden held. Ved du tilfældigvis, eller er du bedre end mig til at søge, vil jeg blive lige så glad for et link. :-)
Avatar billede xicrow Nybegynder
27. maj 2010 - 22:32 #2
Hvilken løsning du skal bruge, kommer nok an på hvor mange niveauer din menu er/kan være i.

Min løsning til en menu i 2 niveauer er således:

<?php
// Array to hold the menu
$mainmenu = array();

// Get all menu-items from DB
$sql = '
select *
from menus
order by parent_id asc, weight asc;';
$db->query($sql);

// Loop through results, if any
if ($db->num_rows()){
    while ($row = $db->fetch_object()){
        // If no parent
        if ($row->parent_id == 0){
            // Create as parent in the menu array
            $mainmenu[$row->id] = array(
                'title'        =>    $row->title,
                'url'        =>    $row->url
            );
        }
        else{
            // Create as child of the parent in the menu array
            if (!isset($mainmenu[$row->parent_id]['submenu'])){
                $mainmenu[$row->parent_id]['submenu'] = array();
            }
            $mainmenu[$row->parent_id]['submenu'][$row->id] = array(
                'title'        =>    $row->title,
                'url'        =>    $row->url
            );
        }
    }
}

// Dump mainmenu
echo '<pre>'.print_r($mainmenu, true).'</pre>';
?>

Du burde nemt kunne omskrive det til at fungere i dit script, og så kan du hurtigt tjekke resultatet i bunden.

Håber du kan bruge det til noget, om ikke andet så at komme videre.

/xicrow
Avatar billede synonymer Nybegynder
27. maj 2010 - 22:37 #3
Tak for det! To levels er meget fint.

Jeg ser om jeg ikke kan bruge det - eller i hvert fald prøver mig frem.
Avatar billede showsource Seniormester
28. maj 2010 - 03:08 #4
Avatar billede synonymer Nybegynder
29. maj 2010 - 12:40 #5
Jeg har forsøgt mig med dette:

<?php
// Array to hold the menu
$mainmenu = array();

// Get all menu-items from DB
$sql = '
select *
from menus
order by parent_id asc, weight asc;';
$db->query($sql);

// Loop through results, if any
if ($db->num_rows()){
    while ($row = $db->fetch_object()){
        // If no parent
        if ($row->parent == 0){
            // Create as parent in the menu array
            $mainmenu[$row->id] = array(
                'title'        =>    $row->title,
                'url'        =>    $row->url
            );
        }
        else{
            // Create as child of the parent in the menu array
            if (!isset($mainmenu[$row->parent]['submenu'])){
                $mainmenu[$row->parent]['submenu'] = array();
            }
            $mainmenu[$row->parent]['submenu'][$row->id] = array(
                'title'        =>    $row->title,
                'url'        =>    $row->url
            );
        }
    }
}

// Dump mainmenu
echo '<pre>'.print_r($mainmenu, true).'</pre>';
?>


Men jeg må indrømme at jeg ikke er nok inde i det, og jeg ved heller ikke helt hvordan 'submenu' skal forstås.
Avatar billede xicrow Nybegynder
29. maj 2010 - 16:04 #6
Den tabel jeg bruger til min menu ser ca sådan her ud:

----------------------------------------------------------
| id | parent_id | title        | url          | weight |
----------------------------------------------------------
| 1  | 0        | Hovedmenu 1  | /hovedmenu-1/ | 0      |
| 2  | 1        | Undermenu 1  | /undermenu-1/ | 0      |
| 3  | 1        | Undermenu 2  | /undermenu-2/ | 1      |
| 4  | 0        | Hovedmenu 2  | /hovedmenu-2/ | 1      |
| 5  | 4        | Undermenu 1  | /undermenu-1/ | 0      |
| 6  | 4        | Undermenu 2  | /undermenu-2/ | 1      |
----------------------------------------------------------

Ud fra det, vil ovenstående kode resulterer i et array lignende:

<?php
$mainmenu = array(
  1 => array(
    'title' => 'Hovedmenu 1',
    'url' => '/hovedmenu-1/'
    'submenu' => array(
      2 = array(
        'title' => 'Undermenu 1',
        'url' => '/undermenu-1/'
      ),
      3 = array(
        'title' => 'Undermenu 2',
        'url' => '/undermenu-2/'
      )
    )
  ),
  4 => array(
    'title' => 'Hovedmenu 2',
    'url' => '/hovedmenu-2/'
    'submenu' => array(
      5 = array(
        'title' => 'Undermenu 1',
        'url' => '/undermenu-1/'
      ),
      6 = array(
        'title' => 'Undermenu 2',
        'url' => '/undermenu-2/'
      )
    )
  ),
);
?>

Derefter kan du så (der hvor du gerne vil vise din menu), blot loope igennem $mainmenu-array'et:

<?php
// Loop igennem "hoved"-menupunkter
foreach ($mainmenu as $menu){
  // Vis "hoved"-menupunktet
  echo '<a href="'.$menu['url'].'">'.$menu['title'].'</a>';
  // Tjek om der er "under"-menupunkter
  if (isset($menu['submenu']) && count($menu['submenu'])){
    // Loop igennem "under"-menupunkter
    foreach ($menu['submenu'] as $submenu){
      // Vis "under"-menupunktet
      echo '<a href="'.$submenu['url'].'">'.$submenu['title'].'</a>';
    }
  }
}
?>

Dog kunne jeg godt forestille mig at du vil have udskrevet dig menu på en anderledes måde, men det vil jeg lade dig om.

Hvis du stadig ikke helt er med, så må du gerne uddybe lidt hvad det er du er i tvivl om / ikke helt forstår, eventuelt hvilke fejl du får, hvis du får nogen. Eller komme med det kode du har fået strikket sammen.

/xicrow
Avatar billede synonymer Nybegynder
30. maj 2010 - 14:52 #7
Jeg har forsøgt at sætte din kode ind, for lige at køre den igennem. Men jeg får denne fejl:

Parse error: syntax error, unexpected T_CONSTANT_ENCAPSED_STRING, expecting ')' in -sti- on line 5

Line 5 svarer til:

'submenu' => array(



Hvad er det jeg overser? Jeg vil da mene jeg bare kan kunne den igennem med den løkke du postede.. men nej.
Avatar billede xicrow Nybegynder
30. maj 2010 - 17:15 #8
Prøv lige at vise den kode du har nu.

Så vidt jeg lige kan se får du en fejl i det her:

<?php
$mainmenu = array(
  1 => array(
    'title' => 'Hovedmenu 1',
    'url' => '/hovedmenu-1/'
    'submenu' => array(
      2 = array(
        'title' => 'Undermenu 1',
        'url' => '/undermenu-1/'
      ),
      3 = array(
        'title' => 'Undermenu 2',
        'url' => '/undermenu-2/'
      )
    )
  ),
  4 => array(
    'title' => 'Hovedmenu 2',
    'url' => '/hovedmenu-2/'
    'submenu' => array(
      5 = array(
        'title' => 'Undermenu 1',
        'url' => '/undermenu-1/'
      ),
      6 = array(
        'title' => 'Undermenu 2',
        'url' => '/undermenu-2/'
      )
    )
  ),
);
?>

Som blot var et eksempel på hvordan dit array kunne se ud, efter du havde hentet den ud af databasen...

Det jeg gerne vil vide, er om denne stump kode fungere, efter du har omskrevet den til din tabel osv, eller om den fejler, samt hvilke fejl du får.

<?php
// Connect to the database
mysql_connect($host, $user, $pass);
mysql_select_db($database);

// Array to hold the menu
$mainmenu = array();

// Get all menu-items from DB
$sql = '
select *
from menus
order by parent_id asc, weight asc;';
$query = mysql_query($sql);

// Loop through results, if any
if (mysql_num_rows($query)){
    while ($row = mysql_fetch_object($query)){
        // If no parent
        if ($row->parent == 0){
            // Create as parent in the menu array
            $mainmenu[$row->id] = array(
                'title'    =>    $row->title,
                'url'    =>    $row->url
            );
        }
        else{
            // Create as child of the parent in the menu array
            if (!isset($mainmenu[$row->parent]['submenu'])){
                $mainmenu[$row->parent]['submenu'] = array();
            }
            $mainmenu[$row->parent]['submenu'][$row->id] = array(
                'title'    =>    $row->title,
                'url'    =>    $row->url
            );
        }
    }
}

// Dump mainmenu
echo '<pre>'.print_r($mainmenu, true).'</pre>';

// Loop through main menu
foreach ($mainmenu as $menu){
    // Show main menu
    echo '<a href="'.$menu['url'].'">'.$menu['title'].'</a>';
    // Check for sub menus
    if (isset($menu['submenu']) && count($menu['submenu'])){
        // Loop through sub menus
        foreach ($menu['submenu'] as $submenu){
            // Show sub menu
            echo '<a href="'.$submenu['url'].'">'.$submenu['title'].'</a>';
        }
    }
}
?>

/xicrow
Avatar billede synonymer Nybegynder
30. maj 2010 - 20:44 #9
Sådan, nu var den der!



Hvis det har interesse, ser min tabel således ud:

------------------------------------------------
| id | parent_id | title        | url          |
------------------------------------------------
| 1  | 0        | Hovedmenu 1  | /hovedmenu-1/ |
| 2  | 0        | Hovedmenu 2  | /hovedmenu-1/ |
| 3  | 0        | Hovedmenu 3  | /hovedmenu-2/ |
| 4  | 0        | Hovedmenu 4  | /hovedmenu-2/ |
| 5  | 0        | Hovedmenu 5  | /hovedmenu-1/ |
| 6  | 0        | Hovedmenu 6  | /hovedmenu-2/ |
| 7  | 3        | Undermenu 1  | /undermenu-2/ |
------------------------------------------------

Og koden jeg bruger nu er:

// Array to hold the menu
$mainmenu = array();

// Get all menu-items from DB
$sql = '
select *
from sider
order by parent asc;';
$query = mysql_query($sql);

// Loop through results, if any
if (mysql_num_rows($query)){
    while ($row = mysql_fetch_object($query)){
        // If no parent
        if ($row->parent == 0){
            // Create as parent in the menu array
            $mainmenu[$row->id] = array(
                'title'    =>    $row->title,
                'url'    =>    $row->url
            );
        }
        else{
            // Create as child of the parent in the menu array
            if (!isset($mainmenu[$row->parent]['submenu'])){
                $mainmenu[$row->parent]['submenu'] = array();
            }
            $mainmenu[$row->parent]['submenu'][$row->id] = array(
                'title'    =>    $row->title,
                'url'    =>    $row->url
            );
        }
    }
}

// Dump mainmenu
//echo '<pre>'.print_r($mainmenu, true).'</pre>';

// Loop through main menu
foreach ($mainmenu as $menu){
    // Show main menu
    echo '<li><a href="'.$menu['url'].'">'.$menu['title'].'</a>';
    // Check for sub menus
    if (isset($menu['submenu']) && count($menu['submenu'])){
        // Loop through sub menus
        echo '<ul>';
        foreach ($menu['submenu'] as $submenu){
            // Show sub menu
            echo '<li><a href="'.$submenu['url'].'">'.$submenu['title'].'</a></li>';
        }
        echo '</ul>';
    }
    echo '</li>';
}

---------------------------------------------------


Du skal have tusinde tak for hjælpen! :-)
Avatar billede xicrow Nybegynder
30. maj 2010 - 21:02 #10
Velbekomme. Og et svar får du her :)

/xicrow
Avatar billede synonymer Nybegynder
30. maj 2010 - 21:44 #11
Hvorfor er det i øvrigt man ikke bare kan bruge et par while-løkker for hver 'level' der er i menuen. Jeg er sikker på det er en logisk forklaring jeg overser, men jeg kan bare ikke lige regne det ud?
Avatar billede xicrow Nybegynder
30. maj 2010 - 22:21 #12
Forstår ikke helt hvad du mener ?
Avatar billede synonymer Nybegynder
30. maj 2010 - 22:28 #13
Hvis man nu kun har ét level/niveau i menuen, kan den jo hentes med en simpel while-løkke. Hvordan kan man så ikke bare smide én til while-løkke ind i den første, som henter undersiderne?
Avatar billede xicrow Nybegynder
30. maj 2010 - 22:47 #14
Det kan du skam også godt, men så ender du bare med at skulle lave en forespørgsel mere til databasen, for hvert menupunkt du har.

Altså sådan som jeg har lavet det her, så laver du én forespørgsel til databasen, og sorterer så bare resultaterne, for at bygge din menu.

Hvis man laver det som du snakker om, så skal du lave en forespørgsel for at hente menu-punkter for niveau 1, samt en forespørgsel for hvert menupunkt. Så hvis du har 10 menu-punkter i niveau 1, så bliver det til 11 forespørgelser i alt.

Og forespørgelserne vokser så kun hvis du skal have flere niveauer i din menu.

/xicrow
Avatar billede synonymer Nybegynder
01. juni 2010 - 09:52 #15
Selvfølgelig ja!
Så kan det andet andet jo faktisk du, men det er jo langt fra en holdbar løsning.

Endnu en gang tak for hjælpen :-)
Avatar billede xicrow Nybegynder
01. juni 2010 - 10:38 #16
Velbekomme
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