Jump to content

Menu dropdown


John Hebert Trindade
Go to solution Solved by Ivo Vicente,

Recommended Posts

Boa tarde pessoa, tenho esse arquivo que gera o menu, existe um erro que no “Ver código fonte” do browser apresenta correctamente.

Quando abro os submenus funcionam normalmente, mas quando estou em uma pagina e quero voltar para o índex ou Quem somos URL é gerada da seguinte forma: 

Exemplo:

Imaginemos que estamos em imprensa:

www.meu_site/eventos/index.php

ou se estamos na pagina Idealização:

www.meu_site/info/index.php

Mas deveria ser:

www.meu_site/index.php

O que estou fazendo de errado?

Já agora outra coisa, existe como fazer de outra forma a “PARTE QUE GOSTARIA DE ALTERAR” deem as suas opiniões, e desde já obrigado.

Meu código:

<?php

$file = explode('/', $_SERVER['SCRIPT_NAME']);
$file = array_pop($file);

$menus = [
    'index' => 'Inicio',
    'Quem Somos' => 'História',
    'eventos' => [
		'exposicoes' => 'Exposições',
    	'imprensa' => 'Imprensa',
		],
    'info' => [
	    'idealizar' => 'Idealização',
	    'entrega' => 'Criar e Envio',
		],
    'contactos' => 'Contactos',
];

//gera menu bar

echo '<nav onclick="void(0)" id="menu"><button aria-label="Abrir Menu" id="btn-mobile" aria-haspopup="true" aria-controls="menu" aria-expanded="false">Menu<span id="hamburger"></span></button>';
$display= '<ul id="navigation">';
foreach ($menus as $key => $value) {
	$link = $key.'.php';
	$class = $file == $link ? "class='selected'": null;
	//gera sub_menu
	if (is_array($value)) {
		
      	/*PARTE QUE GOSTARIA DE ALTERAR*/
      
      	if ($key == 'eventos') {
			$nome_submenu= 'eventos';
		}else {
			$nome_submenu='informações';
		}
      
       /* FIM DO QUE QUERO ALTERAR */
      
		$display.= "<li>".'<a href="#">'. ucfirst($nome_submenu). '</a>'. "<ul class='submenu'>";
		foreach ($value as $sub_key => $sub_value) {
			$link = $sub_key.'.php';
			$class = $file == $link ? "class='selected'": null;
			$display.= "<li $class> <a href=". base_url($key).'/'."$link> $sub_value</a></li>";
		}
		$display.= '</ul></li>';
	}else{
	$display.="<li $class> <a href='$link'> $value</a></li>";
	}
}
echo $display.'</ul>';
echo '</nav>';
?>
 
Link to comment
Share on other sites

Viva @John Hebert Trindade

 

Parece-me que está a misturar tudo e a origem dos dados é muito limitada, quero com isto dizer que uma opção será tornar o array de menu mais completo para que a criação do mesmo seja mais segura, por exemplo:

<?php 
  
$menu = [
	"index" => [
      "text" => "Home",
      "url" => "/",
    ],
  	"eventos" => [
    	"text" => "Eventos",
      	"url" => "eventos.php",
      	"submenu" =>[
        	'exposicoes' => [
              "text" => "Exposições"
              "url" => "..."
            ],
    		...
        ]
    ]
];

Depois no código pode avaliar se a chave submenu existe, e se existir pode criar uma função que só gera o html para o submenu e assim não tem que fazer truques para separar os eventos das informações

Atenção que estou a supor apenas 1 subnível, caso possam ser vários encadeados, tem que aprender a usar funções recursivas.

Feito é melhor que perfeito

Link to comment
Share on other sites

  • 2 weeks later...
  • Solution

@John Hebert Trindade

Fiz uma amostra do que podes fazer sem usar recursividade, basta depois adaptar os elementos HTML e adicionar mais chaves com valores aos array 

<?php
$menus = [
  "level-1" => [
    "name" => "Level 1",
    "submenu" => []
  ],
  "level-2" => [
      "name" => "Level 2",
      "submenu" => [
          "level2-1" =>[
            "name" => "Level 2.1"
          ],
          "level2-2" =>[
            "name" => "Level 2.2"
          ]
      ]
  ],
   "level-3" => [
    "name" => "Level 3",
    "submenu" => []
  ],
];

// UL container
$html = "<ul>";
foreach ($menus as $km => $menu) {
  	// Controi primeiro nivel
    $html .="<li>{$menu["name"]}</li>";
  	// Verifica se tem segundo nivel
    if (!empty("submenu")) {
      	// Controi segundo nivel se existir
        $html .="<ul>";
        foreach ($menu["submenu"] as $ksm => $smenu) {
          // Preenche segundo nivel
            $html .="<li>{$smenu["name"]}</li>";
        }
        $html .="</ul>";
    }
}

$html ."</ul>";
// Output: <ul><li>Level 1</li><ul></ul><li>Level 2</li><ul><li>Level 2.1</li><li>Level 2.2</li></ul><li>Level 3</li><ul></ul>

echo $html;
  Edited by Ivo Vicente
Code typo

Feito é melhor que perfeito

Link to comment
Share on other sites

  • 2 weeks later...

Obrigado pela ajuda, resultou e esta a funcionar a 100%, mais agora tenho um outro senão.

Como pode ver eu utilizo os seguintes códigos para saber onde estou e introduzir a class=select para deixar em destaque o menu.

no menu funciona correctamente:

$link = $km.'.php';
$class = $file == $link ? "class='selected'": null;
	

E no submenu não sei como poderia fazer:

$link = $ksm.'.php';
$class = $file == $link ? "class='selected'": null;
	

 

Exemplo:

Se o submenu for o selecionado, verifique qual é o nome do menu e adicione a classe select

 

espero que entenda e desde já agradeço

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.