Ciao a tutti.
Ho una form con i campi select provincia, comune e cap che prendono i dati dal db e che si compilano in base alla scelta della select precedente: le classiche select dinamiche.
Il problema è che ho 2 gruppi di queste select nella stessa form e ho dovuto adottare un espediente un pò bruttino; vi illustro il codice cosi capite.

class.php
Codice PHP:
class Form
{
    var 
$label;
    var 
$id;
    var 
$name;
    var 
$type;
    var 
$radio = array();
    function 
set_var($a$b$c$d)
    {
        
$this->label $a;
        
$this->id $b;
        
$this->name $c;
        
$this->type $d;
    }

    function 
create_field()
    {
        switch(
$this->type)
        {
            .......
            
            case 
"dynamic_select":
                echo 
"

<label for='"
.$this->id."'>".$this->label."</label>";
                echo 
"<font id='".$this->id."'>";
                echo 
"<select name='".$this->name."'>";
                echo 
"<option value='0'>----</option>";
                echo 
"</select></font></p>";
            break;
        }
    }
    

form.php
Codice PHP:

<script type="text/javascript" src="../js/ajax_cap.js">
</script>
<script type="text/javascript">
//<![CDATA[


window.onLoad=[b]dochange[/b]('id_12', -1),[b]dochange1[/b]('id_29',-1);        // carica la prima select

//]]>
</script>

...

<form>
$field = new Form;
$field->set_var('Provincia','id_12','es_12','dynamic_select');//primo gruppo
$field->create_field();
$field->set_var('Comune','id_13','es_13','dynamic_select');//primo gruppo
$field->create_field();
$field->set_var('Cap','id_14','es_14','dynamic_select');//primo gruppo
$field->create_field();
$field->set_var('Provincia','id_29','es_29','dynamic_select');//secondo gruppo
$field->create_field();
$field->set_var('Comune','id_30','es_30','dynamic_select');//secondo gruppo
$field->create_field();
$field->set_var('Cap','id_31','es_31','dynamic_select');//secondo gruppo
$field->create_field();
</form> 
ajax_cap.js
codice:
function Inint_AJAX()
{
	try { return new ActiveXObject("Msxml2.XMLHTTP"); } catch(e) {} //IE
	try { return new ActiveXObject("Microsoft.XMLHTTP"); } catch(e) {} //IE
	try { return new XMLHttpRequest(); } catch(e) {} //Native Javascript
	alert("XMLHttpRequest not supported");
	return null;
};

function dochange(src, val)
{
	var req = Inint_AJAX();
	req.onreadystatechange = function ()
	{
 		if (req.readyState==4)
		{
      		if (req.status==200)
			{
           		document.getElementById(src).innerHTML=req.responseText; //retuen value
      		}
 		}
	};
	req.open("GET", "../application/italia.php?data="+src+"&val="+val); //make connection
	req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;charset=iso-8859-1"); // set Header
	req.send(null); //send value
}
function dochange1(src, val)
{
	var req = Inint_AJAX();
	req.onreadystatechange = function ()
	{
 		if (req.readyState==4)
		{
      		if (req.status==200)
			{
           		document.getElementById(src).innerHTML=req.responseText; //retuen value
      		}
 		}
	};
	req.open("GET", "../application/italia1.php?data="+src+"&val="+val); //make connection
	req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;charset=iso-8859-1"); // set Header
	req.send(null); //send value
}
italia.php
Codice PHP:
<?
include("../config/config.php");


header ("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header ("Last-Modified: " gmdate("D, d M Y H:i:s") . " GMT");
header ("Cache-Control: no-cache, must-revalidate");
header ("Pragma: no-cache");

header("content-type: application/x-javascript; charset=tis-620");

$data=$_GET['data'];
$val=$_GET['val'];


if (
$data=='id_12') {  // prima select
  
echo "<select class='text' name='provincia' onChange=\"[b]dochange[/b]('id_13', this.value)\">\n";
  echo 
"<option value='0'>Scegli la provincia</option>\n";
  
$result=mysql_query("select `id`, `nome` from province order by `id`");
  while(list(
$id$name)=mysql_fetch_array($result)){
       echo 
"<option value=\"$id\" >$name</option> \n" ;
  }
} else if (
$data=='id_13') { // seconda select
  
echo "<select class='text' name='comune' onChange=\"[b]dochange[/b]('id_14', this.value)\">\n";
  echo 
"<option value='0'>scegli il comune</option>\n";                   
  
$result=mysql_query("SELECT `id`, `nome` FROM comuni WHERE `id_province` = '$val' ORDER BY `id` ");
  while(list(
$id$name)=mysql_fetch_array($result)){
       echo 
"<option value=\"$id\" >$name</option> \n" ;
  }
} else if (
$data=='id_14') { // terza select
  
echo "<select class='text' name='cap' >\n";
    
$result=mysql_query("SELECT `id`, `nome` FROM cap WHERE `id_comuni` = '$val' ORDER BY `id` ");
  while(list(
$id$name)=mysql_fetch_array($result)){
       echo 
"<option value=\"$id\" >$name</option> \n" ;
  }
}

echo 
"</select>\n";

?>
italia1.php
Codice PHP:
<?
include("../config/config.php");


header ("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header ("Last-Modified: " gmdate("D, d M Y H:i:s") . " GMT");
header ("Cache-Control: no-cache, must-revalidate");
header ("Pragma: no-cache");

header("content-type: application/x-javascript; charset=tis-620");

$data=$_GET['data'];
$val=$_GET['val'];


if (
$data=='id_29') {  // prima select
  
echo "<select class='text' name='provincia1' onChange=\"[b]dochange1[/b]('id_30', this.value)\">\n";
  echo 
"<option value='0'>Scegli la provincia</option>\n";
  
$result=mysql_query("select `id`, `nome` from province order by `id`");
  while(list(
$id$name)=mysql_fetch_array($result)){
       echo 
"<option value=\"$id\" >$name</option> \n" ;
  }
} else if (
$data=='id_30') { // seconda select
  
echo "<select class='text' name='comune1' onChange=\"[b]dochange1[/b]('id_31', this.value)\">\n";
  echo 
"<option value='0'>scegli il comune</option>\n";                   
  
$result=mysql_query("SELECT `id`, `nome` FROM comuni WHERE `id_province` = '$val' ORDER BY `id` ");
  while(list(
$id$name)=mysql_fetch_array($result)){
       echo 
"<option value=\"$id\" >$name</option> \n" ;
  }
} else if (
$data=='id_31') { // terza select
  
echo "<select class='text' name='cap1' >\n";
    
$result=mysql_query("SELECT `id`, `nome` FROM cap WHERE `id_comuni` = '$val' ORDER BY `id` ");
  while(list(
$id$name)=mysql_fetch_array($result)){
       echo 
"<option value=\"$id\" >$name</option> \n" ;
  }
}

echo 
"</select>\n";

?>
in pratica la funzione dochange() carica il primo gruppo inviando la richiesta a italia.php,
mentre la funzione dochange1() carica il secondo gruppo inviando la richiesta a italia1.php.
In questo modo devo avere tante funzioni e tanti file italia.php quanti sono i gruppi di select nella form.
La domanda è:
Posso raggruppare tutto in una funzione 'dochange()' e in un file 'italia.php'?