Dotclear

Vous n'êtes pas identifié(e).

Annonce

13 février 2024 Sortie de Dotclear 2.29

#1 2019-04-15 12:45:04

Game A
Membre
Inscription : 2013-06-26
Site Web

Afficher le nombre de billets publiés hors d'un widget

Bonjour à tous.

Je me permets de relancer cette question que l'on trouve ici et là dans les profondeurs du forum (notamment ce fil en 2008).

Je souhaiterais en effet afficher le nombre de billets publiés dans le footer des pages mais je bute sur les propositions formulées précédemment.
L'utilisation du plugin Moretpl avec le bout de code proposé à l'époque par Annso aboutit en particulier à des erreurs fatales (est-ce le plugin qui n'est plus adapté à la dernière version de dotclear ou le code qui est périmé ?).

Pour info le bout de code en question

$core->tpl->addValue('MyEntriesCount',array('tplMoreTpl','MyEntriesCount'));
/*
	Cette fonction affiche le nombre de billets
	*/
	public static function MyEntriesCount($attr)
	{
		$tbl_billets = $GLOBALS['core']->blog->prefix."post";
        $billets = $GLOBALS['core']->con->select("
            SELECT count(post_id) as somme
            FROM ".$tbl_billets." billets
            WHERE post_status=1 AND
                  blog_id ='BLOGID'")->field("somme");
	    return '<?php echo '.$billets.'; ?>';
	}

Et les erreurs associées :

Parse error: syntax error, unexpected 'fonction' (T_STRING) in /homepages/38/d163866478/htdocs/manette2/blog/themes/MAG4/_public.php on line 32

Peut-être existe-t-il maintenant une manière plus directe de l'indiquer ? Après tout les pages d'administration fournissent ce chiffre sans souci.
Merci d'avance pour votre aide !

Dernière modification par Game A (2019-04-15 12:45:37)

Hors ligne

#2 2019-04-15 13:43:40

nanart
Membre
Lieu : Roubaix
Inscription : 2007-08-19

Re : Afficher le nombre de billets publiés hors d'un widget

Bonjour,
Apparemment, si on lit l'erreur, il s'agit d'une erreur de syntaxe dans le fichier _public.php du thème MAG4.
(ou fichier _public.php du plugin)
D'où, question: comment avez vous intégré le tpl 'addValue' dans ce fichier ?


Dernière version stable Dotclear sur wampserver et chez ovh
Versions testing & unstable en local
https
php: 7.4  - 8 +

Hors ligne

#3 2019-04-15 14:20:58

pierrevg
Membre
Inscription : 2005-04-13
Site Web

Re : Afficher le nombre de billets publiés hors d'un widget

Tu peux aussi installer infoBlog (dernière version chez moi) et mettre ça dans le footer :

<tpl:Widget id="infoBlog">
    <setting name="title"></setting>
    <setting name="displayentriesnumber">1</setting>
    <setting name="displayselectedentriesnumber">0</setting>
    <setting name="displayentrieswaitingnumber">0</setting>
    <setting name="displayscheduledentriesnumber">0</setting>
    <setting name="displayofflineentriesnumber">0</setting>
    <setting name="displaycommentsnumber">0</setting>
    <setting name="displaypingsnumber">0</setting>
    <setting name="displaystartblogdate">0</setting>
    <setting name="displaystartblogdatetext"></setting>
    <setting name="displayauthors">0</setting>
    <setting name="displayauthorstats">0</setting>
    <setting name="homeonly">0</setting>
</tpl:Widget>

ou mettre le widget dans le volet supplémentaire et ajouter le code du volet supplémentaire dans ton footer, restera juste à styler :

  <div id="custom" role="complementary">
    {{tpl:Widgets type="custom"}}
  </div> <!-- End #blogcustom -->

Hors ligne

#4 2019-04-15 15:04:27

Game A
Membre
Inscription : 2013-06-26
Site Web

Re : Afficher le nombre de billets publiés hors d'un widget

Merci pour vos réponses !

Nanart, je pense que j'avais fait effectivement n'importe quoi : j'avais juste bêtement rajouté le tout dans le _public.php de mon thème. Je l'ai mis plus proprement dans le _public.php du plugin, la première ligne en haut avec les autres déclarations, le reste dans la partie fonctions du fichier.
Plus d'erreurs a priori mais il renvoie "0" (au lieu d'un millier) comme résultat dans une boucle <tpl:Entries no_content="1" lastn="1" no_context="1">.

J'ai essayé avec le bout de code d'adjaya dans le même fil, cette fois ci ça me donne "1", donc bon je dois encore faire n'importe quoi quelque part.

$core->tpl->addValue('PostsCount',array('tplmoreTpl','PostsCount'));
/*
	Cette fonction affiche le nombre de billets
	Utilisation
	{{tpl:PostsCount}}
	*/	
	public static function PostsCount($attr)
	{
	    $f = $GLOBALS['core']->tpl->getFilters($attr);

	    return '<?php echo '.sprintf($f,'$_ctx->posts->count()').'; ?>';
	}

Merci pierrevg pour l'alternative qui fonctionne !

Le résultat n'est malheureusement pas parfait parce qu'il me place le texte ("1328 billets") dans une liste et elle-même dans une div, ce qui n'est pas super pour mieux intégrer le résultat (en fait pour ajouter "depuis 2006" ensuite).

Je reste à votre écoute si vous avez une idée pour une ou une autre manière, merci encore en tout cas.

Dernière modification par Game A (2019-04-15 15:22:01)

Hors ligne

#5 2019-04-15 16:49:55

nanart
Membre
Lieu : Roubaix
Inscription : 2007-08-19

Re : Afficher le nombre de billets publiés hors d'un widget

Déjà, la première requête

            "SELECT count(post_id) as somme
            FROM ".$tbl_billets." billets
            WHERE post_status=1 AND
                  blog_id ='BLOGID'"

qui donne une requête de type:

 SELECT count(post_id) as somme FROM dc_postbillets WHERE post_status=1 AND blog_id ='BLOGID'

ne peut rien renvoyer
1) la table dc_postbillets n'existe pas (à la limite 'as billets' devrait marcher
2) il n'y a pas d'id de blog comme BLOGID

