Creare meniu in site cu php

Aici prezentati probleme, intrebari, sau orice subiecte legate de scripturi si tutoriale de pe site.
dim
Mesaje: 61

Creare meniu in site cu php

Salut
Am incercat sa pun icons pe primul nivel al meniului din tutorialu tau: Creare site de la zero si nu reusesc sa il adaug pe butonele care deschid sub categoria. poti sa ma ajuti cu un sfat?
Si daca ai ceva asemanator si cu al 3 nivel de submeniu?

MarPlo Mesaje: 4343
Salut,
Nu ma mai ocup cu programare website; totusi, posteaza ce ai incercat si am sa vad daca pot ajuta.

Cat despre meniu de linkuri cu mai multe nivele, pe site e un script ajax de creare multi-level menu la pagina:
marplo.net/php-mysql/creare-meniu-multiple-nivele-script-ajax

Si am gasit ceva pe internet la adresa:
Multi-Level Menu

dim Mesaje: 61
La butoanele fara sub meniu le afiseza la restu imi da eroare, uite cam asta am facut:

Cod: Selectaţi tot

<?php
ini_set('display_errors',1);
error_reporting(E_ALL);

$meniu = '<li id="menu-administrtor"><a href="index2.php"><i class="fa-solid fa-user-gear"></i> Panou General</a></li>';

$pags['category'] = [
 'titl'     => 'catalog_&filme desene',
 'desc'     => 'Descrierea paginii catalog',
 'icon'     =>  'fas fa-home',
];

$pags['system'] = array(
   'titl'     => 'system',
   'desc'     => 'Descrierea paginii system',
   'icon'     =>  'fas  fa-sitemap',
  );

  $pags['poze'] = array( 
   'familie'=>array( 
       'titl'=>'familie',
       'desc'=>'Descriere pt. pagina Poze Familie',  
       ),
   'prieteni'=>array(
      'titl'=>'prieteni',
      'desc'=>'Descriere pt. pagina Poze Prieteni2',
   ),
   'natura'=>array(
      'titl'=>'natura',
      'desc'=>'Descriere pt. pagina Poze Natura',
      ),
   'icon'     =>  'fas fa-image',
  );

  $pags['media'] = array(
    'filme'=>array(   
       'titl'=>'filme',
       'desc'=>'Descriere pt. pagina Poze Familie',
        ),
     'poze'=>array(
        'titl'=>'poze',
        'desc'=>'Descriere pt. pagina Poze Prieteni',
        ),
     'albume'=>array(
         'titl'=>'albume',
         'desc'=>'Descriere pt. pagina Poze Natura',
          ),
   
     'icon'=>  'fas fa-home',
  );

  $pags['stil'] = array(
   'titl'     => 'stil',
   'desc'     => 'Descrierea paginii stil',
   'icon'     =>  'fas fa-home'
  );

foreach($pags as $kei=>$pagini) {
    if (isset($pags[$kei]['titl'])) {
       $link = '<a href="index2.php?route='. urlencode($kei).' "title="'. $pagini['titl'].'"><i class="'. $pagini['icon'].'"></i>'. str_replace('_', ' ', ucfirst($kei)). '</a>';
	    $meniu .= '<li id="menu-'. $pagini['titl'].'">'. $link. "</li>\r\n";
      }
    else {
       $meniu .= '<li id="menu-'. ucfirst($kei).'"><a href="#collapse-'. ucfirst($kei).'" data-bs-toggle="collapse" class="parent collapsed"><i class="'. $pagini['icon'].'"></i>'. str_replace('_', ' ', ucfirst($kei)). '</a>
                  <ul id="collapse-'. ucfirst($kei).'" class="collapse">';
  
	foreach($pagini as $kei2=>$pagini2) {
     $link = '<a href="index2.php?route='. urlencode($kei). '&amp;sm='. urlencode($kei2).'" title="'. $pagini2['titl']. '">'. str_replace('_', ' ', ucfirst($kei2)). '</a>';
	 $meniu .= '<li>'.$link."</li>\r\n";
	}
	$meniu .= '</ul></li>';	
 }
}
$meniu .= '</ul>';
 /*** Prelucrarea datelor primite prin GET ***/

