/

Téléversements de fichiers et d'images

Les types de champ de change_type() pour les téléversements de fichiers et d'images, ainsi que gallery() pour un champ multi-images avec réorganisation par glisser-déposer.

Téléversements de fichiers simples

public function change_type(string $field, string $type, string $length = '', array $extra = []): self

change_type($field, 'file', '', $extra) transforme un champ en zone de dépôt de fichiers. Ses options $extra :

OptionTypeDéfautDescription
not_renameboolfalseConserve le nom d'origine du fichier téléversé au lieu d'un nom sûr généré automatiquement. Le nom est tout de même assaini (séparateurs de chemin/traversée de répertoires supprimés) même avec cette option activée - il n'est simplement pas rendu aléatoire.
previewfalse|true|'download'|'modal'|'edit'falseCe que fait un clic sur le nom du fichier. false/'download' - un simple lien de téléchargement. true/'modal' - ouvre une fenêtre modale de prévisualisation intégrée (une iframe sur le fichier) avec un bouton Télécharger à côté. 'edit' - ouvre le formulaire d'édition de cette ligne à la place, utile lorsque le vrai rôle du champ est "l'enregistrement auquel ce fichier est rattaché".
$xcrud->change_type('simple_upload', 'file', '', ['not_rename' => true, 'preview' => 'modal']);

Téléversements d'images

change_type($field, 'image', '', $extra) ajoute un traitement de redimensionnement/recadrage/filigrane/miniature en plus d'un téléversement simple :

OptionTypeDéfautDescription
width / heightint-Cible de redimensionnement automatique. Les deux + crop=true remplit exactement la zone (rapport d'aspect conservé, excédent recadré) ; l'un des deux seul, ou les deux sans crop, s'ajuste à l'intérieur de la zone (rapport d'aspect conservé, sans recadrage).
cropboolfalseVoir ci-dessus - remplit la zone au lieu de simplement s'y ajuster.
manual_cropboolfalseAffiche une interface interactive de recadrage par glisser (Cropper.js) juste après le choix d'un fichier, avant son enregistrement. Se combine avec width/height/crop plutôt que de les remplacer - manual_crop détermine ce qui est conservé, les autres options continuent de s'appliquer ensuite au résultat recadré.
ratiofloat-Avec manual_crop, verrouille la zone de recadrage à ce rapport largeur/hauteur (ex. 0.5 = toujours deux fois plus haute que large) au lieu de laisser le visiteur choisir un rectangle libre.
watermarkstring-Chemin vers un PNG, relatif à la racine du projet, superposé à l'image enregistrée.
watermark_position[x%, y%][95, 95]Où atterrit le coin supérieur gauche du filigrane, en pourcentage de la largeur/hauteur propre de l'image.
thumbsarray[]Images dérivées supplémentaires nommées, enregistrées à côté de l'image principale - chaque élément : width/height/crop/marker (suffixe de nom de fichier)/folder/watermark. Chaque miniature est redimensionnée indépendamment à partir de l'original, sans être chaînée aux autres.
// S'ajuste dans 200x200, sans recadrage
$xcrud->change_type('auto_resize', 'image', '', ['width' => 200, 'height' => 200]);

// Remplit exactement 200x200, excédent recadré
$xcrud->change_type('auto_crop', 'image', '', ['width' => 200, 'height' => 200, 'crop' => true]);

// Recadrage interactif par glisser, puis redimensionné en 200x200
$xcrud->change_type('manual_crop_2', 'image', '', ['width' => 200, 'height' => 200, 'manual_crop' => true]);

// Deux miniatures dérivées, l'une avec filigrane, l'autre recadrée dans un sous-dossier
$xcrud->change_type('image_with_thumbs', 'image', '', [
    'thumbs' => [
        ['width' => 300, 'marker' => '_th', 'watermark' => 'assets/watermark.png'],
        ['width' => 100, 'height' => 100, 'crop' => true, 'folder' => 'thumbs'],
    ],
]);

Configuration du stockage des téléversements

Ces réglages se trouvent dans XcrudConfig, pas par champ :

RéglageTypeDéfautDescription
$uploadDirstring'media/'Où les fichiers téléversés sont réellement écrits.
$uploadMaxSizeint10 Mo (10 * 1024 * 1024)Taille maximale de téléversement en octets, appliquée côté application en plus du propre upload_max_filesize de PHP.
$uploadAllowedImageExtarray['jpg', 'jpeg', 'png', 'gif', 'webp']Extensions autorisées pour les champs image.
$uploadAllowedFileExtarrayune liste sélectionnée de types de documents/archives courantsExtensions autorisées pour les champs de fichier simples. N'ajoutez à cette liste que des types réellement sûrs et réellement nécessaires.

Voir la Référence XcrudConfig pour tous les autres réglages.

public function gallery(string $field, string $childTable, array $options = []): self

Contrairement à change_type('image'), gallery() est un champ glisser-déposer pour plusieurs images à la fois, chacune enregistrée comme sa propre ligne dans $childTable - et non comme une colonne de la table courante. $field est ici un nom virtuel, il ne figure donc pas dans ->columns(). $childTable doit elle-même être une table réelle et accessible, avec au minimum un id auto-incrémenté, la colonne de clé étrangère nommée dans fk, une colonne filename, une colonne name (une légende par image), une colonne size, et une colonne sort_order dans laquelle le glisser-déposer persiste l'ordre.

OptionTypeDéfautDescription
fkstringrequisLa colonne de clé étrangère de la table enfant référençant la clé primaire de cette table.
folderstringnom du champSous-répertoire de $uploadDir dans lequel les images de cette galerie sont enregistrées.
layout'grid'|'list''grid''grid' - une grille de miniatures carrées à la ligne. 'list' - une ligne par image avec une miniature, une légende modifiable, la taille du fichier, et des boutons Aperçu/Supprimer. Le glisser-déposer fonctionne de manière identique dans les deux cas.
width / height / crop / watermark / watermark_position / thumbs--Même signification que les options équivalentes de change_type('image'), appliquées indépendamment à chaque image téléversée dans cette galerie.
max_filesint-Plafonne le nombre total d'images que cette galerie peut contenir ; les téléversements suivants sont rejetés une fois la limite atteinte.
$xcrud->gallery('gallery', 'uploads_gallery', [
    'fk'     => 'upload_id',
    'width'  => 1600,
    'height' => 1600,
]);

Une nouvelle ligne jamais encore enregistrée n'a pas encore d'id auquel les images de la galerie pourraient se référer - le champ affiche un espace réservé désactivé "enregistrez d'abord cet enregistrement" tant que la ligne n'existe pas réellement.