EDIT:
Pour ce qui concerne id de blog:
- soit on ne met pas de condition complémentaire (AND ..) ce qui devrait donner le nombre de billets postés (statut = 1) pour tous les blogs
-  soit on indique le nom du blog courant à la place de BLOGID et on aura le nb de billets postés sur le blog courant.

il reste à trouver la variable (propriété) ou la constante qui contient l'ID du blog courant (par défaut pour le blog principal : default)
Faut que je cherche un peu... ;-)

Dernière modification par nanart (2019-04-15 17:25:20)


Dernière version stable Dotclear sur wampserver et chez ovh
Versions testing & unstable en local
https
php: 7.4  - 8 +

Hors ligne

#6 2019-04-15 17:41:05

nanart
Membre
Lieu : Roubaix
Inscription : 2007-08-19

Re : Afficher le nombre de billets publiés hors d'un widget

On aurait donc un truc du genre

$core->tpl->addValue('MyEntriesCount',array('tplMoreTpl','MyEntriesCount'));

/* Cette fonction affiche le nombre de billets publiés dans le blog courant */
	public static function MyEntriesCount($attr)
	{
           #tbl post
               $tbl_billets = $GLOBALS['core']->blog->prefix."post";
          #blog id
              $blog_id   = $GLOBALS['core']->blog->id;
         #requete
             $query = 'SELECT count(post_id) as somme'
			 .' FROM ' .$tbl_billets 
			  .' WHERE post_status=1 '
			 ." AND blog_id = '$blog_id'";
        #le traitement de la requete
           $billets = $GLOBALS['core']->con->select($query)->field("somme");
        #puis le return
           return '<?php echo '.$billets.'; ?>';
     }

