Ça fait un moment que ça me titille d’utiliser le serveur REST de Dotclear avec des données au format JSON, format plus simple à gérer du côté Javascript. Je viens de pousser une version expérimentale (à utiliser à vos risques et périls donc avec la future version 2.23 de Dotclear).
Je viens de modifier le plugin wordCount en conséquence et ça permet, pour le code PHP (fichier _services.php), de basculer de ceci :
<?php
…
class restWordCount
{
/**
* Serve method to update current counters.
*
* @param dcCore $core The core
* @param array $get The get
*
* @return xmlTag The xml tag.
*/
public static function getCounters($core, $get)
{
global $core;
$rsp = new xmlTag('check');
$rsp->ret = false;
if ($core->blog->settings->wordcount->wc_active) {
…
$rsp->html = $html;
$rsp->ret = true;
}
return $rsp;
}
}
à cela1 :
<?php
…
class restWordCount
{
/**
* Serve method to update current counters.
*
* @param array $get The get
*
* @return The payload.
*/
public static function getCounters($get)
{
$payload = [
'ret' => false,
];
if (dcCore::app()->blog->settings->wordcount->wc_active) {
…
$payload = [
'ret' => true,
'html' => $html,
];
}
return $payload;
}
}
Et pour le code javascript (fichier js/service.js) de ceci :
/*global $, dotclear */
'use strict';
dotclear.wordCountGetCounters = () => {
$.get('services.php', {
f: 'wordCountGetCounters',
xd_check: dotclear.nonce,
excerpt: $('#post_excerpt').val(),
content: $('#post_content').val(),
format: $('#post_format').val(),
})
.done((data) => {
if ($('rsp[status=failed]', data).length > 0) {
// For debugging purpose only:
// window.console.log($('rsp', data).attr('message'));
window.console.log('Dotclear REST server error');
} else {
const ret = Number($('rsp>check', data).attr('ret'));
if (ret) {
const html = $('rsp>check', data).attr('html');
const $container = $('div.wordcount details p');
if ($container) {
// Replace current counters
$container.empty().append(html);
}
}
}
})
.fail((jqXHR, textStatus, errorThrown) => {
window.console.log(`AJAX ${textStatus} (status: ${jqXHR.status} ${errorThrown})`);
})
.always(() => {
// Nothing here
});
};
$(() => {
// Set 60 seconds interval between two counters calculation
dotclear.wordCountGetCounters_Timer = setInterval(dotclear.wordCountGetCounters, 60 * 1000);
});
à cela2 :
/*global dotclear */
'use strict';
window.addEventListener('load', () => {
// Set interval between two counters calculation
dotclear.wordcount = dotclear.getData('wordcount');
dotclear.wordcount.getCounters = () => {
dotclear.services(
'wordCountGetCounters',
(data) => {
const response = JSON.parse(data);
if (response?.success) {
if (response?.payload.ret) {
// Replace current counters
const p = document.querySelector('div.wordcount details p');
if (p) {
p.innerHTML = response.payload.html;
}
}
} else {
console.log(dotclear.debug && response?.message ? response.message : 'Dotclear REST server error');
return;
}
},
(error) => {
console.log(error);
},
true, // Use GET method
{
json: 1, // Use JSON format for payload
excerpt: document.querySelector('#post_excerpt').value,
content: document.querySelector('#post_content').value,
format: document.querySelector('#post_format').value,
},
);
};
dotclear.wordcount.timer = setInterval(dotclear.wordcount.getCounters, (dotclear.wordcount?.interval || 60) * 1000);
});
Notez que ça ne casse pas l’existant et que si vous voulez continuer à utiliser le serveur REST avec du format XML, c’est toujours possible :-)
1 De Nicolas -
Génial. Depuis le temps que j’en rêve !
p.s: oui je sais, j’ai des rêves bizarres.
2 De Franck -
:-)