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

Tutoriel

Le DNS expliqué à vos managers

Le DNS est un pilier central de l’internet. Vous l’utilisez tous les jours, parfois sans vous en rendre compte.
Et pourtant, même parmi les informaticiens, c’est un domaine obscur et mal connu.

Donc forcément, quand il s’agit d’expliquer à un néophyte comment fonctionne le DNS, on fini généralement pas passer pour un chaman.

Il n’y aura pas d’explication technique ici, c’est un article à vocation pédagogique. Donc cela veut aussi dire que des raccourcis vont être utilisé et qu’il y aura un grand nombre d’approximations technique. Pas taper !
En partie aussi parce que je suis très loin d’être un expert du sujet.

Pour des informations plus techniques, il y a les exposés de Stéphane Bortzmeyer qui sont bien complet sur le sujet.

Les grands livres

Les DNS c’est un peu comme des grands livres. Il y en a plusieurs : le livre .org, le livre .net, le livre .com, etc.
Ces grands livres contiennent les titres d’autres livres, plus petits : Gandi, OVH, one.com... Qui eux même contiennent les adresses des serveurs web qui contiennent le site en question.
Grosso modo, tout ceux qui vendent des noms de domaine, possèdent un livre.

Lorsque l’ordinateur cherche à savoir ou ce trouve un nom de domaine précis, henix.be par exemple, il commence par regarder dans le grand livre .be quel petit livre il faut consulter.
.be ne sait pas exactement ou se trouve henix.be, mais par contre, il contient la référence du livre qui contient l’endroit ou ce trouve henix.be : all2all.org.

L’ordinateur regarde alors dans le petit livre all2all.org ou ce trouve henix.be.
All2all.org sachant exactement ou ce trouve henix.be va le dire à l’ordinateur, qui a alors trouvé ce qu’il cherchait et peut demander au bon serveur d’afficher le site web.


C’est une métaphore très simple, qui peut être comprise facilement par tout le monde.
Plus d’excuse pour ne pas expliquer aux autres !


Utiliser les forums de #SPIP sur d’autres types d’objets

Parce que dans SPIP, il n’y a pas que des articles !

J’en ai marre de ne jamais me souvenir de cette procédure donc je vais la noter une bonne fois pour toutes :’-) .

Procédure :

Il faut déclarer quelques petites choses pour réussir à implémenter les forums de SPIP sur d’autres objets que les articles :

On commence par définir la fonction qui permet au formulaire de forum de trouver le titre de l’objet. Mettons que vous ayez un plugin qui définit un objet « annexe » sur lequel vous voulez utiliser les forums :

Dans le fichier de fonctions.php du plugin :

  1. /**
  2.  * Récupérer le titre des annexes pour les forums
  3.  *
  4.  * @param int $id_objet
  5.  * @access public
  6.  * @return string le titre de l'annexe
  7.  */
  8. function annexe_forum_extraire_titre($id_objet) {
  9. include_spip('inc/filtres');
  10. return generer_info_entite($id_objet, 'annexe', 'titre');
  11. }

Ensuite, il faut définir le pipeline qui va permettre à la balise #FORMULAIRE_FORUM de trouver automatiquement l’objet du forum :

Dans le fichier pipelines.php :

  1. function prefix_forum_objets_depuis_env($objets) {
  2. $objets['annexe'] = id_table_objet('annexe');
  3. return $objets;
  4. }

On n’oublie pas d’ajouter le pipeline dans le paquet.xml :

  1. <pipeline nom="forum_objets_depuis_env" inclure="prefix_pipelines.php" />

Dans le cas où les forums sont désactivés partout, on peut forcer le passage avec une fonction à déclarer dans le fichier inc/annexe_accepter_forums_publics.php :

  1. function inc_annexe_accepter_forums_publics_dist($arg = null) {
  2. return 'abo'; // chaine de 3 caractere parmi 'non','pos','pri','abo'
  3. }

Normalement à ce stade, la balise #FORMULAIRE_FORUM affiche le formulaire sur votre objet :).

Il ne faut pas oublier d’ajouter le critère {id_annexe ?} dans la boucle principale des forums et dans celle qui compte les messages. Sans quoi, SPIP va afficher tous les messages sans distinction.

Limitation :

Il y a cependant une configuration qui ne fonctionne pas correctement :

Si les forums sont désactivés sur les articles, il est impossible d’utiliser le mécanisme de réponse car #PARAMETRES_FORUM ne renvoie rien.
Le problème vient de cette partie du code, qui est spécifique à la configuration des articles.
Il est toujours possible de faire une surcharge brutale de la balise pour faire sauter cette limitation. Mais, du coup, le formulaire de configuration de l’admin n’a plus aucun sens.

Conclusion :

Les forums de SPIP ne sont pas encore complètement portables sur d’autres objets. Il y a visiblement eu du travail dans ce sens, mais ce n’est pas encore complet.
Cependant, il suffit souvent d’activer les forums d’articles pour que tout se passe pour le mieux.


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


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.