Visualizzazione dei risultati da 1 a 10 su 10
  1. #1

    Gerarchia categorie, visualizzazione lista

    Salve a tutti, ho una tabella fatta in questo modo:
    id_cat | categoria | id_parent
    dove id_cat è la chiave principale, categoria contiene il nome della categoria e id_parent contiene l'id della categoria padre.
    Vorrei recuperare la lista delle categorie e ordinarle in un menu ad albero. E' possiblile?
    Grazie in anticipo

  2. #2
    uso questo nel mio sito, setto la IDCategoriaMadre che equivale al tuo id_parent a 0
    Codice PHP:
    <div class="div_sinistro"> 
    <?php 
    $query_cat_madre
    =mysql_query("SELECT * FROM `categorie` WHERE IDCategoriaMadre= '0' ORDER BY Priorita ASC"); 
    while(
    $cat_madre=mysql_fetch_array($query_cat_madre)) { 

    $id_cat_madre=$cat_madre['IDCategoria']; 
    $nome_cat_madre=$cat_madre['NomeCategoria'];

    echo 
    '[url="index.php?tipo=categoria&cat='.$id_cat_madre.'"]'.$nome_cat_madre.'[/url]'

    $query_cat_liv2=mysql_query("SELECT * FROM `categorie` WHERE IDCategoriaMadre = '$id_cat_madre' ORDER BY Priorita ASC"); 

    while(
    $cat_liv2=mysql_fetch_array($query_cat_liv2)) {

    $id_cat_liv2=$cat_liv2['IDCategoria']; 
    $nome_cat_liv2=$cat_liv2['NomeCategoria']; 

    echo 
    '<div class="cat_liv2">'
    echo 
    '[url="index.php?tipo=categoria&cat='.$id_cat_liv2.'"]'.$nome_cat_liv2.'[/url]'
    echo 
    '</div>'; } 
    ?> 
    </div>
    <?php }
    ?>

  3. #3
    Utente di HTML.it L'avatar di Grino
    Registrato dal
    Oct 2004
    Messaggi
    739
    Cioè vorresti viasualizzare tutto l'albero in un solo colpo? O far vedere le radici, quindi cliccando ricaricare e mostrare i figlie di quelle radici e così via?

    In entrambi i casi è possibile.

    Ci puoi riuscire.

    Siamo sempre troppo gelosi delle nostre grandi piccole opere! - Grino inedito.
    Lavori e Lavoretti

  4. #4
    Utente di HTML.it L'avatar di Grino
    Registrato dal
    Oct 2004
    Messaggi
    739
    Originariamente inviato da Tecnologiamiky
    uso questo nel mio sito, setto la IDCategoriaMadre che equivale al tuo id_parent a 0
    Codice PHP:
    <div class="div_sinistro"> 
    <?php 
    $query_cat_madre
    =mysql_query("SELECT * FROM `categorie` WHERE IDCategoriaMadre= '0' ORDER BY Priorita ASC"); 
    while(
    $cat_madre=mysql_fetch_array($query_cat_madre)) { 

    $id_cat_madre=$cat_madre['IDCategoria']; 
    $nome_cat_madre=$cat_madre['NomeCategoria'];

    echo 
    '[url="index.php?tipo=categoria&cat='.$id_cat_madre.'"]'.$nome_cat_madre.'[/url]'

    $query_cat_liv2=mysql_query("SELECT * FROM `categorie` WHERE IDCategoriaMadre = '$id_cat_madre' ORDER BY Priorita ASC"); 

    while(
    $cat_liv2=mysql_fetch_array($query_cat_liv2)) {

    $id_cat_liv2=$cat_liv2['IDCategoria']; 
    $nome_cat_liv2=$cat_liv2['NomeCategoria']; 

    echo 
    '<div class="cat_liv2">'
    echo 
    '[url="index.php?tipo=categoria&cat='.$id_cat_liv2.'"]'.$nome_cat_liv2.'[/url]'
    echo 
    '</div>'; } 
    ?> 
    </div>
    <?php }
    ?>
    Ma così puoi avere al massimo 2 livelli ossia una radice con n sottocategorie collegate alla radice. Io quando ho detto che si può fare pensavo ad una sola query ed un algoritmo che crea una mappa opportunamente organizzata.

    Ma se sono solo due

    Siamo sempre troppo gelosi delle nostre grandi piccole opere! - Grino inedito.
    Lavori e Lavoretti

  5. #5
    Ho risolto con questa funzione, che dite può andare o vengono eseguite troppe query?
    codice:
    function display_children_select($parent, $level) { 
     
    	include("./../includes/config.inc.php");
    
    	$sql = "SELECT * FROM ".$_CONFIG['table_categorie']." WHERE id_parent LIKE '".$parent."'";
    	$result = mysql_query($sql)or die(mysql_error()); 
    
    	while ($row = mysql_fetch_array($result)) { 
    
    		$indentazione=str_repeat('&mdash;&brvbar;',$level);
    		echo "<option value=\"".$row['id_cat']."\">".$indentazione." ".$row['categoria']."</option>";
    
    		display_children_select($row['id_cat'], $level+1); 
      	} 
    
    }

  6. #6
    I risultati sono corretti, ma riesco a utilizzarlo solo con una select box, vorrei ottenere un codice di questo tipo.
    codice:
    <ul>[*]Categoria
          <ul>[*]Sottocategoria 1[*]Sottocategoria 2[/list][*]Categoria 2
          <ul>[*]Sottocategoria 1[*]Sottocategoria 2[/list][/list]

  7. #7
    Utente di HTML.it L'avatar di Grino
    Registrato dal
    Oct 2004
    Messaggi
    739
    Originariamente inviato da piccions
    Ho risolto con questa funzione, che dite può andare o vengono eseguite troppe query?
    codice:
    function display_children_select($parent, $level) { 
     
    	include("./../includes/config.inc.php");
    
    	$sql = "SELECT * FROM ".$_CONFIG['table_categorie']." WHERE id_parent LIKE '".$parent."'";
    	$result = mysql_query($sql)or die(mysql_error()); 
    
    	while ($row = mysql_fetch_array($result)) { 
    
    		$indentazione=str_repeat('&mdash;&brvbar;',$level);
    		echo "<option value=\"".$row['id_cat']."\">".$indentazione." ".$row['categoria']."</option>";
    
    		display_children_select($row['id_cat'], $level+1); 
      	} 
    
    }
    Sì, fai sempre molte query perchè stai applicando la soluzione a due livelli proposta
    Tecnologiamiky al caso più generale con n livelli di profondità sfruttando la ricorsione. Perchè non scarichi tutta la tabella delle categorie con una sola query e dall'array monodimensionale ottenuto costruisci con una funzione rcorsiva, tipo quella che hai postato, il tuo elenco non ordinato html?

    Siamo sempre troppo gelosi delle nostre grandi piccole opere! - Grino inedito.
    Lavori e Lavoretti

  8. #8
    Potresti farmi un esempio per cortesia?
    Non ho capito molto bene

  9. #9
    Utente di HTML.it L'avatar di Grino
    Registrato dal
    Oct 2004
    Messaggi
    739
    Un esempio che genera un array casuale (premi F5 per ricaricare la pagina ed ottenere elenchi dicategorie sempre diversi), quale esempio di estrazione dei dati da una tabella di DB (con una sola query), e produce l'elenco non ordinato dall'array generato dinamicamente.

    http://fruttodigitale.altervista.org...orie/index.php

    L'algoritomo di generazione della struttura dati per i menu e quello di produzione del codice HTML hanno complessità O(n) (con n cardinalità della tabella delle categorie).

    Siamo sempre troppo gelosi delle nostre grandi piccole opere! - Grino inedito.
    Lavori e Lavoretti

  10. #10
    Sto utilizzando questa funzione

    Codice PHP:
    function category_list($category_parent_id $visualizzazione $level $id_cat "" ) { 
        
    //mi connetto a MySQL
        
    include_once ("../connessione.php");
        
    //Dichiaro la variabile
        
    static $cats
        
    //Evito di ripetere la query
        
    if ( ! is_array$cats ) ) { 
            
    $sql  ="SELECT * FROM ".$_CONFIG['table_categorie']; 
            
    $res  mysql_query$sql ); 
            
    $cats = array(); 
            
    //salvo i valori in un array
            
    while ( $cat mysql_fetch_assoc$res ) ) { 
                
    $cats[] = $cat
            } 
        } 
        
    // creo l'array
        
    $list_items = array(); 
        if (
    $visualizzazione==0){
            
    //Foreach array
            
    foreach ( $cats as $cat ) { 
                
    // se non corrispondono va avanti 
                
    if ( ( int ) $cat['id_parent'] !== ( int ) $category_parent_id ) { 
                    continue; 
                } 
                
    // apro la lista
                
    $list_items[] = '[*]'
                
    // creo i link della categoria 
                
    $list_items[] = '<a href="#' $cat['id_cat'] . '">'
                
    $list_items[] = $cat['categoria']; 
                
    $list_items[] = '</a>'
                
    // richiamo la funzione con il nuovo id 
                
    $list_items[] = category_list$cat['id_cat'] ); 
                
    // chiudo la lista
                
    $list_items[] = ''
            } 
        }elseif(
    $visualizzazione==1){

            
    //Foreach array
            
    foreach ( $cats as $cat ) { 
                
    //indentazione
                
    $indentazione=str_repeat('&mdash;&mdash;',$level);
                
    // se non corrispondono va avanti 
                
    if ( ( int ) $cat['id_parent'] !== ( int ) $category_parent_id ) { 
                    continue; 
                } 
                
    // creo i link della categoria 
                    //mostro selected se corrisponde all'id passato come parametro
                
    if ($id_cat==$cat['id_cat']){
                    
    $list_items[] = '<option selected=\"selected\" value="'.$cat['categoria'].'">'
                }else{
                    
    $list_items[] = '<option value="'.$cat['categoria'].'">'
                }
                
    $list_items[] = $indentazione."".$cat['categoria']; 
                
    $list_items[] = '</option>'
                
    // richiamo la funzione con il nuovo id 
                
    $list_items[] = category_list$cat['id_cat'], $level+1$id_cat);
            } 
        }elseif(
    $visualizzazione==2){
            
    //Foreach array
            
    foreach ( $cats as $cat ) { 
                
    //indentazione
                
    $indentazione=str_repeat('&mdash;&mdash;',$level);
                
    // se non corrispondono va avanti 
                
    if ( ( int ) $cat['id_parent'] !== ( int ) $category_parent_id ) { 
                    continue; 
                } 
                
    // creo i link della categoria 
                    //mostro selected se corrisponde all'id passato come parametro
                
    if ($id_cat==$cat['id_cat']){
                    
    $list_items[] = '<option selected=\"selected\" value="'.$cat['id_cat'].'">'
                }else{
                    
    $list_items[] = '<option value="'.$cat['id_cat'].'">'
                } 
                
    $list_items[] = $indentazione."".$cat['categoria']; 
                
    $list_items[] = '</option>'
                
    // richiamo la funzione con il nuovo id 
                
    $list_items[] = category_list$cat['id_cat'], $level+1$id_cat);
            } 
        }
        
    // converto in stringa 
        
    $list_items implode''$list_items ); 
        
    // se la lista è vuota non la mostro 
        
    if ( '' == trim$list_items ) ) { 
            return 
    ''
        } 
        
    // altrimenti mostro la lista di link
            #echo $list_items;
        
    return $list_items


    Il problema è che se la chiamo in questo modo va tutto bene:
    Codice PHP:
    echo "<select>".category_list(0,1,0,"")."</select>"
    Mentre non visualizza nulla se la richiamo dentro ad un' altra funzione, ad esempio
    Codice PHP:
    function prova(){
       .....
       .....
       echo 
    "<select>".category_list(0,1,0,"")."</select>";
       .....
       .....


Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.