09 sept 2010 Différencier les vidéos des photos
Catégorie : Présentation  | Tags :

Dans une de mes galeries organisée par événements, j’ai voulu identifier par un signe distinctif les vidéos, un peu « noyées » parmi toutes les photos d’une sortie. J’ai donc imaginé d’ajouter une icône pour les repérer dans la page de vignettes :

L’opération est assez simple, et repose sur le fait que toutes mes vidéos sont physiquement regroupées1 dans un sous-répertoire /galleries/videos ; il est donc possible de tester la présence de la chaîne de caractères video dans le nom du fichier, et de faire un traitement spécifique en conséquence.

La modification comprend 2 éléments :

  • une fonction jQuery, qui identifie chaque vignette correspondant à une vidéo, et lui ajoute un élément HTML correspondant à l’icône
  • des nouvelles règles CSS pour que ce nouvel élément affiche l’icône sur la vignette de la vidéo.
1. Ajout d’une fonction jQuery

La fonction qui permet d’ajouter à chaque vignette un élément supplémentaire est celle-ci :

jQuery(document).ready(
function($) {
$("img[src*=video]").closest('span').after('<span class="video"></span>');
}
);

avec :

  • jQuery(document).ready(function($) {}); : définition d’une fonction jQuery qui s’exécutera une fois la page web chargée
  • $("img[src*=video]") : recherche des éléments img de la page qui contiennent la chaîne de caractères video
  • .closest('span') : sélection de la balise <span> parente la plus proche
  • .after('<span class="video"></span>') : ajout après cette balise d’un élément span porteur du nom de classe video

Cette fonction peut être ajoutée dans n’importe quel template-extension à condition de l’encadrer ainsi :

{known_script id="jquery" src=$ROOT_URL|@cat:"themes/default/js/jquery.packed.js"}
{html_head}
{literal}
<script type="text/javascript">

… votre fonction est ici …
</script>
{/literal}
{/html_head}

