John Hebert Trindade Posted September 3, 2021 at 12:44 PM Report Share #623591 Posted September 3, 2021 at 12:44 PM 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 More sharing options...
Ivo Vicente Posted September 3, 2021 at 01:13 PM Report Share #623592 Posted September 3, 2021 at 01:13 PM 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 More sharing options...
John Hebert Trindade Posted September 14, 2021 at 03:36 PM Author Report Share #623762 Posted September 14, 2021 at 03:36 PM 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 More sharing options...
Solution Ivo Vicente Posted September 19, 2021 at 11:56 AM Solution Report Share #623833 Posted September 19, 2021 at 11:56 AM (edited) @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 September 19, 2021 at 04:31 PM by Ivo Vicente Code typo Feito é melhor que perfeito Link to comment Share on other sites More sharing options...
John Hebert Trindade Posted September 30, 2021 at 08:35 AM Author Report Share #623971 Posted September 30, 2021 at 08:35 AM 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 More sharing options...
John Hebert Trindade Posted September 30, 2021 at 11:56 AM Author Report Share #623981 Posted September 30, 2021 at 11:56 AM Resolvi da seguinte forma, não sei se será a mais apropriada, gostaria da sua opinião. $file1 = explode("/",$_SERVER["HTTP_HOST"].$_SERVER["REQUEST_URI"]); $class = $km == $file1[1] ? "class='selected'": null; Link to comment Share on other sites More sharing options...
Ivo Vicente Posted October 5, 2021 at 05:47 PM Report Share #624015 Posted October 5, 2021 at 05:47 PM Olá @John Hebert Trindade É uma abordagem simples, mas que resolve a situação, para mim é o mais importante. Pode melhorar sempre, mas para já, nada a acrescentar. Feito é melhor que perfeito Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now