Dropdown dipendenti regioni provincie comuni

Luca Benati

Come creare una serie di campi dropdown dipendenti e relazionati in October


Pubblicato da Luca Benati il 14 settembre 2019

Creare una serie di select dipendenti in October è molto semplice, lo vediamo in questo articolo andando ad implementare una serie di tendine relazionate tra regioni, provincie e comuni italiani sicuri di fare un favore a molti dato che spesso servono nei nostri progetti nei quali è necessario inserire un indirizzo di destinazione, di anagrafica ecc.

Per raggiungere il nostro scopo dobbiamo solo aggiungere la definizione dei campi e le loro dipendenze nel file fields.yaml del nostro plugin come di seguito:


regione_id:
    label: Regione
    emptyOption: '-- Seleziona --'
    showSearch: true
    span: auto
    type: dropdown
    tab: 'Indirizzo'
provincia_id:
    label: Provincia
    emptyOption: '-- Seleziona --'
    showSearch: true
    span: auto
    dependsOn:
        - regione_id
    type: dropdown
    tab: 'Indirizzo'
comune_id:
    label: Comune
    emptyOption: '-- Seleziona --'
    showSearch: true
    span: auto
    dependsOn:
        - regione_id
        - provincia_id
    type: dropdown
    tab: 'Indirizzo'

Nulla ci vieta naturalmente di raggiungere lo stesso risultato utilizzando l'interfaccia del comodissimo builder disponibile per la creazione dei plugin di October.

Come possiamo vedere è tutto molto autoesplicativo, definiamo tre normalissimi campi di tipo dropdown specificando per la provincia e il comune i nomi dei campi da cui dipendono tramite la chiave "dependsOn", così facendo la tendina delle provincie dipenderà da quella delle regioni e quella dei comuni sia da quella delle provincie che da quella delle regioni in modo che anche se compilate tutte e tre andando a cambiare la regione vengano resettate le atre due.

Se omettessimo la dipendenza del campo "regione_id" nella definizione del campo "comune_id" qunado andremo a selezionare una regione diversa la tendina dei comuni non verrebbe aggiornata ma manterrebbe l'ultimo valore selezionato.

Ora andiamo a definire le tre funzioni pubbliche nel model del nostro plugin che andranno ad alimentre le tre tendine come segue


public function getRegioneIdOptions(){
        return Regione::orderBy('regione')->lists('regione','id');
}

public function getProvinciaIdOptions(){
        return Provincia::where('reg_id', $this->regione_id)->orderBy('provincia')->lists('provincia','id');
}

public function getComuneIdOptions(){
        return Comune::where('prov_id', $this->provincia_id)->where('reg_id', $this->regione_id)->orderBy('comune')->lists('comune','id');
}

Ora andremo ad aggiungere tre nuovi Model al nostro plugin per le tre tabelle appena create .

Quindi avremo un Model per le regioni:

file: Regione.php



namespace Mio\Plugin\Models;

use Model;

class Regione extends Model
{
    use \October\Rain\Database\Traits\Validation;

    public $timestamps = false;

    public $table = 'mio_plugin_regioni';

    public $hasMany = [
                        'province' => [
                                        'Mio\Plugin\Models\Provincia',
                                        'key' => 'reg_id'
                        ],
                        'comuni'   => [
                                        'Mio\Plugin\Models\Comune',
                                        'key' => 'reg_id'
                        ]
    ];
}

Uno per le provincie:

file: Provincia.php



namespace Mio\Plugin\Models;

use Model;

class Provincia extends Model
{
    use \October\Rain\Database\Traits\Validation;

    public $timestamps = false;

    public $table = 'mio_plugin_province';

    public $rules = [
    ];

    public $belongsTo = [
                        'regione' => [
                                        'Mio\Plugin\Models\Regione',
                                        'key' => 'reg_id'
                        ]
    ];

    public $hasMany = [
                        'comuni' => [
                                        'Mio\Plugin\Models\Comune',
                                        'key' => 'prov_id'
                        ]
    ];
}

E uno per i comuni:

file: Comune.php



namespace Mio\Plugin\Models;

use Model;

class Comune extends Model
{
    use \October\Rain\Database\Traits\Validation;

    public $timestamps = false;

    public $table = 'mio_plugin_comuni';

    public $rules = [
    ];

    public $belongsTo = [
                        'regione' => [
                                        'Mio\Plugin\Models\Regione',
                                        'key' => 'reg_id'
                        ],
                        'provincia' => [
                                        'Mio\Plugin\Models\Provincia',
                                        'key' => 'prov_id'
                        ]
    ];

}

Ecco fatto, non è necessario fare altro, le nostre tre tendine ora sono perfettamente funzionanti...se non fosse che non abbiamo ancora creato e popolato le nostre tre tabelle nel database contenenti le regione le provincie e i comuni italiani.

