Masquer l'illustration d'une actualité comportant une vidéo

Sur le site Transitions, les actualités sont accompagnées d'une vignette que l'on doit masquer lorsque l'actualité contient une vidéo. Pour cela on peut utiliser le nom de classe node-id présent sur la balise BODY pour sélectivement cacher les illustrations de ce type d'actualités :

body.node-id-164 .view--news--view .illustration {
    display: node;
}

C'est simple, mais cela devient vite pénible lorsque l'on ajoute souvent des actualités accompagnées de vidéo, notamment parce que le client n'est pas autonome et qu'il nous faut intervenir pour mettre à jour la feuille de style par FTP. Bref, c'est simple mais c'est nul. Heureusement, on peut arranger tout ça en quelques lignes.

Une solution automatique

Ce que l'on va faire, c'est ajouter la classe has-video sur l'élément de vue qui affiche l'actualité, lorsque celle-ci comporte une vidéo. Une règle unique nous permettra de masquer les illustrations de ces actualités :

.view--news--view.has-video .illustration {
    display: node;
}

Pour ajouter cette classe on va se servir de deux évènements. L'évènement Icybee\Modules\Views\View::render:before est déclenché lorsqu'une vue s’apprête a être rendue. Lors de cet évènement on vérifie que la vue correspond à celle que nous souhaitons modifier, à savoir « news/view ». Si la vue correspond, on attache une fonction de rappel sur l'évènement Icybee\Modules\News\News::alter_css_class_names. Nous n'aurons plus qu'à ajouter la classe has-video aux noms de classe de l'actualité si son corps contient une balise IFRAME. On oubliera pas de détacher l'évènement une fois terminé afin d'éviter qu'il soit appelé en dehors du rendu de la vue.

<?php

use Icybee\Modules\Views\View;
use Icybee\Modules\News\News;

$core->events->attach(function(View\BeforeRenderEvent $event, View $target) use($core)
{
    if ($event->id != 'news/view')
    {
        return;
    }

    $eh = $core->events->attach(function(\Icybee\AlterCSSClassNamesEvent $event, News $target) use(&$eh) {

        if (strpos($target->body'<iframe ') !== false)
        {
            $event->names['has-video'] = true;
        }

        $eh->detach();

    });
});

Laisser un commentaire

Pas de commentaire