Carnet Wiki

Astuces SPIP

Version 40 — Octobre 2010 denisb

----

UTF8

 ?exec=convert_sql_utf8

A utiliser pour une recherche alphabétique exacte ou pour avoir une jolie base dans PHPMyadmin
Passer par un code caché ;) pour convertir sa base en UTF-8, vraiment !
voir

bah bah bah...
plutôt utiliser le critère {collecte...} voir sur le glossaire de spip.net

----

PLUGINS

• dites moi, vous avez une idée pour trouver si un plugin est là ? (dialogue via irc)

  <marcimat>  1.9.2 ou 1.9.3, php ou squelette ?
  <touti>     dans un squelette 1.9.2c
  <marcimat>  [(#EVAL{DIR_PLUGIN_PREFIX}|?{' ',”}) Mon action ]
  <marcimat>  ou _DIR...
  <touti>     arf, et en php ?...
  <marcimat>  if (defined('_DIR_PLUGIN_XXX')){ ... }
  <touti>     génial merci
  <marcimat>  pour 1.9.2
  <marcimat>  en 1.9.3, c'est un poil simplifié tout ça
  <touti>     ah?
  <marcimat>  [(#PLUGIN{XXX}) Mon action ]

Pour récupérer le chemin d’un plugin dans un squelette

[(#SET{cheminmonplugin,[(#EVAL{_DIR_PLUGIN_MONPLUGIN})]})]
#GET{cheminmonplugin}

• Une syntaxe plus jolie avec SPIP 2 :
|?{' ',''}) devient |oui)
|?{'',' '}) devient |non)

----

CSS

css


Pipeline automatique de css dans un plugin

style_public_plugin_xxx.html
et pour l’espace privé
prive/style_prive_plugin_xxx.html
seront prises en compte automatiquement par SPIP

Transférer les données crées avec EXTRA2
-  mettre en réserve vos ’spip_metas’ ’iextras’ et les champs créés

En ligne
-  créer les champs supplémentaires dans phpmyadmin, du style
ALTER TABLE <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+c3BpcF9hdXRldXJzPC9jb2RlPg=="></span> ADD  <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+bm9tX2NoYW1wX25vdXZlYXU8L2NvZGU+"></span> text NOT NULL;
-  Le plus important ... supprimer tmp/meta_cache.php
-  MODIFIER ’spip_metas’ ’iextras’ dans la base en collant le contenu précédemment sauvegardé
-  vider le cache, voila

----

BALISES

• Quand on crée une balise, on peut vouloir récupérer des variables du contexte. Il y a un article déjà sur contrib qui explique cela.
Mais quand on veut trouver le type de boucle du contexte, faut aller chercher dans la pile $p.
Voilà comment : $p->boucles[$p->id_boucle]->id_table

----

CRITÈRES

• Critère conditionnel, sans parenthèses ni crochets, seulement des bisoux, euh, des accolades...

<BOUCLE_seulement_pour_la_rubrique_dix(RUBRIQUES) {id_rubrique=#ID_RUBRIQUE|=={'10'}|?{'10'}}>
   Mon code ....
</BOUCLE_seulement_pour_la_rubrique_dix>

• Afficher les articles ayant le mot clef truc :

<BOUCLE_articles(ARTICLES) {titre_mot=truc}>
#TITRE
</BOUCLE_articles>

 !OUPS titre_mot étant obsolète on peut désormais écrire :

<BOUCLE_G(ARTICLES) {mots.titre}>

• Le critère {fusion} permet de faire un GROUPBY ; exemple sur un fil RSS, pour éviter des articles de même nom, on peut faire :

<BOUCLE_syndic(SYNDIC_ARTICLES){fusion titre} {0,10}>

On peut également faire une fusion pour avoir les articles tous issus de sites différents :

<BOUCLE_syndic(SYNDIC_ARTICLES){fusion syndic_articles.id_syndic}>

• Un simple {statut?} dans une boucle annule la restriction de statut sur la boucle document (comme sur une boucle article), on peut aussi demander {statut=prepa}

• Utiliser un critère optionnel, et demander le critère via l’url :

<BOUCLE_articles(ARTICLES) {branche ?} {id_mot ?} {id_auteur ?}>

[(#SELF|parametre_url{'id_mot[]', #ID_MOT})] ne fonctionne pas ; il faut donc écrire : [(#SELF)]&id_mot[]=#ID_MOT et pour vider l’url on écrira : [(#SELF|parametre_url{id_mot, ''})]

• n’afficher que les articles dont le num titre est pair (ou impair) :
on considère que tous les titres des articles sont préfixés avec un nombre suivi d’un point suivi d’un espace (« 123. Le titre ») :

<BOUCLE_art_pair(ARTICLES) {par num titre} {titre==^[[:digit:]]*[02468][.][[:space:]]} {"<br />"}>
#TITRE
</BOUCLE_art_pair>
<hr>
<BOUCLE_art_impair(ARTICLES) {par num titre} {titre==^[[:digit:]]*[13579][.][[:space:]]} {"<br />"}>
#TITRE
</BOUCLE_art_impair>

[form_crit_opt<-]
_
_ • un formulaire simple (pas cvt) qui boucle sur la page et y renseigne un critère de boucle
par exemple un select de mots-clefs (name="avec_mot") dont chaque value est un id_mot mais avec une option ’tous les mots’

la boucle ARTICLES correspondante (au retour du formulaire) utilisera donc le critère {id_mot ...}.
mais comment ? puisque la boucle doit retourner les articles liés soit à un id_mot unique soit à n’importe quel id_mot

pour la boucle on utilisera les REGEXP de mysql avec comme critère :
   {id_mot == ^#ENV{avec_mot}$}

dans le select, on passera comme value pour l’option ’tous les mots’
 :
pour un formulaire en method get :
   <option value=".%2B">tous les mots</option>
pour un formulaire en method post :
   <option value=".+">tous les mots</option>

[exclu_flv<-]
• nous voulons afficher les articles sauf ceux qui ont un flash dans le corps de leur texte

on travaille en 2 boucles. la première va extraire les id_articles depuis la table spip_documents_liens des articles (objet) liés à un document (id_document) inséré dans le corps du texte (vu) et d’extension .flv :

#SET{noflash, #ARRAY}
<BOUCLE_noflash(spip_documents_liens) {objet = article} {vu = oui} {spip_documents.extension = jpg}>
#SET{noflash, #GET{noflash}|push{#ID_OBJET}}
</BOUCLE_noflash>

la seconde boucle exclue ces articles (!IN) de sa recherche :

<BOUCLE_a(ARTICLES) {id_article !IN #GET{noflash}} {"<br />"}>
#TITRE
</BOUCLE_a>

----

SQUELETTES

• Le calendrier ICAL ne fonctionne pas ? Assurez vous dans le fichier généré que la première ligne n’est pas vide ! Pour ma part la ligne 1 est devenue #HTTP_HEADER{Content-Type: text/calendar; charset:#CHARSET}BEGIN:VCALENDAR

• Remplaçer lire la suite par autre chose :

[(#TEXTE|couper{110, <a href="#URL_RUBRIQUE"><em>autre chose ...</em></a>})]

• Une syntaxe plus jolie pour tester l’existence d’un élément, la ligne + indique la modification (merci kent1)

-[(#PLUGIN{ABONNEMENT}|?{' ',''})
+[(#PLUGIN{ABONNEMENT}|oui)
 		#INCLURE{fond=inc/menu_abonnement}	
 ]
 
-[(#PLUGIN{ABONNEMENT}|?{'',' '})
+[(#PLUGIN{ABONNEMENT}|non)
 #INCLURE{fond=prive/menu_inscription2}	
 ]

• Créer un lien vers la page site avec la variable id_syndic=xx (à mettre dans une boucle de syndication) : [(#URL_PAGE{site}|parametre_url{id_syndic})]

• Le critère {ajax} permet de recharger uniquement le morceau de noisette appellé ; utilisé en SPIP 2 avec pagination :

<INCLURE{fond=inc-manoisette} {ajax}>

Mais comment faire fonctionner le callback ? et hop :

$(document).ready(function() {
var fonction_a_rappeller=function(){
...
}
if(typeof onAjaxLoad=='function')onAjaxLoad(fonction_a_rappeller);
if(window.jQuery)jQuery(document).ready(function(){
  fonction_a_rappeller.apply(document);
 });


});

• Empêcher l’apparition des boutons de recalcul sur une page en particulier (à plaçer sur la première ligne du squelette) :

[(#HTTP_HEADER{Content-type: text/html[; charset=(#CHARSET)]})]

• Se servir de #NOOP par exemple pour image_typo cela donnerait une image (avec la police victor.ttf) du mot Actuellement :

[(#NOOP|=={''}|?{Actuellement}|image_typo{police=Victor.ttf,taille=14,largeur=150})]

On peut désormais faire :

[(#VAL{"Actuellement"}|image_typo{police=Victor.ttf,taille=14,largeur=150})]

• Créer un lien vers l’article 54 en se passant de boucle :

<a href="#URL_ARTICLE{54}">lien</a>

----

MODELE

Balise # MODELE

Avec #MODELE, définir plusieurs paramètres dans un array :

[(#MODELE{nuage} {notid=5|6|7})]

définira les groupes à exclure dans la boucle du modèle

{id_groupe!==^((#ENV{notid, -1}))$}

(voir le plugin nuage)

----

ARRAY

Utiliser un array, le déclarer précédemment, puis le remplir dans une boucle incrémenté par le compteur.

#SET{articles, #ARRAY}
<BOUCLE_articles_rub(ARTICLES) {id_rubrique}>
#SET{articles, #GET{articles}|array_merge{#ARRAY{#COMPTEUR_BOUCLE, #ID_ARTICLE}}}
</BOUCLE_articles_rub>
[(#REM) test du tableau faire [(#GET{articles}|print_r)] ]

Faire un CSS qui soit un squelette

cela permet de récupérer des variables.

[(#REM) dans la page monstyle.html  et en première ligne ]
#HTTP_HEADER{'Content-Type: text/css'}


.couleurdefond{
background-color:green;
  [(#ENV{id_article}|={33}|?{
  background-color:pink;
  })]
}

Concernant les #HTTP_HEADER (et la disparition des boutons admin) voir http://www.spip.net/fr_article4631....

Appeler la CSS dans une page SPIP

[(#REM) dans la page article.html par exemple cela retournera /?page=styles&id_article=33]
<link rel="stylesheet" type="text/css" href="[(#URL_PAGE{monstyle}|parametre_url{id_article,[(#ENV{id_article})] )]" />


<div class="couleurdefond"> change ici la couleur de fond en rose si article=33 </div>

Tester les autorisations d’écriture ou de modification d’un auteur SPIP >=1.9.3

[(#AUTORISER{modifier,article,#ENV{id_article}})  vous pouvez modifier l'article ] 

Voir la doc

Inclure une variable calculée par une noisette.

classiquement et sans variable on utilise
<INCLURE{fond=monsquelette}> ou les [(#INCLURE{fond=monsquelette})]

pour envoyer et récupérer la variable

#SET{mavariable,#INCLURE{fond=monsquelette}{monparam=#ENV{monparam}}}

URL propres arborescentes

cf http://comments.gmane.org/gmane.com...

$type_urls = 'arbo';
define('_SET_HTML_BASE',1); // ajoute aux pages html une directive  
<base..> et traite les ancres des pages produites

----

MYSQL

Aller directement dans la base pour modifier ou supprimer, par exemple lorsque vous avez 2000 sites qui encombrent, un gros coup de balai peut être nécessaire ! La méthode rapide est donc de lançer une commande directement depuis MYSQL (par exemple via l’interface phpmyadmin)

sélectionner les sites en proposition

SELECT * FROM <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+c3BpcF9zeW5kaWM8L2NvZGU+"></span> WHERE <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+c3RhdHV0PC9jb2RlPg=="></span> = CONVERT(_utf8 'prop' USING latin1) COLLATE latin1_swedish_ci

Supprimer les sites en proposition

DELETE FROM <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+c3BpcF9zeW5kaWM8L2NvZGU+"></span> WHERE <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+c3RhdHV0PC9jb2RlPg=="></span> = CONVERT(_utf8 'prop' USING latin1) COLLATE latin1_swedish_ci

Supprimer les syndications trop anciennes
Vous avez beaucoup de sites syndiqués et ils ne possèdent pas toutes l’option effacer au bout de 2 mois

Voici la requête pour effacer toutes les vieux articles syndiqués (modifier la date avec vos besoins)

DELETE FROM <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+c3BpcF9zeW5kaWNfYXJ0aWNsZXM8L2NvZGU+"></span> WHERE date <  '2007-12-31 10:00:00'

Déplacer tous les articles d’une rubrique 39 à une rubrique 12

UPDATE spip_articles SET id_rubrique = 12 WHERE id_rubrique = 39;

attention : si les deux rubriques ne sont pas dans le même secteur, il faut aussi mettre à jour id_secteur

----

APPELS PARTICULIERS

http://adresse_spip/?var_profile

(SPIP V2) permet d’afficher les requêtes SQL que fait SPIP pour créer la page ainsi que les temps de calcul pour chaque boucle et inclusion.

http://adresse_spip/?var_mode=inclure

(SPIP V2) Afficher les noisettes d’un squelette SPIP

SITES D’ASTUCES


-  http://www.weblog.eliaz.fr/rubrique...

Raccourcis typo

Pour faire un lien dans un texte, on utilise le raccourci [->artXX] ou [->rubXX] ou [->motXX], etc...

Mais comment fait-on si on veut pointer vers une page en lui transmettant des paramètres ? Un nom d’onglet par exemple : l’onglet des sites sur une page de mots-clés...

C’est simple il suffit d’écrire [->motXX?parametre=valeur] (dans notre ex. ce pourrait être [->mot33?onglet=sites]) Spip transforme alors le raccourci en URL cliquable du type spip.php?motxx&parametre=valeur... Remarquez comment Spip jongle automatiquement avec les & et les ?...

----

INCLURE

-  <INCLURE{fond=../../ma_noisette}> ou encore #INCLURE{fond=../../ma_noisette} pour afficher le html (évalué) de « ma_noisette.html » placé 2 répertoires au-dessus de la racine du spip ;
-  <INCLURE(../../ma_noisette.html)> pour afficher le texte brut de « ma_noisette.html » placé 2 répertoires au-dessus de la racine du spip ;
-  <INCLURE(../../mon_script.php)> pour exécuter le script php de « mon_script.php » placé 2 répertoires au-dessus de la racine du spip.

Retour à la version courante

Toutes les versions