Kaskadierende / abhängige Dropdowns
Lassen Sie die Optionen eines relation()-Dropdowns automatisch basierend auf dem aktuell ausgewählten Wert eines anderen Felds filtern.
Die Idee
Die Parameter $dependField/$dependOn von relation() verwandeln zwei gewöhnliche Relation-Felder in ein Eltern-Kind-Paar: Die Auswahl eines Werts im Eltern-Feld ruft die eigenen Optionen des Kind-Felds neu ab, gefiltert auf das, was unter das gerade gewählte Eltern-Element gehört - zum Beispiel ein Stadt-Feld, das nur Städte im aktuell gewählten Land zeigt.
$dependOn benennt das ANDERE Relation-Feld dieser Tabelle, das beobachtet wird (es muss selbst mit relation() konfiguriert sein - es muss ein echtes Dropdown geben, an das die Kaskade angehängt werden kann). $dependField benennt die Spalte in der eigenen Zieltabelle des Kind-Felds, nach der gefiltert wird, verglichen mit dem aktuellen Wert von $dependOn.
Ein Beispiel mit 2 Feldern
Eine Country-Relation und eine City-Relation, miteinander verdrahtet - die Wahl eines Landes ruft die Optionen des City-Dropdowns neu ab (nur Städte, deren country_id mit dem gerade gewählten Land übereinstimmt):
$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'
);
Hier ist 'in_location' das $dependField (die Spalte in meta_location, nach der gefiltert wird) und 'country' das $dependOn (der Name des Eltern-Relation-Felds dieser Tabelle). Die Konvention des alten xCrud, '' statt eines weggelassenen abschließenden Arguments zu übergeben, wird auch für $where/$orderBy/$tree akzeptiert - '' wird genauso behandelt wie ein Auslassen.
Hier relevante Parameter
| Parameter | Typ | Standard | Beschreibung |
|---|---|---|---|
$dependField | string|null | null | Spalte in der eigenen Zieltabelle dieses Felds, nach der gefiltert wird (z. B. in_location). |
$dependOn | string|null | null | Name des übergeordneten relation()-Felds dieser Tabelle, dessen aktueller Wert den Filter steuert. |
Die beiden müssen entweder gemeinsam gesetzt oder gemeinsam weggelassen werden - eines ohne das andere hat keine Filterspalte, mit der es sich paaren könnte, und relation() löst dann einen Fehler aus, statt die Diskrepanz stillschweigend zu ignorieren.
Mehrstufige Ketten
Ketten mit mehr als zwei Feldern funktionieren genauso, ein Glied nach dem anderen - jedes Glied kennt nur sein eigenes unmittelbares Eltern-Element. Eine Land → Region → Stadt-Kette gegen eine einzige selbstreferenzierende Tabelle:
$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'
);
Die Wahl eines Landes ruft die Optionen der Region neu ab (type = 'RE' AND in_location = {id des Landes}) und setzt sowohl Region als auch Stadt zurück, da auch das eigene Eltern-Element der Stadt (die Region) gerade veraltet ist. Die Wahl einer Region ruft entsprechend die Optionen der Stadt neu ab und setzt die Stadt zurück. Eine einstufige Kaskade (z. B. Büro → Manager, die Mitarbeiter auf das Personal eines einzigen Büros eingrenzt) funktioniert mit nur einem Glied genauso.
Ein zweites Beispiel: Büro → Manager
$xcrud->relation('office', 'offices', 'officeCode', 'city');
$xcrud->relation(
'manager', 'employees', 'employeeNumber', ['firstName', 'lastName'],
null, null, false, ' ', null, 'officeCode', 'office'
);
Hier ist die Zieltabelle des Manager-Dropdowns employees, gefiltert nach der eigenen officeCode-Spalte gegen das gerade gewählte Büro - und die Beschriftung wird aus zwei Spalten (firstName, lastName) gebildet, verbunden mit dem Standardtrennzeichen ' '.