Ce qui devrait donner une requete (par ex pour le blog prinipal) : SELECT count(post_id) as somme FROM dc_post WHERE post_status=1 AND blog_id = 'default' qui peut être testée dans phpmyadmin

Dernière modification par nanart (2019-04-15 17:49:16)


Dernière version stable Dotclear sur wampserver et chez ovh
Versions testing & unstable en local
https
php: 7.4  - 8 +

Hors ligne

#7 2019-04-15 17:59:54

nanart
Membre
Lieu : Roubaix
Inscription : 2007-08-19

Re : Afficher le nombre de billets publiés hors d'un widget

Mais, Amha, il doit y avoir plus simple ;-)


Dernière version stable Dotclear sur wampserver et chez ovh
Versions testing & unstable en local
https
php: 7.4  - 8 +

Hors ligne

#8 2019-04-15 18:50:16

Game A
Membre
Inscription : 2013-06-26
Site Web

Re : Afficher le nombre de billets publiés hors d'un widget

Merci beaucoup !

Concernant BLOGID il était précisé d'indiquer le nom du blog (default souvent effectivement), comme j'ai copié le code tel quel j'ai oublié de préciser. En tout cas le bout de code fonctionne très bien, à ceci près qu'il me trouve 1329 articles, alors que dans l'administration il ne m'en signale que 1328 (et 63 non publiés). Bizarre.

Je n'ose pas dire que j'ai tenté un --$billets pour y remédier... ^^;

En tout cas ça laisse imaginer l'étendue de mes connaissances en php, donc merci encore de votre aide !

Hors ligne

#9 2019-04-17 00:21:46

nanart
Membre
Lieu : Roubaix
Inscription : 2007-08-19

Re : Afficher le nombre de billets publiés hors d'un widget

default est le nom du blog principal. C'est le blog créé par défaut.
Quand on crée d'autres blogs (en mode multiblogs) il faut leur indiquer à chacun un nom différent.
C'est pourquoi la valeur du blog "émetteur de posts" est associée à chacun des posts dans la table des posts.
Donc, récupérer la valeur du blog courant permet de ne compter que le blog courant (celui auquel on accède au moment T.)

Quant au nb de "billets", effectivement, au temps pour moi, la requête est basée sur le nombre d'id des posts, que ce soit un post (billet), une page (page) ou autre dont le type peut être défini éventuellement par un plug.

Il faudrait donc modifier la requête du genre :

             $query = 'SELECT count(post_id) as somme'
			   .' FROM ' .$tbl_billets 
			  .' WHERE post_status=1 '
                          ." AND post_type = 'post'"
			  ." AND blog_id = '$blog_id'";

Les guillemets simples sont importants quand on a affaire à une valeur de type texte. Tout comme les espaces autour d'une commande sql.

Ce qui donnerait une requête de type :
SELECT count(post_id) as somme FROM dc_post WHERE post_status=1 AND post_type = 'post' AND blog_id = 'default'

