pcguy
Goto Top

Vom MD Array zum Menu

Hallo zusammen, ich versuche aus einem MD Array ein Menu zu generieren.

 
 $menu = array ( '<i class="fa fa-star "></i> Favoriten', 'favoriten', 1 );  
    $submenu['favoriten'] [5] = array ( 'Seite 1', 'registrations_view', 1 );  
    $submenu['favoriten'][10] = array ( 'Seite 2', 'registrations_edit', 1 );  
 
    $menu = array ( '<i class="fa fa-paint-brush"></i> Deko', 'deko', 3 );  
    $submenu['deko'] [5] = array ( 'Termine', 'meetings', 3 );  
    $submenu['deko'][10] = array ( 'Neuen Termin erstellen', 'meetings_add', 3 );  
    $submenu['deko'][15] = array ( 'Benutzer', 'users', 3 );  
    $submenu['deko'][20] = array ( 'Neuen Benutzer erstellen', 'users_add', 3 );  
    $submenu['deko'][25] = array ( 'Klassen verwalten', 'classes', 3 );  
    $submenu['deko'][30] = array ( 'F&auml;cher verwalten', 'subjects', 3 );  
 
    $menu = array ( '<i class="fa fa-paw "></i> Tiere', 'tiere', 1 );  
    $submenu['tiere'] [5] = array ( 'Allgemein', 'div', 3 );  
    $submenu['tiere'][10] = array ( 'Hunde', 'dog', 3 );  
    $submenu['tiere'][15] = array ( 'Katzen', 'cat', 1 );  


Dazu habe ich folgende Ausgabe:

 
 function in_array_recursive($needle, &$haystack, $case_sensitive=true)
  {
    if( !$case_sensitive )
      $needle = strtolower($needle);
 
    foreach($haystack as $v)
    {
        if( !is_array($v) )
        {
          if( !$case_sensitive )
            $v = strtolower($v);
 
          if( $needle == $v )
            return true;
        }
        else
        {
          if( in_array_recursive($needle, $v, $case_sensitive) === true )
            return true;
        }
    }
    return false;
  }
  
  
  
   
    foreach ( $menu as $key => $values )
    {
        $class = '';  
        if( $page == $values[1] )
        {
          $class .= ' active';  
        }
        else
        {
          if( !isset ( $submenu[$values[1]] ) )
            $class .= ' no-submenu';  
          elseif( in_array_recursive($page,$submenu[$values[1]],true) )
            $class .= ' active';  
        }
 
        print '<li><a href="index.php?page='. $values[1] .'" class="nav-top-item' . $class . '">' . $values . '</a>';  
		
	}
		


Ich kriege immer den Fehler und es erscheind keine Subnavi:
Notice: Undefined variable: page in /home/httpd/vhosts/werbix.ch/httpdocs/content/navitest.php on line 66
Notice: Undefined variable: page in /home/httpd/vhosts/werbix.ch/httpdocs/content/navitest.php on line 74

Dies entspricht dem Inhalt:
=> (if( $page == $values[1] ))
=> elseif( in_array_recursive($page,$submenu[$values[1]],true) )


Leider habe ich keine Ahnung was das Problem ist, kann mir bitte jemand weiterhelfen?

lg

Content-Key: 263439

Url: https://administrator.de/contentid/263439

Printed on: April 24, 2024 at 10:04 o'clock

Member: Arano
Arano Feb 14, 2015 at 12:58:27 (UTC)
Goto Top
Hi.

Na PHP kennt die Variable $page nicht !
Wann wird diese den definiert ?

Wenn ich das richtig sehe, sollte $page eines Schlüsselwörter (favoriten/deko/tiere) enthalten, je nach dem wleche seite man gerade geöffnet hat... WENN man überhaupt eine Seite geöffnet hat.
Irgendwo sollte es als eine Anweisung geben die dem folgendem Sinn entspricht:
$page = 'favoriten';  
// oder
$page = extract_key_from_url_function();

Edit:
Ich sehe gerade die URL deiner Links "index.php?page='. $values[1] .'"
Verwendest du die Variable $page etwa direkt aus der URL ? (register_globals = On)


~Arano
Member: pcguy
pcguy Feb 14, 2015 at 15:09:26 (UTC)
Goto Top
Hallo Arano, besten Dank, mit $page = 'favoriten'; funktioniert es.

