Creare meniu multi level cu date din baza de date

Discutii despre script-uri si coduri PHP-MySQL, precum si lucru cu XML in PHP.
Avatar utilizator
trif
Mesaje:500

Creare meniu multi level cu date din baza de date

Salut,
am si eu o problema si nu stiu cum sa o rezolv.
am un meniu pe verticala multi level si nu stiu cum sa ii dau sa le ia din bd. am asa:

Cod: Selectaţi tot

<li><a href="link">Acasa</a></li>
	<li><a href="#">Pantaloni</a>
		<ul>
			 <li><a href="#">Scurti</a></li>
			 <li><a href="#">Lungi</a></li>
			 <li><a href="#">Marime</a>
				<ul>
					<li><a href="#">SX</a></li>
					<li><a href="#">S</a></li>
					<li><a href="#">M</a></li>
				</ul>
			</li>
			 <li><a href="#">Culoare</a></li>
		</ul>
	</li>
	<li><a href="#">Bluza</a>
si arata asa:

Cod: Selectaţi tot

Acasa --> menu principal level 1
Pantaloni [-] 
    Scurti --> meniu secundar level 2
    Lungi
    Marime [-]
        XS --> meniu secundar level 3
        S
        M
Bluza
Cum as putea face asa.
Multmesc anticipat. Cu stima Trif
M-am hotarat!
De ce sa fiu trist?
Oricum nu intereseaza pe nimeni...!
Mai bine sunt fericit si ii enervez pe toti cu fericirea mea!
http://www.cantaricrestine.ro
---> cu stima Trif

MarPlo Mesaje:4343
Ce ai incercat in php si ce nu iese?
- Vezi daca iti e de folos acest script: Multi-Level Menu Creator. Poti crea meniul din panoul de editare, apoi iti da codul pentru a salva datele in baza de date (sau in fisier TXT), precum si cod php de afisare a meniului, folosind clasa din script (plus HTML - CSS).

- Sau poti incerca in codul php functia de la: Recursive function to create Multi-Level Menu in PHP .

trif Mesaje:500
Salut
am facut select-ul din bd
capul de tabel este:

Cod: Selectaţi tot

 id 	menu_name 	menu_link 	parent_id 

Cod: Selectaţi tot

while ($row = $result->fetch_assoc() ) {
            if ($row['Count'] > 0) {
                echo "<li><a href='" . $row['menu_link'] . "'>" . $row['menu_name'] . "</a>";
                display_children($row['id'], $level + 1);
                echo "</li>";
                }
            elseif ($row['Count']==0) {
                echo "<li><a href='" . $row['menu_link'] . "'>" . $row['manu_name'] . "</a></li>";
                } 
            else;
        }
        echo "</ul>";
    } 
mie imi trebuie cu ce am zis in mesajul de mai sus.
Acest meniu se deschide pe [+] si se inchide [-] si asa imi trebuie pt ca asa este formatul.
Ceea nu inteleg cum sa fac este cum selectez din bd meniul principal level1 si in meniul principal level1 sa fie meniul secundar level2 si in meniul secundar sa fie meniul secundar level 3.
Am mare nevoie de o rezolvare.
Astept raspuns.
Multumesc anticipat.
Cu stima Trif
M-am hotarat!
De ce sa fiu trist?
Oricum nu intereseaza pe nimeni...!
Mai bine sunt fericit si ii enervez pe toti cu fericirea mea!
http://www.cantaricrestine.ro
---> cu stima Trif

MarPlo Mesaje:4343
Ca solutie ar fi cu functia recursiva multilevelMenu() din pagina data mai sus; dar problema e sa adaugi intai datele link-urilor corect in 2 array, bazate pe id-ul lor.
Un array cu numele si adresa de link associate la fiecare id.
Si un alt array sa contina id-urile parinte asociate (sau cheie index) la un array cu id-urile copil / al link-urilor directe din acea categorie
Sa fie 2 array ca acestea:

Cod: Selectaţi tot

