JSON en veux-tu en voilà

Ç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. J’en ai profité pour virer le passage de la variable $core à la méthode, seulement dans le cas où le format JSON est requis, puisque c’est inutile depuis la 2.23 de Dotclear. ↩︎

  2. J’en ai profité pour virer l’utilisation de jQuery au passage. ↩︎

The wedding time is coming!

Balcon avec vue à Morzine, août 2022

J’avais placé ce petit indice dans le codename de la prochaine milestone de Dotclear, mais personne n’avait relevé jusqu’à aujourd’hui :-) En attendant elle [la nouvelle version, ndlr] est toujours prévue pour le 13 août prochain, si toutefois j’arrive à régler ce petit bug paradoxal qui surgit  […]

Lire la suite

Signatures

Anne et Franck, août 2022

Alors en fait, ça tombait bien que je sois témoin en avril dernier du mariage des amis à Tours parce que je vais m’habiller de la même façon début septembre prochain pour signer une nouvelle fois1 ! Ah et puis ce matin, je me suis encore entraîné en signant la promesse de vente2 de la maison des  […]

Lire la suite

Haut de page