Chaînes de langues déportées dans des plugins
Un grand nombre de fonctionnalités du noyau de SPIP sont désormais déportées dans des plugins, et avec elles les chaînes de langues qu’elles utilisent. En conséquence, pour y faire appel dans les squelettes, il faut les préfixer par le préfixe du plugin correspondant si vous les utilisez dans vos squelettes.
Par exemple, <:forum_texte:> doit pour SPIP3 être remplacé par <:forum:forum_texte:>.
A propos des chaines de langues, voyez la doc sur les nouveautés des chaînes de langues avec SPIP3.
Formulaire inscription
La balise #FORMULAIRE_INSCRIPTION n’est jamais totalement vide en SPIP3, même quand les inscriptions ne sont pas autorisées sur le site. En conséquence, elle ne pourra pas servir pour conditionner un affichage (par exemple [(#FORMULAIRE_INSCRIPTION) lien vers la page d'inscription] affichera toujours le lien).
A la place, il faut tester directement la configuration du site SPIP. Il y a 2 entrées pour cela :
- accepter_visiteurs
- accepter_inscriptions
Exemple :
<a href='#URL_PAGE{inscription_visiteurs}'>]
Critère id_parent
Cette boucle ne fonctionne avec spip3 pas de la même manière qu’avec SPIP2 :
- <BOUCLE_sousrubrique(RUBRIQUES){id_parent}>
- #ID_RUBRIQUE
- </BOUCLE_sousrubrique>
mettant
En effet, si il y a une boucle RUBRIQUES englobante, id_parent prend le #ID_RUBRIQUE de la boucle englobante et s’il n’y en pas, id_parent prend le #ENV{id_parent}, alors qu’en spip 2.1 id_parent prend #ENV{id_rubrique}.
En conséquence,
- avec SPIP3, il est désormais possible d’écrire {id_parent ?}{id_rubrique ?}
- pour migrer une telle boucle il faut par exemple appeler l’url avec un paramètre id_parent supplémentaire, ou adapter la boucle en mettant un critère supplémentaire {id_parent ?}{id_rubrique ?}
Dans certains cas, le critère suivant a son utilité pour remplacer {id_parent} en assurant la compatibilité d’un squelette entre versions SPIP2 et SPIP3 : {id_parent=#ENV{id_parent,#ENV{id_rubrique}}}.
Boucles FORUMS et ARTICLES imbriquées
Avec spip2, la table forum comporte plusieurs champs id_article, id_breve et id_rubrique qui permettent certaines boucles, elles doivent être adaptées pour fonctionner avec SPIP3 puisque ces champs ont été remplacés par 2 champs objet et id_objet ». Ces 2 champs permettent en effet de mettre des forums sur n’importe quel objet éditorial, que ce soit des mots, des documents ou tout autre objet créé par un plugin.
Par exemple, les emboitements suivants ne marchent plus :
<BOUCLE_forum_suivant_article(ARTICLES) {id_article}>
...
ou :
<BOUCLE_articles(ARTICLES){id_article}>
#ID_ARTICLE
</BOUCLE_articles>
</BOUCLE_forums>
En SPIP3 on corrige en :
<BOUCLE_articles(ARTICLES){id_article=#ID_OBJET}>
#ID_ARTICLE
</BOUCLE_articles>
</BOUCLE_forums>
ou bien avec :
etc...
Titres et rangs
#TITRE bénéficie désormais d’un traitement qui enlève automatiquement le n° qui préfixe éventuellement le contenu.
La plupart du temps, c’est bien ce comportement qu’on recherche, et il est donc inutile d’appeler le filtre supprimer_numero comme il le fallait avant. Si toutefois vous voulez afficher le titre avec son numéro, il faut enlever ce traitement, c’est à dire employer #TITRE*.
Cette différence de comportement par défaut peut avoir des conséquences sur des squelettes qui feraient des comparaisons dans un critère, car le traitement n’est par contre toujours pas appliqué sur le champ ’titre’ lorsqu’il figure en partie gauche d’un critère.
Par exemple :
<BOUCLE_tri(ARTICLES){titre>#TITRE|recuperer_numero} >
etc...
Cette boucle pour afficher les articles de rangs supérieurs au rang de l’article courant ne marchera plus puisque #TITRE ne renvoie plus de numéro. A la place, sous sqlite par exemple, il faut employer la balise avec étoile #TITRE*.
<BOUCLE_tri(ARTICLES){titre>#TITRE*|recuperer_numero} >
etc...
Modèles
Les modèles reçoivent maintenant l’environnement. Tous les paramètres de contextes, présents dans l’environnement d’appel ou explicitement passés en paramètre de l’appel, avec une priorité à ces derniers, sont à la fois accessibles par #VARIABLE et en #ENV{variable}. Des adaptations sont donc nécessaires dans certains modèles.
À titre d’exemple, un modèle inclus dans le corps de l’article 18 et donc noté : <mon_modele|> transmet 2 informations supplémentaires :
#ENV{id_article} => 18
Dans le cas où l’appel du modèle inclue id_article comme paramètre (<mon_modele|id_article=2>) c’est bien cet id_article là (2) qui sera transmis quel que soit l’id de l’article dans lequel ce modèle est appelé (comportement : comme avant). C’est seulement lorsqu’on ne passe pas de paramètre explicite que le comportement sera différent, si le modèle fait appel :
- au critère conditionnel {id_article?} dans une boucle
- à un test sur [(#ID_ARTICLE) affichage si id_article]
puisque dans tous les cas #ID_ARTICLE ou #ENV{id_article} existera.
Pour corriger lorsque ce sera nécessaire, il est possible :
- de changer de nom de paramètre pour enlever l’ambiguité
- d’utiliser le fait que seuls les paramètres passés explicitement lors de l’appel du modèle sont accessibles par en plus par #ENV{arg/variable}, et pas les paramètres non explicites de contexte automatique.
Ainsi on pourra remplacer un critère conditionnel {article ?} par la combinaison de 2 critères [1] :
{id_article >= #ENV{args/id_article, 0}}
{id_article <= #ENV{args/id_article, 99999999}}Balise #FOREACH
La balise #FOREACH disparait. A la place il faut utiliser une boucle itérateur DATA.
#CLE / #VALEUR
</BOUCLE_for>
Si c’est juste pour afficher le contenu des tableaux #ENV ou #CONFIG, il est aussi possible d’utiliser :
[<pre>(#CONFIG**|unserialize|print_r{1})</pre>]
Avec le plugin ’developpement’ on pourra plus simplement écrire :
[(#ENV|bel_env)] ou [(#CONFIG|bel_env)]



Vos commentaires
# Le 1er novembre 2012 à 21:29, par Mike
En réponse à : Migration d’un squelette de SPIP2 vers SPIP3
Bonjour !
Je travaille actuellement sur la migration de mon site en Spip 2.1 vers Spip 3. Il me reste malheureusement un problème que je n’arrive pas à résoudre. J’utilisais jusque là une partie d’un vieux plugin de recherche multicritères que je m’étais longtemps amusé à modifier et à adapter.
Le fichier de résultat est entièrement en php mais depuis le passage à Spip 3, il ne me retourne plus aucun résultat. Je pense que suite aux modifications de la base sur la version 3, une requête SQL n’est plus bonne mais je n’ai pas réussi à savoir quelles étaient les changements.
Si quelqu’un pouvait m’en dire plus ou jeter un œil à mon code, ce serait cool !
<div class="result_rm">
<?php
######################################################################
# RECHERCHE MULTI-CRITERES - MODELE AFFICHAGE DES RESULTATS #
# #
# Auteurs : Dominique (Dom) Lepaisant #
# www.tispip.etab.ac-caen.fr #
# Stéphanie De Nadaï - www.webdesigneuse.net #
# - Fev 2008 #
# #
# Adaptation de la contrib de Paul Sanchez - www.Netdeveloppeur.com #
# #
# Ce programme est un logiciel libre distribue sous licence GNU/GPL. #
# Pour plus de details voir le fichier COPYING.txt #
######################################################################
$url = parse_url($_SERVER['QUERY_STRING']);
$param = $url['path'];
$pos = 0;
$indice = 255;
if (isset($_POST['idmot'])) {
// Récupération du nombre de jours
// pour periodicité de la rechercher
$nbjour = 0;
if (isset($_POST['nbjour'])){
$nbjour = $_POST['nbjour'];
}
// Récupération du nombre de jours
// pour periodicité de la rechercher
$idonlyrub = 0;
if (isset($_POST['onlyrub'])) {
if (isset($_POST['rubnum'])) {
$idonlyrub = $_POST['rubnum'];
}
}
// 1 = Tous les mots doivent être associés aux articles trouvés
$allword = 0;
if (isset($_POST['allword'])) {
$allword = 1;
}
$nbmot = count($_POST['idmot']);
$sql = "SELECT id_mot, titre FROM spip_mots WHERE id_mot IN (". implode(",", $_POST['idmot']) .") GROUP BY id_mot,titre";
$result = mysql_query($sql);
$tabmot = "";
$nbcol = 0;
$nbcolmax = 4;
if ($result) {
$compt = 0;
while ($row = mysql_fetch_assoc($result)) {
extract($row);
$titre = supprimer_numero($titre);
if ($nbcol == $nbcolmax) {
$nbcol = 0;
}
$tabmot .= "<a class=\"spanblock txtgris\" href=\"./spip.php?page=mot&mots[]=$id_mot\"><span class=\"cle\">$titre</span></a>";
$nbcol += 1;
}
mysql_free_result($result);
}
$sql = "SELECT COUNT(*) AS num, spip_articles.id_article, spip_rubriques.id_rubrique, spip_rubriques.titre AS titrerub ";
$sql .= "FROM spip_articles INNER JOIN spip_rubriques ON spip_rubriques.id_rubrique = spip_articles.id_rubrique ";
$sql .= "INNER JOIN spip_mots_articles ON spip_mots_articles.id_article = spip_articles.id_article ";
$sql .= " WHERE spip_mots_articles.id_mot IN (". implode(",", $_POST['idmot']) .") ";
$datedeb = date("Y-m-d", mktime(0, 0, 0, date("m"), (date("d") - $nbjour), date("Y")));
if ($nbjour != 0) {
$sql .= "AND spip_articles.date >= '$datedeb' ";
}
if ($idonlyrub != 0) {
$sql .= "AND spip_rubriques.id_rubrique = $idonlyrub ";
}
$sql .= "AND spip_articles.statut LIKE 'publie' GROUP BY spip_articles.id_article";
if ($order == 1) {
$sql .= " ORDER BY spip_rubriques.id_rubrique, NUM DESC, spip_mots_articles.id_mot, spip_articles.date DESC";
}
else {
$sql .= " ORDER BY NUM DESC, spip_mots_articles.id_mot, spip_rubriques.id_rubrique, spip_articles.date DESC";
}
$result = mysql_query($sql);
//$nbart = mysql_num_rows($result);
$nbart = 0;
$resultataffiche = "";
if ($result) {
$titrerub = supprimer_numero($titrerub);
$idrub = 0;
$listidmot2 = "";
$listidmotprec = "";
while ($row = mysql_fetch_assoc($result)) {
extract($row);
if (($num != $nbmot) && ($allword == 1)) {
break;
}
if ($idrub != $id_rubrique) {
if (($pospoint = strrpos($titrerub, ". ")) === FALSE) {
$titrerub2=$titrerub;
}
else {
if (is_numeric(substr($titrerub, 0, $pospoint)) == false)
$titrerub2 = $titrerub;
else
$titrerub2 = substr($titrerub, $pospoint + 2);
}
if ($order == 1) {
$resultataffiche.= "<p><a href=\"./spip.php?rubrique$id_rubrique\">$titrerub2 :</a></p>";
}
}
$sql2 = "SELECT spip_articles.id_article AS artid,spip_articles.id_secteur AS id_secteur, spip_articles.titre AS titreart, spip_articles.date, spip_mots.id_mot ";
$sql2 .= ", spip_mots.titre AS titremot FROM spip_articles INNER JOIN spip_mots_articles ON spip_mots_articles.id_article = spip_articles.id_article ";
$sql2 .= "INNER JOIN spip_mots ON spip_mots.id_mot = spip_mots_articles.id_mot ";
$sql2 .= "WHERE spip_articles.id_article = $id_article AND spip_mots_articles.id_mot IN (". implode(",", $_POST['idmot']) .") AND statut LIKE 'publie' ";
$sql2 .= "ORDER BY spip_mots.id_mot";
$result2 = mysql_query($sql2);
if ($result2) {
$listmot = "<h4 class=\"titremots_mc\">";
$titrearticle = "";
$dataffich = "";
$idart = 0;
while ($row2 = mysql_fetch_assoc($result2)) {
extract($row2);
$listidmot2 .= "$id_mot,";
if ($idart == 0) {
$titrearticle = supprimer_numero($titreart);
if (!(($pospoint = strpos($titrearticle, '.')) === FALSE)) {
if (is_numeric(substr($titrearticle, 0, $pospoint)) == true)
$titrearticle = substr($titrearticle, $pospoint + 2);
}
if (!(($pospoint = strpos($titremot, '.')) === FALSE)) {
if (is_numeric(substr($titremot, 0, $pospoint)) == true)
$titremot = substr($titremot, $pospoint + 2);
}
$dataffich = date("d/m/Y", strtotime($date));
if ($order == 1) {
$nbart += 1;
$resultataffiche .= "<li>
<a class=\"titrearticle_mc\" href=\"./spip.php?article$artid\">$titrearticle</a>
<small>$dataffich </small>";
$resultataffiche .= "$titremot";
}
$listmot .= "<a class=\"spanblock\" href=\"./spip.php?page=mot&mots[]=$id_mot\"><span class=\"cle\">$titremot</span></a>";
$idart = 1;
}
else {
$listmot .= "<a class=\"spanblock\" href=\"./spip.php?page=mot&mots[]=$id_mot\"><span class=\"cle\">$titremot</span></a>";
if ($order == 1) {
$resultataffiche .= "<a class=\"spanblock\" href=\"./spip.php?page=mot&mots[]=$id_mot\"><span class=\"cle\">$titremot</span></a>";
}
}
}
if ($order == 1) {
$resultataffiche .= "</li>";
}
mysql_free_result($result2);
if ($order == 0) {
if ($listidmot2 != $listmodidprec) {
$resultataffiche .= " $listmot </h4>";
}
$nbart += 1;
if ($id_secteur == 1) {$variable = 63; $secteur = "Ma classe";}
if ($id_secteur == 3) {$variable = 66; $secteur = "Applications";}
if ($id_secteur == 4) {$variable = 65; $secteur = "Tutoriels";}
if ($id_secteur == 5) {$variable = 64; $secteur = "Liens";}
$resultataffiche .= "
<li class=\"br\">
<a class=\"titrearticle_mc\" href=\"./spip.php?article$id_article\">$titrearticle</a>
<small>publié le : <em>$dataffich</em> , dans la rubrique <em><a href=\"./spip.php?rubrique$id_secteur&mots[]=$variable\">$secteur</a></em></small></li>";
$listmodidprec = $listidmot2;
$listidmot2 = "";
}
}
$idrub = $id_rubrique;
}
mysql_free_result($result);
if($nbart == 0 || $nbart == 1)
$nbart_txt = "<:rmc:article_trouve:>";
else
$nbart_txt = "<:rmc:articles_trouves:>";
echo "<div class=\"contre-encart\">";
echo "<p class=\"mots_mc\"><span class=\"spanblock \">Mots séléctionnés : </span><br />".substr($tabmot, 0)." </p>";
if($nbart == 0 )
$nbart_txt = "Aucun article ne correspond à votre recherche";
else
if($nbart == 1 )
$nbart_txt = " article correspond à votre recherche";
else
$nbart_txt = "articles correspondent à votre recherche";
if($nbart == 0 )
echo "
<p class=\"mots_mc\"> $nbart_txt
<br />
<a href=\"#SELF\">Nouvelle recherche</a></p>";
else
echo "
<p class=\"mots_mc\"> $nbart $nbart_txt
<br />
<a href=\"#SELF\">Nouvelle recherche</a></p>";
echo "
<div class=\"liste-articles\">"
.$resultataffiche
." </div>
</div>";
if($nbart != 0 )
echo " <br class=\"dixpixels\" />
<p class=\"mots_mc\"><a href=\"#SELF\">Nouvelle recherche</a></p>";
} else {
echo "<p class=\"mots_mc\">Aucun article ne correspond à votre recherche</p>";
}
} else {
echo "<div class=\"mots_mc\"><:rmc:selectionner_mot:></div>";
# inutile si form recherche inclus
# echo "<br /><a href=\"".$_SERVER['HTTP_REFERER']."\" onclick=\"javascript:history.back(); return false;\">Retour</a></p>";
}
?>
</div>
# Le 2 novembre 2012 à 01:09, par gilcot
En réponse à : Migration d’un squelette de SPIP2 vers SPIP3
pfiouuuu
On peut voir la page de recherche ?
Et aussi une petite description de comment les résultats sont affichés ?
# Le 2 novembre 2012 à 11:29, par Mike
En réponse à : Migration d’un squelette de SPIP2 vers SPIP3
Je te mets un lien vers la version qui fonctionne sur SPIP 2.1
http://www.librairie-interactive.com/?page=recherche&type_rech=multi
Je pense savoir d’où vient le problème mais je ne suis pas assez compétent en SQL pour le résoudre.
En effet, je viens de réaliser que dans la nouvelle structure de la base de SPIP 3, la table spip_mots_articles n’existe plus alors que dans mon fichier, il y est souvent fait appel en SQL. Du coup mon code se comporte comme si il n’y avait aucun mot clé dans le tableau idmot et me dit qu’il n’y a pas de résultats.
Reste à comprendre les jointures de la nouvelle base pour modifier le SQL dans mon code.
# Le 2 novembre 2012 à 14:56, par gilcot
En réponse à : Migration d’un squelette de SPIP2 vers SPIP3
Bonjour Mike.
Dites-moi si ra ré-écriture suivante marche avec la 2.1 :
<div class="result_rm">
<?php
/*********************************************************************
* RECHERCHE MULTI-CRITERES - MODELE AFFICHAGE DES RESULTATS
*
* @author
* -2008-08: [Dominique (Dom) Lepaisant->www.tispip.etab.ac-caen.fr]
* -2008-08: [Stéphanie De Nadaï->www.webdesigneuse.net]
* - [Paul Sanchez->www.Netdeveloppeur.com] (contrib initiale)
*
* @copyright
* Ce programme est un logiciel libre distribue sous licence GNU/GPL.
*********************************************************************/
$url = parse_url($_SERVER['QUERY_STRING']);
$param = $url['path'];
$pos = 0;
$indice = 255;
if (_request('idmot')) {
// Récupération du nombre de jours
// pour periodicité de la rechercher
$nbjour = intval(_request('nbjour'));
// Récupération du nombre de jours
// pour periodicité de la rechercher
if (_request('onlyrub')) {
$idonlyrub = intval(_request('rubnum'));
} else
$idonlyrub = 0;
// 1 = Tous les mots doivent être associés aux articles trouvés
$allword = intval(_request('allword'));
$sql_in_mot = implode(',', _request('idmot') );
$nbmot = count(_request('idmot'));
$result = sql_select('id_mot, titre', 'spip_mots', 'id_mot IN ('.$sql_in_mot.')', '', 'id_mot,titre"');
$tabmot = "";
$nbcol = 0;
$nbcolmax = 4;
if ($result) {
$compt = 0;
while ($row = sql_fetch($result)) {
extract($row);
$titre = supprimer_numero($titre);
if ($nbcol == $nbcolmax) {
$nbcol = 0;
}
$tabmot .= "<a class=\"spanblock txtgris\" href=\"./spip.php?page=mot&mots[]=$id_mot\"><span class=\"cle\">$titre</span></a>";
$nbcol += 1;
}
sql_free($result);
}
$sql_where[] = "spip_mots_articles.id_mot IN (".$sql_in_mot.") ";
if ($nbjour) {
$datedeb = date("Y-m-d", mktime(0, 0, 0, date("m"), (date("d") - $nbjour), date("Y")));
$sql_where[] = "spip_articles.date >= '$datedeb' ";
}
if ($idonlyrub) {
$sql_where[] = "spip_rubriques.id_rubrique = $idonlyrub ";
}
$sql_where[] = "spip_articles.statut = 'publie' GROUP BY spip_articles.id_article";
if ($order) {
$sql_order = "spip_rubriques.id_rubrique, NUM DESC, spip_mots_articles.id_mot, spip_articles.date DESC";
}
else {
$sql_order = "NUM DESC, spip_mots_articles.id_mot, spip_rubriques.id_rubrique, spip_articles.date DESC";
}
$result = sql_select('COUNT(*) AS num, spip_articles.id_article, spip_rubriques.id_rubrique, spip_rubriques.titre AS titrerub', 'spip_articles INNER JOIN spip_rubriques ON spip_rubriques.id_rubrique = spip_articles.id_rubrique INNER JOIN spip_mots_articles ON spip_mots_articles.id_article = spip_articles.id_article', $sql_where, '', $sql_order);
$nbart = 0;
$resultataffiche = "";
if ($result) {
$titrerub = supprimer_numero($titrerub);
$idrub = 0;
$listidmot2 = "";
$listidmotprec = "";
while ($row = sql_fetch($result)) {
extract($row);
if (($num != $nbmot) && ($allword)) {
break;
}
if ($idrub != $id_rubrique) {
if (($pospoint = strrpos($titrerub, ". ")) === FALSE) {
$titrerub2=$titrerub;
}
else {
if (is_numeric(substr($titrerub, 0, $pospoint)) == false)
$titrerub2 = $titrerub;
else
$titrerub2 = substr($titrerub, $pospoint + 2);
}
if ($order) {
$resultataffiche.= '<p><a href="'. generer_url_entite($id_rubrique, 'rubrique') ."\">$titrerub2 :</a></p>";
}
}
$result2 = sql_select('spip_articles.id_article AS artid,spip_articles.id_secteur AS id_secteur, spip_articles.titre AS titreart, spip_articles.date, spip_mots.id_mot, spip_mots.titre AS titremot', 'spip_articles INNER JOIN spip_mots_articles ON spip_mots_articles.id_article = spip_articles.id_article INNER JOIN spip_mots ON spip_mots.id_mot = spip_mots_articles.id_mot ', "spip_articles.id_article = $id_article AND spip_mots_articles.id_mot IN (".$sql_in_mot.") AND statut = 'publie' ", '', 'spip_mots.id_mot');
if ($result2) {
$listmot = "<h4 class=\"titremots_mc\">";
$titrearticle = "";
$dataffich = "";
$idart = 0;
while ($row2 = sql_fetch($result2)) {
extract($row2);
$listidmot2 .= "$id_mot,";
if ($idart == 0) {
$titrearticle = supprimer_numero($titreart);
if (!(($pospoint = strpos($titrearticle, '.')) === FALSE)) {
if (is_numeric(substr($titrearticle, 0, $pospoint)) == true)
$titrearticle = substr($titrearticle, $pospoint + 2);
}
if (!(($pospoint = strpos($titremot, '.')) === FALSE)) {
if (is_numeric(substr($titremot, 0, $pospoint)) == true)
$titremot = substr($titremot, $pospoint + 2);
}
$dataffich = date("d/m/Y", strtotime($date));
if ($order) {
$nbart += 1;
$resultataffiche .= '<li><a class="titrearticle_mc" href="'. generer_url_entite($artid, 'article') ."\">$titrearticle</a> <small>$dataffich </small>";
$resultataffiche .= "$titremot";
}
$listmot .= "<a class=\"spanblock\" href=\"./spip.php?page=mot&mots[]=$id_mot\"><span class=\"cle\">$titremot</span></a>";
$idart = 1;
}
else {
$listmot .= "<a class=\"spanblock\" href=\"./spip.php?page=mot&mots[]=$id_mot\"><span class=\"cle\">$titremot</span></a>";
if ($order) {
$resultataffiche .= "<a class=\"spanblock\" href=\"./spip.php?page=mot&mots[]=$id_mot\"><span class=\"cle\">$titremot</span></a>";
}
}
}
if ($order) {
$resultataffiche .= "</li>";
}
sql_free($result2);
if (!$order) {
if ($listidmot2 != $listmodidprec) {
$resultataffiche .= " $listmot </h4>";
}
$nbart += 1;
switch ($id_secteur) {
case 1: $variable = 63; $secteur = "Ma classe"; break;
case 3: $variable = 66; $secteur = "Applications"; break;
case 4: $variable = 65; $secteur = "Tutoriels"; break;
case 5: $variable = 64; $secteur = "Liens"; break;
}
$resultataffiche .= '<li class="br"><a class="titrearticle_mc" href="'. generer_url_entite($id_article, 'article'). "\">$titrearticle</a><small>publié le : <em>$dataffich</em> , dans la rubrique <em><a href=\"". generer_url_entite($id_secteur,'rubrique') ."&mots[]=$variable\">$secteur</a></em></small></li>";
$listmodidprec = $listidmot2;
$listidmot2 = "";
}
}
$idrub = $id_rubrique;
}
sql_free($result);
if($nbart == 0 || $nbart == 1)
$nbart_txt = "<:rmc:article_trouve:>";
else
$nbart_txt = "<:rmc:articles_trouves:>";
echo "<div class=\"contre-encart\">";
echo "<p class=\"mots_mc\"><span class=\"spanblock \">Mots séléctionnés : </span><br />".substr($tabmot, 0)." </p>";
if($nbart == 0 )
$nbart_txt = "Aucun article ne correspond à votre recherche";
else
if($nbart == 1 )
$nbart_txt = " article correspond à votre recherche";
else
$nbart_txt = "articles correspondent à votre recherche";
if($nbart == 0 )
echo "<p class=\"mots_mc\"> $nbart_txt<br /><a href=\"#SELF\">Nouvelle recherche</a></p>";
else
echo "<p class=\"mots_mc\"> $nbart $nbart_txt<br /><a href=\"#SELF\">Nouvelle recherche</a></p>";
echo '<div class="liste-articles">'.$resultataffiche."</div></div>";
if($nbart)
echo "<br class=\"dixpixels\" /><p class=\"mots_mc\"><a href=\"#SELF\">Nouvelle recherche</a></p>";
} else {
echo "<p class=\"mots_mc\">Aucun article ne correspond à votre recherche</p>";
}
} else {
echo "<div class=\"mots_mc\"><:rmc:selectionner_mot:></div>";
// inutile si form recherche inclus
// echo "<br /><a href=\"".$_SERVER['HTTP_REFERER']."\" onclick=\"javascript:history.back(); return false;\">Retour</a></p>";
}
?>
</div>
Normalement c’est juste un portage qui utllise l’API SQL de SPIP : cela a pas mal d’avantages plus tard. Si ça marche, je peux adapter les requêtes (je soupçonne aussi les mots-clés)
J’irai voir la page de recherche dans la soirée. Je pense que ça m’aidera à comprendre le code... Mais je pense aussi qu’il aurait été possible d’écrire cette page directement en langage de boucles SPIP avec ses bénéfices (lisibilité du HTML qui n’est pas mélangé à du PHP, portabilité et prise en main plus simples pour un non développeur, prise en charge automatique par le cache, etc.)
# Le 2 novembre 2012 à 20:34, par Mike
En réponse à : Migration d’un squelette de SPIP2 vers SPIP3
Bonsoir !
Désolé je me suis trompé en postant tout à l’heure pour dire que c’était résolu et j’ai créé un autre post au lieu de répondre.
C’était bien lié aux modifications de la base de données suite au passage en spip 3.
La table spip_mot_articles est devenue spip_mots_liens et du coup spip_mots_articles.id_article devient spip_mots_liens.id_objet
Merci d’avoir pris le temps de regarder ! :)
Maintenant c’est vrai qu’il faudrait que je recode tout ça directement en SPIP mais j’avoue que je ne sais pas trop par quel bout commencer. J’avais déjà passé pas mal de temps à bidouiller ce code en php (dont je ne suis pas l’auteur) pour l’adapter à mes besoins. Je pense que c’est au delà de mes compétences pour le moment !
En tous cas merci du temps que vous m’avez accordé, d’autant plus que le code est plutôt indigeste présenté comme ça !
Mike
# Le 3 novembre 2012 à 00:32, par gilcot
En réponse à : Migration d’un squelette de SPIP2 vers SPIP3
C’était ma prochaine suggestion (mais avant, s’assurer que la ré-écriture avec l’API ne casse rien) Mais ne pouvant pas tester, je n’étais pas certain que cette seule modification aurait suffit (je pensais qu’il aurait fallu rajouter dans votre cas que «
objet='article'» en plus du lien surid_objet(car la nouvelle structure permet de lier n’importe quel objet aux mots clés, pas que les articles... donc quand vous aurez des articles et des rubriques de même ID rattaché au même mot-clé...)<?php
/*********************************************************************
* RECHERCHE MULTI-CRITERES - MODELE AFFICHAGE DES RESULTATS
*
* @author
* -2008-08: [Dominique (Dom) Lepaisant->www.tispip.etab.ac-caen.fr]
* -2008-08: [Stéphanie De Nadaï->www.webdesigneuse.net]
* - [Paul Sanchez->www.Netdeveloppeur.com] (contrib initiale)
*
* @copyright
* Ce programme est un logiciel libre distribue sous licence GNU/GPL.
*********************************************************************/
$url = parse_url($_SERVER['QUERY_STRING']);
$param = $url['path'];
$pos = 0;
$indice = 255;
if (_request('idmot')) {
// Récupération du nombre de jours
// pour periodicité de la rechercher
$nbjour = intval(_request('nbjour'));
// Récupération du nombre de jours
// pour periodicité de la rechercher
if (_request('onlyrub')) {
$idonlyrub = intval(_request('rubnum'));
} else
$idonlyrub = 0;
// 1 = Tous les mots doivent être associés aux articles trouvés
$allword = intval(_request('allword'));
$sql_in_mot = implode(',', _request('idmot') );
$nbmot = count(_request('idmot'));
$result = sql_select('id_mot, titre', 'spip_mots', 'id_mot IN ('.$sql_in_mot.')', '', 'id_mot,titre"');
$tabmot = "";
$nbcol = 0;
$nbcolmax = 4;
if ($result) {
$compt = 0;
while ($row = sql_fetch($result)) {
extract($row);
$titre = supprimer_numero($titre);
if ($nbcol == $nbcolmax) {
$nbcol = 0;
}
$tabmot .= "<a class=\"spanblock txtgris\" href=\"./spip.php?page=mot&mots[]=$id_mot\"><span class=\"cle\">$titre</span></a>";
$nbcol += 1;
}
sql_free($result);
}
$sql_where[] = "spip_mots_liens.objet='article'"
$sql_where[] = "spip_mots_liens.id_mot IN (".$sql_in_mot.") ";
if ($nbjour) {
$datedeb = date("Y-m-d", mktime(0, 0, 0, date("m"), (date("d") - $nbjour), date("Y")));
$sql_where[] = "spip_articles.date >= '$datedeb' ";
}
if ($idonlyrub) {
$sql_where[] = "spip_rubriques.id_rubrique = $idonlyrub ";
}
$sql_where[] = "spip_articles.statut = 'publie' GROUP BY spip_articles.id_article";
if ($order) {
$sql_order = "spip_rubriques.id_rubrique, num DESC, spip_mots_liens.id_mot, spip_articles.date DESC";
}
else {
$sql_order = "num DESC, spip_mots_liens.id_mot, spip_rubriques.id_rubrique, spip_articles.date DESC";
}
$result = sql_select('COUNT(*) AS num, spip_articles.id_article, spip_rubriques.id_rubrique, spip_rubriques.titre AS titrerub', 'spip_articles INNER JOIN spip_rubriques ON spip_rubriques.id_rubrique = spip_articles.id_rubrique INNER JOIN spip_mots_liens ON spip_mots_liens.id_objet = spip_articles.id_article', $sql_where, '', $sql_order);
$nbart = 0;
$resultataffiche = "";
if ($result) {
$titrerub = supprimer_numero($titrerub);
$idrub = 0;
$listidmot2 = "";
$listidmotprec = "";
while ($row = sql_fetch($result)) {
extract($row);
if (($num != $nbmot) && ($allword)) {
break;
}
if ($idrub != $id_rubrique) {
if (($pospoint = strrpos($titrerub, ". ")) === FALSE) {
$titrerub2=$titrerub;
}
else {
if (is_numeric(substr($titrerub, 0, $pospoint)) == false)
$titrerub2 = $titrerub;
else
$titrerub2 = substr($titrerub, $pospoint + 2);
}
if ($order) {
$resultataffiche.= '<p><a href="'. generer_url_entite($id_rubrique, 'rubrique') ."\">$titrerub2 :</a></p>";
}
}
$result2 = sql_select('spip_articles.id_article AS artid,spip_articles.id_secteur AS id_secteur, spip_articles.titre AS titreart, spip_articles.date, spip_mots.id_mot, spip_mots.titre AS titremot', 'spip_articles INNER JOIN spip_mots_liens ON spip_mots_liens.id_objet = spip_articles.id_article INNER JOIN spip_mots ON spip_mots.id_mot = spip_mots_liens.id_mot ', "spip_articles.id_article = $id_article AND spip_mots_liens.id_mot IN (".$sql_in_mot.") AND statut = 'publie' AND spip_mots_liens.objet = 'article' ", '', 'spip_mots.id_mot');
if ($result2) {
$listmot = "<h4 class=\"titremots_mc\">";
$titrearticle = "";
$dataffich = "";
$idart = 0;
while ($row2 = sql_fetch($result2)) {
extract($row2);
$listidmot2 .= "$id_mot,";
if ($idart == 0) {
$titrearticle = supprimer_numero($titreart);
if (!(($pospoint = strpos($titrearticle, '.')) === FALSE)) {
if (is_numeric(substr($titrearticle, 0, $pospoint)) == true)
$titrearticle = substr($titrearticle, $pospoint + 2);
}
if (!(($pospoint = strpos($titremot, '.')) === FALSE)) {
if (is_numeric(substr($titremot, 0, $pospoint)) == true)
$titremot = substr($titremot, $pospoint + 2);
}
$dataffich = date("d/m/Y", strtotime($date));
if ($order) {
$nbart += 1;
$resultataffiche .= '<li><a class="titrearticle_mc" href="'. generer_url_entite($artid, 'article') ."\">$titrearticle</a> <small>$dataffich </small>";
$resultataffiche .= "$titremot";
}
$listmot .= "<a class=\"spanblock\" href=\"./spip.php?page=mot&mots[]=$id_mot\"><span class=\"cle\">$titremot</span></a>";
$idart = 1;
}
else {
$listmot .= "<a class=\"spanblock\" href=\"./spip.php?page=mot&mots[]=$id_mot\"><span class=\"cle\">$titremot</span></a>";
if ($order) {
$resultataffiche .= "<a class=\"spanblock\" href=\"./spip.php?page=mot&mots[]=$id_mot\"><span class=\"cle\">$titremot</span></a>";
}
}
}
if ($order) {
$resultataffiche .= "</li>";
}
sql_free($result2);
if (!$order) {
if ($listidmot2 != $listmodidprec) {
$resultataffiche .= " $listmot </h4>";
}
$nbart += 1;
switch ($id_secteur) {
case 1: $variable = 63; $secteur = "Ma classe"; break;
case 3: $variable = 66; $secteur = "Applications"; break;
case 4: $variable = 65; $secteur = "Tutoriels"; break;
case 5: $variable = 64; $secteur = "Liens"; break;
}
$resultataffiche .= '<li class="br"><a class="titrearticle_mc" href="'. generer_url_entite($id_article, 'article'). "\">$titrearticle</a><small>publié le : <em>$dataffich</em> , dans la rubrique <em><a href=\"". generer_url_entite($id_secteur,'rubrique') ."&mots[]=$variable\">$secteur</a></em></small></li>";
$listmodidprec = $listidmot2;
$listidmot2 = "";
}
}
$idrub = $id_rubrique;
}
sql_free($result);
if($nbart == 0 || $nbart == 1)
$nbart_txt = "<:rmc:article_trouve:>";
else
$nbart_txt = "<:rmc:articles_trouves:>";
echo "<div class=\"contre-encart\">";
echo "<p class=\"mots_mc\"><span class=\"spanblock \">Mots séléctionnés : </span><br />".substr($tabmot, 0)." </p>";
if($nbart == 0 )
$nbart_txt = "Aucun article ne correspond à votre recherche";
else
if($nbart == 1 )
$nbart_txt = " article correspond à votre recherche";
else
$nbart_txt = "articles correspondent à votre recherche";
if($nbart == 0 )
echo "<p class=\"mots_mc\"> $nbart_txt<br /><a href=\"#SELF\">Nouvelle recherche</a></p>";
else
echo "<p class=\"mots_mc\"> $nbart $nbart_txt<br /><a href=\"#SELF\">Nouvelle recherche</a></p>";
echo '<div class="liste-articles">'.$resultataffiche."</div></div>";
if($nbart)
echo "<br class=\"dixpixels\" /><p class=\"mots_mc\"><a href=\"#SELF\">Nouvelle recherche</a></p>";
} else {
echo "<p class=\"mots_mc\">Aucun article ne correspond à votre recherche</p>";
}
} else {
echo "<div class=\"mots_mc\"><:rmc:selectionner_mot:></div>";
// inutile si form recherche inclus
// echo "<br /><a href=\"".$_SERVER['HTTP_REFERER']."\" onclick=\"javascript:history.back(); return false;\">Retour</a></p>";
}
?>
</div>
# Le 29 janvier à 18:48, par christophe noisette
En réponse à : Migration d’un squelette de SPIP2 vers SPIP3
Bonjour
j’ai le même souci d’utiliser la recherche multi-critère par mot clé sous spip3 du fait du changement de table de à . J’ai donc essayer de copier / coller ce que tu proposes, que j’ai mis dnas le fichier natif ’result_rec_mc.html’.
La recherche se fait à partir de la page : http://www.infogm.org/spip.php?rubrique657.
Quand je lance une recherche, j’ai droit au message d’erreur suivant : « Parse error : syntax error, unexpected T_VARIABLE in /homez.95/infogm/www/ecrire/public/evaluer_page.php(55) : eval()’d code on line 63 ».
J’ai aussi essayer de simplement faire rechercher / remplacer sur mon premier fichier tous les spip_mots_articles par spip_mots_liens et les .id_article par des id.objet...Mais cette solution ne me donnait tout simplement aucun résultat... Jamais. Or j’ai bien des articles liés à des mots clés.
Merci pour vos lumières
Répondre à ce message
# Le 24 mai 2012 à 01:08, par philooo
En réponse à : Migration d’un squelette de SPIP2 vers SPIP 3.0
le critere par num titre, id_document ne marche plus, car les numeros devant les titres sont maintenant ignore.
c’est quoi le nouveau critere pour prendre en compte les numeros de titres ? la documentation n’est ps encore a jour :(
# Le 24 mai 2012 à 11:39, par JLuc
En réponse à : Migration d’un squelette de SPIP2 vers SPIP 3.0
Sisi,
{par num titre}marche toujours... ce n’est que la balise #TITRE qui a le numéro supprimé d’office.# Le 15 novembre 2012 à 16:59, par Beurt
En réponse à : Migration d’un squelette de SPIP2 vers SPIP3
C’est pas si simple je crois : car je constate aussi que
{par num titre}ne trie pas partitrequand les titres ne contiennent pas de numéro !# Le 29 janvier à 14:49, par JLuc
En réponse à : Migration d’un squelette de SPIP2 vers SPIP3
Dans une rubrique, il est recommandé que soit il y ait des numéros à tous les articles, soit il n’y en ait pas du tout.
Répondre à ce message
# Le 2 novembre 2012 à 11:53, par Mike
En réponse à : Migration d’un squelette de SPIP2 vers SPIP3
Problème résolu, je poste la réponse très simple qui pourra dépanner probablement d’autres personnes
La table spip_mot_articles est devenue spip_mots_liens et du coup spip_mots_articles_.id_article devient spip_mots_liens.id_objet
Merci d’avoir pris le temps de regarder ! Je suis conscient que comme ça le code php est un peu indigeste ! Je pourrais d’ailleurs faire ça plus simplement maintenant sous Spip 3 mais bon !
Mike
Répondre à ce message
# Le 1er octobre 2012 à 11:03, par Abel
En réponse à : Migration d’un squelette de SPIP2 vers SPIP3
Bonjour,
Sauf erreur de ma part, le critère id_groupe semble ne plus fonctionner sur une boucle « breves » dans SPIP 3 (pour sélectionner les brèves liées à un groupe de mots-clés). http://www.spip.net/fr_article906.html
La boucle suivante qui fonctionnait très bien sous SPIP 2, n’affiche plus rien après une migration sur SPIP3, et affiche une « erreur dans le squelette » de type « critère inconnu » :
<BOUCLE_nom_de_boucle(BREVES){id_groupe="9"}{0,5}{id_rubrique="1"}{!par date}{doublons}>Je précise que la boucle se situe dans un « inclure ».
Merci !
# Le 7 octobre 2012 à 08:15, par gilcot
En réponse à : Migration d’un squelette de SPIP2 vers SPIP3
Bonjour.
Quelle est l’erreur exacte ?
Est-ce que l’erreur persiste quand on enlève
{id_groupe="9"}et qu’on recalcule la page ?# Le 12 octobre 2012 à 16:15, par Abel
En réponse à : Migration d’un squelette de SPIP2 vers SPIP3
Bonjour,
Voici l’erreur exacte :
Et la boucle n’affiche rien.
Si j’enlève le critère ça marche sans problème.
Pour le moment j’ai trouvé un autre moyen d’afficher ce que je veux mais c’est tout de même étrange.
# Le 13 octobre 2012 à 12:11, par gilcot
En réponse à : Migration d’un squelette de SPIP2 vers SPIP3
Bonjour.
Vous (Abel) écriviez :
Et je (gilcot) ai répondu
Et vous (Abel) confirmez
En fait, ce n’est pas si étrange que cela : le problème des mots-clés est un peu celui des forums, même si l’article ne le mentionne pas (mais c’est un poil plus complexe aussi) Mais l’essentiel (jointures automatiques) ayant été fait pour qu’on retombe sur ses pattes dans la plupart des cas (boucles simples de ce type), cette erreur n’aurait pas du se produire non ?
A tout hasard (je ne peux pas tester là), remplacer
{id_groupe="9"}par{mots.id_groupe="9"}{mots.objet='breve'}pour voir ce que ça donne# Le 13 octobre 2012 à 14:45, par Abel
En réponse à : Migration d’un squelette de SPIP2 vers SPIP3
Bonjour,
Alors si je mets
{mots.id_groupe="9"}{mots.objet='breve'}ça ne fonctionne pas.Mais si je ne mets que
{mots.id_groupe="9"}alors cela semble fonctionner.Abel
# Le 13 octobre 2012 à 15:19, par gilcot
En réponse à : Migration d’un squelette de SPIP2 vers SPIP3
Salut Abel
Comme j’ai pas testé.. mais vous avez trouvé la version qui fonctionne. L’idée était de forcer la jointure sur la table des mots clés ;-)
Problème résolu donc. Bonne continuation.
# Le 13 octobre 2012 à 19:43, par Abel
En réponse à : Migration d’un squelette de SPIP2 vers SPIP3
Oui,
Bravo et merci ! ^^
Répondre à ce message
# Le 5 mai 2012 à 21:54, par YannX
En réponse à : Migration d’un squelette de SPIP2 vers SPIP 3.0
Un chapitre majeur de modification de SPIP 3 reste a expliciter :
la gestion des mots-clés est a refondre assez complètement si vous utilisez ce domaine...
car les tables dsupport ont completement changé.
Voir les articls descriptifs SPIP3 (actuellement seulement en interface privée, en attendant leur publication publique a la sortie officielle de SPIP3)
# Le 26 mai 2012 à 18:55, par .Gilles
En réponse à : Migration d’un squelette de SPIP2 vers SPIP 3.0
Bonjour,
il faudrait mettre cet article dans la rubrique « Suivre les versions de SPIP » :
http://www.spip-contrib.net/Suivre-les-versions-de-SPIP
Sinon on ne s’y retrouve pas, non ?
# Le 26 septembre 2012 à 14:51, par JLuc
En réponse à : Migration d’un squelette de SPIP2 vers SPIP3
C’est fait
Répondre à ce message