web-dev-qa-db-fra.com

Créer des vignettes avec des images de champs personnalisés

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:

  • Perfomance: ce code implique que les vignettes sont recréées chaque fois que la page est chargée (la vue peut être mise en cache mais même si)
  • Méthode: existe-t-il un moyen plus simple de créer des vignettes (par exemple en les créant lorsque l'article est enregistré dans le backend)?
1
web-tiki

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

1
FFrewin