/

Listes déroulantes de relation

Transformez une colonne de clé étrangère brute en liste déroulante, en combobox avec recherche, ou en sélection multiple résolue par rapport à une autre table avec relation().

Ce que fait relation()

relation() relie une colonne réelle et éditable de la table courante (p. ex. payments.customerNumber) à une recherche dans une autre table. Le formulaire de création/édition affiche une liste déroulante des lignes de cette table au lieu d'une simple saisie d'identifiant numérique, et la liste affiche le nom résolu à la place de l'identifiant brut.

$xcrud->relation(
    'customerNumber', 'customers', 'customerNumber', 'customerName',
    "country = 'USA'", null, false, ' ', null, null, null, true
);

La table cible doit elle-même être accessible de la même manière que n'importe quelle autre table du site - une vraie table, pas mise en liste noire, avec une clé primaire à une seule colonne. Elle n'a pas besoin de sa propre page CRUD ; relation() peut lire une table que rien d'autre sur le site ne parcourt jamais directement.

Paramètres

ParamètreTypePar défautDescription
$fieldstring-La colonne réelle et éditable de cette table à relier (p. ex. customerNumber).
$targetTablestring-La table dans laquelle rechercher les valeurs.
$targetIdstring-Colonne de $targetTable dont la valeur est réenregistrée dans $field.
$targetNamestring|array-Colonne(s) affichée(s) comme libellé d'option. Un tableau (p. ex. ['contactFirstName', 'contactLastName']) est joint avec $concatSeparator pour afficher quelque chose comme « Prénom Nom ».
$wherearray|string|nullnullRestreint les lignes cibles proposées. Un tableau est une égalité colonne=>valeur sûre, combinée par ET et liée comme paramètres. Une chaîne est du SQL brut de confiance, écrit par le développeur (même niveau de confiance que where_raw()), avec éventuellement des espaces réservés {field} substitués par la propre valeur de la ligne courante.
$orderBystring|nullnullOrdre de tri de la liste d'options.
$multiboolfalseAffiche une sélection multiple au lieu d'une liste déroulante simple ; la valeur enregistrée devient une liste d'identifiants séparés par des virgules.
$concatSeparatorstring' 'Séparateur utilisé quand $targetName est un tableau de colonnes.
$treemixednullRéservé pour une future liste déroulante hiérarchique/en arbre indenté - pas encore implémenté ; passer une valeur différente de la valeur par défaut déclenche une exception.
$dependFieldstring|nullnullColonne de $targetTable par laquelle filtrer, comparée à la valeur actuelle de $dependOn. Voir Listes déroulantes en cascade / dépendantes.
$dependOnstring|nullnullNom d'un autre champ configuré avec relation() sur cette table, dont la sélection actuelle pilote le filtre ci-dessus.
$searchboolfalseAffiche une combobox avec recherche (une saisie de texte qui filtre la liste d'options récupérée au fur et à mesure de la frappe) au lieu d'un simple <select> - utile dès qu'il y a des dizaines d'options. Se combine avec $multi pour des puces amovibles.

Filtrer la liste d'options

La forme tableau de $where est le choix sûr par défaut - simple égalité, paramétrée :

$xcrud->relation('catid', 'categories', 'cid', 'name', ['published' => 1]);

La forme chaîne est un fragment SQL brut pour tout ce qu'un tableau d'égalité ne peut pas exprimer - c'est du SQL de confiance, écrit par le développeur, jamais construit à partir d'une entrée utilisateur :

$xcrud->relation('customerNumber', 'customers', 'customerNumber', 'customerName', "country = 'USA'");

Quelle que soit la forme utilisée, la configuration de relation entière - table, colonne d'identifiant, colonne(s) de nom, where, order, multi - est signée par HMAC avec XcrudConfig::$appSecret de la même façon qu'un filtre where() de base, de sorte qu'elle ne peut pas être reciblée ou élargie en modifiant quoi que ce soit côté client.

subselect() : une colonne calculée en lecture seule

Là où relation() résout une clé étrangère éditable, subselect() ajoute une colonne d'affichage uniquement, calculée à partir d'une expression SQL corrélée arbitraire - rien n'y est réenregistré, et elle n'est jamais éditable, triable, ni consultable par recherche.

$xcrud->subselect(
    'orderCount',
    'SELECT COUNT(*) FROM orders o WHERE o.customerNumber = payments.customerNumber'
);

$field devient une nouvelle colonne aux côtés des colonnes réelles de la table et doit être un identifiant valide qui n'est pas déjà un nom de colonne réel. $sql est du SQL de confiance, écrit par le développeur - comme la chaîne brute $where de relation(), elle est signée par HMAC avec XcrudConfig::$appSecret au rendu de la page et revérifiée à chaque requête, de sorte qu'un visiteur ne peut pas la falsifier, mais elle n'est jamais validée ni mise en bac à sable par rapport à ce que vous écrivez - gardez-la toujours écrite côté serveur, jamais assemblée à partir d'une entrée de requête.

Listes déroulantes en cascade

$dependField/$dependOn permettent aux options d'une liste déroulante de relation de se filtrer en fonction de la valeur actuellement sélectionnée d'un autre champ sur le même formulaire - par exemple une liste déroulante de villes qui ne propose que les villes du pays actuellement sélectionné. Voir Listes déroulantes en cascade / dépendantes pour le déroulé complet, chaînes multi-niveaux comprises.