Le besoin métier
Je vous propose aujourd'hui un petit plugin qui va vous permettre de visualiser les dernières mises à jours de fichier. Ce travail s'inscrit une fois de plus dans un besoin professionnel où je drois gérer des mises à jours doccumentaires, des PDF que les utilisateurs peuvent télécharger via un lien hypertexte.
Or, que ce soit l'utilisateur final, ou m^oi même, gestionnaire, il peut être interessant de pouvoir visualiser les derniers fichiers ayant été mis à jour. Sur un serveur linux, avec PHP, il existe une commande pour exxtraire cette donnée : filemtime.
Ce plugin qui s'utilise via le shortcode {LastDocUpdates} (attention à la casse)
Le fonctionnement
Ce plugin de contenu va alors lister récursivement le contenu du dossier à surveiller, que vous définirez dans l'interface d'administration, va lister les fichiers de ce dossier et les trier par date de derniere mises à jour. Sera alors présenté à l'utilisateur une liste ordonée et classée des fichiers dernièrement modifiés (en fait le tri est croissant) et vous obtiendrez une liste de la forme suivante :
lastdocupdate.xml
<?xml version="1.0" encoding="utf-8"?>
<extension version="1.0" type="plugin" group="Content">
<name>Last Docs Updates</name>
<author>Sebastien LHUILLIER</author>
<creationDate>Novembre 2023</creationDate>
<copyright>Sébastien LHUILLIER</copyright>
<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
<authorEmail>Cette adresse e-mail est protégée contre les robots spammeurs. Vous devez activer le JavaScript pour la visualiser.</authorEmail>
<authorUrl>www.sebastien-lhuillier.com</authorUrl>
<version>1.0</version>
<description><![CDATA[Ce plugin permet de VISUALISER les derniers documents (fichiers PDF) mise à jour sur le serveur]]></description>
<files>
<filename plugin="lastDocsUpdates">lastdocsupdates.php</filename>
<filename>lastdocsupdates.xml</filename>
</files>
<config>
<fields name="params">
<fieldset name="basic">
<field name="note1" type="note" class="alert" label="Tag" description="Tag case-sensitive à utiliser : {LastDocUpdates}" />
<field name="dossier" type="text" default="" label="Dossier à surveiller (__DOCUMENTS__)" description="" size="10" />
</fieldset>
</fields>
</config>
</extension>
lastdocupdate.php
<?php
defined('_JEXEC') or die('Access deny');
class plgContentLastDocsUpdates extends JPlugin
{
function getDirContents($dir, &$results = array()) {
$files = scandir($dir);
foreach ($files as $key => $value) {
$path = realpath($dir . DIRECTORY_SEPARATOR . $value);
if (!is_dir($path)) {
$results[] = $path;
} else if ($value != "." && $value != "..") {
getDirContents($path, $results);
$results[] = $path;
}
}
return $results;
}
function onContentPrepare($content, $article, $params, $limit){
$document = JFactory::getDocument();
$document->addStyleSheet('plugins/content/lastdocsupdates/style.css');
$T=array();
$root = $this->params->get('dossier', '');
$iter = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($root, RecursiveDirectoryIterator::SKIP_DOTS),
RecursiveIteratorIterator::SELF_FIRST,
RecursiveIteratorIterator::CATCH_GET_CHILD // Ignore "Permission denied"
);
$paths = array($root);
foreach ($iter as $path => $dir) {
$paths[] = $path;
}
$c = array();
$i=0;
foreach ($paths as $uneLigne)
{
$c[$i][0] = filemtime($uneLigne);
$c[$i][1] = $uneLigne;
$i++;
}
array_multisort(array_column($c, 0), SORT_ASC, $c);
$ch='<div class="derniers-fichiers-modifies">';
//j'affiche les éléments
foreach ($c as $unfichier){
$ch .= '<div class="un-fichier"><div class="un-fichier-nom">'.$unfichier[1].'</div><div class="un-fichier-date">'.date('d-M-Y',$unfichier[0]).'</div></div>';
}
$ch .= '</div>';
$article->text = str_replace('{LastDocUpdates}',$ch, $article->text);
}
}