Carnet Wiki

Astuces SPIP

Version 42 — Novembre 2010 denisb

----

UTF8

----

UTF8

 ?exec=convert_sql_utf8

- convertir sa base en UTF-8  :
_
À A utiliser pour une recherche alphabétique exacte ou pour avoir une jolie base dans PHPMyadmin
Passer par un code caché ;) < code > ? pour convertir sa base en UTF-8 , vraiment  !
exec=convert_sql_utf8

pour convertir sa base en UTF-8, vraiment ! ([-> [voir -> http://archives.rezo.net/archives/spip-dev.mbox/DOMZDGTKPJ5IKEQI7MZXZ3APF35ZM3I3/])

<quote >
bah bah bah...
_ plutôt utiliser le critère {collecte...}. À </code > 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)  :<code <code >
1.9.2 ou 1.9.3, php ou squelette ?
dans un squelette 1.9.2c
[(#EVALDIR_PLUGIN_PREFIX| ?’ ’,”) Mon action ]
ou _DIR...
arf, et en php ?...
if (defined(’_DIR_PLUGIN_XXX’)) ...
génial merci
pour 1.9.2
en 1.9.3, c’est un poil simplifié tout ça
ah ?
[(#PLUGINXXX) Mon action ]

- Pour récupérer le chemin d’un plugin dans un squelette :<
<
code>
#SETcheminmonplugin , #EVAL_DIR_PLUGIN_MONPLUGIN
#
GETcheminmonplugin
</
code > [(#SETcheminmonplugin,[(#EVAL_DIR_PLUGIN_MONPLUGIN )] )]
#GETcheminmonplugin

----

CSS

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

----

CSS

Pipeline automatique de css dans un plugin

- Pipeline automatique de css dans un plugin  :
_
style_public_plugin_xxx style_public_plugin_xxx .html
_
html
et pour l’espace privé
_
prive/style_prive_plugin_xxx prive/style_prive_plugin_xxx .html
_
html
seront prises en compte automatiquement par SPIP

- Faire un CSS qui soit un squelette (cela permet de récupérer des variables) :

&#91;(#REM) dans la page monstyle.html et en première ligne ]
#HTTP_HEADER{'Content-Type: text/css'}
.couleurdefond {
  background-color:green;
  &#91;(#ENV{id_article}|={33}|?{background-color:pink;})]
} 
&lt;/ code >
 Appeler la CSS dans une page SPIP&lt;code >
 SPIP 
&lt; cadre  class=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>

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


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 , il faut aller le chercher dans la pile < code>$p</code >  : <code >
$p->boucles$p . 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...

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

- Afficher les articles ayant le mot clef truc :<  :
<
code>

#TITRE


<quote >
 !OUPS < code>titre_mot<:code > titre_mot étant obsolète on peut désormais écrire :<  :
<
code>


</quote >

- 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 :<  :
<
code>
<BOUCLE_syndic(SYNDIC_ARTICLES ) fusion <BOUCLE_syndic(SYNDIC_ARTICLES)fusion titre 0 , 10 0,10 >

On peut également faire une fusion pour avoir les articles tous issus de sites différents :<  :
<
code>
<BOUCLE_syndic(SYNDIC_ARTICLES ) fusion <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 :<  :
<
code>

- 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 »)  :<code  :
<code >
<BOUCLE_art_pair(ARTICLES) par num titre titre==^ [1]*[02468][.] [2] "
"
>
#TITRE


<BOUCLE_art_impair(ARTICLES) par num titre titre==^ [3]*[13579][.] [4] "
"
> #TITRE

[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 :<  :
<
code>
[(#TEXTE|couper110, autre chose ...)]

- Une syntaxe plus jolie ( avec spip 2 ) pour tester l’existence d’un élément :< code >
[(#PLUGINABONNEMENT|oui , la ligne + indique la modification ( merci kent1 )
#INCLUREfond=inc/menu_abonnement]
<cadre class=« spip  »>
-[(#PLUGINABONNEMENT | ? ’ ’,’’)
+[(#PLUGINABONNEMENT|oui)
#INCLUREfond=inc/menu_abonnement
]

-[(#PLUGINABONNEMENT| ?[(#PLUGINABONNEMENT|non ’’,’ )
+[(#PLUGINABONNEMENT|non )
#INCLUREfond=prive/menu_inscription2] #INCLUREfond=prive/menu_inscription2
]

</code </cadre >

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

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);
 });


Mais comment faire fonctionner le callback ? et hop :<code>
$(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);
  });
});
</code>


-   Empêcher l'apparition des boutons de recalcul sur une page en particulier (à plaçer sur la {{première ligne}} du squelette) :&lt;code :
 &lt;code >
[(#HTTP_HEADER{Content-type: text/html[; charset=(#CHARSET)]})]
</code>
voir &#91;->http://www.spip . &lt;/code > net/fr_article4631.html#HTTP_HEADER]


-   Se servir de &lt;code>#VAL&lt;/code code>#NOOP&lt;/code > par exemple pour image_typo cela donnerait une image (avec la police victor.ttf) du mot {{Actuellement}} :
<code>
&#91;(#NOOP|=={''}|?ttf )  du  mot  {{Actuellement}}  :&lt; code >
 &#91;(#VAL{Actuellement}|image_typo{police=Victor {Actuellement}|image_typo{police=Victor .ttf ,  taille=14 ,  largeur=150 ttf,taille=14,largeur=150 })]
</code>


-  Tester  {{{Tester  les autorisations d'écriture ou de modification d'un auteur ( SPIP >=  1.9.3) :<code>
[(#AUTORISER{modifier, article, #ENV{id_article}}) vous pouvez modifier l'article ] 
</code>
Voir &#91;la doc->http://doc.spip . 3}}} org/@balise_AUTORISER_dist]


On peut désormais faire:
<code>
[(#VAL{"Actuellement"}|image_typo{police=Victor.ttf,taille=14,largeur=150})]
</code>


----
{{{#MODELE}}}


-  Avec #MODELE, définir plusieurs paramètres dans un array :&lt;  : 
&lt; code>
[(#MODELE{nuage} {notid=5|6|7})]
</code>
définira les groupes à exclure dans la boucle du modèle&lt;code modèle 
&lt; code >
{id_groupe!==^((#ENV{notid, -1}))$}
</code>
(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.
-  Utiliser  un  array ,  le  déclarer  précédemment ,  puis  le  remplir  dans  une  boucle  incrémentée  par  le  compteur  :&lt; code &lt;code >
#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)] ]
</code>


{{{Faire un CSS qui soit un squelette}}}
cela permet de récupérer des variables.
<cadre class=spip>


[(#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....

change ici la couleur de fond en rose si article=33

[(#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})]

- Définir une variable calculée par une noisette
sans variable on utilise <INCLURE{fond=monsquelette}> ou

[(#INCLURE{fond=monsquelette})]&lt;/code >
 _  pour définir  envoyer  et  récupérer  la variable calculée  :&lt; code>#SET{mavariable ,  #INCLURE{fond=monsquelette}{monparam=#ENV{monparam}}}&lt;/code 
&lt; cadre  class="spip ">
 #SET{mavariable,#INCLURE{fond=monsquelette}{monparam=#ENV{monparam}}} 
&lt;/ cadre >


----
{{{MYSQL}}}


-  faire  le  ménage  en  base  de  données  : 
_ ----
 {{{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 lancer  lançer  une commande directement depuis MYSQL (par exemple via l'interface phpmyadmin)


-*  sélectionner les sites en proposition :&lt; code 
&lt; cadre >
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
&lt;/code >
 -*  Supprimer  les  sites  en  proposition  :&lt; cadre>
DELETE  FROM  <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+QEBAU1BJUF9ESUZGMUBAQCBAQEBTUElQX0RJRkY0QEBAc3BpcF9zeW5kaWNAQEBTUElQX0RJRkYxQEBAIEBAQFNQSVBfRElGRjRAQEA8L2NvZGU+"></span>  WHERE  <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+QEBAU1BJUF9ESUZGMUBAQCBAQEBTUElQX0RJRkY0QEBAc3RhdHV0QEBAU1BJUF9ESUZGMUBAQCBAQEBTUElQX0RJRkY0QEBAPC9jb2RlPg=="></span>  =  CONVERT(_utf8  ' prop '  USING  latin1 )  COLLATE  latin1_swedish_ci 
&lt;/ code > 


Supprimer les sites en proposition
<cadre>
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
</cadre>


{{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}


-  Supprimer  les  syndications  trop  anciennes 
_   Vous  avez  beaucoup  de  sites  syndiqués  et  ils  ne  possèdent  pas  tous  l'option  {effacer  au  bout  de  2  mois}  
_   Voici la requête pour effacer toutes les vieux articles syndiqués (modifier la date selon  avec  vos besoins) :&lt;code &lt;cadre >
DELETE FROM <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+c3BpcF9zeW5kaWNfYXJ0aWNsZXM8L2NvZGU+"></span> WHERE date &lt;  '2007-12-31 10:00:00'
&lt;/code &lt;/cadre >


{{Déplacer tous les articles d'une rubrique 39 à une rubrique 12}}
<cadre class="mysql">
UPDATE spip_articles SET id_rubrique = 12 WHERE id_rubrique = 39;
</cadre>


-  Déplacer  tous  les  articles  de  la  rubrique  39  à  la  rubrique  12  :&lt; code >
 UPDATE  spip_articles  SET  id_rubrique  =   12  WHERE  id_rubrique  =   39 ;
 &lt;/code >
 _  attention :  si les deux rubriques ne sont pas dans le même secteur, il faut aussi mettre à jour &lt; code > id_secteur&lt;/code > id_secteur 


-  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
<code>ALTER TABLE <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+c3BpcF9hdXRldXJzPC9jb2RlPg=="></span> ADD  <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+bm9tX2NoYW1wX25vdXZlYXU8L2NvZGU+"></span> text NOT NULL;

-* - Le plus important : ... supprimer < code>tmp/meta_cache . supprimer tmp/meta_cache.php
-* - MODIFIER spip_metas , iextras spip_metas ’iextras dans la base en collant le contenu précédemment sauvegardé


  • -  
    vider le cache, voila

URLS et LIENS

APPELS PARTICULIERS

- passer un tableau de variables en url  :< code >
[(#SELF|parametre_url’id_mot &#91;(#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, ''})]

- Créer un lien vers la page site avec la variable id_syndic=xx (à mettre dans une boucle de syndication)  :<code >
[(#URL_PAGEsite|parametre_urlid_syndic  :

&#91;(#URL_PAGE{site}|parametre_url{id_syndic })]

- Créer un lien vers l’article 54 en se passant de boucle :<  :
<
code>
lien

- URL

URL propres arborescentes _ arborescentes

cf http://comments.gmane.org/gmane.com...
<code >
<cadre class=« php  »>
$type_urls = ’arbo’ ;
define(’_SET_HTML_BASE ’, 1 define(’_SET_HTML_BASE’,1 ) ; // ajoute aux pages html une directive
<base..> et traite les ancres des pages produites
</code cadre >

http://adresse_spip/?var_profile

-

http://adresse_spip/?var_profile&lt;/code >  (SPIP 2 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.


<code>http://adresse_spip/?var_mode=inclure

-

http://adresse_spip/?var_mode=inclure&lt;/code >  (SPIP 2 V2 ) Afficher les noisettes d’un squelette SPIP


voir [Les aides au débuggage de squelettes->http://www.spip.net/fr_article4453.html]


----
{{{SITES D'ASTUCES}}}


-&#91;->http://www {{{SITES  D'ASTUCES}}} 
-&#91;-> http://www .weblog.eliaz.fr/rubrique2.html]


----
{{{RACCOURCIS TYPOS}}}


{{{Raccourcis typo}}}


Pour faire un lien dans un texte, on utilise le raccourci <code>[->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...

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... motxx&parametre=valeur</code >
_ Remarquez comment Spip jongle automatiquement avec les & et les

?&lt;/code>. >... 


----
{{{INCLURE}}}


- <code><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 ;
-  &lt;INCLURE(..
/../ma_noisette.html)> pour afficher le texte brut de « ma_noisette.html » placé 2 répertoires au-dessus de la racine du spip ;
-  &lt;INCLURE(..
/../mon_script.php)> pour exécuter le script php de « mon_script.html php » 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.


DATE DU JOUR

dans un squelette, afficher la date du jour (la date courante) n’est pas toujours aisé.
deux variables peuvent entrer en jeu :

  • la date retournée par la boucle dans laquelle on veut afficher notre date du jour
  • une variable nommée date passée en url ou par le biais d’un formulaire

pour chaque cas, néanmoins, il existe une possibilité d’afficher la date du jour et ce sans que cette date soit tributaire du cache du squelette (ce sera toujours la date courante qui sera affichée)

dans une boucle dont la table possède

un champ date ou date_redac

hors boucle
pas de date ni de date_redac en url

ni passées par formulaire

#ENV{date_redac}

ou

#ENV{date}

#DATE_REDAC

ou

#DATE

variable date passée en url ou par formulaire #ENV{date_redac} #DATE_REDAC
variable date_redac passée en url ou par formulaire #ENV{date} #DATE
variables date et date_redac passées

en url ou par formulaire

définir en début de squelette la date courante avec par exemple :

#SET{cur_date, #VAL{Y-m-d h:i:s}|date}

puis l’utiliser dans le squelette avec :

#GET{cur_date}

JOUONS AVEC LES DATES

-  la date du prochain jeudi qui suit #DATE :

[(#VAL{Y-m-d}|date{#VAL{next Thursday}|strtotime{#DATE|affdate{U}}})]

-  le nom du jour de l’avant-veille de #DATE :

[(#VAL{Y-m-d}|date{#VAL{-2 days}|strtotime{#DATE|affdate{U}}}|nom_jour)]

-  la date de lundi prochain :

[(#SET{lundi_prochain, #VAL{Y-m-d 00:00:00}|date{#VAL{next Monday}|strtotime{#DATE|affdate{U}}}})]
#GET{lundi_prochain}

-  la date du dimanche d’après lundi prochain :

[(#SET{dimanche_apres, #VAL{Y-m-d 23:59:59}|date{#VAL{+6days}|strtotime{#GET{lundi_prochain}|affdate{U}}}})]
#GET{dimanche_apres}

-  afficher le label nouveau ! pour un article publié ou modifié il y a moins de 10 jours :

#SET{periode, -10days}
#TITRE[ (#DATE_MODIF|>{#VAL{Y-m-d H:i:s}|date{#GET{periode}|strtotime}}|oui) nouveau !]

---- ) ;
</cadre >

Retour à la version courante

Toutes les versions