Accueil > SPIP > Autorisation > Gérer le statut des articles directement depuis le site public
Gérer le statut des articles directement depuis le site public
mercredi 8 décembre 2010, par
J’utilise sur ce site le plugin de prévisualisation en cours de rédaction, qui me permet de voir le résultat de ma rédaction sur le site public, avant que l’article soit publié.
Du coup j’ai voulu pouvoir changer le statut de l’article directement sur le site public.
Remarque : sous SPIP 3, c’est beaucoup plus simple.
Pour ce faire, je me suis rendu dans l’espace privé de spip, et j’ai ajouté un &var_mode=inclure
sur la page d’un article. J’ai ainsi reperé que le bloc qui m’intéressait se situait dans prive/infos/article.html
.
En ouvrant ce fichier, j’ai reperé la ligne qui m’intéressait :
[(#ID_ARTICLE|instituer_article{#ID_RUBRIQUE,#STATUT})]
Cela affiche le bloc de changement de statut.
J’ai donc recopier cela dans mon squelette article.html
[1].
Mais comme je ne voulais pas que n’importe qui voit ce bloc, j’ai testé l’autorisation
[(#AUTORISER{instituer,article,#ID_ARTICLE}|oui)
[(#ID_ARTICLE|instituer_article{#ID_RUBRIQUE,#STATUT})]]
Seulement voilà, le filtre |instituer_article
n’existe pas dans tout SPIP. Il est défini dans le fichier prive/statuts/article_fonctions.php
, ce qui veut dire qu’il n’existe que pour le squelette prive/infos/article.html
.
function instituer_article($id_article, $id_rubrique, $statut){
$instituer_article = charger_fonction('instituer_article', 'inc');
return $instituer_article($id_article, $statut, $id_rubrique);
}
J’ai donc recopié cela dans un fichier article_fonctions.php
[2]
Le problème est que la fonction instituer_article()
renvoi des liens dans l’espace privé, et non le lien de l’article dans l’espace public. Du coup, après avoir changé le statut d’un article, je me retrouvais sur page 404 du type : http://http://geekographie.maieul.net/ecrire/ecrire/?exec=articles&id_article=10
, ce qui était génant.
Comme il n’existe pas de pipeline pour cette fonctions, j’ai du faire quelquechose de « sale », en modifiant son résultat.
Et du coup mon fichier articles_fonctions.php
contient :
function instituer_article($id_article, $id_rubrique, $statut){
$instituer_article = charger_fonction('instituer_article', 'inc');
return str_replace('ecrire%2Fecrire%2F%3Fexec%3Darticles%26id_article%3D','spip.php%3Farticle',$instituer_article($id_article, $statut, $id_rubrique));
}
Par ailleurs, la fonction instituer_article
de inc
contient un appel à fonction puce_statut()
. Il a donc fallu que je rajoute une inclusion supplémentaire auparavent.
include_spip('inc/puce_statut');
Et voilà, cela fonctionne ! Je peux modifier le statut d’un article depuis le site public, mais les autres ne voient pas ce bouton.
En résumé
Dans le fichier article.html
, à l’endroit souhaité
[(#AUTORISER{instituer,article,#ID_ARTICLE}|oui)
[(#ID_ARTICLE|instituer_article{#ID_RUBRIQUE,#STATUT})]]
Dans le fichier article_fonctions.php
<?php
include_spip('inc/puce_statut');
function instituer_article($id_article, $id_rubrique, $statut){
$instituer_article = charger_fonction('instituer_article', 'inc');
return str_replace('ecrire%2Fecrire%2F%3Fexec%3Darticles%26id_article%3D','spip.php%3Farticle',$instituer_article($id_article, $statut, $id_rubrique));
}
?>
Évidement, avec la balise #AUTORISER, cela double le cache de article/extra.html
: un cache pour moi connecté, un pour les visiteurs non connectés.
[1] En fait comme j’ai un squelette "Z", j’ai mis dans extra/article.html
, mais cela ne change pas grand chose.
[2] En fait extra/article_fonctions.php
.