if (isset($_GET['route']) && isset($pags[urldecode(trim($_GET['route']))])) {
    $pg = urldecode(trim($_GET['route']));
    $obj = $pags[$pg];
   
    if (isset($_GET['sm']) && isset($obj[urldecode(trim($_GET['sm']))])) {
    $pg = urldecode(trim($_GET['sm']));
    $obj = $obj[$pg];
    }

    $titlu = $obj['titl'];
    $desc  = $obj['desc'];
   }  
si ma gandeam daca pot sa fac si al 3 nivel introducand inca un array ? adica ceva de genul asta:

Cod: Selectaţi tot

  $pags['media'] = array(
        'filme'=>array(
                  'youtube'=>array(
                     'titl'=>'youtube',
                     'desc'=>'Descriere pt. pagina youtube',
                  ),
                 'Instagram'=>array(
                     'titl'=>'Instagram',
                     'desc'=>'Descriere pt. pagina Instagram',
                  ),
                  'hbo go'=>array(
                     'titl'=>hbo go',
                     'desc'=>'Descriere pt. pagina hbo go',
                  ),
           ),

      'poze'=>array(
      'titl'=>'poze',
      'desc'=>'Descriere pt. pagina Poze Prieteni',
      ),
     
      'albume'=>array(
      'titl'=>'albume',
      'desc'=>'Descriere pt. pagina Poze Natura',
      ),
  );

MarPlo Mesaje: 4343
Incearca urmatorul script. Are meniu cu 3 nivele (Aici la: Poze->Natura) si icon la fiecare link.

- Fisierul admin.php

Cod: Selectaţi tot

<?php
// Datele initiale pt. HEAD ale pagini "index"
$titlu = 'Titlul paginii index';
$desc = 'Descrierea pentru pagina index';
$keys = 'cuvnte, cheie, pagina, index';

//Pt icons in meniu
$icons =[
 'social'=>'fas so-image',
 'facebook'=>'fas fb-image',
 'youtobe'=>'fas yo-image',
 'poze'=>'fas po-image',
 'natura'=>'fas na-image',
 'pasari'=>'fas pa-image',
 'animale'=>'fas an-image',
 'familie'=>'fas fa-image',
 'prieteni'=>'fas pr-image',
 'contact'=>'fas co-image'
];

/*** Matricea cu datele despre paginile adaugate in site, care apar in "context" ***/

// Este formata din numele paginilor ca si cheie principala
// Fiecare contine un array cu: Titlul paginii, Descriere si Cuvinte-cheie (pt. sectiunea HEAD)
// Sau pt. submeniuri, cu alte array imbricate, ce contin datele de mai sus (cum e la 'poze')

$pags['social'] =[
 'facebook'=>[
 'titl'=>'Titlul pt. pagina Poze facebook',
 'desc'=>'Descriere pt. pagina Poze facebook',
 'keys'=>'cuvinte, cheie, poze, facebook'
 ],
 'youtobe'=>[
 'titl'=>'Titlul pt. pagina Poze youtobe',
 'desc'=>'Descriere pt. pagina Poze youtobe',
 'keys'=>'cuvinte, cheie, poze, youtobe'
 ]
];
$pags['poze'] =[
 'natura'=>[
   'pasari'=>[
     'titl'=>'Titlul paginii pasari',
     'desc'=>'Descrierea paginii pasari',
     'keys'=>'cuvinte, cheie, pasari'
   ],
   'animale'=>[
     'titl'=>'Titlul paginii animale',
     'desc'=>'Descrierea paginii animale',
     'keys'=>'cuvinte, cheie, animale'
   ]
 ],
 'familie'=>[
 'titl'=>'Titlul pt. pagina Poze Familie',
 'desc'=>'Descriere pt. pagina Poze Familie',
 'keys'=>'cuvinte, cheie, poze, familie'
 ],
 'prieteni'=>[
 'titl'=>'Titlul pt. pagina Poze Prieteni',
 'desc'=>'Descriere pt. pagina Poze Prieteni',
 'keys'=>'cuvinte, cheie, poze, prieteni'
 ]
];
$pags['contact'] =[
 'titl'=>'Titlul paginii Contact',
 'desc'=>'Descrierea paginii Contact',
 'keys'=>'cuvinte, cheie, contact'
];

