/

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

ParametroTipoPredefinitoDescrizione
$dependFieldstring|nullnullColonna sulla tabella target propria di questo campo da usare per il filtro (ad es. in_location).
$dependOnstring|nullnullNome 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 ' '.