/

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ámetroTipoPor defectoDescripción
$dependFieldstring|nullnullColumna de la propia tabla destino de este campo por la que filtrar (por ejemplo, in_location).
$dependOnstring|nullnullNombre 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 ' '.