Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 30
  1. #1

    [pillola] option menù multipli creati dinamicamente - il solito problema

    In questa pillola voglio trattare un problema molto comune (circa una volta alla settimana almeno qualcuno chiede come fare), ovvero la creazione di menù option (a tendina per intenderci) in modo dinamico. Ad esempio:

    Ho un primo menù option dove posso scegliere il genere musicale. A dipendenza del genere che scelgo, nel secondo option avrò la lista di musicisti che suonano quel genere, una volta scelto il musicista, nel terzo option, troverò l'elenco degli album.

    Solitamente chi risponde, me compreso, consiglia di implementare una soluzione ajax. Molto elegante non c'è dubbio, ed anche funzionale. Mi rendo conto che purtroppo in diversi vengono però scoraggiati da questa tecnologia.

    Ho provato dunque a realizzare una cosa del genere senza utilizzare ajax, ma solo con un po' di javascript.
    Il risultato è forse un po' laborioso ma è efficace.

    Per il nostro esempio prenderò in considerazione la realizzazione di tre option menù che listano le regioni, le province, i comuni.
    Dunque una volta selezionata la regione, nell'option delle province troverò le province di quella regione. Ed una volta selezionata la provincia, nell'option comuni troverò i comuni di quella provincia.
    Ovviamente tutti questi dati dovrò averli in un database. Cominciamo dunque a vedere come strutturarlo.

    Immagino che tutti sappiate cosa si intende per database relazionale, ma visto che non ne sono sicuro, faccio una brevissima premessa.

    Nel realizzare il database, sarebbe assurdo che facessi una tabella per le regioni, per ogni provincia di ogni regione una tabella e per ogni comune di ogni provincia una tabella. Mi ritroverei un database di migliaia di tabelle e praticamente ingestibile.

    Farò invece 3 tabelle. Una per le regioni, una per le province, e una per i comuni. Sfruttando le chiavi primarie di ogni tabella, le metterò poi in relazione.
    In questo modo:

    Tabella regioni:

    ID – regione


    Tabella province:

    ID – id_regione – provincia


    Tabella comuni:

    ID – id_provincia – comune


    In questo modo se l'id della regione Lombardia è 6, nella tabella delle province la provincia di Como avrà in id_regione il numero 6, come pure ad esempio la provincia di Varese.

    Creiamo allora la struttura del database:

    CREATE TABLE `regioni` (
    `id` int(10) unsigned NOT NULL auto_increment,
    `regione` varchar(20) NOT NULL,
    PRIMARY KEY (`id`)
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1;


    CREATE TABLE `province` (
    `id` int(3) unsigned NOT NULL auto_increment,
    `id_regione` int(3) unsigned NOT NULL,
    `provincia` varchar(20) NOT NULL,
    PRIMARY KEY (`id`)
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1;


    CREATE TABLE `comuni` (
    `id` int(4) unsigned NOT NULL auto_increment,
    `id_provincia` int(3) unsigned NOT NULL,
    `comune` varchar(20) NOT NULL,
    PRIMARY KEY (`id`)
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1;



    E mettiamoci anche qualche dato (non tutti ovviamente, ma almeno per fare qualche prova).



    Adesso, la prima cosa che dovremo fare, è inserire nell'header della pagina una funzione javascript da richiamare nei menù a tendina. Scopo di questa funzione è di ricaricare la pagina al momento della selezione. Chiaramente ricaricheremo la pagina passando dei parametri, ma questo lo vedremo dopo.

    Codice PHP:
    <SCRIPT language=JavaScript>
    <!--
    function 
    goSelect(daform)
    {
            
    with(daform)
            {
                
    top.window.location=options[selectedIndex].value;
            }
        }
    //-->
    </SCRIPT> 
    Siccome andremo a creare una classe, questo script lo metteremo in un metodo della nostra classe; metodo che richiameremo poi nell'header della pagina. Lo vedremo in seguito.

    Creiamo il file db_config.php (è sempre preferibile inserire i dati di connessione del db in un file esterno).
    Codice PHP:
    <?php

    $db 
    "option";
    $host "localhost";
    $username "root";
    $password "password";

    ?>
    Ed ora la classe completa (option.class.php)

    Codice PHP:
    session_start();

    class 
    OptionMenu
    {
        protected    
    $conn;
        protected    
    $page;
        
            public function 
    __construct()
            {
                
    $this->page basename($_SERVER['PHP_SELF']);
                
    $this->DbConnectAndSelect();
                
    $this->ParsingAction();
                
            }
            
            protected function 
    DbConnectAndSelect()
            {
                include 
    "db_config.php";
                
                
    $this->conn = @mysql_connect($host,$username,$password) OR
                die(
    "Impossibile connettersi al server");
                
                @
    mysql_select_db($db$this->conn) OR
                die(
    "Impossibile selezionare il database");
            }
            
            public function 
    JsHeader()
            {
                echo 
    '<SCRIPT language=JavaScript>
                <!--
                function goSelect(daform)
                {
                    with(daform)
                    {
                        top.window.location=options[selectedIndex].value;
                    }
                }
                //-->
                </SCRIPT>
                '
    ;

            }
            
            public function 
    ShowRegioni()
            {
                if(isset(
    $_SESSION['regione']))
                {
                    
    $regione $_SESSION['regione'];
                }
                else
                {
                    
    $regione "Seleziona una regione";
                }
                
                
    $sql "SELECT id,regione FROM regioni";
                
    $res mysql_query($sql$this->conn);
                
                echo 
    '<form>
                <select onchange="goSelect(this)" size="1">
                <option>' 
    $regione '</option>
                '
    ;
                
                    while(
    $row mysql_fetch_array($res))
                    {
                        if(
    $row['regione'] != $regione)
                        {
                            echo 
    '<option value="' $this->page '?id_regione=' $row['id'] . '&action=provincia&regione=' $row['regione'] . '">' $row['regione'] . '</option>
                            '
    ;
                        }
                    }
                
                echo 
    '</select>
                </form>
                '
    ;
            }
            
            public function 
    ShowProvince()
            {
                if(isset(
    $_SESSION['provincia']))
                {
                    
    $provincia $_SESSION['provincia'];
                }
                else
                {
                    
    $provincia 'Seleziona una provincia';
                }
                
                echo 
    '<form>
                <select onchange="goSelect(this)" size="1">
                <option>' 
    $provincia '</option>
                '
    ;
                
                if(
    $regione $this->SelectProvincia())
                {
                    
    $sql "SELECT id,provincia FROM province WHERE id_regione='$regione'";
                    
    $res mysql_query($sql$this->conn);
                    
                        while(
    $row mysql_fetch_array($res))
                        {
                            if(
    $row['provincia'] != $provincia)
                            {
                                echo 
    '<option value="' $this->page '?id_provincia=' $row['id'] . '&action=comune&provincia=' $row['provincia'] . '">' $row['provincia'] . '</option>
                            '
    ;
                            }
                        }
                }
                
                    echo 
    '</select>
                </form>
                '
    ;
            }
            
            public function 
    ShowComuni()
            {
                if(isset(
    $_SESSION['comune']))
                {
                    
    $comune $_SESSION['comune'];
                }
                else
                {
                    
    $comune 'Seleziona un comune';
                }
                
                echo 
    '<form>
                <select onchange="goSelect(this)" size="1">
                <option>' 
    $comune '</option>
                '
    ;
                
                if(
    $_GET['id_provincia'])
                {
                    
    $sql "SELECT id,comune FROM comuni WHERE id_provincia='$_GET[id_provincia]'";
                    
    $res mysql_query($sql$this->conn);
                    
                        while(
    $row mysql_fetch_array($res))
                        {
                            echo 
    '<option value="' $this->page '?id_comune=' $row['id'] . '&action=end&comune=' $row['comune'] . '">' $row['comune'] . '</option>
                        '
    ;
                        }
                }
                
                    echo 
    '</select>
                </form>
                '
    ;
            }
            
            protected function 
    SelectProvincia()
            {
                if(!
    $_GET['id_regione'] AND !$_SESSION['regione'])
                {
                    return 
    FALSE;
                }
                else
                {
                    if(
    $_GET['id_regione'])
                    {
                        return 
    $_GET['id_regione'];
                    }
                    else
                    {
                        
    $sql "SELECT id FROM regioni WHERE regione='$_SESSION[regione]'";
                        
    $res mysql_query($sql$this->conn);
                        
    $row mysql_fetch_array($res);
                        
                        return 
    $row['id'];
                    }
                }
            }
            
            protected function 
    ParsingAction()
            {
                if(isset(
    $_GET['action']))
                {
                    if(
    $_GET['action'] == 'provincia')
                    {
                        
    $_SESSION['regione'] = $_GET['regione'];
                        unset(
    $_SESSION['provincia']);
                        unset(
    $_SESSION['comune']);
                    }
                    if(
    $_GET['action'] == 'comune')
                    {
                        
    $_SESSION['provincia'] = $_GET['provincia'];
                        unset(
    $_SESSION['comune']);
                    }
                    if(
    $_GET['action'] == 'end')
                    {
                        
    $_SESSION['comune'] = $_GET['comune'];
                        
    header("Location: result.php");
                        die;
                    }
                }
            }

    Che utilizzeremo in questo modo:
    Codice PHP:
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>

    <head>
        <meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
        <title>Titolo</title>
        <?php
        
    include "option.class.php";
        
    $OpMenu = new OptionMenu();
        
    $OpMenu->JsHeader();
        
    // Abbiamo incluso la classe, istanziato la classe, e stampato la funzione Javascript
        
    ?>
    </head>

    <body>
    <?php
    $OpMenu
    ->ShowRegioni();
    $OpMenu->ShowProvince();
    $OpMenu->ShowComuni();
    // Naturalmente possono essere impaginati a piacere
    ?>

    </body>
    </html>
    Una volta scelto il comune si verrà reindirizzati alla pagina result.php, a titolo di prova l'ho fatta così:
    Codice PHP:
    <?php

    session_start
    ();

    echo 
    'Regione: ' $_SESSION['regione'] . '
    Provincia: ' 
    $_SESSION['provincia'] . '
    Comune: ' 
    $_SESSION['comune'];

    ?>
    Alcune considerazioni:

    Utilizzo le sessioni per comodità; nel senso che mi permettono di memorizzare lo stato delle scelte ed eventualmente anche operare dei ripensamenti. Infatti, finchè non si è scelto il comune, è possibile modificare nuovamente la regione o la provincia.
    E' chiaro che se dovessi scegliere un'altra regione quando ho già scelto la provincia, dovrò resettare i parametri di sessione associati alla regione e alla provincia, questo lo faccio con il metodo ParsingAction() che invoco nel costruttore. In questo modo, ogni volta che viene modificata una selezione, il metodo si occupa di assegnare il giusto stato alla sessione.
    PHP LEARN - Guide, tutorial e articoli sempre aggiornati
    NUOVO: standardLib; il potente framework PHP é ora disponibile
    *******************************************
    Scarica oggi la tua copia di MtxEventManager

  2. #2

    Scusami ma non sono riuscito ad utilizzare il codice.

    Ho seguito passo passo le tue istruzioni ma il risultato è questo

    codice:
    session_start(); class OptionMenu { protected $conn; protected $page; public function __construct() { $this->page = basename($_SERVER['PHP_SELF']); $this->DbConnectAndSelect(); $this->ParsingAction(); } protected function DbConnectAndSelect() { include "db_config.php"; $this->conn = @mysql_connect($host,$username,$password) OR die("Impossibile connettersi al server"); @mysql_select_db($db, $this->conn) OR die("Impossibile selezionare il database"); } public function JsHeader() { echo ' '; } public function ShowRegioni() { if(isset($_SESSION['regione'])) { $regione = $_SESSION['regione']; } else { $regione = "Seleziona una regione"; } $sql = "SELECT id,regione FROM cgil_regioni"; $res = mysql_query($sql, $this->conn); echo '
     ' . $regione . ' '; while($row = mysql_fetch_array($res)) { if($row['regione'] != $regione) { echo '' . $row['regione'] . ' '; } } echo ' 
    '; } public function ShowProvince() { if(isset($_SESSION['provincia'])) { $provincia = $_SESSION['provincia']; } else { $provincia = 'Seleziona una provincia'; } echo '
     ' . $provincia . ' '; if($regione = $this->SelectProvincia()) { $sql = "SELECT id,provincia FROM cgil_province WHERE id_regione='$regione'"; $res = mysql_query($sql, $this->conn); while($row = mysql_fetch_array($res)) { if($row['provincia'] != $provincia) { echo '' . $row['provincia'] . ' '; } } } echo ' 
    '; } public function ShowComuni() { if(isset($_SESSION['comune'])) { $comune = $_SESSION['comune']; } else { $comune = 'Seleziona un comune'; } echo '
     ' . $comune . ' '; if($_GET['id_provincia']) { $sql = "SELECT id,comune FROM cgil_comuni WHERE id_provincia='$_GET[id_provincia]'"; $res = mysql_query($sql, $this->conn); while($row = mysql_fetch_array($res)) { echo '' . $row['comune'] . ' '; } } echo ' 
    '; } protected function SelectProvincia() { if(!$_GET['id_regione'] AND !$_SESSION['regione']) { return FALSE; } else { if($_GET['id_regione']) { return $_GET['id_regione']; } else { $sql = "SELECT id FROM cgil_regioni WHERE regione='$_SESSION[regione]'"; $res = mysql_query($sql, $this->conn); $row = mysql_fetch_array($res); return $row['id']; } } } protected function ParsingAction() { if(isset($_GET['action'])) { if($_GET['action'] == 'provincia') { $_SESSION['regione'] = $_GET['regione']; unset($_SESSION['provincia']); unset($_SESSION['comune']); } if($_GET['action'] == 'comune') { $_SESSION['provincia'] = $_GET['provincia']; unset($_SESSION['comune']); } if($_GET['action'] == 'end') { $_SESSION['comune'] = $_GET['comune']; header("Location: result.php"); die; } } } } 
    Fatal error: Cannot instantiate non-existent class: optionmenu in /web/htdocs/www.xxxxxxxxx.it/xxxx/xxxx/xxxx/index_prova.php on line 12

  3. #3

    Re: Scusami ma non sono riuscito ad utilizzare il codice.

    Originariamente inviato da poldissimo
    Ho seguito passo passo le tue istruzioni ma il risultato è questo
    sei sicuro di avere abilitato il php?

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  4. #4

    eehhhmmm!!

    Grazie Piero Mac per le tue segnalazioni sempre puntuali

    Si .... in effetti... non avevo iniziato la pagina con il marcatore di php...

    ora però ho questo errore..

    codice:
    Parse error: syntax error, unexpected T_STRING, expecting T_OLD_FUNCTION or T_FUNCTION or T_VAR or '}' in /web/htdocs/www.xxxxxxxxx.it/xxxx/xxxx/xxxx/option.class.php on line 7
    ho controllato la versione del server linux

    PHP Version 5.2.8 centra qualcosa?

  5. #5

    Scusate ...

    funziona perfettamente..

    adesso vedo di integrarlo nel mio form personalizzato.

    Complimenti per l'ottima "pillola"

  6. #6
    Utente di HTML.it
    Registrato dal
    Oct 2006
    Messaggi
    121

    elenco regioni e province

    Scusami Maurizio
    Stavo cercando di vedere se potevo sfruttare questo script per le mie esigenze.
    Ho bisogno di poter elencare i punti vendita di un azienda nelle diverse regioni d'italia.
    avevo in mente un cartina d'italia e cliccando nelle diverse regioni potesse elencare i punti vendita della regione divise per provincia, ma quello che proponi tu mi sembra anche meglio, eventualmente non saprei come creare una pagina per poter inserire un modulo che inserisca i vari dati aziendali sul Db (Rag.sociale, indirizzo citta, prov. regione), portesti darmi qualche dritta....grazie in anticipo
    Roberto

  7. #7
    Innanzitutto grazie mille per il file, mi è utilissimo..

    Ho provato a modificare il file option.class.php secondo le mie esigenze, ovvero cambiando i nomi delle variabili secondo i nomi dei campi del mio database. Risultato: riesco a scegliere nella prima tendina, ma una volta scelto non si carica nulla nella seconda... Cos'ho sbagliato?
    Codice PHP:

    <?php

    session_start
    ();

    class 
    OptionMenu
    {
        protected    
    $conn;
        protected    
    $page;

            public function 
    __construct()
            {
                
    $this->page basename($_SERVER['PHP_SELF']);
                
    $this->DbConnectAndSelect();
                
    $this->ParsingAction();

            }

            protected function 
    DbConnectAndSelect()
            {
                include 
    "db_config.php";

                
    $this->conn = @mysql_connect($host,$username,$password) OR
                die(
    "Impossibile connettersi al server");

                @
    mysql_select_db($db$this->conn) OR
                die(
    "Impossibile selezionare il database");
            }

            public function 
    JsHeader()
            {
                echo 
    '<SCRIPT language=JavaScript>
                   <!--
                function goSelect(daform)
                {
                    with(daform)
                    {
                        top.window.location=options[selectedIndex].value;
                    }
                }
                -->
                </SCRIPT>
                '
    ;

            }

            public function 
    ShowOggetti()
            {
                if(isset(
    $_SESSION['oggetto']))
                {
                    
    $oggetto $_SESSION['oggetto'];
                }
                else
                {
                    
    $oggetto "Seleziona un oggetto";
                }

                
    $sql "SELECT id_oggetto, nome_oggetto FROM oggetti";
                
    $res mysql_query($sql$this->conn);

                echo 
    '<form>
                <select onchange="goSelect(this)" size="1">
                <option>' 
    $oggetto '</option>
                '
    ;

                    while(
    $row mysql_fetch_array($res))
                    {
                        if(
    $row['nome_oggetto'] != $oggetto)
                        {
                            echo 
    '<option value="' $this->page '?id_ogg=' $row['id_oggetto'] . '&action=marca&oggetto=' $row['nome_oggetto'] . '">' $row['nome_oggetto'] . '</option>
                            '
    ;
                        }
                    }

                echo 
    '</select>
                </form>
                '
    ;
            }

            public function 
    ShowMarche()
            {
                if(isset(
    $_SESSION['marca']))
                {
                    
    $marca $_SESSION['marca'];
                }
                else
                {
                    
    $marca 'Seleziona una marca';
                }

                echo 
    '<form>
                <select onchange="goSelect(this)" size="1">
                <option>' 
    $marca '</option>
                '
    ;

                if(
    $oggetto $this->SelectMarca())
                {
                    
    $sql "SELECT id_marca,nome_marca FROM marche WHERE id_ogg='$oggetto'";
                    
    $res mysql_query($sql$this->conn);

                        while(
    $row mysql_fetch_array($res))
                        {
                            if(
    $row['nome_marca'] != $marca)
                            {
                                echo 
    '<option value="' $this->page '?id_mark=' $row['id_marca'] . '&action=modello&marca=' $row['nome_marca'] . '">' $row['nome_marca'] . '</option>
                            '
    ;
                            }
                        }
                }

                    echo 
    '</select>
                </form>
                '
    ;
            }

            public function 
    ShowModelli()
            {
                if(isset(
    $_SESSION['modello']))
                {
                    
    $modello $_SESSION['modello'];
                }
                else
                {
                    
    $modello 'Seleziona un modello';
                }

                echo 
    '<form>
                <select onchange="goSelect(this)" size="1">
                <option>' 
    $modello '</option>
                '
    ;

                if(
    $_GET['id_marca'])
                {
                    
    $sql "SELECT id_modello,nome_modello FROM modelli WHERE id_mark='$_GET[id_marca]'";
                    
    $res mysql_query($sql$this->conn);

                        while(
    $row mysql_fetch_array($res))
                        {
                            echo 
    '<option value="' $this->page '?id_modello=' $row['id_modello'] . '&action=end&modello=' $row['nome_modello'] . '">' $row['nome_modello'] . '</option>
                        '
    ;
                        }
                }

                    echo 
    '</select>
                </form>
                '
    ;
            }

            protected function 
    SelectMarca()
            {
                if(!
    $_GET['id_oggetto'] AND !$_SESSION['oggetto'])
                {
                    return 
    FALSE;
                }
                else
                {
                    if(
    $_GET['id_oggetto'])
                    {
                        return 
    $_GET['id_oggetto'];
                    }
                    else
                    {
                        
    $sql "SELECT id_oggetto FROM oggetti WHERE oggetto='$_SESSION[oggetto]'";
                        
    $res mysql_query($sql$this->conn);
                        
    $row mysql_fetch_array($res);

                        return 
    $row['id_oggetto'];
                    }
                }
            }

            protected function 
    ParsingAction()
            {
                if(isset(
    $_GET['action']))
                {
                    if(
    $_GET['action'] == 'marca')
                    {
                        
    $_SESSION['oggetto'] = $_GET['oggetto'];
                        unset(
    $_SESSION['marca']);
                        unset(
    $_SESSION['modello']);
                    }
                    if(
    $_GET['action'] == 'modello')
                    {
                        
    $_SESSION['marca'] = $_GET['marca'];
                        unset(
    $_SESSION['modello']);
                    }
                    if(
    $_GET['action'] == 'end')
                    {
                        
    $_SESSION['modello'] = $_GET['modello'];
                        
    header("Location: result.php");
                        die;
                    }
                }
            }
    }

    ?>

  8. #8
    ma, difficile da dire. Controlla di avere sostituito veramente tutto, probabile che sia un errore di sintassi nella trascrizione di qualche variabile.
    E poi

    $sql = "SELECT id_marca,nome_marca FROM marche WHERE id_ogg='$oggetto'"

    visto che id_oggetto è un INT, togli quegli apici (anche dalle altre query).
    PHP LEARN - Guide, tutorial e articoli sempre aggiornati
    NUOVO: standardLib; il potente framework PHP é ora disponibile
    *******************************************
    Scarica oggi la tua copia di MtxEventManager

  9. #9

    Re: [pillola] option menù multipli creati dinamicamente - il solito problema

    Originariamente inviato da mtx_maurizio
    Farò invece 3 tabelle. Una per le regioni, una per le province, e una per i comuni. Sfruttando le chiavi primarie di ogni tabella, le metterò poi in relazione.
    giusto un appunto, questo tipo di informazioni sono estremamente adatte ad un algoritmo di tipo Modified Preorder Trasversal Tree in quanto i dati sono "statici"
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  10. #10

    Re: Re: [pillola] option menù multipli creati dinamicamente - il solito problema

    Originariamente inviato da andr3a
    giusto un appunto, questo tipo di informazioni sono estremamente adatte ad un algoritmo di tipo Modified Preorder Trasversal Tree in quanto i dati sono "statici"
    VVoVe: VVoVe: VVoVe: VVoVe: VVoVe: VVoVe: VVoVe:

    PHP LEARN - Guide, tutorial e articoli sempre aggiornati
    NUOVO: standardLib; il potente framework PHP é ora disponibile
    *******************************************
    Scarica oggi la tua copia di MtxEventManager

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.