Quant au statut, de mémoire il va de -2 à 1 (4 états que l'on peut déterminer quand on gère un billet ou une page)
En s'exerçant un peu, on peut tester différentes requêtes SELECT sur phpMyadmin...

Quant au plug proposé par Pierre, il utilise un ensemble de requêtes et propose donc différents résultats (posts, pages, commentaires... /publiés, en attente......) Il doit donc être possible de ne choisir que quelques infos (dont <setting name="displayentriesnumber">1</setting> comme le propose Pierre), voire, je suppose, en supprimant les lignes non nécessaires
et, je pense, moduler la mise en page (p au lieu de div) - à vérifier

Dernière modification par nanart (2019-04-17 00:25:01)


Dernière version stable Dotclear sur wampserver et chez ovh
Versions testing & unstable en local
https
php: 7.4  - 8 +

Hors ligne

#10 2019-04-17 06:26:56

Philippe
Stagiaire
Lieu : Toulon
Inscription : 2004-06-13
Site Web

Re : Afficher le nombre de billets publiés hors d'un widget

Arrivé un peu tard sur le sujet, je propose la solution suivante (Pep inside), avec une balise de template {{tpl:EntriesCount}} qui renvoie le nombre de billets et pages, avec plusieurs filtres possibles (auteur, type, tags, catégories, billets sélectionnés ou non).

$core->tpl->addValue('EntriesCount',array('myTpl','EntriesCount'));

class myTpl {
public static function EntriesCount($attr)
        {
			$p = "if (!is_array(\$params)) \$params = array();";
			if (isset($attr['author'])) {
					$p .= "\$params['user_id'] = '".addslashes($attr['author'])."';";
			}
			if (isset($attr['category'])) {
					$p .= "\$params['cat_url'] = '".addslashes($attr['category'])."';";
					$p .= "context::categoryPostParam(\$params);";
			}

			if (isset($attr['no_category'])) {
					$p .= "\$params['sql'] .= ' AND P.cat_id IS NULL ';";
					$p .= "unset(\$params['cat_url']);";
			}
			if (!empty($attr['type'])) {
					$p .= "\$params['post_type'] = preg_split('/\s*,\s*/','".addslashes($attr['type'])."',-1,PREG_SPLIT_NO_EMPTY);";
			}
			if (isset($attr['tag'])) {
					$p .= 
							"\$params['from'] .= ', '.\$core->prefix.'meta META ';".
							"\$params['sql'] .= 'AND META.post_id = P.post_id ';".
							"\$params['sql'] .= \"AND META.meta_type = 'tag' \";".
							"\$params['sql'] .= \"AND META.meta_id = '".$GLOBALS['core']->con->escape($attr['tag'])."' \";";
			}
			if (empty($attr['no_context'])) {
					$p .=
							'if ($_ctx->exists("users")) { '.
									"\$params['user_id'] = \$_ctx->users->user_id; ".
							"}";

					$p .=
							'if ($_ctx->exists("categories")) { '.
									"\$params['cat_id'] = \$_ctx->categories->cat_id; ".
							"}";
					$p .=
							'if ($_ctx->exists("archives")) { '.
									"\$params['post_year'] = \$_ctx->archives->year(); ".
									"\$params['post_month'] = \$_ctx->archives->month(); ".
									"unset(\$params['limit']); ".
							"}";

					$p .=
							'if ($_ctx->exists("langs")) { '.
									"\$params['post_lang'] = \$_ctx->langs->post_lang; ".
							"}";
					$p .=
							'if (isset($_search)) { '.
									"\$params['search'] = \$_search; ".
							"}";
					$p .=
							'if ($_ctx->exists("meta")) { '.
									"\$params['from'] .= ', '.\$core->prefix.'meta META ';".
									"\$params['sql'] .= 'AND META.post_id = P.post_id ';".
									"\$params['sql'] .= \"AND META.meta_type = 'tag' \";".
									"\$params['sql'] .= \"AND META.meta_id = '\".\$core->con->escape(\$_ctx->meta->meta_id).\"' \";".
							"}";
			}

			if (isset($attr['selected'])) {
					$p .= "\$params['post_selected'] = ".(integer) (boolean) $attr['selected'].";";
			}

			return
					"<?php ".
					$p.
					'$_ctx->post_params = $params;'."".
					'$_ctx->posts = $core->blog->getPosts($params,true); unset($params);'."".
					'echo $_ctx->posts->f(0);'."".
					'$_ctx->posts = null; $_ctx->post_params = null;'."".
					"?>";
	}
}

Seul le nombre de billets est retourné, sans balises html autour, ce qui répond peut-être plus précisément à la demande (?)

PS : ce code est à insérer dans le fichier _public.php du thème courant

Dernière modification par Philippe (2019-04-17 07:24:30)

Hors ligne

#11 2019-04-17 15:53:38

nanart
Membre
Lieu : Roubaix
Inscription : 2007-08-19

Re : Afficher le nombre de billets publiés hors d'un widget

Euh, Philippe tu as testé dans _public?

Parce que, mis à part les alertes qui concernent des variables non déclarées ou des index d'arrays non existant (from/sql),
le résultat est 0.

de +, en analysant la requête lancée on s'aperçoit, sauf erreur de ma part, que la requête est lancée sur la table meta ???


Dernière version stable Dotclear sur wampserver et chez ovh
Versions testing & unstable en local
https
php: 7.4  - 8 +

Hors ligne

#12 2019-04-17 17:37:23

Philippe
Stagiaire
Lieu : Toulon
Inscription : 2004-06-13
Site Web

Re : Afficher le nombre de billets publiés hors d'un widget

nanart a écrit :

Euh, Philippe tu as testé dans _public?

Non, désolé, et je suis confus :(

Ça fonctionnait il y a quelque temps, mais il semble que ce code ne résiste pas aux dernières mises à jour.

Je tenterai de réparer cela, mille excuses pour le bruit inutile

Hors ligne

#13 2019-04-17 18:33:28

nanart
Membre
Lieu : Roubaix
Inscription : 2007-08-19

Re : Afficher le nombre de billets publiés hors d'un widget

Pad'problem... ;-)
Ceci dit les alertes sont affichées car j'ai mis le rapport d'erreur de php au max.
les valeurs non déclarées auparavant génèrent une alerte

Ca m'a appris un peu mieux comment fonctionnent les behaviors
Mébon, j'aimerai savoir s'il existe une possibilité de tester avant....
En gros savoir à quoi correspond l'argument $attr; je suppose un "contexte".
Mais comment le générer ?
Et, fait-il partie de $core ?

Dernière modification par nanart (2019-04-17 18:33:51)


Dernière version stable Dotclear sur wampserver et chez ovh
Versions testing & unstable en local
https
php: 7.4  - 8 +

Hors ligne

#14 2019-04-17 19:00:11

Philippe
Stagiaire
Lieu : Toulon
Inscription : 2004-06-13
Site Web

Re : Afficher le nombre de billets publiés hors d'un widget

$attr, dans le code d'une balise de template, correspond aux arguments passés par cette balise.

Par exemple, pour {{tpl:EntriesCount}}, on pourrait vouloir ne récupérer que les billets sélectionnés ainsi :

{{tpl:EntriesCount type="post" selected="1"}}

Je reviendrai (j'espère) avec les corrections nécessaires dans quelques jours...

Hors ligne

#15 2019-04-18 00:14:00

nanart
Membre
Lieu : Roubaix
Inscription : 2007-08-19

Re : Afficher le nombre de billets publiés hors d'un widget

Bon, on résume:
- le résultat fait appel à la fonction $core->blog->getPosts

qui prend deux paramètres: $params = array() et (facultatif $count_only = false)
$count_only = true -> Only counts results

$params pour ce qui nous intéresse doit contenir :

  • * post_type = 'post' (ou page...)

  • * post_status = '1' (ou -2, -1, 0 suivant le statut désiré) integer

+ si on veut post_selected boolean
+, si on veut compter les billets avec mdp: columns(array), par défaut la fonction ne les comptabilise pas (paramêtre pas encore testé)
+ lang, etc cf params/fonction citée

Donc, a minima une ligne supplémentaire de type :

			if (isset($attr['status'])) {
				$p .= "\$params['post_status'] = ".(integer) $attr['status'].";";
			}

Et, comme j'ai omis de le faire en entrant aucun attribut,
une balise tpl dans le template footer, de type:
{{tpl:EntriesCount type="post" status="1" no_context="no_context" }}
NOTE: si no_context est vide, cela génère les alertes / index arrays

no_content: Don't retrieve entry content (excerpt and content)

Reste la première alerte /variable $params qui peut être évitée en remplaçant la 1ère ligne par

$p = "if (!isset(\$params) || !is_array(\$params)) \$params = array();";

Après on peut soulager le code de tout ce qui n'est pas utile, quitte à prévoir d'autres behavariors ou à améliorer celui-ci pour éviter les alertes

Avec ce minimum: type, status, voire selected/password on peut déjà jouer pour afficher le nombre de :
tous les posts publiés, ceux en attente, non publiés...
toutes les pages publiées, en attente...
les posts avec mdp publiés, en attente (pas testé)
les posts sélectionnés, publiés, etc.
etc.
ce qui est déjà pas mal.

Restera, quand même, à voir si, plutôt que de modifier les thèmes par défaut, il ne serait pas possible d'ajouter un template dans le plug
(j'ai déjà vu ça).


Dernière version stable Dotclear sur wampserver et chez ovh
Versions testing & unstable en local
https
php: 7.4  - 8 +

Hors ligne

#16 2019-04-18 05:17:29

Philippe
Stagiaire
Lieu : Toulon
Inscription : 2004-06-13
Site Web

Re : Afficher le nombre de billets publiés hors d'un widget

Bien vu pour les corrections :) Je te laisse continuer ?

Hors ligne

#17 2019-04-18 07:14:51

Game A
Membre
Inscription : 2013-06-26
Site Web

Re : Afficher le nombre de billets publiés hors d'un widget

Je me permets de vous remercier encore une fois pour tous vos efforts !

Nanart, les changements apportés en #9 marchent nickel. J'ai du coup enlevé mon affreux --$variable. :)

Merci aussi à Philippe dont le code permettra d'affiner les résultats pour ceux qui en ont besoin (effectivement le "problème" de l'utilisation du plugin Infoblog était qu'il ne renvoyait pas que le résultat mais aussi une ul et une div, ce qui rendait la mise en page plus délicate,

Hors ligne

#18 2019-04-18 15:41:09

nanart
Membre
Lieu : Roubaix
Inscription : 2007-08-19

Re : Afficher le nombre de billets publiés hors d'un widget

Pour ce qui concerne le décompte des billets, il faudrait remplacer, dans le premier jet avec requete sql, la requête par un simple appel à la fonction getsPosts; du genre $core->blog->getsPosts(array( 'post_type' => 'post', 'post_status' =>1 )
Ce qui donnerait

$core->tpl->addValue('MyEntriesCount',array('tplMoreTpl','MyEntriesCount'));
/* Cette fonction affiche le nombre de billets publiés dans le blog courant */
	public static function MyEntriesCount($attr)
	{
           #args
               $args = array('post_type' = 'post', 'post_status' = 1);
        #le résultat
           $result = $GLOBALS['core']->->blog->getPosts($args, true);
           $billets = $result->f(0);
        #puis le return
           return '<?php echo '.$billets.'; ?>';
     }

Mébon j'ai pas testé hein ;-)

Dernière modification par nanart (2019-04-18 15:49:19)


Dernière version stable Dotclear sur wampserver et chez ovh
Versions testing & unstable en local
https
php: 7.4  - 8 +

Hors ligne

#19 2019-04-18 15:57:10

nanart
Membre
Lieu : Roubaix
Inscription : 2007-08-19

Re : Afficher le nombre de billets publiés hors d'un widget

Quant à la suite du code, faudrait que quelqu'un s'y colle pour:
- corriger les erreurs dues au contenu du billet (alertes index not in array => if isset(array[$key])
- structure/éclaircir un peu (savoir ce que l'on peut/veut chercher, ...)
- déterminer une possibilité pour établir de manière quasi automatique la balise tpl - via un form, par ex.

Bref en faire un module qui permettrait d'afficher différents résultats dans un billet, une page,
à l'identique de ce qui, amha, doit être fait par le plug proposé par Pierre, par l'intermédiaire d'un widget.

Mébon, quelqu'un, en ce moment, c'est pas moi... ;-)


Dernière version stable Dotclear sur wampserver et chez ovh
Versions testing & unstable en local
https
php: 7.4  - 8 +

Hors ligne

Vous n'êtes pas identifié(e).

Pied de page des forums

Sites map