//Returneaza tagul pt icons
function set_iconm($k){
  global $icons;
  $ic = isset($icons[$k]) ?'<i class="'. $icons[$k].'"></i>' :'';
  return $ic;
}

// Daca doriti sa adaugati alte meniuri sau submeniuri pt. alte pagini de site
// Adaugati in continuare, comform modelului de mai sus
// De asemenea, trebuie sa adaugati in dir. "pagini" fisierul ce contine contextul afisat de acel meniu
?>

- Fisierul index.php

Cod: Selectaţi tot

<?php
// Exemplu creare site cu PHP, de la https://marplo.net/
ini_set('display_errors',1);
error_reporting(E_ALL);

// Include fisierul "admin.php", in care e matricea cu datele fiecarei pagini
include('admin.php');

/*** Crearea variabilei ce contine codul HTML pt. meniu, cu paginile din matrice ***/

$meniu = '<ul><li><a href="index.php" title="Pagina principala"><i class="fas pp-image"></i>Pagina principala</a></li>';	// Initializeaza variabila pt. meniu

// Parcurge matricea cu foreach() si adauga un link in <li> pt. fiecare pagina
// Verifica daca sunt submeniuri si creaza codul HTML pt. ele
foreach($pags as $kei=>$pagini) {
 // Daca elementul are cheia 'titl', e considerat cu link direct, fara submeniu
 if (isset($pags[$kei]['titl'])) {
 // Daca e meniu direct
	// Creaza link-ul, codificat urlencode() si prima litera din nume majuscula cu ucfirst()
	$link = '<a href="index.php?id='. urlencode($kei).'" title="'. $pagini['titl']. '">'. set_iconm($kei). str_replace('_', ' ', ucfirst($kei)). '</a>';
	// Adauga link-ul in meniu
	$meniu .= '<li>'. $link. "</li>\r\n";
	}
 else {
 // Altfel e considerat cu submeniu
 $meniu .= '<li class="smeniu">'.set_iconm($kei).'<span>'. str_replace('_', ' ', ucfirst($kei)). '</span><ul>';
 // Parcurge submeniul
	foreach($pagini as $kei2=>$pagini2) {
   // Daca elementul are cheia 'titl', e considerat cu link direct, fara submeniu
   if (isset($pagini[$kei2]['titl'])) {
    // Daca e meniu direct
    // Creaza link-ul, codificat urlencode() si prima litera din nume majuscula cu ucfirst()
    $link = '<a href="index.php?id='. urlencode($kei). '&amp;sm='. urlencode($kei2).'" title="'. $pagini2['titl']. '">'. set_iconm($kei2). str_replace('_', ' ', ucfirst($kei2)). '</a>';
    // Adauga link-ul in meniu
    $meniu .= '<li>'. $link. "</li>\r\n";
    }
    else{
     // Altfel e considerat cu submeniu
     $meniu .= '<li class="smeniu2">'.set_iconm($kei2).'<span>'. str_replace('_', ' ', ucfirst($kei2)). '</span><ul>';
     // Parcurge submeniul
      foreach($pagini2 as $kei3=>$pagini3) {
       // Creaza link-ul, codificat urlencode() si prima litera din nume majuscula cu ucfirst()
       $link = '<a href="index.php?id='. urlencode($kei). '&amp;sm='. urlencode($kei2). '&amp;sm2='. urlencode($kei3).'" title="'. $pagini3['titl']. '">'. set_iconm($kei3). str_replace('_', ' ', ucfirst($kei3)). '</a>';
       // Creaza submeniul cu link-ul si numele
       $meniu .= '<li>'. $link. "</li>\r\n";
      }
      $meniu .= '</ul></li>';		// Inchide codul HTML pt. submeniu
    }
	}
	$meniu .= '</ul></li>';		// Inchide codul HTML pt. submeniu
 }
}
$meniu .= '</ul>';		// Inchide codul HTML pt. tot meniul