avec :

  • {known_script id="jquery" src=$ROOT_URL|@cat:"themes/default/js/jquery.packed.js" : indique que la bibliothèque jQuery est déjà définie par ailleurs,
  • {html_head} {/html_head} : déplace dans la partie head du code HTML tout le code encadré par les balises2,
  • {literal} {/literal} : indique à Smarty que le code entre ces balises ne le concerne pas,
  • <script type="text/javascript"> … votre fonction est ici … </script> : votre fonction jQuery est du javascript, ce qu’indiquent les balises qui l’encadrent.

Je vous suggère d’ajouter ce script à la fin d’un de vos template-extensions existants, si vous en avez déjà3 ; à défaut, vous trouverez un exemple de création et d’activation de template-extension sur cette page.

2. Nouvelles règles de style

La mise en forme de l’élément span ajouté par le script jQuery requiert l’ajout de 2 nouvelles règles CSS :

.content ul.thumbnails span.wrap1 {
position:relative;
}


.thumbnails .video{
background: url('../img/video.png') no-repeat;
position: absolute;
top: 90px;
left: 100px;
z-index:99;
width: 45px;
height:45px;
}

avec :

  • .content ul.thumbnails span.wrap1 {position:relative;} : définit un positionnement relatif pour l’élément parent de notre nouvel élément
  • .thumbnails .video{} : ensemble de la règle concernant notre nouvel élément, qui a pour nom de classe video
  • background: url('../img/video.png') no-repeat; : définition de l’icône qui sert de fond au nouvel élément
  • position: absolute; top: 90px; left: 100px; : positionnement absolu du nouvel élément, à 90 pixels du haut et 100 pixels de la gauche de l’élément parent
  • z-index:99; : provoque la superposition de l’icône par rapport à l’élément parent
  • width: 45px; height:45px; dimensions de l’icône affichée

Cette règle est à ajouter dans l’un de vos fichiers personnels de styles, par exemple /local/rules.css. Vous trouverez sur cette page un exemple détaillé de mise à jour de ce fichier.

Reste à charger l’icône video.png, définie avec une taille de 45 x 45 pixels. Je vous propose de copier celle-ci  par un simple clic droit ; il s’agit d’une adaptation personnelle à partir d’une image trouvée sur cette page, qui en comportent beaucoup d’autres. Il vous suffit ensuite d’utiliser votre client FTP pour la charger dans le répertoire /local/img de votre galerie.

3. Pour aller plus loin

Vous pouvez adopter le même principe pour d’autres types de fichiers. Dans la même galerie, j’ai par exemple identifié les articles de presse par une autre icône du même style, comme vous pouvez le voir ici :

  1. Rappel : bien que les vidéos soient physiquement stockées dans une même sous-arborescence elles peuvent apparaître individuellement dans n’importe quelle catégorie virtuelle de la galerie. []
  2. C’est pour cette raison que la fonction peut être mise dans n’importe quel fichier template. []
  3. Personnellement, j’ai pour habitude de regrouper mes scripts dans un même template-extension ; je les retrouve ainsi beaucoup plus facilement. []
Vous pouvez suivre les commentaires sur cet article grâce à son flux RSS 2.0. Les commentaires et les pings sont fermés. // ajout MNA pour les posts liés //
Articles liés

7 réactions

  1. 1
    Julien 

    Bonjour,

    Il s’agit d’une excellente astuce et j’en remercie vivement l’auteur.

    Cependant, il y a une erreur dans le code du « jquery », il faut mettre :
    $(« img[src*=video]« ).closest(‘span’).after( »);
    au lieu de :
    $(« img[src*=video]« ).closest(‘span’).after( »);

  2. 2
    Julien 

    Ce que je voulais noter dans mon précédent post n’est pas bien « passé » : dans le span du code il manque le class= »video »

  3. 3
    tosca 

    Merci beaucoup Julien d’avoir relevé cette anomalie : le class= »video » apparaissait effectivement dans le commentaire, mais pas dans le bloc de code source que chacun peut copier/coller.

    L’anomalie est désormais corrigée.

  4. 4
    frob 

    je suis perdu …
     
    mes vidéos sont sous galleries/mesvideos
    j’ai ajouté :
    {known_script id= »jquery » src=$ROOT_URL|@cat: »themes/default/js/jquery.packed.js »}
    {html_head}
    {literal}
    <script type= »text/javascript »>
    jQuery(document).ready(
    function($) {
    $(« img[src*=video]« ).closest(‘span’).after(‘<span class= »video »></span>’);
    }
    );
    </script>
    {/literal}
    {/html_head}
    dans mon fichier footer_perso.tpl
    puis:
     
    .content ul.thumbnails span.wrap1 {
    position:relative;
    }


    .thumbnails .video{
    background: url('../img/video.png') no-repeat;
    position: absolute;
    top: 90px;
    left: 100px;
    z-index:99;
    width: 45px;
    height:45px;
    }

    dans le fichier rule.css
     
    puis j'ai recopié le fichier video.png dans le rep local/img
     
    et je ne vois rien qui s'affichent sur les vigenttes de mes videos.
    pouvez vous m'aider ?

    http://portecles.free.fr/pcp_col/index.php?/category/361
     
    merci

  5. 5
    frob 

    j’ai ces erreurs qui s’affichent :
    Warning: known_script is deprecated jquery themes/default/js/jquery.min.js in /mnt/142/sda/1/c/portecles/pcp_col/include/template.class.php on line 547

    Warning: Attempt to add script jquery but the head has been written in /mnt/142/sda/1/c/portecles/pcp_col/include/template.class.php on line 979
     
    voyez vous ou pourrait etre mon pb ?
    merci

  6. 6
    tosca 

    C’est écrit en anglais dans le texte : ‘known_script’ n’est plus utilisable dans la nouvelle version de Piwigo, et provoque un conflit dans les scripts jquery. Il faut que je revois les tutoriaux qui ne sont plus d’actualité, mais je ne vais pas pouvoir le faire immédiatement.

  7. 7
    frob 

    merci pour ta reponse, je vais revenir en arrière en attendant la mise a jour de ce tuto :-)