web-dev-qa-db-fra.com

Ajouter une classe à toutes les images de l'article dynamiquement

J'essaie de construire un plugin qui ajoute une classe à toutes les images de mes articles. Jusqu'à présent, j'ai le code suivant:

<?php
// no direct access
defined('_JEXEC') or die;
jimport('joomla.plugin.plugin');
class plgContentAddImageClass extends JPlugin
{
    public function __construct(&$subject, $params)
    {
        parent::__construct($subject, $params);
    }
    public function onContentPrepare($context, &$article, &$params, $offset = 0)
    {
        // Article Content
        $content = &$article->text;
        // Find images and add a class
    }
?>

Mais je ne sais pas comment je peux trouver des images dans le contenu et leur ajouter une classe. En outre, les images peuvent déjà avoir une classe, dans ce cas, je veux en ajouter une nouvelle aux classes existantes.

Edit:
J'ai un plugin qui filigrane toutes les images avec une certaine classe, mais comme le site contient déjà beaucoup d'images, j'aimerais ajouter la classe aux images de manière dynamique au lieu de passer chaque <img> tag sur le site et ajouter les classes.

Je suis conscient que je peux cibler toutes les images avec CSS, cela ne sert à rien dans ce cas.

5
Bogowoe

Vous pouvez charger le contenu dans une DOMDocument() et le manipuler.

<?php
// no direct access
defined('_JEXEC') or die;
jimport('joomla.plugin.plugin');
class plgContentAddImageClass extends JPlugin
{
    public function __construct(&$subject, $params)
    {
        parent::__construct($subject, $params);
    }
    public function onContentPrepare($context, &$article, &$params, $offset = 0)
    {
        // Article Content
        $content = &$article->text;
        // Find images and add a class
        $dom = new DOMDocument();
        @$dom->loadHTML(mb_convert_encoding($content, 'HTML-ENTITIES', 'UTF-8'));
        $dom->preserveWhiteSpace = false;
        $images                  = $dom->getElementsByTagName('img');
        foreach($images as $image) {
            // the existing classes already on the images
            $existing_classes   = $image->getAttribute('class');
            // the class you want to add
            $new_class          = ' yourclass';
            // the existing classes plus the new class
            $class_names_to_add = $existing_classes . $new_class;
            $image->setAttribute('class', $class_names_to_add);
        }
        // $dom now contains a complete HTML source, remove unnecessary tags
        $content = preg_replace('/^<!DOCTYPE.+?>/', '', str_replace( array('<html>', '</html>', '<body>', '</body>'), array('', '', '', ''), $dom->saveHTML()));
        return true;
    }
}
?>
3
johanpw

Pourquoi voudriez-vous faire cela?

Vous pouvez facilement cibler toutes les images d'un article avec css sans utiliser de plugin. Tout ce dont vous avez besoin, c'est d'un peu de css;

.view-article img { // My awesome styles here ;}

Cible toutes les images dans vos articles et ne pas ajouter la surcharge, ou la complexité, un plugin serait. Le moyen le plus simple est toujours le meilleur.

Maintenable, évolutive, sécurisée.

3
Seth Warburton