Jump to content
PF2G

[Resolvido] Breadcrumb - Função Recursiva

Recommended Posts

PF2G

Boas,

eu estou a tentar fazer uma função recursiva onde faça a listagem do "historico" da pagina produtos.

por exemplo eu estou na página das categorias e quero que me apareça o seguinte:

HOME >> PRODUTOS >> nome_categoria

quando estiver no produto tem de aparecer:

HOME >> PRODUTOS >> nome_categoria >> nome_produto.

Mas não me aparece nada...Alguem me pode ajudar?

Este é o meu código:

/****** RECURSIVE_QUERY ******/
$sel_prod_tit=mysql_query("SELECT * FROM menu_page WHERE type='".$clean_url[1]."'") or die(mysql_error());
$tit_prod_module=mysql_fetch_assoc($sel_prod_tit);
$clean_prod_module=$tit_prod_module['title'];
/********* RECURSIVE ********/
function BreadCrumb($id,$level)
{
if ($level!=0)
{
 $query_taxo = mysql_query("SELECT * FROM node WHERE taxonomy_id='".$id."'") or die(mysql_error());
 $taxo=mysql_fetch_assoc();

 $query_taxo_page = mysql_query("SELECT * FROM taxonomia_page WHERE id='".$taxo['taxonomy_id']."'") or die(mysql_error());
 $row=mysql_fetch_assoc($query_taxo_page);

 $link = "<a href=index.php>HOME</a>";
 $link = "<a href=index.php>".$clean_prod_module."</a>";
 $link = "<a href=index.php>".$row['title']."</a>";
 $bc .= $level==0 ? $link : $link . ' >> '  ;
 $parent_id = $row['parent_id'];
 BreadCrumb($parent_id,$level+1);

 echo $bc."";

 return BreadCrumb($id,$level);
}
else
{
 return true;
}
}

Share this post


Link to post
Share on other sites
pmg

... não me aparece nada ...

E ainda bem!

Como é que estás a chamar a função recursiva?

Repara: se chamares a função recursiva com o segundo parametro a 0 ela devolve true e não faz nada.

Se a chamares com um valor positivo ela entra em loop infinito (1, 2, 3, ..., 47835472354, ...).

Só funciona "bem" se a chamares com um valor negativo.

BreadCrumb(0, -3);


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Share this post


Link to post
Share on other sites
MASNathan

return BreadCrumb($id,$level);

estás a chamar a função dentro da mesma se o valor for positivo e como nunca alteras o valor que usas para a chamar dentro de si própria ela anda lá ás voltas

Share this post


Link to post
Share on other sites
MASNathan

Então como faço para resolver isso?

isso diz-me tu, o que é que queres devolver se o valor for positivo?

Share this post


Link to post
Share on other sites
PF2G

Será que me podem ajudar a por o codigo direito. Já estive a pesquisar mas não encontro nada que me ajude...

Obrigado

Share this post


Link to post
Share on other sites
HappyHippyHippo

eu não percebo a relação entre os elementos do teu breadcrumb ...

 // que é isto ?????
 $query_taxo = mysql_query("SELECT * FROM node WHERE taxonomy_id='".$id."'") or die(mysql_error());
 $taxo=mysql_fetch_assoc();

 // que é isto ?????
 $query_taxo_page = mysql_query("SELECT * FROM taxonomia_page WHERE id='".$taxo['taxonomy_id']."'") or die(mysql_error());
 $row=mysql_fetch_assoc($query_taxo_page);


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
PF2G

$query_taxo = mysql_query("SELECT * FROM node WHERE taxonomy_id='".$id."'") or die(mysql_error());
 $taxo=mysql_fetch_assoc();

Isso era para ir buscar o id do produto (utlimo elemento)...

Mas ja alterei (não digo que esteja correto).

/****** RECURSIVE_QUERY ******/
/* aqui vai buscar o id do produto */
$query_tax = mysql_query("SELECT * FROM node") or die(mysql_error());
$tax=mysql_fetch_assoc($query_tax);
$tax_id=$tax['taxonomy_id'];
/********* RECURSIVE ********/
function BreadCrumb($tax_id,$level)
{
if ($tax_id!=0)
{
		    /* aqui é a categoria de produtos */
 $query_taxo = mysql_query("SELECT * FROM node WHERE taxonomy_id='".$tax_id."'") or die(mysql_error());
 $taxo=mysql_fetch_assoc();

 $query_taxo_page = mysql_query("SELECT * FROM taxonomia_page WHERE id='".$taxo['taxonomy_id']."'") or die(mysql_error());
 $row=mysql_fetch_assoc($query_taxo_page);

 $link = "<a href=index.php>HOME</a>";
 $link = "<a href=index.php>".$clean_prod_module."</a>";
 $link = "<a href=index.php>".$row['title']."</a>";
 $bc .= $level==0 ? $link : $link . ' >> '  ;
 $parent_id = $row['parent_id'];
 BreadCrumb($parent_id,$level++);

 echo $bc."";

 return BreadCrumb($id,$level);
}
else
{
 return true;
}
}
/** end/RECURSIVE FUNCTION **/

