Jump to content

Recommended Posts

Posted

Boas pessoal, sou iniciante em php e estou a tentar fazer um menu dinâmico. Já pesquisei na net, mas ainda não consegui deixar o código a funcionar.

Se me dessemm uma ajudinha, agradecia! 😉

Tenho o seguinte código:

mysql_connect("localhost", "blablabla", "blablabla") or die ("Impossivel ligar ao servidor!<p>");
	$sql="select categorias.*, cat.nome AS pai_nome FROM categorias LEFT JOIN categorias AS cat ON categorias.pai = cat.id where pai ='".$id."'";
	$resultado=mysql_db_query ("blablabla", $sql);

	function menu($pai=0)
{
	while ($registos = $resultado)
	{
		menu($pai=$registo['pai_nome']);

		echo ($pai);
				if ($pai=0)
					{
						//menu($pai["pai_nome"]);
						menu($pai);
						//echo ($pai);
					}
					}
	mysql_close();
	mysql_free_result ($resultado);
}
	menu();

$pai - é o id do pai...

Va lá malta ajudem-me a seguir em frente.  😉

Posted

Tens aí uma função recursiva pelo meio, suponho que seja para fazer os submenus... Não consigo é perceber como tens a tua base de dados organizada, se puderes deixar aqui, seria útil para a resolução do teu problema.

Para além disso, essa função mysql_db_query parece ter sido descontinuada no PHP 5, troca por mysql_query($sql), que é compatível com ambas as versões.

Nick antigo: softclean | Tens um projeto? | Wiki P@P

Ajuda a comunidade! Se encontrares algo de errado, usa a opção "Denunciar" por baixo de cada post.

Posted

Tens aí uma função recursiva pelo meio, suponho que seja para fazer os submenus... Não consigo é perceber como tens a tua base de dados organizada, se puderes deixar aqui, seria útil para a resolução do teu problema.

Para além disso, essa função mysql_db_query parece ter sido descontinuada no PHP 5, troca por mysql_query($sql), que é compatível com ambas as versões.

Sim, é para os sub-menus. Mas estou a ir por partes para ser mais fácil, visto que estou no principio.

na bd tenho os campos, id; pai; nome. E queria só usar estes se desse.

Posted

Para mostrar os pais tenho assim:

	if ($resultado)
{
	while ($registo=mysql_fetch_array($resultado))
	{
		$nome=$registo["nome"];
		print ("<td><align=center>$nome<p></tr></td>");
	}

}
else
{
	print ("Não há registos!");
}
mysql_free_result ($resultado);

Preciso é de agora ir chamar os filhos com uma function...  😉

Posted

Em vez de uma função recursiva, podes é efectuar queries dentro teu ciclo. Ou seja, tu seleccionas todos os menus de raiz (em principio serão aqueles que não têm um pai), e dentro do ciclo, em que vais buscar cada "pai", fazes uma nova query, a perguntar quem sao os filhos, exmeplo:

// seleccionar os menus "de topo" (sem menu superior na sua hierarquia)
$q = mysql_query("SELECT .... WHERE pai = NULL");

while ($pai=mysql_fetch_array($q)) {
  $nome=$pai["nome"];
  echo "<td><align=center>$nome<p></tr></td>";
  
  // procurar menus "filhos", que têm como pai o actual
  $qf = mysql_query("SELECT ... WHERE pai = '$nome'")
  while ($filho =  mysql_fetch_array($qf)) {
    echo "<li>{$filho['nome']}</li>";
  }
}

esta solução funciona para menus com apenas um nível de submenus. Caso tenhas submenus dentro de submenus é um bocado mais complicado e terás de usar recursividade tal como estavas a fazer.

Nick antigo: softclean | Tens um projeto? | Wiki P@P

Ajuda a comunidade! Se encontrares algo de errado, usa a opção "Denunciar" por baixo de cada post.

Posted

