Version 40 — Octobre 2010 — denisb
----
?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
----
• 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)
----
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
----
• 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è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>
----
• 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>
----
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)
----
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)] ]
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>
[(#AUTORISER{modifier,article,#ENV{id_article}}) vous pouvez modifier l'article ]
Voir la doc
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}}}
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
----
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
----
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
- http://www.weblog.eliaz.fr/rubrique...
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¶metre=valeur
... Remarquez comment Spip jongle automatiquement avec les &
et les ?
...
----
- <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.