// array cu datele (nume, adresa) pt fiecare link din meniu
$dete_menu= array (
  0 => array ('lname' => 'Root', 'lurl' => '#'),
  1 => array ('lname' => 'Acasa', 'lurl' => 'link'),
  2 => array ('lname' => 'Pantaloni', 'lurl' => '#'),
  3 => array ('lname' => 'Bluza', 'lurl' => '#'),
  4 => array ('lname' => 'Scurti', 'lurl' => '#'),
  5 => array ('lname' => 'Lungi', 'lurl' => '#'),
  6 => array ('lname' => 'Marime', 'lurl' => '#'),
  7 => array ('lname' => 'SX', 'lurl' => '#'),
  8 => array ('lname' => 'S', 'lurl' => '#'),
  9 => array ('lname' => 'M', 'lurl' => '#'),
  10 => array ('lname' => 'Culoare', 'lurl' => '#')
);

// array cu id-urile parinte si copii lor (categoriile si sub-categorii directe din ele)
$ierarhie_menu = array (
  0 => array (1, 2, 3),         // in root sunt link-urile cu id: 1, 2, 3
  2 => array (4, 5, 6, 10),       // link-urile din meniul cu id=2
  6 => array (7, 8, 9),       // link-urile din meniul cu id=6
);
Daca a fost creat tabelul in baza de date astfel incat sa ai asociate, sau referinta, fiecare id al link-ului in care parinte este (0 fiind Root), incearca asa:

Cod: Selectaţi tot

// recursive function to create multilevel menu list, $parentId 0 is the Root
// From: https://coursesweb.net/php-mysql/
function multilevelMenu($parentId, $ctgLists, $ctgData) {
  $html = '';       // stores and returns the html code with Menu lists

  // if parent item with child IDs in ctgLists
  if(isset($ctgLists[$parentId])) {
    $html = '<ul>';      // open UL

    // traverses the array with child IDs of current parent, and adds them in LI tags, with their data from $ctgData
    foreach ($ctgLists[$parentId] as $childId) {
      // define CSS class in anchors, useful to be used in CSS style to design the menu
      if($parentId == 0) $clsa = ' class="firsrli"';       // class for anchors in main /first categories
      else if(isset($ctgLists[$childId])) $clsa = ' class="litems"';       // class for anchors in lists with childs
      else $clsa = '';

      // open LI
      $html .= '<li><a href="'. $ctgData[$childId]['lurl'] .'" title="'. $ctgData[$childId]['lname'] .'"'. $clsa .'>'. $ctgData[$childId]['lname'] .'</a>';

      $html .= multilevelMenu($childId, $ctgLists, $ctgData);     // re-calls the function to find parent with child-items recursively

      $html .= '</li>';      // close LI
    }
    $html .= '</ul>';       // close UL
  }

  return $html;
}

// array cu datele (nume, adresa) pt fiecare link din meniu
$date_menu = array(0 => array('lname' => 'Root', 'lurl' => '#'));

// array cu id-urile parinte si copii lor (categoriile si sub-categorii din ele)
$ierarhie_menu = array ();

/** Aici Conectare la baza de date si efectuare Select **/

// Parcurge datele selectate si le adauga in cele 2 array, pt apelare la functia multilevelMenu()
while ($row = $result->fetch_assoc() ) {
  if (count($row) > 0) {
    $date_menu[$row['id']] = array('lname'=>$row['menu_name'], 'lurl'=>$row['menu_link']);
    if(isset($ierarhie_menu[$row['parent_id']])) $ierarhie_menu[$row['parent_id']][] = $row['id'];
    else $ierarhie_menu[$row['parent_id']] = array($row['id']);
  }
}

echo '<div id="m_menu">'. multilevelMenu(0, $ierarhie_menu, $date_menu) .'</div>';
- Daca sunt nepotriviri cu ce ai in baza de date, sau cu ce rezulta, mai modifici si testezi separat in browser pana iese cum vrei.

