Dotclear

Vous n'êtes pas identifié(e).

Annonce

13 février 2024 Sortie de Dotclear 2.29

#1 2013-10-12 20:00:20

geceo
Membre
Lieu : Cesson Sévigné
Inscription : 2008-05-10
Site Web

Enregistrer la date de mise à jour des données d'un widget ?

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

#2 2013-10-15 15:15:54

Philippe
Stagiaire
Lieu : Toulon
Inscription : 2004-06-13
Site Web

Re : Enregistrer la date de mise à jour des données d'un widget ?

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

#3 2013-10-20 12:01:07

geceo
Membre
Lieu : Cesson Sévigné
Inscription : 2008-05-10
Site Web

Re : Enregistrer la date de mise à jour des données d'un widget ?

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

#4 2013-10-20 13:33:04

geceo
Membre
Lieu : Cesson Sévigné
Inscription : 2008-05-10
Site Web

Re : Enregistrer la date de mise à jour des données d'un widget ?

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

#5 2013-10-20 15:34:13

geceo
Membre
Lieu : Cesson Sévigné
Inscription : 2008-05-10
Site Web

Re : Enregistrer la date de mise à jour des données d'un widget ?

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).

Pied de page des forums

Sites map