Penso que está um pouco confuso, este código, mas foi o mais proximo que consegui arranjar para o que eu quero, pois eu nunca trabalhei com funções, muito menos recursivas.

Share this post


Link to post
Share on other sites
HappyHippyHippo

diz-me só :

- qual o SQL que te dá o elemento do breadcrumb e que campo dá a informação a apresentar e que campo dá a informação do link

- qual o SQL que dá a informação do ID do "pai"


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
PF2G

- qual o SQL que te dá o elemento do breadcrumb

list($tax_link, $taxonomy_id) = explode("-", $page);
$query_tax = mysql_query("SELECT * FROM taxonomia_page WHERE link='".$tax_link."' AND id='".$taxonomy_id."'") or die(mysql_error());
$tax=mysql_fetch_assoc($query_tax);
$tax_id=$tax['id'];

e que campo dá a informação a apresentar e que campo dá a informação do link

Informação a apresentar: titulo; informação do link: link

- qual o SQL que dá a informação do ID do "pai"

 $query_taxo = mysql_query("SELECT * FROM node WHERE taxonomy_id='".$tax_id."'") or die(mysql_error());
 $taxo=mysql_fetch_assoc();

 $query_taxo_page = mysql_query("SELECT parentid FROM taxonomia_page WHERE id='".$taxo['taxonomy_id']."'") or die(mysql_error());
 $row=mysql_fetch_assoc($query_taxo_page);

Share this post


Link to post
Share on other sites
HappyHippyHippo

por muito estranho que o teu código parece, acho que será algo deste genero

/****** RECURSIVE_QUERY ******/
/* aqui vai buscar o id do produto */
$query_tax = mysql_query("SELECT * FROM node") or die(mysql_error());
$tax=mysql_fetch_assoc($query_tax);

/********* RECURSIVE ********/
function BreadCrumb($tax_id) {
 // verifica se é uma chamada recursiva para um elemento que não existe
 if ((int)$tax_id == 0)
   return "<a href='index.php'>HOME</a> >> ";

 $query_taxo = mysql_query("SELECT * FROM node WHERE taxonomy_id='".$tax_id."'") or die(mysql_error());
 $taxo=mysql_fetch_assoc();
 $query_taxo_page = mysql_query("SELECT * FROM taxonomia_page WHERE id='".$taxo['taxonomy_id']."'") or die(mysql_error());
 $row=mysql_fetch_assoc($query_taxo_page);

 return BreadCrumb($row['parent_id'])."<a href='{$row['link']}'>{$row['titulo']}</a> >> ";   
}

$breadcrumbs = BreadCrumb($tax['parent_id']).$tax['titulo'];

mas como disse, não da para perceber como tens isso da base de dados, logo não posso dar a certeza da exatidão do código


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
PF2G

Fiz umas pequenas alterações, nos nomes dos campos (pq estavam errados)

<?php
/****** RECURSIVE_QUERY ******/
list($tax_link, $taxonomy_id) = explode("-", $page);
$query_tax = mysql_query("SELECT * FROM taxonomia_page WHERE link='".$tax_link."' AND id='".$taxonomy_id."'") or die(mysql_error());
$tax=mysql_fetch_assoc($query_tax);
$tax_id=$tax['id'];
/********* RECURSIVE ********/
function BreadCrumb($tax_id) {

echo $tax_id['title'];

 // verifica se é uma chamada recursiva para um elemento que não existe
 if ((int)$tax_id == 0)
   {
return "<a href='index.php'>HOME</a> >> ";
}
 $query_taxo = mysql_query("SELECT * FROM node WHERE taxonomy_id='".$tax_id."'") or die(mysql_error());
 $taxo=mysql_fetch_assoc();

 $query_taxo_page = mysql_query("SELECT * FROM taxonomia_page WHERE id='".$taxo['taxonomy_id']."'") or die(mysql_error());
 $row=mysql_fetch_assoc($query_taxo_page);
 return BreadCrumb($row['parentid'])."<a href='".$row['link']."'>".$row['title']."</a> >> ";  
}
$breadcrumbs = BreadCrumb($tax['parentid']).$tax['title'];
/** end/RECURSIVE FUNCTION **/
?>

Não estava a funcionar, entao fiz um echo do $tax_id e deu-me 0 quando devia dar 41

Share this post


Link to post
Share on other sites
HappyHippyHippo

1º - se é para fazer uma alteração sem significado nenhum :

 if ((int)$tax_id == 0)
   { // <------- isto não serve para nada
return "<a href='index.php'>HOME</a> >> ";
} // <------- isto não serve para nada

ao menos mete a indentação correta !!!

se tens um erro nos dados da tabela isso já terás de resolver tu porque sinceramente é impossível dizer o porque disso, o máximo que posso dizer é : verifica o SQL que estás a criar

