Jump to content

Menu dropdown


John Hebert Trindade
 Share

Recommended Posts

John Hebert Trindade

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

Ivo Vicente

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

John Hebert Trindade

Boas @Ivo Vicente, sou novo no ramo de php, e ainda estou a estudar, será que poderia ajudar-me?

Porque não sei como faria a função, ou apenas indicar um vídeo no YouTube a fazer o processo para eu ver.

Desde já agradeço.

O meu menu tem apenas um subnível.

Link to comment
Share on other sites

Ivo Vicente

@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

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
 Share

×
×
  • 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.