/*** Prelucrarea datelor primite prin GET ***/

// Verifica daca sunt primite date prin GET si daca acestea se afla in matrice
// Creaza variabilele pt. meta-tags si continutul ce va fi inclus
if (isset($_GET['id']) && isset($pags[urldecode(trim($_GET['id']))])) {
 $pg = urldecode(trim($_GET['id']));		// Numele paginii, decodificat URL, care va fi inclusa pt. continut
 $obj = $pags[$pg];		// Obiectul cu datele despre pagina

 // Daca e accesata pagina din submeniu
 if (isset($_GET['sm']) && isset($obj[urldecode(trim($_GET['sm']))])) {
  $pg = urldecode(trim($_GET['sm']));		// Numele paginii, decodificat URL, care va fi inclusa pt. continut
  $obj = $obj[$pg];
 }

 // Daca e accesata pagina din submeniu-2
 if (isset($_GET['sm2']) && isset($obj[urldecode(trim($_GET['sm2']))])) {
  $pg = urldecode(trim($_GET['sm2']));		// Numele paginii, decodificat URL, care va fi inclusa pt. continut
  $obj = $obj[$pg];
 }

 // Seteaza variabilele cu datele pt. sectiunea HEAD
 $titlu = $obj['titl'];
 $desc = $obj['desc'];
 $keys = $obj['keys'];
}
// In continuare, codul HTML in care se adauga variabilele necesare generate de PHP
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
 <title><?php echo $titlu; ?></title>
 <meta name="description" content="<?php echo $desc; ?>" />
 <meta name="keywords" content="<?php echo $keys; ?>" />
 <meta name="robots" content="index, follow" />
 <link href="grafic.css" rel="stylesheet" type="text/css" />
</head>
<body>
<!-- Start Top pagina -->
<div id="top">
 <h1>Sectiunea din top-ul paginii</h1>
 <h2>Va apare in toate paginile site-ului</h2>
</div>

<!-- Start Corp pagina -->
<div id="corp">
 <!-- Start Meniu -->
 <div id="meniu">
 <h4>Meniu</h4>
<?php echo $meniu; ?>
 </div>

 <!-- Start Context -->
 <div id="context">
<?php
 // Daca e setata o valoare pt. variabila $pg,
 // Variabila devinita cand e accesat un link din meniu
 if (isset($pg)) {
 // Include fisierul in care e continutul
  include('pagini/'.$pg.'.php');
 }
 else {
 // Daca nu e apelat vreun link din meniu
  // Afiseaza continutul dorit pt. pagina "index"
  // Il puteti afisa cu 'echo' sau sa includeti din alt fisier extern
 echo '<h3>Continut initial pentru pagina index</h3>
   <h3>Creati cu "echo" tag-urile HTML sau includeti continut din alt fisier extern,<br />
   cu include("fisier.php") sau readfile("fisier.html")</h3>';
 }
?>
 </div>
</div>

<!-- Start Subsol pagina -->
<div id="subsol">
 <h4>Continutul din subsolul paginii</h4>
 <h4>Va apare in toate paginile site-ului</h4>
</div>

</body>
</html>

- Fisierul grafic.css

Cod: Selectaţi tot

body {
 margin:0px auto;
 width:1000px;
 background-color:#e8e8fe;
 text-align:center;
}

/* Grafica pentru sectiunea Top */
#top {
 margin:2px auto;
 position:relative;
 border:1px solid #ceceda;
 background-color:#dedeee;
}

/* Grafica pentru sectiunea Corp */
#corp {
 position:relative;
 margin:2px auto;
 width:100%;
 border:1px solid #eeeefe;
 background-color:#ededfe;
 text-align:left;
}