trif Mesaje:500
Buna ziua,
Multumesc pentru raspuns.
Mai am o problema la acest script:
nu se face bine legaturile, adica:
articolele se fac automat si primesc un id si se selecteaza din bd pagina.php?id_a=1 (sau alt nr) si daca pun

Cod: Selectaţi tot

$html .= '<li><a href="index.php?id_a='. $ctgData[$childId]['lurl'] .'" 
intervine problema, ca meniurile principale/secundare care deschid submeniurile nu trebuie sa aibe link dar ma trimite pe index.php?id_a=# pentru ca in bd au #.
Cum pot sa il modific scriptul ca atunci cand este # sa nu ma trimita nici unde ci sa ramana pe pagina si sa imi deschida submeniul dorit.
Multumesc atincipat.
Cu stima Trif
M-am hotarat!
De ce sa fiu trist?
Oricum nu intereseaza pe nimeni...!
Mai bine sunt fericit si ii enervez pe toti cu fericirea mea!
http://www.cantaricrestine.ro
---> cu stima Trif

MarPlo Mesaje:4343
Ai putea pune un tag <span> in locul tag-ului <a> cu link "#". Pentru asta, se inlocuieste aceasta linie de cod din functia multilevelMenu():

Cod: Selectaţi tot

$html .= '<li><a href="'. $ctgData[$childId]['lurl'] .'" title="'. $ctgData[$childId]['lname'] .'"'. $clsa .'>'. $ctgData[$childId]['lname'] .'</a>';
Cu acest cod:

Cod: Selectaţi tot

if($ctgData[$childId]['lurl'] == '#') $html .= '<li><span>'. $ctgData[$childId]['lname'] .'</span>';
else $html .= '<li><a href="'. $ctgData[$childId]['lurl'] .'" title="'. $ctgData[$childId]['lname'] .'"'. $clsa .'>'. $ctgData[$childId]['lname'] .'</a>';
Iar ca sa se deschida submeniul din acea lista, cand se da clic, se poate folosi acest script JavaScript, adaugat dupa codul cu meniul (meniul aflandu-se intr-un Div cu id="m_menu").

Cod: Selectaţi tot

<script type="text/javascript">
var lisp = document.querySelectorAll('li span');
var nr_lisp = lisp.length;
if(nr_lisp > 0) {
  for(var i=0; i<nr_lisp; i++) {
    if(lisp[i].parentNode.querySelector('ul')) lisp[i].parentNode.querySelector('ul').style.display = 'none';
    lisp[i].onclick = function() {
      if(this.parentNode.querySelector('ul')) this.parentNode.querySelector('ul').style.display = 'block';
    }
  }
}
</script>

trif Mesaje:500
Salut,
Multumesc de raspuns.
Inlocuirea codului cu ce mi-ai dat tu nu a mers, ci se vedea aiurea DAR am modificat ceea ce mi-ai zis sa fac cu asta:

Cod: Selectaţi tot

if($ctgData[$childId]['lurl'] == "#") 
		  $html .= '<li><a href="'. $ctgData[$childId]['lurl'] .'" title="'. $ctgData[$childId]['lname'] .'"'. $clsa .'>'. $ctgData[$childId]['lname'] .'</a>';
		  else 
		  $html .= '<li><a href="index.php?id_a='. $ctgData[$childId]['lurl'] .'#" title="'. $ctgData[$childId]['lname'] .'"'. $clsa .'>'. $ctgData[$childId]['lname'] .'</a>';

Nu am folosit span ci am folosit acelasi link dar fara trimitere.
Cum as putea sa tina minte indiferent daca ma duc la pagina noua sau nu. Mie momentan se inchide daca ii dau pe o anume pagina si trebuie iara sa selectez din meniu toate cele pana ajung la destinatie.
Multumesc anticipat.
Cu stima Trif
M-am hotarat!
De ce sa fiu trist?
Oricum nu intereseaza pe nimeni...!
Mai bine sunt fericit si ii enervez pe toti cu fericirea mea!
http://www.cantaricrestine.ro
---> cu stima Trif

Subiecte similare