var Phenix = function () {
Troll du Web depuis 1996

Web dev

Truc, astuces et tuto sur le CMS SPIP ou sur le développement web en général.

Utiliser le critère {recherche} de #SPIP avec PHP

Les boucles SPIP possèdent un mécanisme de recherche particulièrement utile. On utilise le critère recherche.

Cela permet de faire des recherches sur n’importe quel objet SPIP et d’avoir des résultats un peu plus précis qu’un simple LIKE sur une requête SQL.

J’ai découvert qu’on pouvait également utiliser ce système en dehors d’une boucle, avec un peu de PHP :

  1. <?php
  2. $prepare_recherche = charger_fonction('prepare_recherche', 'inc');
  3. list($rech_select, $rech_where) = $prepare_recherche(
  4.   _request('recherche'), // Le terme recherché
  5.   $objet // L'objet dans lequel on recherche
  6. );

$rech_where contient un WHERE sql qui peut être utilisé dans une requête. Il ne faut juste pas oublie la jointure sur la table spip_resultats :

  1. <?php
  2. // On fait la requête SQL qui va bien
  3. $recherche = sql_allfetsel('*', 'spip_articles INNER JOIN spip_resultats as resultats ON resultats.id=spip_articles.id_article', $rech_where);

Et voilà !


Ajouter une balise #CHERCHER_LOGO à #SPIP

Lorsque l’on veut récupérer le logo d’un objet SPIP, on est obligé de faire quelques choses qui ressemble à :

  1. <BOUCLE_logo(ARTICLES){id_article=1}>
  2. #LOGO_ARTICLE
  3. </BOUCLE_logo>

C’est assez ennuyant, d’autant que cela risque fort de faire une requête SQL alors que la récupération de logo n’en a absolument pas besoin, les fichiers sont stocker sous la forme objetId_objet.xx dans le dossier IMG.

On pourrait espérer que mettre simplement l’identifiant dans la balise récupère le logo, comme le font les balises URL. Malheureusement cela ne fonctionne pas.

Du coup, je me suis inspiré de la balise #INFO_ pour créer une balise #CHERCHER_LOGO :

  1. <?php
  2. /**
  3.  * #CHERCHER_LOGO{objet, id_objet}
  4.  * Retrouver le logo d'un objet sans avoir à lancer tout le système de boucle.
  5.  *
  6.  * @param mixed $p
  7.  * @access public
  8.  * @return mixed
  9.  */
  10. function balise_CHERCHER_LOGO_dist($p) {
  11.     $objet = interprete_argument_balise(1, $p);
  12.     $id_objet = interprete_argument_balise(2, $p);
  13.  
  14.     // Faire la conversion pour la fonction chercher_logo
  15.     $objet = "id_table_objet($objet)";
  16.  
  17.     include_spip('inc/filtres');
  18.     include_spip('public/quete');
  19.     $p->code = "http_img_pack(_DIR_IMG.quete_logo($objet, 'on', $id_objet, '', true), '', 'class=\"spip_logos\"')";
  20.     $p->interdire_scripts = false;
  21.  
  22.     return $p;
  23. }

Voir mon gist : https://gist.github.com/phenix-factory/57cb993512d13fdfee88


Utiliser Google Map pour suggérer des adresses

Lorsqu’on nous demande « d’autocompleter » un champ adresse, il vient immédiatement la question : avec quelle base de donnée ?

Eh bien, avec celle de Google ?

Une petite astuce que j’ai découvert il y a peu, on peut utiliser l’API de Google map pour créer facilement une autocomplétion d’adresse.

Un peu de JavaScript qui va bien :

  1. // Inclure l'API de Google map, il y a un paramètre de pour spécifier qu'on veut la librairie des places.
  2. <script type="text/javascript" src="https://maps.googleapis.com/maps/api/js?libraries=places"></script>
  3. <script type="text/javascript">
  4.   $(function () {
  5.      var input = (document.getElementById('test'));
  6.      var autocomplete = new google.maps.places.Autocomplete(input);
  7.   });

Et le html qui va avec :

  1. <input name="Test" type="text" value="" id="test"/>

Et voilà, pas besoin de se casser plus la tête.

Pour ceux qui veulent tester :

https://gist.github.com/phenix-factory/f4d82164f8aee13fb6ec#file-gmap_adresse_autocomplete-html


Ajouter l’icône des blocs AJAX dans l’espace publics d’un site #SPIP

Parce que c’est mieux !

Petite astuce que j’ai trouvée il y a peu.

Lorsque l’ont AJAX des blocs SPIP, le comportement par défaut est de passer le bloc en opacité 50%.
Ce n’est pas forcément le plus explicite pour les visiteurs, plus habitués à avoir un signe de « pseudo-progression ».

Ce n’est le comportement de la partie admin, qui affiche une icône « Loading » dans le coin supérieur droit.

On peut facilement reproduire ce comportement dans l’espace publique avec une petite ligne de css :

  1. .loading {
  2. background: url(../../prive/themes/spip/images/searching.gif) no-repeat top right;
  3. }

Ici je suppose que le fichier css se trouve dans un sous-dossier du dossier squelettes de SPIP. Si ce n’est pas le cas, il faut adapter le chemin.

Bien entendu on peut mettre ce que l’on veut sur la class loading, ici je n’ai fais que reproduire le comportement de SPIP.


Actualiser le cache de #SPIP

Je n’ai trouvé de documentation sur cela nulle part, comme souvent avec SPIP malheureusement.

Le cache de SPIP est très puissant, mais souvent, quand on fait des modifications, on voudrait actualiser rafraichir ce cache.
Pour une raison ou pour une autre, dans mon cas c’était un formulaire de modification d’objet, mais il peut y avoir plein d’autres raisons de rafraichir le cache.

Au lieu de vider ou de recalculer, on peut simplement demander à SPIP d’invalider le cache :

  1. // On invalide les caches
  2. include_spip('inc/invalideur');
  3. suivre_invalideur("id='$objet/$id_objet'");

$objet c’est le type d’objet : article, rubrique, brève, ou même un objet créer via un plugin.
$id_objet, je pense que je ne dois pas expliquer quand même !

Je pense que cette fonction est bien plus puissante que cela, mais dans mon cas ça me suffit, si vous voulez compléter, lâchez-vous !