Quindi prepariamo le nostre tre migration

Per le regioni


namespace Mio\Plugin\Updates;

use Schema;
use October\Rain\Database\Updates\Migration;

class RegioneTableCreateMioPlugin extends Migration
{
    public function up()
    {
        Schema::create('mio_plugin_regione', function($table)
        {
            $table->increments('id')->unsigned();
            $table->string('regione', 255);
        });
    }

    public function down()
    {
        Schema::dropIfExists('mio_plugin_regione');
    }
}

Per le provincie


namespace Mio\Plugin\Updates;

use Schema;
use October\Rain\Database\Updates\Migration;

class ProvinciaTableCreateMioPlugin extends Migration
{
    public function up()
    {
        Schema::create('mio_plugin_provincia', function($table)
        {
            $table->increments('id')->unsigned();
            $table->string('provincia', 255);
            $table->integer('reg_id')->unsigned();
        });
    }

    public function down()
    {
        Schema::dropIfExists('mio_plugin_provincia');
    }
}

Per i comuni


namespace Mio\Plugin\Updates;

use Schema;
use October\Rain\Database\Updates\Migration;

class ComuneTableCreateMioPlugin extends Migration
{
    public function up()
    {
        Schema::create('mio_plugin_comune', function($table)
        {
            $table->increments('id')->unsigned();
            $table->string('comune', 255);
            $table->integer('prov_id')->unsigned();
            $table->integer('reg_id')->unsigned();
        });
    }

    public function down()
    {
        Schema::dropIfExists('mio_plugin_comune');
    }
}

Eseguiamo quindi le nostre migration

E i nostri tre seeders

Per le regioni


namespace Mio\Plugin\Updates;

use Seeder;
use Mio\Plugin\Models\Regione;

class SeedRegioneTable extends Seeder
{

    public $regioni = [
                ['id' => '1','regione' => 'Piemonte'],
                ['id' => '2','regione' => 'Umbria'],
                ['id' => '3','regione' => 'Marche'],
                ['id' => '4','regione' => 'Lazio'],
                ['id' => '5','regione' => 'Abruzzo'],
                ['id' => '6','regione' => 'Molise'],
                ['id' => '7','regione' => 'Campania'],
                ['id' => '8','regione' => 'Puglia'],
                ['id' => '9','regione' => 'Basilicata'],
                ['id' => '10','regione' => 'Calabria'],
                ['id' => '11','regione' => 'Sicilia'],
                ['id' => '12','regione' => 'Valle d\'Aosta'],
                ['id' => '13','regione' => 'Sardegna'],
                ['id' => '14','regione' => 'Lombardia'],
                ['id' => '15','regione' => 'Trentino-Alto Adige'],
                ['id' => '16','regione' => 'Veneto'],
                ['id' => '17','regione' => 'Friuli-Venezia Giulia'],
                ['id' => '18','regione' => 'Liguria'],
                ['id' => '19','regione' => 'Emilia-Romagna'],
                ['id' => '20','regione' => 'Toscana']
            ];

    public function run()
    {
        foreach($regioni as $regione){

            Regione::create([
                                'id'        => $regione['id'],
                                'regione'   => $regione['regione']
                            ]);
        }
    }
}

Per le provincie


namespace Mio\Plugin\Updates;

use Seeder;
use Mio\Plugin\Models\Provincia;

class SeedProvinciaTable extends Seeder
{