/* Grafica pentru Meniu */
#meniu {
 float:left;
 position:relative;
 width:250px;
 margin:2px auto;
 border:1px solid #dafedf;
 background-color:#deefee;
 padding-left:5px;
}
#meniu ul {
 margin:0px;
 background-color:#cceede;
 list-style:none;
 padding:0px 0px 1px 5px;
}
#meniu ul li {
 display:block;
 position:relative;
 margin:0px;
 width:235px;
 border:1px solid silver;
 padding:2px 0px 2px 5px;
}
#meniu ul li a {
 display:block;
 margin:0px;
 width:100%;
 border:1px solid #daccfe;
}
#meniu ul li a:hover {
 background-color:#ebede0;
}
#meniu .smeniu ul, #meniu .smeniu2 ul {
 display:none;
 position:absolute;
 top:0px;
}
 #meniu li span {
 overflow:hidden;
 }
 #meniu .smeniu:hover ul:not(.smeniu2 ul), #meniu .smeniu2:hover ul {
 display:block;
 left:190px;
 z-index:12;
 }

/* Grafica pentru Context */
#context {
 min-height:200px;
 margin:0px 1px 1px 260px;
 padding:3px 5px;
}

/* Grafica pentru sectiunea Subsol */
#subsol {
 clear:both;
 position:relative;
 margin:2px auto;
 border:1px solid #ceced8;
 background-color:#ebede0;
 z-index:10;
 }

dim Mesaje: 61
Icons alea nu apre la meniul principale.
Am incrcat sa inlocuiesc:

Cod: Selectaţi tot

 else {
 // Altfel e considerat cu submeniu
 $meniu .= '<li class="smeniu"><a href="#"><span>'. str_replace('_', ' ', ucfirst($kei)). '</a></span><ul>';
 // Parcurge submeniul
  foreach($pagini as $kei2=>$pagini2) {
cu:

Cod: Selectaţi tot

 else {
 // Altfel e considerat cu submeniu
 $meniu .= '<li class="smeniu"><a href="#"><span>'. $icon_a. str_replace('_', ' ', ucfirst($kei)). '</a></span><ul>';
 // Parcurge submeniul
  foreach($pagini as $kei2=>$pagini2) {

dar in felul asta imi pune ultimul icons din sub meniu in meiulul principal

In al doilea rand linkul din sub meniuri returneaza daor pagina principala, cu un "id".

Ai vrun link sau tutorial unde pot intelege mai bine cum sa configurez si creez aceste lincuri legate de index?

MarPlo Mesaje: 4343
Am modificat codul script-ului, copie din nou continutul pentru fisierele admin.php si index.php din postarea anterioara unde sunt puse codurile fisierelor.
Incearca sa studiezi codul ca sa-l intelegi.

Un tutorial despre configurare link-uri in php nu am, dar poate iti e de folos cel de la pagina:
marplo.net/php-mysql/lucru_formulare.html

In special capitolele: 3. Utilizarea metodelor GET si POST si 5. Trimiterea de date unui script prin adresa URL

dim Mesaje: 61
Multumes pt ajutor
Este ok acum.
Din exeplul dat de tine am mai vazut ceva intersant si anume acel meniu asa zis "breadcrumb" cu ce ma selectat deja.
Ma gndeam ca il pot face automat cu css facadn dupicat la meniul existent da cred ca ingreunez codul asa?
sau cu java:

Cod: Selectaţi tot

 
 <div class="display">
    <div class="syllabus">
        <a href=" <?php echo $index; ?>"> Acasa / </a>
     </div>
  </div>
<script type="text/javascript">
   $('.topics a').on('click', function() {
      $select = $('<div class="syllabus"></div>');
      $(this).parents('li').each(function(n, li) {
          $select.prepend(' / ',$(li).children('a').clone());
      });

    $('.display').html(
      $select.prepend('<a href="<?php echo $index; ?>"> Acasa</a>'));   
})
</script>
doar ca il creaza dor pana in momentul in care nu accesez un buton cu link catre pagina
ex: poze/natura
daca apas si pe peisaj dipare tot

Subiecte similare