Dropdown a cascata / dipendenti
Fai in modo che le opzioni di un dropdown relation() si filtrino automaticamente in base al valore attualmente selezionato di un altro campo.
L'idea
I parametri $dependField/$dependOn di relation() trasformano due normali campi relation in una coppia genitore/figlio: scegliere un valore nel campo genitore fa recuperare di nuovo le opzioni del campo figlio, filtrate solo a ciò che appartiene sotto il genitore appena scelto - un campo Città che mostra solo le città nel Paese attualmente selezionato, per esempio.
$dependOn nomina l'ALTRO campo relation su questa tabella da osservare (deve a sua volta essere configurato con relation() - deve esistere un vero dropdown a cui agganciare la cascata). $dependField nomina la colonna sulla tabella target del figlio da usare per il filtro, confrontata con il valore corrente di $dependOn.
Un esempio a 2 campi
Un relation Paese e un relation Città, collegati insieme - scegliere un paese fa recuperare di nuovo le opzioni del dropdown città (solo le città il cui country_id corrisponde al paese appena scelto):
$xcrud->relation('country', 'meta_location', 'id', 'local_name', "type = 'CO'");
$xcrud->relation(
'city', 'meta_location', 'id', 'local_name',
"type = 'CI'", null, false, ' ', null, 'in_location', 'country'
);
Qui 'in_location' è $dependField (la colonna su meta_location da usare per il filtro) e 'country' è $dependOn (il nome del campo relation genitore su questa tabella). La convenzione del vecchio xCrud di passare '' invece di omettere un argomento finale è accettata anche per $where/$orderBy/$tree - '' viene trattato allo stesso modo di ometterlo.
Parametri rilevanti qui
| Parametro | Tipo | Predefinito | Descrizione |
|---|---|---|---|
$dependField | string|null | null | Colonna sulla tabella target propria di questo campo da usare per il filtro (ad es. in_location). |
$dependOn | string|null | null | Nome del campo relation() genitore su questa tabella il cui valore corrente guida il filtro. |
I due devono essere entrambi impostati o entrambi omessi - uno senza l'altro non ha nulla con cui abbinare una colonna di filtro, e relation() genera un'eccezione invece di ignorare silenziosamente la discrepanza.
Catene a più livelli
Catene più lunghe di due campi funzionano allo stesso modo, un anello alla volta - ogni anello conosce solo il proprio genitore immediato. Una catena Paese → Regione → Città contro un'unica tabella auto-referenziata:
$xcrud->relation('country', 'meta_location', 'id', 'local_name', "type = 'CO'");
$xcrud->relation(
'region', 'meta_location', 'id', 'local_name',
"type = 'RE'", null, false, ' ', null, 'in_location', 'country'
);
$xcrud->relation(
'city', 'meta_location', 'id', 'local_name',
"type = 'CI'", null, false, ' ', null, 'in_location', 'region'
);
Scegliere un paese fa recuperare di nuovo le opzioni di regione (type = 'RE' AND in_location = {id del paese}) e reimposta sia regione sia città, poiché anche il genitore proprio della città (regione) è appena diventato obsoleto. Scegliere una regione allo stesso modo fa recuperare di nuovo le opzioni di città e reimposta città. Una cascata a un solo livello (ad es. Ufficio → Responsabile, che filtra i dipendenti al solo personale di un ufficio) funziona esattamente allo stesso modo con un solo anello.
Un secondo esempio: Ufficio → Responsabile
$xcrud->relation('office', 'offices', 'officeCode', 'city');
$xcrud->relation(
'manager', 'employees', 'employeeNumber', ['firstName', 'lastName'],
null, null, false, ' ', null, 'officeCode', 'office'
);
Qui la tabella target del dropdown responsabile è employees, filtrata dalla propria colonna officeCode rispetto all'ufficio attualmente scelto - e l'etichetta viene costruita da due colonne (firstName, lastName) unite dal separatore predefinito ' '.