    public $province = [
                ['id' => '1','provincia' => 'Agrigento','reg_id' => '11'],
                ['id' => '2','provincia' => 'Alessandria','reg_id' => '1'],
                ['id' => '3','provincia' => 'Ancona','reg_id' => '3'],
                ['id' => '4','provincia' => 'Aosta','reg_id' => '12'],
                ['id' => '5','provincia' => 'Ascoli Piceno','reg_id' => '3'],
                ['id' => '6','provincia' => 'L\'Aquila','reg_id' => '5'],
                ['id' => '7','provincia' => 'Arezzo','reg_id' => '20'],
                ['id' => '8','provincia' => 'Asti','reg_id' => '1'],
                ['id' => '9','provincia' => 'Avellino','reg_id' => '7'],
                ['id' => '10','provincia' => 'Bari','reg_id' => '8'],
                ['id' => '11','provincia' => 'Bergamo','reg_id' => '14'],
                ['id' => '12','provincia' => 'Biella','reg_id' => '1'],
                ['id' => '13','provincia' => 'Belluno','reg_id' => '16'],
                ['id' => '14','provincia' => 'Benevento','reg_id' => '7'],
                ['id' => '15','provincia' => 'Bologna','reg_id' => '19'],
                ['id' => '16','provincia' => 'Brindisi','reg_id' => '8'],
                ['id' => '17','provincia' => 'Brescia','reg_id' => '14'],
                ['id' => '18','provincia' => 'Bolzano','reg_id' => '15'],
                ['id' => '19','provincia' => 'Cagliari','reg_id' => '13'],
                ['id' => '20','provincia' => 'Campobasso','reg_id' => '6'],
                ['id' => '21','provincia' => 'Caserta','reg_id' => '7'],
                ['id' => '22','provincia' => 'Chieti','reg_id' => '5'],
                ['id' => '23','provincia' => 'Carbonia-Iglesias','reg_id' => '13'],
                ['id' => '24','provincia' => 'Caltanissetta','reg_id' => '11'],
                ['id' => '25','provincia' => 'Cuneo','reg_id' => '1'],
                ['id' => '26','provincia' => 'Como','reg_id' => '14'],
                ['id' => '27','provincia' => 'Cremona','reg_id' => '14'],
                ['id' => '28','provincia' => 'Cosenza','reg_id' => '10'],
                ['id' => '29','provincia' => 'Catania','reg_id' => '11'],
                ['id' => '30','provincia' => 'Catanzaro','reg_id' => '10'],
                ['id' => '31','provincia' => 'Enna','reg_id' => '11'],
                ['id' => '32','provincia' => 'Forlì-Cesena','reg_id' => '19'],
                ['id' => '33','provincia' => 'Ferrara','reg_id' => '19'],
                ['id' => '34','provincia' => 'Foggia','reg_id' => '8'],
                ['id' => '35','provincia' => 'Firenze','reg_id' => '20'],
                ['id' => '36','provincia' => 'Frosinone','reg_id' => '4'],
                ['id' => '37','provincia' => 'Genova','reg_id' => '18'],
                ['id' => '38','provincia' => 'Gorizia','reg_id' => '17'],
                ['id' => '39','provincia' => 'Grosseto','reg_id' => '20'],
                ['id' => '40','provincia' => 'Imperia','reg_id' => '18'],
                ['id' => '41','provincia' => 'Isernia','reg_id' => '6'],
                ['id' => '42','provincia' => 'Crotone','reg_id' => '10'],
                ['id' => '43','provincia' => 'Lecco','reg_id' => '14'],
                ['id' => '44','provincia' => 'Lecce','reg_id' => '8'],
                ['id' => '45','provincia' => 'Livorno','reg_id' => '20'],
                ['id' => '46','provincia' => 'Lodi','reg_id' => '14'],
                ['id' => '47','provincia' => 'Latina','reg_id' => '4'],
                ['id' => '48','provincia' => 'Lucca','reg_id' => '20'],
                ['id' => '49','provincia' => 'Monza e della Brianza','reg_id' => '14'],
                ['id' => '50','provincia' => 'Macerata','reg_id' => '3'],
                ['id' => '51','provincia' => 'Messina','reg_id' => '11'],
                ['id' => '52','provincia' => 'Milano','reg_id' => '14'],
                ['id' => '53','provincia' => 'Mantova','reg_id' => '14'],
                ['id' => '54','provincia' => 'Modena','reg_id' => '19'],
                ['id' => '55','provincia' => 'Massa-Carrara','reg_id' => '20'],
                ['id' => '56','provincia' => 'Matera','reg_id' => '9'],
                ['id' => '57','provincia' => 'Napoli','reg_id' => '7'],
                ['id' => '58','provincia' => 'Novara','reg_id' => '1'],
                ['id' => '59','provincia' => 'Nuoro','reg_id' => '13'],
                ['id' => '60','provincia' => 'Ogliastra','reg_id' => '13'],
                ['id' => '61','provincia' => 'Oristano','reg_id' => '13'],
                ['id' => '62','provincia' => 'Olbia-Tempio','reg_id' => '13'],
                ['id' => '63','provincia' => 'Palermo','reg_id' => '11'],
                ['id' => '64','provincia' => 'Piacenza','reg_id' => '19'],
                ['id' => '65','provincia' => 'Padova','reg_id' => '16'],
                ['id' => '66','provincia' => 'Pescara','reg_id' => '5'],
                ['id' => '67','provincia' => 'Perugia','reg_id' => '2'],
                ['id' => '68','provincia' => 'Pisa','reg_id' => '20'],
                ['id' => '69','provincia' => 'Pordenone','reg_id' => '17'],
                ['id' => '70','provincia' => 'Prato','reg_id' => '20'],
                ['id' => '71','provincia' => 'Parma','reg_id' => '19'],
                ['id' => '72','provincia' => 'Pistoia','reg_id' => '20'],
                ['id' => '73','provincia' => 'Pesaro e Urbino','reg_id' => '3'],
                ['id' => '74','provincia' => 'Pavia','reg_id' => '14'],
                ['id' => '75','provincia' => 'Potenza','reg_id' => '9'],
                ['id' => '76','provincia' => 'Ravenna','reg_id' => '19'],
                ['id' => '77','provincia' => 'Reggio Calabria','reg_id' => '10'],
                ['id' => '78','provincia' => 'Reggio Emilia','reg_id' => '19'],
                ['id' => '79','provincia' => 'Ragusa','reg_id' => '11'],
                ['id' => '80','provincia' => 'Rieti','reg_id' => '4'],
                ['id' => '81','provincia' => 'Roma','reg_id' => '4'],
                ['id' => '82','provincia' => 'Rimini','reg_id' => '19'],
                ['id' => '83','provincia' => 'Rovigo','reg_id' => '16'],
                ['id' => '84','provincia' => 'Salerno','reg_id' => '7'],
                ['id' => '85','provincia' => 'Siena','reg_id' => '20'],
                ['id' => '86','provincia' => 'Sondrio','reg_id' => '14'],
                ['id' => '87','provincia' => 'La Spezia','reg_id' => '18'],
                ['id' => '88','provincia' => 'Siracusa','reg_id' => '11'],
                ['id' => '89','provincia' => 'Sassari','reg_id' => '13'],
                ['id' => '90','provincia' => 'Savona','reg_id' => '18'],
                ['id' => '91','provincia' => 'Taranto','reg_id' => '8'],
                ['id' => '92','provincia' => 'Teramo','reg_id' => '5'],
                ['id' => '93','provincia' => 'Trento','reg_id' => '15'],
                ['id' => '94','provincia' => 'Torino','reg_id' => '1'],
                ['id' => '95','provincia' => 'Trapani','reg_id' => '11'],
                ['id' => '96','provincia' => 'Terni','reg_id' => '2'],
                ['id' => '97','provincia' => 'Trieste','reg_id' => '17'],
                ['id' => '98','provincia' => 'Treviso','reg_id' => '16'],
                ['id' => '99','provincia' => 'Udine','reg_id' => '17'],
                ['id' => '100','provincia' => 'Varese','reg_id' => '14'],
                ['id' => '101','provincia' => 'Verbano-Cusio-Ossola','reg_id' => '1'],
                ['id' => '102','provincia' => 'Vercelli','reg_id' => '1'],
                ['id' => '103','provincia' => 'Venezia','reg_id' => '16'],
                ['id' => '104','provincia' => 'Vicenza','reg_id' => '16'],
                ['id' => '105','provincia' => 'Verona','reg_id' => '16'],
                ['id' => '106','provincia' => 'Medio Campidano','reg_id' => '13'],
                ['id' => '107','provincia' => 'Viterbo','reg_id' => '4'],
                ['id' => '108','provincia' => 'Vibo Valentia','reg_id' => '10']
            ];

