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

PHP

Array_column

Attention :

Cette fonctionnalité a été ajoutée à spip_bonux (version 3.2.0).

Charge la fonction array_column de PHP 5.5 pour les versions inférieures.

PHP 5.5 introduit une nouvelle fonction fort utile : array_column, pour récupérer par sa clé une sous-colonne d’un tableau associatif en php.
Malheureusement, ce n’est pas la version de PHP la plus répandue à l’heure actuelle. Ce plugin résout le problème de la compatibilité en ajoutant cette fonction à SPIP si le serveur n’est pas en PHP 5.5.

Il est basé sur le travail de Ben Ramsey.


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


Modifier la carte d’identité d’un site #SPIP

Voici le premier tutoriel sur SPIP, et certainement pas le dernier vu comment, ce CMS est absolument magique.

Intro

Tous les sites SPIP sont livrés, par défaut, avec une carte d’identité : le titre du site, le slogan, l’email du webmaster, etc.
En gros par défaut, cela ressemble à cela :

Dans la plupart des cas, cela suffit largement au site. Toute fois dans certains cas, on voudrait étendre les possibilités de cette carte d’identité.

Éditer le formulaire

La première chose que l’on va faire, c’est éditer le formulaire pour ajouter les champs dont on à besoin. Le fichier se trouve dans prive/formulaires.

On copie donc configurer_identite.html et configurer_identite.php dans un dossier squelettes/formulaires. Cela a pour effet de les surcharger (voir la notion de chemin dans SPIP).

Ouvrez le fichier configurer_identite.html, vous y trouverez toute une série de li contenant des champs de formulaire.

Ajoutez-y votre champ, ici je vais ajouter un champ « téléphone de la billetterie » :

  1. #SET{name,billetterie_telephone}#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}}#SET{obli,''}
  2. <li class="editer editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]">
  3. <label for="#GET{name}">Téléphone billeterie</label>
  4. [<span class='erreur_message'>(#GET{erreurs})</span>]
  5. <input type='text' class='text' name='#GET{name}' id='#GET{name}' value="#ENV{#GET{name}}" />
  6. </li>

Si vous retournez sur votre page, vous constaterez qu’un nouveau champ est disponible. En revanche, il ne fonctionne pas.

En effet, SPIP n’est pas au courant qu’il doit créer ce champ dans la base de données, il faut lui dire. Pour cela, ouvrez le fichier configurer_identite.php

Dans ce fichier vous trouverez 2 foreach de ce type (ligne 21 et 49) :

  1. foreach(array('nom_site', 'adresse_site', 'slogan_site', 'descriptif_site', 'email_webmaster') as $k)

Ajoutez dans le tableau votre nouveau champ :

  1. foreach(array('nom_site', 'adresse_site', 'slogan_site', 'descriptif_site', 'email_webmaster', 'billetterie_telephone') as $k)

Rien de plus à faire, votre champ est maintenant fonctionnel !

Créer la balise

Maintenant, on va créer la balise qui va avec ce champ, dans un fichier mes_fonctions.php (a mettre à la racine de votre dossier squelettes) :

  1. /*
  2. * Balise #BILLETERIE_TELEPHONE
  3. */
  4. function balise_BILLETTERIE_TELEPHONE_dist($p) {
  5. $p->code = "\$GLOBALS['meta']['billetterie_telephone']";
  6. return $p;
  7. }

Voilà, il ne reste plus qu’à utiliser #BILLETERIE_TELEPHONE où bon vous semble dans vos squelettes SPIP. Bien sûr tous les filtres fonctionneront également !