Desplegables en cascada / dependientes
Haz que las opciones de un desplegable relation() se filtren automáticamente según el valor actualmente seleccionado de otro campo.
La idea
Los parámetros $dependField/$dependOn de relation() convierten dos campos relation ordinarios en un par padre/hijo: elegir un valor en el campo padre vuelve a obtener las propias opciones del campo hijo, filtradas a solo lo que pertenece bajo el padre recién elegido - por ejemplo, un campo Ciudad que solo muestra ciudades del País actualmente seleccionado.
$dependOn nombra el OTRO campo relation de esta tabla a observar (debe estar configurado con relation() él mismo - tiene que existir un desplegable real al que enganchar la cascada). $dependField nombra la columna de la propia tabla destino del hijo por la que filtrar, comparada contra el valor actual de $dependOn.
Un ejemplo con 2 campos
Un relation País y un relation Ciudad, conectados entre sí - elegir un país vuelve a obtener las opciones del desplegable de ciudad (solo ciudades cuyo country_id coincida con el país recién elegido):
$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'
);
Aquí 'in_location' es $dependField (la columna de meta_location por la que filtrar) y 'country' es $dependOn (el nombre del campo relation padre en esta tabla). La convención del antiguo xCrud de pasar '' en lugar de omitir un argumento final también se acepta para $where/$orderBy/$tree - '' se trata igual que si se hubiera omitido.
Los parámetros que importan aquí
| Parámetro | Tipo | Por defecto | Descripción |
|---|---|---|---|
$dependField | string|null | null | Columna de la propia tabla destino de este campo por la que filtrar (por ejemplo, in_location). |
$dependOn | string|null | null | Nombre del campo relation() padre en esta tabla cuyo valor actual controla el filtro. |
Ambos deben establecerse juntos o ambos omitirse - uno sin el otro no tiene con qué emparejar una columna de filtro, y relation() lanza un error en lugar de ignorar silenciosamente el desajuste.
Cadenas de varios niveles
Las cadenas de más de dos campos funcionan de la misma manera, un enlace a la vez - cada enlace solo conoce a su propio padre inmediato. Una cadena País → Región → Ciudad contra una única tabla autorreferenciada:
$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'
);
Elegir un país vuelve a obtener las opciones de región (type = 'RE' AND in_location = {id del país}) y reinicia tanto región como ciudad, ya que el propio padre de ciudad (región) también acaba de quedar obsoleto. Elegir una región de forma similar vuelve a obtener las opciones de ciudad y reinicia ciudad. Una cascada de un solo nivel (por ejemplo, Oficina → Gerente, filtrando empleados hasta el propio personal de una oficina) funciona exactamente igual con un solo enlace.
Un segundo ejemplo: Oficina → Gerente
$xcrud->relation('office', 'offices', 'officeCode', 'city');
$xcrud->relation(
'manager', 'employees', 'employeeNumber', ['firstName', 'lastName'],
null, null, false, ' ', null, 'officeCode', 'office'
);
Aquí la tabla destino del desplegable de gerente es employees, filtrada por su propia columna officeCode contra la oficina actualmente elegida - y la etiqueta se construye a partir de dos columnas (firstName, lastName) unidas por el separador por defecto ' '.