- 1
[Opened] Comment récupérer les images dans www/images associées avec dao-crud ?
Posted by débutantjelix on 03/30/2021 11:56
Bonjour,
Supposons l'existant suivant :
- une table produit(id_produit, nom_produit) stockée en base de données mysql.
- une deuxième table image(id_image, #produit.id_produit, nom_image_produit) stockée aussi en base de données mysql (#produit.id_produit est une clé étrangère).
- les images correspondantes sont stockées dans www/images/produits
Nous utiliserons dao-crud pour la gestion des produits.
Comment afficher la liste des produits avec les images correspondantes ? (j'aimerai afficher les images/photos en formats jpeg ou png ou gif) ?
Merci d'avance pour vos réponses
[Opened] Comment récupérer les images dans www/images associées avec dao-crud ?
Posted by laurentj on 03/30/2021 14:36
bonjour,
Dans ce cas-ci, il faut fournir un template pour index, et indiquer son sélecteur dans la propriété $listTemplate
. ce template peut être une copie du template crud_list
(dans lib/jelix/core-modules/jelix/templates).
Exemple :
protected $listTemplate = 'monmodule~produit_list';
Et dans ce template, utiliser le champs nom_image_produit
j'imagine ?
Pour récupérer les images :
- soit on est sûr qu'il y a une seule image pour chaque produit (ce qui ne semble pas être le cas vu la structure des tables), et alors on peut fournir un DAO pour produit qui fait une jointure avec image
- soit, dans la méthode
_index
à rédéfinir, ajouter un "modificateur" sur la liste des résultats, qui va récupérer pour chaque item l'image correspondante.
Un truc dans le genre:
protected function _index($response, $tpl) { // on récupère la connexion sur la base $db = jDb::getConnection(); // on prépare la requete pour l'image $stmt = $db->prepare("select nom_image_produit from image where id_produit= :id"); // on récupère le resultset de la liste /** @var jDbResultSet */ $rs = $tpl->get('list'); // on ajoute un modificateur = une fonction appelée automatiquement sur chaque // record lors du fetch $rs->addModifier(function ($record, $rs) use ($stmt) { // on execute la requete pour récupérer l'image du produit $stmt->execute(array('id'=>$record->id_produit)); // on récupère le record de l'image $recImage = $stmt->fetch(); // sur le record du produit, on met les champs que l'on veut dans des // propriétés quelconques, ici du même nom. if ($recImage) { $record->id_image = $recImage->id_image; $record->nom_image_produit = $recImage->nom_image_produit; } else { $record->id_image = '' $record->nom_image_produit = ''; } } ); }
cette méthode a un coùt, ça peut faire beaucoup de requetes sql si on affiche beaucoup d'enregistrements.
Au final, dans le template, pour chaque enregistrement, on a une chose du genre :
{if $record->id_image} <img src="{$j_basepath}/images/produits/{$record->id_image}.jpg" alt="{$record->nom_image_produit}" title="{$record->nom_image_produit}"/> {else} <img src="{$j_basepath}/images/produit_no_photo.jpg" alt=""/> {/if}
Note: je ne sais pas sous quels noms les images sont sauvegardés. J'ai ici émis l'hypothèse qu'elles étaient toutes en jpg, avec leur id comme nom.
Si on veut pouvoir mettre n'importe quel format, il va falloir rajouter une colonne dans image, qui indique soit le nom complet du fichier, soit le type (jpg, png etc...), et récupérer cette colonne dans le modificateur, et l'utiliser dans le template.
[Opened] Comment récupérer les images dans www/images associées avec dao-crud ?
Posted by débutantjelix on 05/27/2021 11:39
laurentj a dit :
bonjour,
Dans ce cas-ci, il faut fournir un template pour index, et indiquer son sélecteur dans la propriété$listTemplate
. ce template peut être une copie du templatecrud_list
(dans lib/jelix/core-modules/jelix/templates).
Exemple :
protected $listTemplate = 'monmodule~produit_list';
Et dans ce template, utiliser le champsnom_image_produit
j'imagine ?
Pour récupérer les images :
* soit on est sûr qu'il y a une seule image pour chaque produit (ce qui ne semble pas être le cas vu la structure des tables), et alors on peut fournir un DAO pour produit qui fait une jointure avec image
* soit, dans la méthode_index
à rédéfinir, ajouter un "modificateur" sur la liste des résultats, qui va récupérer pour chaque item l'image correspondante.
Un truc dans le genre:
<code>
protected function _index($response, $tpl) {
// on récupère la connexion sur la base
$db = jDb::getConnection();
// on prépare la requete pour l'image
$stmt = $db->prepare("select nom_image_produit from image where id_produit= :id");
// on récupère le resultset de la liste
/** @var jDbResultSet */
$rs = $tpl->get('list');
// on ajoute un modificateur = une fonction appelée automatiquement sur chaque
// record lors du fetch
$rs->addModifier(function ($record, $rs) use ($stmt) {
// on execute la requete pour récupérer l'image du produit
$stmt->execute(array('id'=>$record->id_produit));
// on récupère le record de l'image
$recImage = $stmt->fetch();
// sur le record du produit, on met les champs que l'on veut dans des
// propriétés quelconques, ici du même nom.
if ($recImage) {
$record->id_image = $recImage->id_image;
$record->nom_image_produit = $recImage->nom_image_produit;
}
else {
$record->id_image = ''
$record->nom_image_produit = '';
}
}
);
}
</code>
cette méthode a un coùt, ça peut faire beaucoup de requetes sql si on affiche beaucoup d'enregistrements.
Au final, dans le template, pour chaque enregistrement, on a une chose du genre :
<code>
{if $record->id_image}
<img src="{$j_basepath}/images/produits/{$record->id_image}.jpg"
alt="{$record->nom_image_produit}"
title="{$record->nom_image_produit}"/>
{else}
<img src="{$j_basepath}/images/produit_no_photo.jpg" alt=""/>
{/if}
</code>
Note: je ne sais pas sous quels noms les images sont sauvegardés. J'ai ici émis l'hypothèse qu'elles étaient toutes en jpg, avec leur id comme nom.
Si on veut pouvoir mettre n'importe quel format, il va falloir rajouter une colonne dans image, qui indique soit le nom complet du fichier, soit le type (jpg, png etc...), et récupérer cette colonne dans le modificateur, et l'utiliser dans le template.
Bonjour laurent et merci pour la réponse, désolé pour le retour tardif mais j'étais occupé à autre chose. Je tente quand même cette méthode, c'est vrai que ça fais beaucoup de requêtes pour afficher pas mal d'enregistrements mais je vais quand même l'essayer pour voir si ce n'est pas trop lent (j'ai en moyenne 2 images par produit et en tout j'ai un millier de produits).
- 1