Vous n'êtes pas identifié(e).
13 février 2024 Sortie de Dotclear 2.29
Bonjour,
Je cherche à ajouter sur le site http://www.escrime-cesson-rennes.fr un widget qui indiquera si la salle d'armes sera ouverte le samedi entre 10h et 12h (car ça dépend des semaines). On peut obtenir la date du «prochain samedi» avec :
echo strftime("%e %B", strtotime("this Saturday"));
Côté administration, j'ai donc pour l'instant utilisé un menu déroulant ("option") avec trois valeurs : «oui», «non» et «non décidé».
Je voudrais maintenant améliorer ce widget pour que la valeur revienne automatiquement à «non décidé» à partir du samedi à 12h01, jusqu'à ce que l'on redéfinisse la valeur via l'interface d'administration pendant la semaine.
Afin que ce changement automatique soit possible, il faut bien sûr enregistrer le timestamp de l'enregistrement de la valeur «oui» ou de la valeur «non», et faire une comparaison dans _public.php du type : «sachant qu'on est un jour J à une heure H, si l'information a été enregistrée avant le samedi qui a précédé J, repasser la valeur à «non décidé» dans la base de données» (en effet ça signifie que l'information «oui» ou «non» ne concerne pas le samedi qui vient).
D'où ma question : comment peut-on enregistrer la date et l'heure de mise à jour des données d'un widget?
Merci de vos lumières.
Grégoire
Dernière modification par geceo (2013-10-12 20:05:29)
Hors ligne
Si tu as créé un widget, tu as un plugin ;)
Il te faut alors enregistrer dans les paramètres du plugin le timestamp si on choisit oui dans _widget.php (si oui tu enregistres), puis lire ce paramètre dans le fichier _public.php.
Hors ligne
Bonjour,
Merci pour cette réponse et pour le lien. Il y a plusieurs références à addNameSpace sur la page :
http://fr.dotclear.org/documentation/2. … s/settings
Or le vrai nom est addNamespace et non addNameSpace (une seule majuscule).
EDITION : j'avais oublié que PHP n'était pas sensible à la casse. Bon, c'est toujours mieux que ça soit cohérent avec le nom de la fonction dans /inc/core/class.dc.settings.php.
Dernière modification par geceo (2013-10-20 12:25:04)
Hors ligne
Re-bonjour,
J'ai créé les fichiers suivants :
_define.php
<?php
if (!defined('DC_RC_PATH')) { return; }
$this->registerModule(
/* Name */ "Widget Samedi Matin",
/* Description*/ "Ouverture de la salle le samedi matin",
/* Author */ "Grégoire Colbert",
/* Version */ '1',
/* Permissions */ 'usage,contentadmin'
);
?>
_install.php
<?php
if (!defined('DC_CONTEXT_ADMIN')) exit;
global $core;
$this_version = $core->plugins->moduleInfo('samedimatin','version');
$installed_version = $core->getVersion('samedimatin');
if (version_compare($installed_version,$this_version,'>=')) {
return;
}
$core->blog->settings->addNamespace('samedimatin');
$core->setVersion('samedimatin',$this_version);
return true;
?>
_admin.php
<?php
if (!defined('DC_CONTEXT_ADMIN')) { return; }
require dirname(__FILE__).'/_widgets.php';
global $core;
# ajouter le plugin dans la liste des plugins du menu de l'administration
$_menu['Plugins']->addItem(
# nom du lien (en anglais)
__('Samedi matin'),
# URL de base de la page d'administration
'plugin.php?p=samedimatin',
# URL de l'image utilisée comme icône
'index.php?pf=samedimatin/icon.png',
# expression régulière de l'URL de la page d'administration
preg_match('/plugin.php\?p=samedimatin(&.*)?$/',
$_SERVER['REQUEST_URI']),
# persmissions nécessaires pour afficher le lien
$core->auth->check('usage,contentadmin',$core->blog->id));
?>
_widgets.php
<?php
if (!defined('DC_RC_PATH')) { return; }
$core->addBehavior('initWidgets', array('OuvertureSamediMatin','initWidgets'));
class OuvertureSamediMatin
{
public static function initWidgets($w)
{
$w->create('WidgetSamediMatin',__('Widget Samedi Matin'), array('publicWidgetOuvertureSamediMatin','myWidgetOuvertureSamediMatin'));
setlocale (LC_TIME, 'fr_FR.utf8','fra');
$dateSamedi = dt::str("%e %B", strtotime("this Saturday"),$core->blog->settings->blog_timezone);
$w->WidgetSamediMatin->setting('option',__('Ouverture de la salle le '.$dateSamedi),
null,'combo',array('pas décidé' => 1, 'oui' => 2, 'non' => 3));
global $core;
# enregistrement du paramètre indiquant la date de mise à jour, si l'on est dans la page "plugin.php" dans l'administration de DotClear
if (basename($_SERVER['PHP_SELF'])=="plugin.php")
{
$core->blog->settings->addNamespace('samedimatin');
#$dateMAJ = strtotime("now");
$dateMAJ = strtotime("last Monday-1 week"); # date ancienne pour tester le retour automatique de la valeur à "pas décidé" (cf bloc "else")
$core->blog->settings->samedimatin->put('dateMAJ', $dateMAJ, 'string', 'Date de mise à jour');
}
else
# Sinon, c'est que le widget est appelé par une page publique
{
# Si la date de MAJ de l'option remonte à avant le dernier samedi à midi, on réinitialise l'option à "pas décidé"
if (($core->blog->settings->samedimatin->dateMAJ) <= (strtotime("last Saturday+12 hours")))
{
# COMMENT FORCER LA VALEUR DE L'OPTION À "pas décidé" ?
# La ligne suivante ne semble rien faire du tout :
$w->WidgetSamediMatin->setting('option',__('Ouverture de la salle le '.$dateSamedi),1,'combo',array('pas décidé' => 1, 'oui' => 2, 'non' => 3));
}
}
}
}
?>
et _public.php :
<?php
if (!defined('DC_RC_PATH')) { return; }
require dirname(__FILE__).'/_widgets.php';
class publicWidgetOuvertureSamediMatin
{
public static function myWidgetOuvertureSamediMatin($w)
{
$settings = $w->settings();
$texteOption = array_search($settings["option"]["value"],$settings["option"]["options"]);
global $core;
setlocale (LC_TIME, 'fr_FR.utf8','fra');
return '<div id="infos-pratiques" class="text"><h2>Ouverture le samedi (10h-12h)</h2><p>Samedi '.dt::str("%e %B", strtotime("this Saturday"), $core->blog->settings->blog_timezone).' : <strong>'.$texteOption.'</strong> (au '.dt::str("%e %B", $core->blog->settings->samedimatin->dateMAJ, $core->blog->settings->blog_timezone).')</p></div>';
}
}
?>
J'ai presque terminé mais je ne vois pas comment passer à "pas décidé" la valeur de l'option dans le bas de "widgets.php". Est-ce possible?
Note : un var_dump sur mon widget laisse voir un "settings:private", est-ce que ça signifie qu'on ne peut rien changer?
object(dcWidget)#63 (6) {
["id:private"]=> string(17) "WidgetSamediMatin"
["name:private"]=> string(20) "Widget Samedi Matin"
["desc:private"]=> string(0) ""
["public_callback:private"]=> array(2) {
[0]=> &string(32) "publicWidgetOuvertureSamediMatin"
[1]=> string(28) "myWidgetOuvertureSamediMatin"
}
["append_callback"]=> NULL
["settings:private"]=> array(1) {
["option"]=> array(4) {
["title"]=> string(35) "Ouverture de la salle le 26 octobre"
["type"]=> string(5) "combo"
["value"]=> string(1) "2"
["options"]=> array(3) {
["pas décidé"]=> int(1)
["oui"]=> int(2)
["non"]=> int(3)
}
}
}
}
Merci de vos lumières!
Grégoire
Dernière modification par geceo (2013-10-20 19:04:48)
Hors ligne
Bon, comme je n'arrive pas à remettre à "pas décidé" la valeur de mon option, j'ai usé d'un artifice, je change juste l'affichage :
<?php
if (!defined('DC_RC_PATH')) { return; }
require dirname(__FILE__).'/_widgets.php';
class publicWidgetOuvertureSamediMatin
{
public static function myWidgetOuvertureSamediMatin($w)
{
$settings = $w->settings();
$texteOption = array_search($settings["option"]["value"],$settings["option"]["options"]);
global $core;
if (($core->blog->settings->samedimatin->dateMAJ) <= (strtotime("last Saturday+12 hours")))
{
$texteOption = "pas décidé";
}
setlocale (LC_TIME, 'fr_FR.utf8','fra');
return '<div id="infos-pratiques" class="text"><h2>Ouverture le samedi (10h-12h)</h2><p>Samedi '.dt::str("%e %B", strtotime("this Saturday"), $core->blog->settings->blog_timezone).' : <strong>'.$texteOption.'</strong> ('.dt::str("%e/%m",$core->blog->settings->samedimatin->dateMAJ,$core->blog->settings->blog_timezone).')</p></div>';
}
}
?>
Si quelqu'un sait comment se passe l'enregistrement de la valeur de l'option dans "widgets.php", je suis vraiment intéressé, car là c'est vraiment pas très satisfaisant comme solution…
Dernière modification par geceo (2013-10-20 20:42:08)
Hors ligne
Vous n'êtes pas identifié(e).