Dotclear

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

Annonce

13 février 2024 Sortie de Dotclear 2.29

#1 2011-07-24 11:57:04

Mirovinben
M comme Mathusalem
Lieu : Dole (Jura)
Inscription : 2007-02-06
Site Web

Comment éliminer une catégorie de <tpl:EntryNext/Previous>

Bonjour,

Je suis en train de faire du ménage. J'ai créé une catégorie "A jeter" pour y affecter dans un premier temps les billets que j'envisage de supprimer dans un second temps.

Je sais comment ne pas afficher les billets de cette catégorie dans home.html :

<tpl:Entries category="A-jeter ?not">

Je sais comment ne pas afficher cette catégorie dans la liste des catégories grâce à un paramétrage du widget mrvbCategories proposé par mrvbCustomWidgets.

Ce que je ne sais pas faire, c'est d'empêcher l'affichage d'un billet ayant cette catégorie dans les boucles <tpl:EntryNext> et <tpl:EntryPrevious>. Je suis allé faire un tour du côté de class.dc.blog.php qui fournit getNextPost et class.dc.template qui fournit les fonctions EntryNext et EntryPrevious utilisant getNextPost. Comme je ne souhaite pas "casser la garantie", j'aimerais ajouter des balises template de type block dans le _public.php de mon thème. Balises que j'utiliserai à la place des "normales" dans post.html. J'ignore comment m'y prendre, une simple copie des fonctions "améliorées" ne suffisant pas à cause du

