Vous n'êtes pas identifié(e).
13 février 2024 Sortie de Dotclear 2.29
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 ?
Le B.A.BA : https://abc.dotaddict.org
La doc DC2 : https://fr.dotclear.org/documentation/2.0
Mes extensions : https://www.mirovinben.fr/blog/index.ph … pluginsDC2
Mes marqueurs de template : https://www.mirovinben.fr/blog/index.php?post/id3553
Hors ligne
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
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)
Le B.A.BA : https://abc.dotaddict.org
La doc DC2 : https://fr.dotclear.org/documentation/2.0
Mes extensions : https://www.mirovinben.fr/blog/index.ph … pluginsDC2
Mes marqueurs de template : https://www.mirovinben.fr/blog/index.php?post/id3553
Hors ligne
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
Je regarde tout ça. Merci.
Le B.A.BA : https://abc.dotaddict.org
La doc DC2 : https://fr.dotclear.org/documentation/2.0
Mes extensions : https://www.mirovinben.fr/blog/index.ph … pluginsDC2
Mes marqueurs de template : https://www.mirovinben.fr/blog/index.php?post/id3553
Hors ligne
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.
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)
Le B.A.BA : https://abc.dotaddict.org
La doc DC2 : https://fr.dotclear.org/documentation/2.0
Mes extensions : https://www.mirovinben.fr/blog/index.ph … pluginsDC2
Mes marqueurs de template : https://www.mirovinben.fr/blog/index.php?post/id3553
Hors ligne
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>
Le B.A.BA : https://abc.dotaddict.org
La doc DC2 : https://fr.dotclear.org/documentation/2.0
Mes extensions : https://www.mirovinben.fr/blog/index.ph … pluginsDC2
Mes marqueurs de template : https://www.mirovinben.fr/blog/index.php?post/id3553
Hors ligne
Vous n'êtes pas identifié(e).