• User Attivo

    Ciao,
    io prevederei delle variabili a livello di pagina e le valorizzerei prima di ogni chiamata ajax.

    ES:
    [PHP]
    var provincia = null;
    var comune = null;
    var cap = null;

    $(document).ready(
    .................
    )
    [/PHP]

    Prima di richiedere i comuni valorizzi la variabile provincia con la provincia scelta e prima di richiedere il cap salvi il valore scelto del comune nella variabile comune.

    Spero di essere stato chiaro.
    Ciao


  • User

    Rieccomi alla carica...
    purtroppo non sono riuscito a fare come mi hai indicato, Mirko.
    Vado per ordine....

    • Seleziono la provincia dalla prima combo.
      Mi fa una chiamata alla checkcomune.php e gli passa come parametri:
      comune=-1;
      provincia=72; ad esempio (value della provincia selezionata)
      La check comune mi restituisce giustamente l'elenco di tutti i comuni senza nessuno già selezionato (giustamente perchè -1 non corrisponde a nessuno dei values dei comuni.
    • Seleziono il comune dalla seconda combo:
      Mi richiama alla checkcap.php passandogli come parametro il codice del comune:
      comune=72012; ad esempio
      Correttamente mi restituisce il cap corrispondente al comune selezionato, ma la combo dei comuni mi mostra sempre il primo comune della lista.

    Dovrei quindi fare in modo di ripassare il parametro codice comune corretto alla checkcomune... ma come lo intercetto, al caricamento della pagina?

    Grazie
    Nicola


  • User Attivo

    Ciao,
    cerco di portarti parte dell'esempio:

    [php]

    //variabili globali
    var prov_glob= null;
    var com_glob= null;
    var cap_glob= null;

    $("#provincia").change(function() {
    //SALVO IL VALORE SCELTO PER LA PROVINCIA
    prov_glob = $("#provincia").val();

    var prov = $("#provincia").val();
    var comune = $("#citta").val();
    
    $.ajax({  
        type: "POST",  
         url: "checkcomune.php",  
        data: "provincia="+ prov + "&comune="+ comune,  
        success: function(resp){  
       
        $("#citta").ajaxComplete(function(event, request, settings){ 
    
                $(this).html(resp);
       
           });
    
             } 
       
    });
    

    }); //fine provincia.change
    [/php]
    E poi la stessa cosa quando si scatena l'evento onchange sui comuni.
    Finita la function che gestisce la scelta dei comuni riassegni alla select dei comuni il valore salvato in com_glob.

    Ciao


  • User

    Niente da fare.
    [...]

    Grazie
    Nicola


  • User Attivo

    Io l'ho fatto usando il plugin jquery: linkedSelect


  • User

    Ciao,
    ho provato, i risultati non sono proprio come mi aspettavo, è di una lentezza impressionante (forse per la grossa mole di dati da trattare) inoltre mi da un popup con un errore js.

    Grazie
    Nicola


  • User Attivo

    A me funziona benissimo, dipende come l'hai applicato, io ho tre select, la prima delle regioni è normale, selezionata la regione presento le provincie e poi i comuni:

    
    $(document).ready(function(){
    $('#provincia').linkedSelect('ajaxsave.php?ps=comune','#comune',{firstOption: 'Selezionare il comune', loadingText: 'Attendere...'});
    $('#regione').linkedSelect('ajaxsave.php?ps=provincia','#provincia',{firstOption: 'Selezionare la provincia', loadingText: 'Attendere...'});
    });
    
    

    ajaxsave.php mi torna i dati necessari.


  • User

    Ah c'è proprio il metodo linkedselect...
    Io invece ho cercato quella parola su google e ho trovato altro... che ho provato... con tutte le conseguenze che ti ho descritto.

    Ti sarei grato se mi posteresti il link alla libreria.

    Grazie mille
    Nicola


  • User

    Ho provato anche a cercarla tra i plugin sul sito ufficiale ma non me lo ha trovato 😞


  • User Attivo

    Effettivamente il sito non c'è più, ti posto il codice di jquery.linkedselect.js:

    
    (function($){
      $.fn.linkedSelect = function(url,destination,params) {
          var params = $.extend({
             firstOption : 'Please Select',
             loadingText : 'Loading...'
          },params);
          var $dest = $(destination);
          return this.each(function(){
            $(this).bind('change', function() {
                var $$ = $(this);
                $dest.attr('disabled','false')
           .append('<option value="">' +params.loadingText+ '</option>')
           .ajaxStart(function(){
            $$.show();
                });
                $.getJSON(url,{str: $$.val() }, function(j){
                   if (j.length > 0) {
                      var options = '<option value="">' +params.firstOption+ '</option>';
                      for (var i = 0; i < j.length; i++) {
                         options += '<option value="' + j*.optionValue + '">' + j*.optionDisplay + '</option>';
                      }
                   }
                  $dest.removeAttr('disabled')
            .html(options)
            .find('option:first')
            .attr('selected', 'selected');
                });
             });
          });
       };
    })(jQuery);
    
    

  • User

    Grazie mille.
    Ora provo... al max ti chiederò delle dritte sull'utilizzo.

    Dovrò modificare il js leggermente perchè in realtà io ho due combo e una textbox il cui valore è univocamente definito dalla scelta della seconda combo.

    Ti farò sapere.

    Grazie
    Nicola


  • User

    Ciao,
    finalmente ho trovato 5 minuti per provare questo codice.

    Sorge la prima domanda: in che modo la funzione (nel tuo caso ajaxsave.php) ti restituisce i valori?

    Grazie
    Nicola


  • User

    Ciao ho risolto,
    ho semplicemente modificato il js che mi hai postato adattandolo all'oggetto JSON che il mio script emette.


  • User

    Faccio un attimo il punto della situazione:
    ho brillantemente risolto il problema delle due linked select (seleziona provincia --> elenco province).
    Ora vorrei che selezionando un comune, nella textbox successiva vorrei visualizzare il cap, che è in corrispondenza 1 a 1 con il comune selezionato.
    Utilizzando la stessa linkedselect.js riesco a ricavarmi, dalla checkcap.php, il cap corretto attraverso un json message, ad esempio
    [{"txtValue" : "60020"}]Mi manca l'ultimo pezzettino... ovvero riuscire a visualizzarlo nella textbox.Come posso fare?


  • User Attivo

    Ciao,
    dovrebbe essere:

    [php]
    document.getElementById(idTextbox).value = il cap;
    [/php]Con JQuery:

    [php]
    $('#' + idTextbox).val(il cap);
    [/php]Ciao


  • User

    Eh purtroppo non è cosi facile, mi sono un po incasinato.
    Mi spiego:
    nella pagina principale ho questo codice

    
    $(document).ready(function(){
     
     $('#citta').linkedSelect('checkcap2.php','#cap');
     $('#provincia').linkedSelect('checkcomune2.php','#citta',{firstOption: 'Selezionare il comune', loadingText: 'Attendere...'}); 
    }
    
    

    La linked select è quella indicata da Senamion. Ho provato a modificarla in modo di passargli un ulteriore parametro 'isSelectBox' che vale 0 o 1 e mettere una if nella quale mi viene restituito

    
    $.getJSON(url,{str: $$.val() }, function(j){
                    if (j.length > 0) {
                       var options = '<option value="">' +params.firstOption+ '</option>';
                       for (var i = 0; i < j.length; i++) {
                          options += '<option value="' + j*.optionValue + '">' + j*.optionDisplay + '</option>';
                       }
                    }
                   $dest.removeAttr('disabled')
             .html(options)
             .find('option:first')
             .attr('selected', 'selected');
                 });
    
    

    Se si tratta di select box, oppure

    
    $dest.val()=j.txtValue;
    
    

    ..ma non va 😞


  • User Attivo

    Ciao,
    prova così:
    [PHP]
    $dest.val(j.txtValue);[/PHP]

    Ciao


  • User

    Ciao,
    l'ho modificata in questo modo ma non funziona....

    
    (function($){
      $.fn.linkedSelect = function(url,destination,params) {
          var params = $.extend({
             firstOption : 'Please Select',
             loadingText : 'Loading...'
          },params);
          var $dest = $(destination);
           
           return this.each(function(){
             $(this).bind('change', function() {
                 var $$ = $(this);
                 $dest.attr('disabled','false')
            .append('<option value="">' +params.loadingText+ '</option>')
            .ajaxStart(function(){
             $$.show();
                 });
                 
                 if(params.isSelectBox==1){
                 $.getJSON(url,{str: $$.val() }, function(j){
                    if (j.length > 0) {
                       var options = '<option value="">' +params.firstOption+ '</option>';
                       for (var i = 0; i < j.length; i++) {
                          options += '<option value="' + j*.optionValue + '">' + j*.optionDisplay + '</option>';
                       }
                    }
                   $dest.removeAttr('disabled')
             .html(options)
             .find('option:first')
             .attr('selected', 'selected');
                 });
                 
               }else if(params.isSelectBox==0){
                
                $.getJSON(url,{str: $$.val() }, function(j){
                    
             $dest.val(j.txtValue);
                 });
               }  
                 
              });
           });
          
       };
       
       
    })(jQuery);
    
    

  • User Attivo

    Ciao,
    mi è parso di capire che j è un array?

    Allora:
    [php]$('#' + ID_dest).val(j*.txtValue);
    [/php]
    Ciao


  • User

    Si ma contiene solo un valore nel caso del cap. Devo mettere l'indice comunque?