[SPIP Zone] article invisble si recalcul

Bonjour,

J'ai un souci avec un plugin en cours de création. Je souhaite afficher une boite dans les articles de l'espace privé, j'ai donc créée le petit squelette qui va bien avec. Par contre quand je fais un var_mode=recalcul j'ai le message d'interdiction d'accès à l'article.
Sur la table spip_articles je déclare deux champs nouveaux dont le dernier est archive qui sera soit à 1 soit à rien. Je voudrais également que lorsque les articles ont un archive=1 ceux-ci ne soient plus visibles depuis la partie publique à moins de mettre {tout} dans la boucle.
En m'appuyant sur le plugin archive déjà existant pour SPIP 2 je déclare ceci:
function archiver_pre_boucle($boucle){
    if ($boucle->type_requete == 'articles') {
        $id_table = $boucle->id_table;
        $champ_archive = $id_table.'.archive';
          if (!isset($boucle->modificateur['criteres']['archive']) &&
            !isset($boucle->modificateur['tout']))
        {
            $boucle->where[]= array("'is'", "'$champ_archive'", "'null'");
        } }
    return $boucle;
}

Ca marche bien sauf que :
<B_archive>
[(#BOITE_OUVRIR{[<:archiver:titre_attention:>(#CHEMIN_IMAGE{archiver-24.png}|balise_img{'',cadre-icone})],notice})]
<ul>
<BOUCLE_archive(ARTICLES){id_article}{archive=1}{tout} >
<li><:archiver:archiver_le:> [(#ARCHIVE_DATE|affdate)] </li>
</BOUCLE_archive></ul><div class="ajax">#FORMULAIRE_RETIRER_ARCHIVE</div>
#BOITE_FERMER
</B_archive>

affiche ma boite et ne m'affiche plus rien du tout sauf interdiction de voir l'article en mode recalcul. Si je supprime la fonction du haut, ça marche mais je n'ai plus la possibilité de cacher les articles archivés.

Je reviens parce que je pense que je n'ai pas été très clair sur le post précédent!
Pourquoi ce script m'empêche de voir l'article dans l'espace privé dont le champ archive =1
function archiver_pre_boucle($boucle){
    if ($boucle->type_requete == 'articles') {
        $id_table = $boucle->id_table;
        $champ_archive = $id_table.'.archive';
            if (!isset($boucle->modificateur['criteres']['archive']) &&
            !isset($boucle->modificateur['tout']))
        {
            $boucle->where= array("'='", "'$champ_archive'", "'0'");
        } }
    return $boucle;
}

Bernard Blazin a écrit :

Bonjour,

J'ai un souci avec un plugin en cours de création. Je souhaite afficher une boite dans les articles de l'espace privé, j'ai donc créée le petit squelette qui va bien avec. Par contre quand je fais un var_mode=recalcul j'ai le message d'interdiction d'accès à l'article.
Sur la table spip_articles je déclare deux champs nouveaux dont le dernier est archive qui sera soit à 1 soit à rien. Je voudrais également que lorsque les articles ont un archive=1 ceux-ci ne soient plus visibles depuis la partie publique à moins de mettre {tout} dans la boucle.
En m'appuyant sur le plugin archive déjà existant pour SPIP 2 je déclare ceci:
function archiver_pre_boucle($boucle){
   if ($boucle->type_requete == 'articles') {
       $id_table = $boucle->id_table;
       $champ_archive = $id_table.'.archive';
         if (!isset($boucle->modificateur['criteres']['archive']) &&
           !isset($boucle->modificateur['tout']))
       {
           $boucle->where= array("'is'", "'$champ_archive'", "'null'");
       } }
   return $boucle;
}

Ca marche bien sauf que :
<B_archive>
[(#BOITE_OUVRIR{[<:archiver:titre_attention:>(#CHEMIN_IMAGE{archiver-24.png}|balise_img{'',cadre-icone})],notice})]

<ul>
<BOUCLE_archive(ARTICLES){id_article}{archive=1}{tout} >
<li><:archiver:archiver_le:> [(#ARCHIVE_DATE|affdate)] </li>
</BOUCLE_archive></ul><div class="ajax">#FORMULAIRE_RETIRER_ARCHIVE</div>
#BOITE_FERMER
</B_archive>

affiche ma boite et ne m'affiche plus rien du tout sauf interdiction de voir l'article en mode recalcul. Si je supprime la fonction du haut, ça marche mais je n'ai plus la possibilité de cacher les articles archivés.
_______________________________________________
spip-zone@rezo.net - http://listes.rezo.net/mailman/listinfo/spip-zone

Je vais peut-être dire une bêtise mais je me lance. :slight_smile:

Pourquoi ce script m'empêche de voir l'article dans l'espace privé dont le
champ archive =1

[...]

      $champ_archive = $id_table.'.archive';

[...]

           $boucle->where= array("'='", "'$champ_archive'", "'0'");

Il semble que c'est normal.... On demande à n'afficher que les
$champ_archive valant "0"
Mais, encore une fois, n'ayant pas l'expérience et/ou la compréhension
de l'utilisation de _pre_boucle(), je dis peut-être une connerie après
tout.

Gildas Cotomale a écrit :

Je vais peut-être dire une bêtise mais je me lance. :slight_smile:

Pourquoi ce script m'empêche de voir l'article dans l'espace privé dont le
champ archive =1
    

[...]
  

      $champ_archive = $id_table.'.archive';
    

[...]
  

           $boucle->where= array("'='", "'$champ_archive'", "'0'");
    
Il semble que c'est normal.... On demande à n'afficher que les
$champ_archive valant "0"
Mais, encore une fois, n'ayant pas l'expérience et/ou la compréhension
de l'utilisation de _pre_boucle(), je dis peut-être une connerie après
tout.

Si le champs est à 0 {tout} dans la boucle php ça fonctionne trop bien. C'est à dire que je ne vois pas l'article dans la la page privée mais pas non plus sur l'espace public( ça, je le souhaite). Si je passe passe à 1, je vois tout mais sans le critère {tout} et ça m'embête. pre_boucle est une fonction assez peu utilisée et assez peu renseignée, d'où la difficulté de savoir ce que l'on doit faire.. Par exemple on peut mettre d'autres commandes sql à la place de

array("'='".. enfin je crois d'après les messages d'erreurs, mais comment, lesquels et pourquoi?