Query Path

Query Path (http://querypath.org/) est une librairie PHP permettant de récupérer, sélectionner et manipuler un contenu HTML comme le fait la librairie javascript jQuery. Ce plugin permet d’utiliser cette librairie dans SPIP.

Ce plugin permet d’utiliser dans SPIP la librairie QueryPath dans le code PHP d’un plugin. Cette librairie est entre autre un portage en PHP des sélecteurs et des manipulateurs de document de jQuery. Cela dit QueryPath permet bien d’autres choses également.

Pour l’utiliser, il faut charger inc/querypath.php :

  1. include_spip('inc/querypath');

Une fois le fichier chargé, vous avez à disposition les fonctions prévues par la librairie :

Ce plugin requiert une version de PHP >= 5.3

Manipuler du HTML

J’ai été confronté à différents problèmes lors de mon utilisation avec pour source un morceau de page HTML issu d’un pipeline de SPIP. Aussi, pour faciliter l’utilisation, une fonction apportée par ce plugin est aussi disponible avec les mêmes paramètres que les fonctions d’origine :

  • spip_query_path()

La fonction retourne pareillement un objet QueryPath, mais le chargement modifie certaines propriétés (lire inc/querypath.php pour plus de détails) pour que le fonctionnement soit le plus simple et transparent pour les développeurs.

Je n’ai pas encore tout le recul nécessaire pour savoir si cela fonctionne à tous les coups, mais vos tests le diront certainement :)

Exemple d’utilisation

Dans le plugin Groupes de mots arborescents, j’utilise ce plugin pour ajouter du code HTML sous le formulaire d’édition d’un groupe après le titre, et pour enlever une partie du HTML également lorsque nous sommes dans un groupe enfant d’un autre. Cela se fait (le jour de l’écriture) de la sorte :

function gma_formulaire_fond($flux) {
	// sur le formulaire d'édition de groupe de mot
	if ($flux['args']['form'] == 'editer_groupe_mot') {
 
		$html = $flux['data'];
		$env = $flux['args']['contexte'];
 
		// charger QueryPath
		include_spip('inc/querypath');
		$qp = spip_query_path($html, 'body');
 
		// la parenté sur tous
		// on récupère le sélecteur et on l'ajoute après le titre...
		$selecteur_parent = recuperer_fond('formulaires/selecteur_groupe_parent', $env);
		$qp->top('body')->find('li.editer_titre')->after($selecteur_parent);
 
		// les paramètres techniques sont uniquement sur les groupes racine
		if ($env['id_parent']) {
			$qp->top('body')->find('li.fieldset_config')->remove();
		}
 
		// retourner le HTML modifie
		$flux['data'] = $qp->top('body>div')->xhtml();
	}
	return $flux;
}

updated on 13 February 2019

Discussion

Une discussion

  • Comme je le signale ici http://zone.spip.org/trac/spip-zone/changeset/91788 il y a un gros bug avec la librairie libxml2 qui affecte querypath dans certaines versions récentes de PHP (5.6.4 en ce qui me concerne, avec libxml version 2.9.2).

    Pas d’alternative au bug, qui a lieu dès qu’un attribut ID est présent dans le code HTML, c’est à dire… quasiment tout le temps !

    Donc voilà, si vous avez “PHP Warning: DOMNode::cloneNode(): ID XXXXX already defined in quelquechose/DOMQuery.php on line 3176” ou proche, c’est que ça provient certainement de ce bug :/

    Reply to this message

Comment on this article

Who are you?
  • [Log in]

To show your avatar with your message, register it first on gravatar.com (free et painless) and don’t forget to indicate your Email addresse here.

Enter your comment here

This form accepts SPIP shortcuts {{bold}} {italic} -*list [text->url] <quote> <code> and HTML code <q> <del> <ins>. To create paragraphs, just leave empty lines.

Add a document

Follow the comments: RSS 2.0 | Atom