    public function run()
    {
        foreach($province as $provincia){

            Provincia::create([
                                'id'        => $provincia['id'],
                                'provincia' => $provincia['provincia'],
                                'reg_id'    => $provincia['reg_id']
                            ]);
        }
    }
}

Per i comuni (per motivi di leggibilità non abbiamo elencato qui tutti i comuni italiani ma potete scaricare il file completo dei comuni italiani da qui)


namespace Mio\Plugin\Updates;

use Seeder;
use Mio\Plugin\Models\Comune;

class SeedComuneTable extends Seeder
{

    $comuni = [
                    ['id' => '1','comune' => 'Cantagallo','prov_id' => '70','reg_id' => '20'],
                    ['id' => '2','comune' => 'Carmignano','prov_id' => '70','reg_id' => '20'],
                    ['id' => '3','comune' => 'Montemurlo','prov_id' => '70','reg_id' => '20'],
                    ['id' => '4','comune' => 'Poggio a Caiano','prov_id' => '70','reg_id' => '20'],
                    ['id' => '5','comune' => 'Prato','prov_id' => '70','reg_id' => '20'],
                    ['id' => '6','comune' => 'Vaiano','prov_id' => '70','reg_id' => '20'],
                    ['id' => '7','comune' => 'Vernio','prov_id' => '70','reg_id' => '20'],
                    ['id' => '8','comune' => 'Arenzano','prov_id' => '37','reg_id' => '18'],
                    ['id' => '9','comune' => 'Avegno','prov_id' => '37','reg_id' => '18'],
                    ['id' => '10','comune' => 'Bargagli','prov_id' => '37','reg_id' => '18'],
                    ....

            ];

    public function run()
    {
        foreach($comuni as $comune){

            Comune::create([
                                'id'        => $comune['id'],
                                'comune'    => $comune['comune'],
                                'prov_id'   => $comune['prov_id'],
                                'reg_id'    => $comune['reg_id']
                            ]);
        }
    }
}

Ora non ci resta che goderci il risultato del nostro lavoro e passare al prossimo task!

Happy coding!


Lunga vita e prosperità

Ti interessa un argomento non trattato?