$next_post = $core->blog->getNextPost($_ctx->posts,(...)

.

Ma question de PHP-padawan-novice : Comment ajouter une fonction perso (basée sur getNextPost) dans $core->blog ?

Hors ligne

#2 2011-07-24 12:37:05

Franck
Footer de merde
Lieu : Paris
Inscription : 2004-11-09
Site Web

Re : Comment éliminer une catégorie de <tpl:EntryNext/Previous>

Rapidement il faudrait intervenir avant la récupération (lecture dans la base) et donc mettre en place un complément du type ' AND P.cat_id != '.$cat_id_to_exclude au $param['sql'] — mais je ne vois pas bien où le faire — ou bien contrôler après la lecture, grâce au behaviour coreBlogGetPosts qui permet de taper dans le $rs (recordset) consécutif à la lecture.


Dotclear addicted since 2004

Hors ligne

#3 2011-07-24 12:45:26

Mirovinben
M comme Mathusalem
Lieu : Dole (Jura)
Inscription : 2007-02-06
Site Web

Re : Comment éliminer une catégorie de <tpl:EntryNext/Previous>

C'est pour ça que j'étais prêt à copier/compléter/coller (avec ce qu'il fait dans la requête) getNextPost, EntryNext et EntryPrevious vers mon _public.php, sous d'autres noms. Le truc que je n'arrive pas à faire c'est de rendre possible un truc du genre "$core->blog->getMirovinbenNextPost".

Dernière modification par Mirovinben (2011-07-24 12:46:50)

Hors ligne

#4 2011-07-24 13:35:00

Franck
Footer de merde
Lieu : Paris
Inscription : 2004-11-09
Site Web

Re : Comment éliminer une catégorie de <tpl:EntryNext/Previous>

Ce sont les balises (ou plutôt le code qui gère celles-ci) tpl:EntryPrevious et tpl:EntryNext qui appellent $core->blog->getPreviousPost et $core->blog->getNextPost

Là il faudra que tu développes tes propres balises tpl:EntryMirovinbenNextPost et …PreviousPost pour qu'elles appellent tes fonctions que tu auras développées. Tu peux t'inspirer du code des balises originales pour ce faire.

Si tes fonctions getNext et getPrevious sont déclarées dans ton _public.php dans une classe mirovinbenMyClass (en public static function … ) alors tu les appelleras avec un mirovinbenMyClass::getNext et mirovinbenMyClass::getPrevious


Dotclear addicted since 2004

Hors ligne

#5 2011-07-24 13:48:18

Mirovinben
M comme Mathusalem
Lieu : Dole (Jura)
Inscription : 2007-02-06
Site Web

Re : Comment éliminer une catégorie de <tpl:EntryNext/Previous>

Je regarde tout ça. Merci.

Hors ligne

#6 2011-07-24 14:40:15

Mirovinben
M comme Mathusalem
Lieu : Dole (Jura)
Inscription : 2007-02-06
Site Web

Re : Comment éliminer une catégorie de <tpl:EntryNext/Previous>

Franck Paul a écrit :

Ce sont les balises (ou plutôt le code qui gère celles-ci) tpl:EntryPrevious et tpl:EntryNext qui appellent $core->blog->getPreviousPost et $core->blog->getNextPos

Je rectifie, au vu de ce que j'ai capté : core->blog->getPreviousPost n'existe pas. C'est core->blog->getNextPost avec un "-1" au bon endroit qui va chercher le billet précédent.

Franck Paul a écrit :

Si tes fonctions getNext et getPrevious sont déclarées dans ton _public.php dans une classe mirovinbenMyClass (en public static function … ) alors tu les appelleras avec un mirovinbenMyClass::getNext et mirovinbenMyClass::getPrevious

C'est donc ainsi qu'on appelle une fonction perso depuis un marqueur de template perso ? Ca à l'air de fonctionner sauf que...

Si j'ai dans mon _public.php (le code a été recopié telque, seule modif, l'appel à tplMrvb4::getNextPost2 dans EntryNext2 et EntryPrevious2) ça :

$core->tpl->addBlock('EntryNext2',array('tplMrvb4','EntryNext2'));
$core->tpl->addBlock('EntryPrevious2',array('tplMrvb4','EntryPrevious2'));

class tplMrvb4
{
	public static function getNextPost2($post,$dir,$restrict_to_category=false, $restrict_to_lang=false)
	{
		$dt = $post->post_dt;
		$post_id = (integer) $post->post_id;
		
		if($dir > 0) {
               $sign = '>';
               $order = 'ASC';
          }
          else {
               $sign = '<';
               $order = 'DESC';
          }
		
		$params['post_type'] = $post->post_type;
		$params['limit'] = 1;
		$params['order'] = 'post_dt '.$order.', P.post_id '.$order;
		$params['sql'] =
		'AND ( '.
		"	(post_dt = '".$this->con->escape($dt)."' AND P.post_id ".$sign." ".$post_id.") ".
		"	OR post_dt ".$sign." '".$this->con->escape($dt)."' ".
		') ';
		
		if ($restrict_to_category) {
			$params['sql'] .= $post->cat_id ? 'AND P.cat_id = '.(integer) $post->cat_id.' ' : 'AND P.cat_id IS NULL ';
		}
		
		if ($restrict_to_lang) {
			$params['sql'] .= $post->post_lang ? 'AND P.post_lang = \''. $this->con->escape($post->post_lang) .'\' ': 'AND P.post_lang IS NULL ';
		}
		
		$rs = $this->getPosts($params);
		
		if ($rs->isEmpty()) {
			return null;
		}
		
		return $rs;
	}
	
	public static function EntryNext2($attr,$content)
	{
		$restrict_to_category = !empty($attr['restrict_to_category']) ? '1' : '0';
		$restrict_to_lang = !empty($attr['restrict_to_lang']) ? '1' : '0';
		
		return
		'<?php $next_post = tplMrvb4::getNextPost2($_ctx->posts,1,'.$restrict_to_category.','.$restrict_to_lang.'); ?>'."\n".
		'<?php if ($next_post !== null) : ?>'.
			
			'<?php $_ctx->posts = $next_post; unset($next_post);'."\n".
			'while ($_ctx->posts->fetch()) : ?>'.
			$content.
			'<?php endwhile; $_ctx->posts = null; ?>'.
		"<?php endif; ?>\n";
	}
	
	public static function EntryPrevious2($attr,$content)
	{
		$restrict_to_category = !empty($attr['restrict_to_category']) ? '1' : '0';
		$restrict_to_lang = !empty($attr['restrict_to_lang']) ? '1' : '0';
		
		return
		'<?php $prev_post = tplMrvb4::getNextPost2($_ctx->posts,-1,'.$restrict_to_category.','.$restrict_to_lang.'); ?>'."\n".
		'<?php if ($prev_post !== null) : ?>'.
			
			'<?php $_ctx->posts = $prev_post; unset($prev_post);'."\n".
			'while ($_ctx->posts->fetch()) : ?>'.
			$content.
			'<?php endwhile; $_ctx->posts = null; ?>'.
		"<?php endif; ?>\n";
	}

}

Ca couine beaucoup avec comme premier message d'erreur bloquant

Fatal error: Using $this when not in object context in M:\www\dc2themes\mrvb4\_public.php on line xxx

Fait référence dans getNextPost2 à

$this->con->escape($dt)

Je devine bien qu'il y a un pb d'appel à des fonctions liées à l'objet $this->con mais ne vois pas comment parer à ça. Sans doute tout bête mais je bloque complètement avec ces objets "globaux" et comment les récupérer/appeler depuis le _public.php de mon thème.

Je me demande d'ailleurs si c'est bien normal d'utiliser la fonction getNextPost2 sans l'avoir déclarée/référencée ailleurs, avant class tplMrvb4 {...}... ???

Dernière modification par Mirovinben (2011-07-24 14:44:29)

Hors ligne

#7 2011-07-26 10:08:28

Mirovinben
M comme Mathusalem
Lieu : Dole (Jura)
Inscription : 2007-02-06
Site Web

Re : Comment éliminer une catégorie de <tpl:EntryNext/Previous>

Franck Paul m'a donné un joli coup de main en privé. Le résultat de nos échanges pouvant en intéresser d'autres est...

<?php 

$core->tpl->addBlock('mrvbEntryNext',array('tplMrvb4','EntryNext'));
$core->tpl->addBlock('mrvbEntryPrevious',array('tplMrvb4','EntryPrevious'));

class tplMrvb4
{
	public static function EntryNext($attr,$content)
	{
		$restrict_to_category = !empty($attr['restrict_to_category']) ? '1' : '0';
		$restrict_to_lang = !empty($attr['restrict_to_lang']) ? '1' : '0';
		$exclude_category = isset($attr['exclude_category']) ? $attr['exclude_category'] : "";
	
		return
		'<?php $next_post = tplMrvb4::getNextPost($_ctx->posts,1,'.$restrict_to_category.','.$restrict_to_lang.',\''.$exclude_category.'\'); ?>'."\n".
		'<?php if ($next_post !== null) : ?>'.
		
			'<?php $_ctx->posts = $next_post; unset($next_post);'."\n".
			'while ($_ctx->posts->fetch()) : ?>'.
			$content.
			'<?php endwhile; $_ctx->posts = null; ?>'.
		"<?php endif; ?>\n";
	}

	public static function EntryPrevious($attr,$content)
	{
		$restrict_to_category = !empty($attr['restrict_to_category']) ? '1' : '0';
		$restrict_to_lang = !empty($attr['restrict_to_lang']) ? '1' : '0';
		$exclude_category = isset($attr['exclude_category']) ? $attr['exclude_category'] : '';
	
		return
		'<?php $prev_post = tplMrvb4::getNextPost($_ctx->posts,-1,'.$restrict_to_category.','.$restrict_to_lang.',\''.$exclude_category.'\'); ?>'."\n".
		'<?php if ($prev_post !== null) : ?>'.
		
			'<?php $_ctx->posts = $prev_post; unset($prev_post);'."\n".
			'while ($_ctx->posts->fetch()) : ?>'.
			$content.
			'<?php endwhile; $_ctx->posts = null; ?>'.
		"<?php endif; ?>\n";
	}
	
	public static function getNextPost($post,$dir,$restrict_to_category=false,$restrict_to_lang=false,$exclude_category='')
	{
		global $core;
		
		$dt = $post->post_dt;
		$post_id = (integer) $post->post_id;
		
		if($dir > 0) {
			$sign = '>';
			$order = 'ASC';
		}
		else {
			$sign = '<';
			$order = 'DESC';
		}
		
		$params['post_type'] = $post->post_type;
		$params['limit'] = 1;
		$params['order'] = 'post_dt '.$order.', P.post_id '.$order;
		$params['sql'] =
		'AND ( '.
		"	(post_dt = '".$core->con->escape($dt)."' AND P.post_id ".$sign." ".$post_id.") ".
		"	OR post_dt ".$sign." '".$core->con->escape($dt)."' ".
		') ';
		
		if ($restrict_to_category) {
			$params['sql'] .= $post->cat_id ? 'AND P.cat_id = '.(integer) $post->cat_id.' ' : 'AND P.cat_id IS NULL ';
		}
		
		if ($restrict_to_lang) {
			$params['sql'] .= $post->post_lang ? 'AND P.post_lang = \''. $core->con->escape($post->post_lang) .'\' ': 'AND P.post_lang IS NULL ';
		}
		
		if ($exclude_category != '') {
			$params['sql'] .= 'AND C.cat_url <> \''.$core->con->escape($exclude_category).'\' ';
		}
		
		$rs = $core->blog->getPosts($params);
		
		if ($rs->isEmpty()) {
			return null;
		}
		
		return $rs;
	}

}

?>

On peut à présent exclure une catégorie dans post.html comme dans cet exemple extrait de mon thème :

<ul id="navlinks">
  <tpl:mrvbEntryNext exclude_category="A-jeter">
    <li class="next"><a href="{{tpl:EntryURL}}" title="{{tpl:lang next entry}}">{{tpl:EntryTitle encode_html="1"}}</a></li>
 </tpl:mrvbEntryNext>
    <li>{{tpl:EntryTitle encode_html="1"}}</li>
  <tpl:mrvbEntryPrevious exclude_category="A-jeter">
    <li class="prev"><a href="{{tpl:EntryURL}}" title="{{tpl:lang previous entry}}">{{tpl:EntryTitle encode_html="1"}}</a></li>
  </tpl:mrvbEntryPrevious>
</ul>

Hors ligne

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

Pied de page des forums

Sites map