J'ai des articles avec champs de type champs personnalisés . J'ai besoin de créer des vignettes à partir de ces images avec une largeur fixe (1200px, 700px, 450px and 250px
) à afficher avec le élément d’image et sur différentes vues (affichage du blog et de l’article).
Pour l'affichage de l'article, j'utilise un remplacement de modèle avec le classe JImage pour créer les vignettes :
<?php
$fields = $this->item->jcfields;
foreach ($fields as $field):
if ($field->type == 'media'):
$img_path = $field->rawvalue;
$image = new JImage($img_path);
$image->setThumbnailGenerate(true);
$scale_method = JImage::SCALE_INSIDE;
$img_L = $image->createThumbs('1200x12000', $scale_method)[0]->getPath();
$img_M = $image->createThumbs('700x7000', $scale_method)[0]->getPath();
$img_S = $image->createThumbs('450x4500', $scale_method)[0]->getPath();
$img_XS = $image->createThumbs('250x2500', $scale_method)[0]->getPath();
?>
<picture>
<source srcset="<?php echo $img_L ?>" media="(min-width: 2001px)"/>
<source srcset="<?php echo $img_M ?>" media="(min-width: 1201px) and (max-width: 2000px)"/>
<source srcset="<?php echo $img_S ?>" media="(min-width: 701px) and (max-width: 1200px)"/>
<source srcset="<?php echo $img_XS ?>" media="(min-width: 401px) and (max-width: 700px)"/>
<img src="<?php echo $img_M ?>" srcset="<?php echo $img_M . ', ' . $img_L . ' 2x'?>" alt="Responsive image" />
</picture>
<?php endif; ?>
<?php endforeach; ?>
Ma préoccupation concerne principalement la performance et la méthode:
Vous avez raison, de cette façon vous créerez des miniatures tout le temps ... Une possibilité serait d’ajuster votre implémentation de telle sorte que les miniatures ne soient créées que lors du premier chargement, puis stockées dans le chemin base de données. Ensuite, vous pouvez vérifier l'existence de miniatures et leur cohérence avec le fichier d'origine et ne les recréer que si vous avez mis à jour l'original.
Il est également possible de le faire lors de la création de contenu avec un plugin de contenu.
https://docs.joomla.org/Plugin/Events/Content#onContentBeforeSave