$sql = "SELECT * FROM taxonomia_page WHERE link='".$tax_link."' AND id='".$taxonomy_id."'";
echo $sql;
$query_tax = mysql_query($sql) or die(mysql_error());


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
PF2G

Já estou a um passo de conseguir resolver.

Este é o meu codigo:

<?php
/*********** RECURSIVE_QUERY ***********/
list($tax_link, $taxonomy_id) = explode("-", $page);
$query_tax = mysql_query("SELECT * FROM taxonomia_page WHERE link='".$tax_link."' AND id='".$taxonomy_id."'") or die(mysql_error());
$tax=mysql_fetch_assoc($query_tax);
$tax_id=$tax['id'];
/************** RECURSIVE *************/
$query = mysql_query("SELECT * FROM taxonomia_page WHERE id = '".$tax_id."'") or die(mysql_error());
$sel=mysql_fetch_assoc($query);
$id=$sel['id'];
function get_lines($id){
$cat = mysql_fetch_object(mysql_query("SELECT * FROM node WHERE taxonomy_id = '$id'"));
return $cat->titulo; 
}
function get_product($id)
{
$cat = mysql_fetch_object(mysql_query("SELECT * FROM taxonomia_page WHERE id = '$id'"));
return $cat->title; 
}
$select_prd=mysql_query("SELECT * FROM node WHERE taxonomy_id='".$tax_id."'") or die(mysql_error());
$taxo_id=mysql_fetch_assoc($select_prd);
$sel_prod=mysql_query("SELECT * FROM taxonomia_page WHERE id='".$taxo_id['taxonomy_id']."'") or die(mysql_error);
$products=mysql_fetch_assoc($sel_prod);
?>

<a href="<?php echo $current_lang; ?>">HOME</a> >> <a href="<?php echo $current_lang; ?>/<?php echo $module; ?>/all" >PRODUTOS</a> >>

<?php
if ($clean_url[2]!='all')
{
echo $products['title'];
}
elseif ($clean_url[3]!='')
{
?>
<a href="<?php echo $current_lang; ?>/<?php echo $module; ?>/<?php echo $products['link']; ?>-<?php echo $products['id']; ?>" ><?php echo $products['title']; ?></a>
<?php
$slct_prd=mysql_query("SELECT * FROM node WHERE url='".$clean_url[3]."'") or die(mysql_error());
$txnm_id=mysql_fetch_assoc($slct_prd);

echo $txnm_id['titulo'];
?>
<?php
/*********** end/RECURSIVE ***********/
}
?>

O que pretendo fazer agora é:

se o clean_url[2] (categoria) estiver seleccionada, isto é nao tiver nenhum link à frente ele mostra a categoria normal:

<a href>HOME</a> >> <a href>PODUTOS</a> >> nome_categoria

se tiver o clean_url[3] (produto), entao mostra o nome da categoria (linkado) e o nome do produto:

<a href>HOME</a> >> <a href>PODUTOS</a> >> <a href>nome_categoria</a> >>nome_produto

Podem-me ajudar, sff?

Obrigado,

PF2G

Share this post


Link to post
Share on other sites
PF2G

Estou aqui com um problema pq não me esta a ler o if para $clean_url[3]:

<?php
/*********** RECURSIVE_QUERY ***********/
list($tax_link, $taxonomy_id) = explode("-", $page);
$query_tax = mysql_query("SELECT * FROM taxonomia_page WHERE link='".$tax_link."' AND id='".$taxonomy_id."'") or die(mysql_error());
$tax=mysql_fetch_assoc($query_tax);
$tax_id=$tax['id'];
/************** RECURSIVE *************/
$query = mysql_query("SELECT * FROM taxonomia_page WHERE id = '".$tax_id."'") or die(mysql_error());
$sel=mysql_fetch_assoc($query);
$id=$sel['id'];
function get_lines($id){
$cat = mysql_fetch_object(mysql_query("SELECT * FROM node WHERE taxonomy_id = '$id'"));
return $cat->titulo;
}
function get_product($id)
{
$cat = mysql_fetch_object(mysql_query("SELECT * FROM taxonomia_page WHERE id = '$id'"));
return $cat->title;
}
$select_prd=mysql_query("SELECT * FROM node WHERE taxonomy_id='".$tax_id."'") or die(mysql_error());
$taxo_id=mysql_fetch_assoc($select_prd);
$sel_prod=mysql_query("SELECT * FROM taxonomia_page WHERE id='".$taxo_id['taxonomy_id']."'") or die(mysql_error);
$products=mysql_fetch_assoc($sel_prod);
?>

<a href="<?php echo $current_lang; ?>">HOME</a> >> <a href="<?php echo $current_lang; ?>/<?php echo $module; ?>/all" >PRODUTOS</a> >>

<?php
if($clean_url[2]!='all')
{
 echo $products['title'];
}
elseif(isset($clean_url[3]) && $clean_url[3] != "")
{
 echo 'YEAH';
}
?>
<?php /*********** end/RECURSIVE ***********/ ?>

</div>

Edited by PF2G

Share this post


Link to post
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.