Allerdings werden die Submenus nicht angezeigt.
Die Idee währe das alle Hauptlinks als eigenes Panel (http://holdirbootstrap.de/komponenten/#panels) angezeigt werden und beim Klick das Panel sich öffnet und die Subnavs anzeigt.
Member: Arano
Arano Feb 14, 2015 at 16:18:42 (UTC)
Goto Top
Hallo.

$page = 'favoriten'; hast du doch nicht fest in das Script geschrieben oder !?
Denn das muss ja dynamisch sein falls eine andere Kategorie geöffnet ist (deko/tiere),

Nein, die Untermenüs werden nicht angezeigt. Es gibt ja auch keine Script das dafür verantworlich wäre... diesen Part muss du wohl noch integrieren.
zZ. gibt es ja nur
foreach ( $menu as $key => $values )
Und diese Schleife durchläuft nur $menu also die Hauptmenüs.

Dieser Teil ist die Stelle an der du ansetzen must:
          if( !isset ( $submenu[$values[1]] ) ) 
            $class .= ' no-submenu';   
          elseif( in_array_recursive($page,$submenu[$values[1]],true) ) 
            $class .= ' active';   
Die erste Hälfte bestimmt einen CSS-Klassennamen für dan Fall das es KEINE Untermenüs gibt, die andere Hälfte WENN es Untermenüs gibt. Aber wie gesagt, die Untermenüs werden nirgends weiter behandelt. Die zweite Hälfte muss also um die Ausgabe der entsprechenden Untermenüs ergänzt werden.


~Arano
Member: pcguy
pcguy Feb 17, 2015 at 06:27:34 (UTC)
Goto Top
Ich bleibe bei der Ausgabe des Submenus hängen, muss ich ein weiteres "foreach" einbauen?


 
 foreach ( $menu as $key => $values )
    {
        $class = '';  
        if( $page == $values[1] )
        {
          $class .= ' active';  
        }
        else
        {
          if( !isset ( $submenu[$values[1]] ) )
            $class .= ' no-submenu';  
          elseif( in_array_recursive($page,$submenu[$values[1]],true) )
            $class .= ' active';  
        }
 
       // print '<li><a href="index.php?page='. $values[1] .'" class="nav-top-item' . $class . '">' . $values . '</a>';  
	   
	   print '  
	   
	   <div class="panel-group archiv" id="accordion" role="tablist" aria-multiselectable="true">  
        
          <div class="panel panel-default">  
            <div class="panel-heading" role="tab" id="'. $values[1] .'">  
              <h4 class="panel-title">  
                <a class="collapsed" data-toggle="collapse" data-parent="#accordion" href="#collapse'. $values[1] .'" aria-expanded="false" aria-controls"collapse1"="">  
                   '.$values.'  
                </a>
              </h4>
            </div>
            <div style="height: 0px;" aria-expanded="false" id="collapse'. $values[1] .'" class="panel-collapse collapse" role="tabpanel" aria-labelledby="'. $values[1] .'">  
              <div class="panel-body">  
                    <ul>
                   		      
						  <a href='.$values[2].'> <li> '.$values.'</li> </a>   
			
                  </ul> 
              </div>
            </div>
         </div>
		 
		 ';  
		
	}
Member: Arano
Arano Feb 17, 2015 at 18:38:46 (UTC)
Goto Top
Hallo.

Sorry sorry sorry, da habe ich mit vertan !
Das if-else das ich im letztem Post erwähnte ist NICHT die stelle wo du ansetzen sollst, das war quatsch.
Aber es sieht so aus, als wäre die das auch schon aufgefallen.

Ja du benötigst noch eine zweite Schleifen !
Mit der ersten gehst du durch das Hauptmenü ($menü), dem erstem Array, und gibst
  1. den Hauptlink aus und
  2. mit der zweiten Schleife die einzelnen Untermenüs ($submenu) aus dem zweitem Array.
Den ersten Teil hast du ja schon.
In die Zeile 35 wo momentan noch ein Link steht muss die zweite Schleife hin.
Vielleicht so:
    // wenn untermenüs zum hauptmenü vorhanden sind
    if( isset($submenu[$values[1]]) )
    {
        // durchlaufe submenü array und...
        foreach( $submenu[$values[1]] as $subKey => $subValues )
        {
            // ...gebe links in listenform aus
            echo '<li>  
                    <a href='.$subValues[2].'>'.$subValues.'</a>  
                  </li>';  
        }
    }
    // wenn keine untermenüs vorhanden sind, mach nix
    //else { }
Habe das jetzt einfach so getippt, kann Fehler enthalten und muss generell nicht passen face-wink


~Arano
Member: Arano
Arano Feb 24, 2015 at 21:02:19 (UTC)
Goto Top
Nabend...

*knock* *knock* wie schauts aus ?
Member: pcguy
pcguy Feb 26, 2015 at 07:17:23 (UTC)
Goto Top
Bitte entschuldige mein spätes Feedback.
Danke, es hat bestens geklappt!!

Unten noch der Code falls jemand dasselbe Problem hat ....

<code =php>

print' <div class="panel-group archiv" id="accordion" role="tablist" aria-multiselectable="true" >';


foreach ( $menu as $key => $values )
{
$class = '';
if( $page == $values[1] )
{
$class .= ' active';
}
else
{
if( !isset ( $submenu[$values[1]] ) )
$class .= ' no-submenu';
elseif( in_array_recursive($page,$submenu[$values[1]],true) )
$class .= ' active';
}

print '
<div class="panel panel-default">
<div class="panel-heading" role="tab" id="'. $values[1] .'">
<h4 class="panel-title">
<a class="collapsed" data-toggle="collapse" data-parent="#accordion" href="#collapse'. $values[1] .'" aria-expanded="false" aria-controls"collapse1"="">
'.$values.'
</a>
</h4>
</div>
<div style="height: 0px;" aria-expanded="false" id="collapse'. $values[1] .'" class="panel-collapse collapse" role="tabpanel" aria-labelledby="'. $values[1] .'">
<div class="panel-body">
<ul> ';
wenn untermenüs zum hauptmenü vorhanden sind
if( isset($submenu[$values[1]]) )
{
durchlaufe submenü array und...
foreach( $submenu[$values[1]] as $subKey => $subValues )
{
...gebe links in listenform aus
echo '<li>
<a href=index.php?page=archiv&content=4&cat='.$subValues[2].'> <i class="fa fa-caret-right"></i>&nbsp;
'.$subValues.'</a>
</li>';
}
}
keine untermenüs vorhanden
//else { }
print ' </ul>
</div>
</div>
</div> ';

}
print '</div> ';
?>