Eu tenho a class Mysql e depois fiz uma class para a listagem dos menus,submenus e submenus de submenus...está assim:

   $this->mySQL=$mySQL = new MySQL();
   $mySQL->conecta();
   $mySQL->db=$_SESSION['CONFIG']['DB'];   
   $n=0;
   $n2=1;   
   $resultado_menus=$mySQL->sql("SELECT *FROM paginas WHERE tipo='menu' ORDER BY posicao");
   
   
          $menus_html.='<h4 align="center">'.C_HEADER1.'</h4>
	                <div id="index_tab">
                        <div style="width:10%;" >ID</div>
			        <div style="width:10%;" >'.C_ACTIVO.'</div>
                        <div style="width:10%;" >'.C_TIPO.'</div>
                        <div style="width:51%;">'.C_TITULO.'</div>
					<div style="width:5%;">...</div>
					</div>
					<div style="clear:both;"></div>';


    while($m_row=mysql_fetch_array($resultado_menus)){	
$resultado_submenus=$mySQL->sql("SELECT *FROM paginas WHERE tipo='submenu' and parent='".$m_row['id']."' ORDER BY posicao");

if(!mysql_num_rows($resultado_submenus)==0){$submenus="yes";}else{$submenus="no";}
  
 $menus_html.='<div id="index_tab_menus">
                   <div style="width:10%;" >'.$this->FixSub('submenu',$n,$submenus).''.$m_row['id'].'</div>
			   <div style="width:10%;" >'.$this->estado($m_row['estado']).'</div>
                   <div style="width:10%;" ><b>'.$this->tipoCheck($m_row['indice'],$m_row['password']).'</b></div>
                   <div style="width:51%;" >
			     <a href="'.$this->UrlCheck($m_row['indice'],$m_row['id']).'">
				 <b>'.$this->coded($m_row['titulo']).'</b>
				 </a>
			   </div>
                   <div style="width:43px;">
			     <a  href="?app='.$m_row['edit_link'].'&id='.$m_row['id'].'" >
                     <img src="styles/template/edit.gif"  title="'.C_EDITAR.'"border="0" />
				 </a>';
				 if($m_row['indice']<>"homepage"){
   $menus_html.='<a  href="?app='.$m_row['del_link'].'&id='.$m_row['id'].'" >
			     <img src="styles/template/del.gif"  title="'.C_ELIMINAR.'" border="0"/>
				 </a>';}
     $menus_html.='</div>
			   </div>';
	  
  
     
	   if($submenus=="yes"){
	   while($s_row=mysql_fetch_array($resultado_submenus)){
$resultado_multinivel=$mySQL->sql("SELECT *FROM paginas WHERE tipo='multinivel' and parent='".$s_row['id']."' ORDER BY posicao");
     if(!mysql_num_rows($resultado_multinivel)==0){$multinivel="yes";}else{$multinivel="no";}
				   
 $menus_html.='<div id="index_tab_submenus" class="sub_'.$n.'">
                   <div style="width:10%;" >'.$this->FixSub('multinivel',$n2,$multinivel).''.$s_row['id'].'</div>
			   <div style="width:10%;" >'.$this->estado($s_row['estado']).'</div>
                   <div style="width:10%;" >'.$this->tipoCheck($s_row['indice'],$s_row['password']).'</div>
                   <div style="width:51%;" >
			   <span id="tab_i_text">'.$m_row['titulo'].'-></span>
			     <a href="'.$this->UrlCheck($s_row['indice'],$s_row['id']).'">
				 <b>'.$this->coded($s_row['titulo']).'</b>
				 </a>
			   </div>
                   <div style="width:43px;" id="row">
			     <a  href="?app='.$s_row['edit_link'].'&id='.$s_row['id'].'" >
                     <img src="styles/template/edit.gif" height="16" hspace="2" title="'.C_EDITAR.'"border="0" />
				 </a>
			     <a href="?app='.$s_row['del_link'].'&id='.$s_row['id'].'">
			     <img src="styles/template/del.gif" height="16" hspace="2" title="'.C_ELIMINAR.'" border="0"/>
				 </a>
                   </div>
			   </div>';
			   
			   if($multinivel=="yes"){
			   $menus_html.='<div class="sub_'.$n.'">';
	              while($f_row=mysql_fetch_array($resultado_multinivel)){
				   
                  $menus_html.='<div id="index_tab_multinivel" class="multi_'.$n2.'">
                                    <div style="width:10%;" id="row" >
								'.$f_row['id'].'</div>
			                    <div style="width:10%;" >'.$this->estado($f_row['estado']).'</div>
                                    <div style="width:10%;" ><b>'.$this->tipoCheck($f_row['indice'],$f_row['password']).'</b></div>
                                    <div style="width:51%;" >
								<span id="tab_i_text">'.$m_row['titulo'].'->'.$s_row['titulo'].'-></span>
			                    <a href="'.$this->UrlCheck($f_row['indice'],$f_row['id']).'">
				                <b>'.$this->coded($f_row['titulo']).'</b>
				                </a>
			                    </div>
                                    <div style="width:43px;" id="rowed" >
			                    <a  href="?app='.$f_row['edit_link'].'&id='.$f_row['id'].'" >
                              <img src="styles/template/edit.gif" height="16" hspace="2" title="'.C_EDITAR.'"border="0" />
				               </a>
			                   <a href="?app='.$f_row['del_link'].'&id='.$f_row['id'].'">
			                <img src="styles/template/del.gif" height="16" hspace="2" title="'.C_ELIMINAR.'" border="0"/>
				           </a>
                               </div>
			               </div>';
			   
			   
		             }//MULTINIVEL WHILE END//
					 $n2++;
					 $menus_html.='</div>';
				  }
			   
			   
		  }//SUBMENUS WHILE END//
         

           }  
$n++;
            $menus_html.='<div id="index_tab_menus_end"></div>';
}//MENUS WHILE END/

Não está um código muito simples de perceber porque foi retirado directo de uma app minha nem limpei um pouco pa perceberes.. mas o que tá ai a mais e algumas DEFINES e funcoes da class desnecessárias para o teu caso, mas a essência está ai que são os whiles necessárias e uma maneira de como podes "perguntar" se existe submenus ou multiniveis(submenus de submenus)...

Posted

Agradeço todas as vossas dicas e acredito que também seriam soluções fiáveis!  🙂

Mas eu queria usar a função recursiva, porque é para ter submenus dentro de submenus e por aí fora. Se me pudessem ajudar com a função...  🙂

Mas obrigado pelas outras dicas, que entretanto enquanto não me ajudam vou fazendo assim como disseram, mas aguardo um empurrãozito na funciton.  🙂

Posted

funcao listar(idPai=0)

  cmd = select * from items where idPai=idPai

enquanto cmd.eof entao

  output += outputQueQueres +listar(cmd.IDdoItem);

retorna output;

Alguma coisa do genero ajuda?

"Quando eu for grande quero ser como o Celso"

Posted

Ah e reparei que num exemplo mostraram $filho. Eu não tenho nenuhm campo filho na bd.

Só tenho:

id;

pai;(id do pai)

nome;

O "Filho" é o item que estas a iterar actualmente, só precisas de saber o pai, tudo o que nao tiver pai é porque é root

"Quando eu for grande quero ser como o Celso"

Posted

funcao listar(idPai=0)

  cmd = select * from items where idPai=idPai

enquanto cmd.eof entao

  output += outputQueQueres +listar(cmd.IDdoItem);

retorna output;

Alguma coisa do genero ajuda?

desculpa lá cyclop, não entendi muito bem o exemplo!  🙂

Posted

Não sei se é relevante ou não para a resolução da dúvida, mas tenho assim o código que mostra os pais e os filhos. Gostava só de utilizar a função para aprender...

mysql_connect("localhost", "user, "pass") or die ("Impossivel ligar ao servidor!<p>");
	$sql="select categorias.*, cat.nome AS pai_nome FROM categorias LEFT JOIN categorias AS cat ON categorias.pai = cat.id where categorias.pai =0";
	//$resultado=mysql_query($sql);
	$resultado=mysql_db_query("bd" ,$sql);

if ($resultado)
{

	while ($pai=mysql_fetch_array($resultado))
	{
		$nome=$pai["nome"];
		echo "<td><align=center>$nome<p></tr></td>";
	}

		$qf = mysql_query("select categorias.*, cat.nome AS pai_nome FROM categorias LEFT JOIN categorias AS cat ON categorias.pai = cat.id where categorias.pai <> 0");
		while ($filho=mysql_fetch_array($qf)) 
	{
	//$nome=$filho["nome"];
   		echo "<li>{$filho['nome']}</li>";	
	}

}
else
{
	print ("Não há registos!");
}
mysql_free_result ($resultado);
Posted

Ok, tenta então o seguinte, com algumas alterações que

function printSubmenus($idpai="", $pai="") {
  if ($idpai == "") {
    // fazer aqui a query para ir buscar todos os "pais de topo" (nao têm pais)
    $q = mysql_query("select .... where pai = NULL");
  } else {
    // buscar cada filho e ver os seu filhos
    $q = mysql_query("select .... where pai = '$idpai'");
  }
  
  echo $pai;

  while ($filho=mysql_fetch_array($q)) {
    printSubmenus($filho['nome'], $filho['id']);
  }
}

Ou seja, começamos por procurar todos os pais, e por cada um, ver os seus filhos. A função termina quando acabam os filhos, ou seja, não faz mais nada. Tens de corrigir aí os pormenores das queries e  formatação, mas penso que funciona. Não testei.

Nick antigo: softclean | Tens um projeto? | Wiki P@P

Ajuda a comunidade! Se encontrares algo de errado, usa a opção "Denunciar" por baixo de cada post.

Posted

Ok, tenta então o seguinte, com algumas alterações que

function printSubmenus($idpai="", $pai="") {
  if ($idpai == "") {
    // fazer aqui a query para ir buscar todos os "pais de topo" (nao têm pais)
    $q = mysql_query("select .... where pai = NULL");
  } else {
    // buscar cada filho e ver os seu filhos
    $q = mysql_query("select .... where pai = '$idpai'");
  }
  
  echo $pai;

  while ($filho=mysql_fetch_array($q)) {
    printSubmenus($filho['nome'], $filho['id']);
  }
}

Ou seja, começamos por procurar todos os pais, e por cada um, ver os seus filhos. A função termina quando acabam os filhos, ou seja, não faz mais nada. Tens de corrigir aí os pormenores das queries e  formatação, mas penso que funciona. Não testei.

$idpai e o $filho vão buscar que valores!??!

Posted

$filho é controlado pelo código da aplicação, e não é intenção seres tu a preencher.

O valor inicial de pai, deve ser vazio, para efectuar a primeira query. Fiz assim para ter tudo completamente dentro da função recursiva mas, alternativamente, podes passar a parte de obter os pais para fora da função, e num for, chamas a função com o nome e id de cada pai.

Nick antigo: softclean | Tens um projeto? | Wiki P@P

Ajuda a comunidade! Se encontrares algo de errado, usa a opção "Denunciar" por baixo de cada post.

Posted

$filho é controlado pelo código da aplicação, e não é intenção seres tu a preencher.

O valor inicial de pai, deve ser vazio, para efectuar a primeira query. Fiz assim para ter tudo completamente dentro da função recursiva mas, alternativamente, podes passar a parte de obter os pais para fora da função, e num for, chamas a função com o nome e id de cada pai.

Estou um bocado baralhado.

Tipo este código é necessário?

if ($resultado)
{
	while ($pai=mysql_fetch_array($resultado))
	{
		$nome=$pai["nome"];
		echo "<td><align=center>$nome<p></tr></td>";
	}

		$qf = mysql_query("select categorias.*, cat.nome AS pai_nome FROM categorias LEFT JOIN categorias AS cat ON categorias.pai = cat.id where categorias.pai <> 0");
		while ($filho=mysql_fetch_array($qf)) 
	{
	//$nome=$filho["nome"];
   		echo "<li>{$filho['nome']}</li>";	
	}

}
else
{
	print ("Não há registos!");
}
mysql_free_result ($resultado);
Posted

O objectivo da função que coloquei é teres a possibilidade de possuir uma quantidade de submenus dentro de submenus ilimitada. Com a função que tens com os dois while (em cima), apenas consegues fazer root e um nivel de submenus, logo não precisas disso.

Nick antigo: softclean | Tens um projeto? | Wiki P@P

Ajuda a comunidade! Se encontrares algo de errado, usa a opção "Denunciar" por baixo de cada post.

Posted

Eu acho que a solução e aplicar whiles dentro de whiles se queres menus submenus e multinivel.. agora se queres menus submenus multinivel, submenu de multinivel e por ai a fora seria criares uma funcão com dois parametros iniciais tipo listaMenus($Id,$from) ou uma class bem estruturada, e secalhar por ventura inserires nas tuas tabelas um indice de orientacao para os whiles ou através de IDS com autoIncrement...tens inúmeras maneiras.

Posted

Estou com o código assim e não aprece nada no ecrã. Não vejo onde esteja o problema!  😄

mysql_connect("localhost", "user", "pass") or die ("Impossivel ligar ao servidor!<p>");

function printSubmenus($pai="")
{
  if ($pai=0)
  {
    $q = mysql_query("select * FROM categorias where pai = 0");
  } else {
    $q = mysql_query("select * FROM categorias where pai = $pai");
  }
  //echo $pai;

  while ($filho=mysql_fetch_array($q))
  	{
	echo $filho["nome"];
    printSubmenus($filho["id"]);
  	}
}

printSubmenus(0);

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.