Miscellanées

Finalement le basculement depuis FluxBB vers Flarum pour le forum Dotclear ne sera pas envisagé — malgré tout le bien que j’en pense — parce que les pré-requis de Flarum ne sont pas remplis sur l’actuel serveur, d’une part, et que d’autre part les finances de l’association ne nous permettent pas de louer un second serveur. Rien de grave cependant, j’ai bien joué avec Flarum et maintenant l’intérêt est un peu retombé.

Me voilà de nouveau en train de jouer avec Ajax — oui, je sais, c’est une vieille techno, surtout comparée à ce qu’on fait maintenant, mais bon — pour lever les blocages consécutifs à un serveur aux abonnés absent une fois sur deux ; ce même serveur qu’on a pas les moyens de remplacer. Le contrôle de mise à jour de Dotclear est fait dorénavant de façon asynchrone et ne bloque plus la page d’accueil de l’administration.

La mécanique pour faire ça est super simple : vous prenez le bout de code PHP qui faisait le job avant et vous le collez dans une fonction serveur (REST) qui sera appelée par un script javascript inséré dans la page chargée, ici la page d’accueil de l’administration.

Comme le boulot fait par le javascript n’est pas bloquant, c’est-à-dire que le reste de la page est entièrement fonctionnel pendant qu’il bosse ou attend la réponse du serveur, plus rien ne bloque.

En détail, le code javascript dans la page d’accueil est celui-ci :

// check if core update available
	var params = {
		f: 'checkCoreUpdate',
		xd_check: dotclear.nonce
	};
	$.post('services.php',params,function(data) {
		if ($('rsp[status=failed]',data).length > 0) {
			// Silently fail as a forced checked my be done with admin update page
		} else {
			if ($('rsp>update',data).attr('check') == 1) {
				// Something has to be displayed
				xml = $('rsp>update',data).attr('ret');
				$('#content h2').after(xml);
			}
		}
	});

Et le code appelé par le code javascript est celui-là :

public static function checkCoreUpdate($core,$get)
{
	# Dotclear updates notifications

	$rsp = new xmlTag('update');
	$rsp->check = false;
	$ret = __('Dotclear update not available');

	if ($core->auth->isSuperAdmin() && !DC_NOT_UPDATE && is_readable(DC_DIGESTS) &&
		!$core->auth->user_prefs->dashboard->nodcupdate)
	{
		$updater = new dcUpdate(DC_UPDATE_URL,'dotclear',DC_UPDATE_VERSION,DC_TPL_CACHE.'/versions');
		$new_v = $updater->check(DC_VERSION);
		$version_info = $new_v ? $updater->getInfoURL() : '';

		if ($updater->getNotify() && $new_v) {
			// Check PHP version required
			if (version_compare(phpversion(),$updater->getPHPVersion()) >= 0) {
				$ret =
				'<div class="dc-update"><h3>'.sprintf(__('Dotclear %s is available!'),$new_v).'</h3> '.
				'<p><a class="button submit" href="'.$core->adminurl->get("admin.update").'">'.sprintf(__('Upgrade now'),$new_v).'</a> '.
				'<a class="button" href="'.$core->adminurl->get("admin.update", array('hide_msg' => 1)).'">'.__('Remind me later').'</a>'.
				($version_info ? ' </p>'.
				'<p class="updt-info"><a href="'.$version_info.'">'.__('Information about this version').'</a>' : '').'</p>'.
				'</div>';
			} else {
				$ret = '<p class="info">'.
					sprintf(__('A new version of Dotclear is available but needs PHP version ≥ %s, your\'s is currently %s'),
						$updater->getPHPVersion(),phpversion()).
					'</p>';
			}
			$rsp->check = true;
		} else {
			if (version_compare(phpversion(),DC_NEXT_REQUIRED_PHP,'<')) {
				$ret = '<p class="info">'.
					sprintf(__('The next versions of Dotclear will not support PHP version < %s, your\'s is currently %s'),
						DC_NEXT_REQUIRED_PHP,phpversion()).
					'</p>';
				$rsp->check = true;
			}
		}
	}
	$rsp->ret = $ret;
	return $rsp;
}

Vous noterez que si quelque chose se passe mal, ou ne se passe pas du tout, ou encore si aucune mise à jour n’est disponible ou si vous avez une version de PHP d’une version qui sera supportée par la prochaine version majeure de Dotclear eh bien aucun message ne sera affiché, soit dans la majorité des cas, en fait. Parce qu’en plus vous pourriez très bien ne pas être super-admin, ou si c’est le cas avoir désactivé dans vos préférences utilisateur le contrôle de mise à jour.

Quoi qu’il en soit, si vous êtes super-admin vous avez toujours la possibilité de faire un contrôle direct en utilisant l’entrée de menu correspondante (« Mise à jour » dans le groupe « Réglages système »).

Il me reste à faire de même pour la récupération des nouvelles de Dotclear, ce que je coderai ce week-end ou en début de semaine prochaine, et on sera enfin tranquille de ce point de vue ! Pour info, ça sera dans la future 2.13 de Dotclear.

En fait on pourrait même pousser plus loin ce principe, à savoir utiliser du javascript côté client (sur vos navigateurs) et des fonctions serveurs en PHP pour toute l’administration ; c’est d’ailleurs très exactement ce que fait Flarum, qui pousse même le bouchon jusqu’à gérer aussi la partie publique de cette manière (avec tout de même un mode dégradé basique si javascript est désactivé). C’est tout l’intérêt d’avoir maintenant des navigateurs qui intègrent du javascript efficace et qui ne nuit pas à l’accessibilité, alors que ce n’était pas le cas au début des années 2000 où le javascript tenait plus de la cerise sur le klafoutis qu’autre chose !

Ah mais au fait, maintenant que j’y pense, je n’avais pas dit que je sortirai une 2.12.2 ces prochains jours ? Faut que j’aille voir ce qu’il reste potentiellement à y mettre… À moins que j’aille jouer avec mon nouveau joujou pour développer mes photos en attente :-)

Mon projet préféré ? C’est le prochain.

Frank Lloyd Wright

Ajouter un commentaire

Les champs suivis d'un * sont obligatoires

Les commentaires peuvent être formatés en utilisant la syntaxe Markdown Extra.

Ajouter un rétrolien

URL de rétrolien : https://open-time.net/trackback/13585

Haut de page