Pagina 1 di 6 1 2 3 ... ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 57
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2005
    Messaggi
    2,125

    regioni province città - ajax

    ciao a tutti.

    Ho trovato uno script molto bello (e gia discusso) per la popolazione dinamica delle select con ajax.
    Questo script ha 3 livelli : regioni - province - citta.
    Il problema e' che quando seleziono una regione , appare automaticamente popolata la <select> delle province.... mentre quella delle città si popola solo se si cambia il valore della select province.
    Come posso modificare lo script affinche venga immediatamente popolata anche la terza <select> senza bisogno di cambiare il valore della seconda(province) per farlo apparire???

    Potete trovare lo script qui dentro :

    http://www.conveyormarket.eu/registrazione_prova.php

    Spero di esser stato abbastanza chiaro.

    cmq posto un po di codice ajax :


    file list.js

    Codice PHP:

    var xmlHttp getXmlHttpObject();

    function 
    loadList(tbid){
    xmlHttp.open('GET''request.php?table='+tb+'&id='+idtrue);
    xmlHttp.onreadystatechange stateChanged;
    xmlHttp.send(null);
    }
    function 
    addOption(selectvaluetext) {
        
    //Aggiunge un elemento <option> ad una lista <select>
        
    var option document.createElement("option");
        
    option.value value,
        
    option.text text;
        try {
            
    select.add(optionnull);
        } catch(
    e) {
            
    //Per Internet Explorer
            
    select.add(option);
        }
    }
    function 
    getSelected(select) {
        
    //Ritorna il valore dell'elemento <option> selezionato in una lista
        
    return select.options[select.selectedIndex].value;
    }
    function 
    stateChanged() {
        if(
    xmlHttp.readyState == 4) {
            
    //Stato OK
            
    if (xmlHttp.status == 200) {
                
                var 
    resp xmlHttp.responseText;
                
                if(
    resp) {
                    
    //Le coppie di valori nella striga di risposta sono separate da ;
                    
    var values resp.split(';');
                    
    //Il primo elemento è l'ID della lista.
                    
    var listId values.shift();
                    var 
    select document.getElementById(listId);
                    
    //Elimina i valori precedenti
                    
    while (select.options.length) {
                        
    select.remove(0);
                    } 
                    
                    if(
    listId == 'regioni') {

                        
    addOption (select0'-- Selezionare regione --');
                    }
                    var 
    limit values.length;
                    
                    for(
    i=0limiti++) {
                        var 
    pair values[i].split('|');
                        
    //aggiunge un elemento <option>
                        
    addOption(selectpair[0], pair[1]);
                    }
                }
            } else {
                
    alert(xmlHttp.responseText);
                                    
            }
        }
    }

    function 
    getXmlHttpObject()
    {
      var 
    xmlHttp=null;
      try
        {
        
    // Firefox, Opera 8.0+, Safari
        
    xmlHttp=new XMLHttpRequest();
        }
      catch (
    e)
        {
        
    // Internet Explorer
        
    try
          {
          
    xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
          }
        catch (
    e)
          {
          
    xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
          }
        }
      return 
    xmlHttp;

    file request.php

    Codice PHP:
    require 'dbconfig.php';
    $conn mysql_connect(DB_HOSTDB_USERDB_PASSWORD) or die;
    mysql_select_db(DB_NAME) or die;
    //I valori in input vanno verificati
    //id deve essere un valore numerico
    $pid = (int)$_REQUEST['id'];
    //maschera  eventuali caratteri speciali in table 
    $tb mysql_real_escape_string($_REQUEST['table'], $conn);

    switch(
    $tb) {
        case 
    'regioni':
            
    $sql="SELECT id, nome FROM `$tb` ORDER BY nome";
            break;
        case 
    'province':
            
    $sql="SELECT id, nome FROM `$tb` WHERE id_regione=$pid ORDER BY nome";
            break;
            case 
    'comuni':
            
    $sql="SELECT id, nome FROM `$tb` WHERE id_provincia=$pid ORDER BY nome";
            break;
            
    }
    //Il primo elemento della risposta è il nome della tabella (= attributo ID del tag select)
    $out="$tb;";
    if(
    $result mysql_query($sql$conn)) {
        while (
    $row mysql_fetch_row($result)) {
            
    $out .= $row[0] . '|' $row[1] . ';';
        }
    }
    //Rimuove il carattere ; in coda
    echo rtrim($out';'); 

  2. #2
    Frontend samurai L'avatar di fcaldera
    Registrato dal
    Feb 2003
    Messaggi
    12,924
    immagino che quandi cambi una provincia richiami una funzione che esegue la chiamata ajax

    quindi, semplicemente quando cambi regione e DOPO che hai ricevuto la lista di province richiami quella funzione passando il value della prima option delle province per popolare i comuni.
    Vuoi aiutare la riforestazione responsabile?

    Iscriviti a Ecologi e inizia a rimuovere la tua impronta ecologica (30 alberi extra usando il referral)

  3. #3
    Utente di HTML.it
    Registrato dal
    Jun 2005
    Messaggi
    2,125
    grazie per la rapidità.
    Ma nel mio caso come faccio?
    devo modificare la funzione loadList() ?

    Il codice e' tutto postato ...non e' che puoi venirmi incontro?

    ecco nello specifico dove chiamo la funzione :

    Codice PHP:
    <select name="regioni" id="regioni" onChange="loadList('province', getSelected(this));" >
                              </
    select></td>
                            </
    tr>
                            <
    tr>
                              <
    td><label for="regioni">Provincia</label></td>
                              <
    td><select name="province" id="province" onChange="loadList('comuni', getSelected(this));">
                                </
    select>                          </td>
                            </
    tr>
                            <
    tr>
                              <
    td><label for="regioni">Comune</label></td>
                              <
    td><select name="comuni" id="comuni">
                                </
    select

  4. #4
    Utente di HTML.it L'avatar di bstefano79
    Registrato dal
    Feb 2004
    Messaggi
    2,520
    Prova così
    Codice PHP:
    <select name="regioni" id="regioni" onChange="loadList('province', getSelected(this)); loadList('comuni', getSelected(document.getElementById('provincie')));" 
                              </
    select></td
                            </
    tr
                            <
    tr
                              <
    td><label for="regioni">Provincia</label></td
                              <
    td><select name="province" id="province" onChange="loadList('comuni', getSelected(this));"
                                </
    select>                          </td
                            </
    tr
                            <
    tr
                              <
    td><label for="regioni">Comune</label></td
                              <
    td><select name="comuni" id="comuni"
                                </
    select

  5. #5
    Utente di HTML.it
    Registrato dal
    Dec 2010
    Messaggi
    3,660
    All'interno della funzione stateChanged dopo aver caricato la lista delle province devi richiamare ancora la pagina che effettua le select su db passando i parametri associati...($tb = comuni...)

    codice:
    function stateChanged() { 
    ...
    for(i=0; i < limit; i++) { 
         var pair = values[i].split('|'); //aggiunge un elemento <option> 
        addOption(select, pair[0],        pair[1]); 
    }
    //richiamo loadList con £tb uguale a comuni ecc...
    ...
    }
    Attento pero che cosi facendo quando cambi la provincia cercherà di caricarla 2 volte.
    Potresti usare un parametro che ti faccia capire che devi fare questa operazione solo quando stai cambiando regione...

  6. #6
    Utente di HTML.it
    Registrato dal
    Jun 2005
    Messaggi
    2,125
    Per stefano79 : niente da fare. Non appare nulla. nel senso...funziona come prima
    Da errore : select is null. (nel file list.js)

  7. #7
    Frontend samurai L'avatar di fcaldera
    Registrato dal
    Feb 2003
    Messaggi
    12,924
    Non vedendo tutto il codice, nè il db devo supporre che nella select delle province tu abbia per coerenza
    loadList('comuni', getSelected(this));

    cmq farei così

    codice:
    function loadList(tb, id){
    xmlHttp.open('GET', 'request.php?table='+tb+'&id='+id, true);
    xmlHttp.onreadystatechange = function() {
        stateChanged(tb);
    }
    xmlHttp.send(null);
    }
    e quindi
    codice:
    function stateChanged(tb) {
        if(xmlHttp.readyState == 4) {
            //Stato OK
            if (xmlHttp.status == 200) {
                var resp = xmlHttp.responseText;
                if(resp) {
                     ...           
                     
                     if (tb == 'province') {
                        loadList('comuni', getSelected(document.getElementById('comuni')); 
                     }
       
                }
            } else {
                alert(xmlHttp.responseText);
                                    
            }
        }
    }
    Vuoi aiutare la riforestazione responsabile?

    Iscriviti a Ecologi e inizia a rimuovere la tua impronta ecologica (30 alberi extra usando il referral)

  8. #8
    Utente di HTML.it L'avatar di bstefano79
    Registrato dal
    Feb 2004
    Messaggi
    2,520
    Originariamente inviato da fcaldera
    codice:
                     if (tb == 'province') {
                        loadList('comuni', getSelected(document.getElementById('comuni'));
    manca una parentesi e deve vedere la provincia selezionata
    codice:
    loadList('comuni', getSelected(document.getElementById('provincie')));
    ma ha gia detto che non funziona e che gli da null il select

  9. #9
    Utente di HTML.it
    Registrato dal
    Jun 2005
    Messaggi
    2,125
    probabilmente la tua soluzione e' giusta...ma non riesco a metterla giusta-....

    Mi hai messo dei puntini di sospensione nella funzione... non riesco a capire dove incollare il codice...

    In secondo.... provando per deduzione a metterlo prima della chiusura della parentesi dell' if(resp) .... non funziona piu nulla. non appare nemmeno le regioni.

    se vuoi metto il file del db....cmq . Il resto del codice l'ho postato.... cosa manca?

    grazie a tutti raga

  10. #10
    Utente di HTML.it
    Registrato dal
    Dec 2010
    Messaggi
    3,660
    quella di stefano mi pare la piu semplice e corretta cmq .... ti da select null perche passi alla funzione "provincie" mentre l'id della select è "province"

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.