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à