Mise à jour des mémos

1 1 1 1 1
Vote 0.00 (0 Votes)

Le but de cet article est d'expliquer comment mettre à jour automatiquement des mémos à partir d'événements du calendier (calendriers de JEvents ou de DPCalendar).


23/05/2017 : le plugin Maj Post-it a été créé pouvant remplacer ce code, qui reste ici juste pour information.


La mise à jour des mémos est lancée tous les soirs par Cron au niveau du serveur Gandi.

J'ai ajouté dans le fichier anacrontab la ligne suivante:

1@daily 0 maj_memo php -f /srv/data/web/vhosts/<votre site>/maj_post_it.php

en remplaçant <votre site> par votre nom de site, naturellement...

Dans le code qui suit, nous faisons la mise à jour des mémos à partir d'événements de JEvents.

Le fichier maj_post_it.php est très simple:

<?php
// but : mise à jour des post-it avec les derniers événements
//
// Les modules Joomla suivants ont été utilisés:
// - Responsive Mémo de polishedgeek (http://polishedgeek.com/)
// - JEvents
//
// Dans cette application,
// - 2 mémos ont été créés : mémo ca et mémo accueil
// - 2 catégories d'événements : ca et accueil
//
// 1. récupération du prochain événement d'une catégorie
// attention : la catégorie de l'événement doit être dans le nom du mémo
// sous la forme 'memo <catégorie>'
//
// 2. recherche du mémo de la catégorie
// - remplace la zone "editor" par le contenu de l'événement
// - mis à jour des dates début et fin de l'événement
//

require_once __DIR__ . '/CRON_Functions.php';
$db = new DB_Functions();

try {
$user = $db->getEvents("caps"); // prefixe des tables dans la base => caps

} catch (Exception $e) {
echo 'Erreur sur getEvents : ', $e->getMessage();
echo '<br />Trace : ', $e->getTraceAsString();
}
?>

 

Il utilise la librairie CRON_Functions.php pour gérer tout ça.

<?php

class DB_Functions {

private $db;
private $mysqli;

// constructor
function __construct() {
require_once 'CRON_Connect.php';
// connecting to database
$this->db = new DB_Connect();
$this->mysqli = $this->db->connect();
}

// destructor
function __destruct() {

}
// recherche du memo de la catégorie
// - remplace la zone "editor" par le contenu de l'événement
// - mis à jour des dates début et fin de l'événement
//
function upd_memo($prefixe,$st_type,$date_end,$st_desc) {
$constants = get_defined_constants(true);
$json_errors = array();
foreach ($constants["json"] as $name => $value) {
if (!strncmp($name, "JSON_ERROR_", 11)) {
$json_errors[$value] = $name;
}
}
$req = "SELECT id, params FROM ".$prefixe."_modules WHERE module like 'mod_postit' ";
$req .= " AND title like CONCAT('post-it ','" . $st_type."') AND published > 0;";
$query = $this->mysqli->prepare($req);
$query->execute();
$query->bindColumn(1,$id);
$query->bindColumn(2,$params);
$query->fetch();
$params = utf8($params);
$obj = json_decode($params);
// remplace le contenu de "editor" par le contenu de l'événement
$obj->{'editor'} = utf8($st_desc);
$params_new = json_encode($obj);
try {
$req = 'UPDATE '.$prefixe.'_modules';
$req .= ' set params = :params, publish_up = now() - INTERVAL 1 DAY';
$req .= ',publish_down = :dt_end WHERE id = :id;';
$query = $this->mysqli->prepare($req);
$query->execute(array(':params'=>$params_new,':dt_end'=>$date_end,':id'=>$id));
}
catch ( Exception $e ) {
echo "update impossible : ", $e->getMessage();
return false;
}
if (json_last_error() > 0)
echo '\nError JSON: '.json_last_error().' '.$json_errors[json_last_error()];
return true;
}
// récupération du prochain événement d'une catégorie
// attention : la catégorie de l'événement doit être dans le nom du post-it
// sous la forme 'post-it <catégorie>'
//
public function getEvent($prefixe,$type) {
$req = "select detail.evdet_id,detail.dtstart, detail.dtend,detail.description, detail.summary ";
$req .= " from ".$prefixe."_jevents_vevdetail detail ";
$req .= " INNER JOIN ".$prefixe."_jevents_vevent vevent ON detail.evdet_id = vevent.ev_id ";
$req .= " INNER JOIN ".$prefixe."_categories cat ON vevent.catid = cat.id";
$req .= " where cat.extension = 'com_jevents' ";
$req .= " AND alias = :1 ";
$req .= " AND detail.dtstart > UNIX_timestamp() AND detail.dtend > UNIX_timestamp() ";
$req .= " ORDER BY detail.dtstart LIMIT 1; ";
$query = $this->mysqli->prepare($req);
$query->bindParam(':1',$type);
$query->execute();
$query->bindColumn(1,$id);
$query->bindColumn(2,$dtstart);
$query->bindColumn(3,$dtend);
$query->bindColumn(4,$desc);
$query->bindColumn(5,$summary);
$query->fetch();
// $query->close();
if ($id == 0) { // pas d'événement: on sort
echo "rien: ".$type;
return false;
}
$rac = 'index.php/calendrier/icalrepeat.detail/';
$rac .= date('Y/m/d',$dtstart);
$rac .= '/'.$id.'/-/'.$type;
if (strlen($desc) == 0) {
// pas de description: on en génère une à partir du titre
$desc = $summary.' le '.date('d/m',$dtstart).' à partir de '.date('H\hi',$dtstart);
} else {
// on limite la taille pour le post-it: 1ere paragraphe
$desc = substr($desc,0,strpos($desc,'</p>'));
}
$desc = '<a href="'.$rac.'">'.$desc.'</a>';
$this->upd_memo($prefixe,$type,date("Y/m/d H:i:s",$dtend),$desc);
return true;

}
// recherche des événements des catégories ca et accueil
// $prefixe => prefixe des tables dans la base de données

public function getEvents($pref) {
if ($this->getEvent($pref,'ca')                           //<---- On cherche la catégorie ca
&& $this->getEvent($pref,'accueil'))                   //<---- puis la catégorie accueil
echo date("D M j G:i:s T Y")." : Maj Accueil et CA ok...";

else
echo date("D M j G:i:s T Y")."Maj Accueil et CA NOK...";
}
} // fin de la classe DB
// autres functions
function utf8($n) {
return (utf8_encode($n));
}

?>

Et la librairie CRON_Connect.php, qui contient la connexion en mode PDO.

<?php

class DB_Connect {

// constructor
function __construct() {

}

// destructor
function __destruct() {
// $this->close();
}

// Connecting to database
public function connect() {
require_once 'CRON_config.php';
return new PDO("mysql:host=$DB_HOST;dbname=$DB_DATABASE", $DB_USER, $DB_PASSWORD);
}

// Closing database connection
public function close() {
mysqli_close();
}

}

?>

Le fichier CRON_config.php contient vos paramètres de connexion à la base de données:

<?php
$DB_HOST="<votre host>";
$DB_USER="<votre code utilisateur>";
$DB_PASSWORD = "<votre mot de passe>";
$DB_DATABASE = "<votre base de données>";
?>