Dotclear

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

Annonce

13 février 2024 Sortie de Dotclear 2.29

#1 2018-06-24 13:13:38

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

Obtenir la liste des billets d'une série

Bonjour

Je souhaite afficher, pour le billet courant, la liste des billets affectés à la même série que lui

J'ai créé pour cela une balise de template dans le fichier _public.php de mon thème, appelée depuis post.html, mais je coince sur comment récupérer la série d'un billet, puis trouver tous les autres billets de la série

Voici mon premier essai :

$core->tpl->addValue('EntrySeriesImages', array('tplSeriesImages', 'EntrySeriesImages'));

class tplSeriesImages
{
    public static function EntrySeriesImages()
    {
        return
		'<?php
        global $core, $_ctx;
        $metas = unserialize($_ctx->posts->post_meta);
        $serie = \'plougue\';
        $params = array();
        $params[\'no_content\'] = true;
        $params[\'meta_id\']   = $serie;
        $params[\'meta_type\'] = \'serie\';
        $params[\'post_type\'] = array(\'post\');

        $posts = $core->blog->getPosts($params);

        $res = \'<ul>\';
        while ($posts->fetch()) {
            $res .= \'<li>\'.html::escapeHTML($posts->post_title).\'</li>\';
        }

        $res .= \'</ul>\';
        echo $res;
        ?>';
    }
}

Je cherche à récupérer le titre de chacun des billets de la série "plougue", mais en l'état je récupère la liste de tous les billets, y compris ceux d'un autre type que post malgré le paramètre idoine...

Si un sorcier pouvait me donner une petite indication du comment procéder ?

Dernière modification par Philippe (2018-06-24 13:23:47)

Hors ligne

#2 2018-06-24 16:07:22

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

Re : Obtenir la liste des billets d'une série

Tu sais que le plugin Séries emporte un widget qui fait ça (liste des billets de la même série) ? Jette un œil au code ;-)

Exemple : https://open-time.net/post/2012/03/21/P … -marocaine, regarde le début de la sidebar, bloc « Dans la même série »


Dotclear addicted since 2004

Hors ligne

#3 2018-06-24 16:08:21

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

Re : Obtenir la liste des billets d'une série

Franck a écrit :

Tu sais que le plugin Séries emporte un widget qui fait ça (liste des billets de la même série) ? Jette un œil au code ;-)

Exemple : https://open-time.net/post/2012/03/21/P … -marocaine, regarde le début de la sidebar, bloc « Dans la même série »

Et si le widget en sidebar ne convient pas, tu peux récupérer le code dudit widget et le placer où tu voudras dans ton template.


Dotclear addicted since 2004

Hors ligne

#4 2018-06-24 16:22:59

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

Re : Obtenir la liste des billets d'une série

Oui, j'avais déjà vu le widget, mais en l'état il ne me convenait pas tout à fait : je veux en effet construire ma liste de billets avec la première image de chacun, extraite par listImages, ce que ne permettra pas le widget.

Je vais regarder à nouveau le code dudit widget, mais avec un doute car je ne sais pas encore traduire cela pour ma balise de template. J'y retourne.

Hors ligne

#5 2018-06-24 17:12:25

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

Re : Obtenir la liste des billets d'une série

Ça marche en partant du widget, dont j'ai enfin réussi à un peu beaucoup adapter le code.

Merci de m'avoir mis sur la bonne piste :)

Hors ligne

#6 2018-06-24 17:36:37

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

Re : Obtenir la liste des billets d'une série

Arf, pas encore ça : il me reste à apprivoiser le cache de templates, car en l'état ce sont toujours les mêmes billets qui sont récupérés :(

Voici le code :

$core->tpl->addValue('EntrySeriesImages', array('tplSeriesImages', 'EntrySeriesImages'));

class tplSeriesImages
{
    public static function EntrySeriesImages()
    {
        global $core, $_ctx;

        $size = 't';
		$html_tag = 'none';
		$link = 'none';
		$exif = 0;
		$legend = 'none';
		$bubble = 'entry';
		$from = 'full';
		$start = 1;
		$length = 1;
		$class = '';
		$alt = 'none';
		$img_dim = 'none';
        $def_size="o";

        if ($core->url->type != 'post') {
            return;
        }

        $metas = unserialize($_ctx->posts->post_meta);
        if (isset($metas['serie'])) {
            $sql = 'SELECT * FROM ' .
            $core->prefix . 'meta as m,' .
            $core->prefix . 'post as p ' .
            ' WHERE m.post_id = p.post_id ' .
            ' AND post_type = \'post\' ' .
            ' AND post_status = 1 ' .
            ' AND blog_id = \'' . $core->blog->id . '\'' .
                ' AND meta_type = \'serie\' AND ( ';
            foreach ($metas['serie'] as $key => $meta) {
                $sql .= " meta_id = '" . $meta . "' ";
                if ($key < count($metas['serie']) - 1) {
                    $sql .= ' OR ';
                }
            }
            $sql .= ')';
            $order = 'asc';
            $sql .= ' ORDER BY meta_id ' . ($order == 'asc' ? 'ASC' : 'DESC') . ', ';
            $sort = 'date';
            $order = 'asc';

            $sql .= ($sort == 'date' ? 'p.post_dt' : 'p.post_title') . ' ' . ($order == 'asc' ? 'ASC' : 'DESC');
            $rs = $core->con->select($sql);
            if ($rs->isEmpty()) {
                return;
            }
        } else {
            return;
        }

        $res = '';

        $serie = '';
        $list  = '';
        while ($rs->fetch()) {
            $class = '';
            $link  = true;
            if ($rs->post_id == $_ctx->posts->post_id) {
                $class = ' class="current"';
                $link = true;
            }

            if ($rs->meta_id != $serie) {
                if ($serie != '') {
                    $list .= '</ul>' . "\n";
                }

                $list .= '<ul>' . "\n";
                $serie = $rs->meta_id;
            }

            $list .= '<li' . $class . '>' .
            ($link ? '<a href="' . $core->blog->url . $core->getPostPublicURL($rs->post_type, html::sanitizeURL($rs->post_url)) . '">' : '') .
            tplEntryImages::EntryImagesHelper($size, $html_tag, $link, $exif, $legend, $bubble, $from, $start, $length, $class, $alt, $img_dim, $def_size, $rs) .
                ($link ? '</a>' : '') .
                '</li>' . "\n";
        }
        if ($list == '') {
            return;
        }
        $res .= $list . '</ul>' . "\n";

        return $res;
    }
}

Hors ligne

#7 2018-06-24 19:15:29

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

Re : Obtenir la liste des billets d'une série

Je jetterai un œil ASAP Philippe ;-)


Dotclear addicted since 2004

Hors ligne

#8 2018-06-25 07:32:48

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

Re : Obtenir la liste des billets d'une série

Si tu as le temps, ce serait chouette : je m'arrache les cheveux à échapper tout ça pour envoyer du php dans le cache

Edit : ne cherche pas, j'ai fini par y arriver \o/

À tout hasard, je mets ici le code de la fonction. Elle est assez spécifique, mais ça donnera peut-être une piste à ceux qui cherchent à faire quelque chose de similaire avec les plugins series et listImages...

$core->tpl->addValue('EntrySeriesImages', array('tplSeriesImages', 'EntrySeriesImages'));

class tplSeriesImages
{
    public static function EntrySeriesImages()
    {
        return
	'<?php
	global $core, $_ctx;

        $size = \'t\';
	$html_tag = \'none\';
	$link = \'none\';
	$exif = 0;
	$legend = \'none\';
	$bubble = \'entry\';
	$from = \'full\';
	$start = 1;
	$length = 1;
	$class = \'\';
	$alt = \'none\';
	$img_dim = \'none\';
        $def_size = \'o\';

        if ($core->url->type != \'post\') {
            return;
        }

        $metas = unserialize($_ctx->posts->post_meta);

        if (isset($metas[\'serie\'])) {
            $sql = \'SELECT * FROM \' .
            $core->prefix . \'meta as m,\' .
            $core->prefix . \'post as p \' .
            \' WHERE m.post_id = p.post_id \'.
            \' AND post_type = "post" \' .
            \' AND post_status = 1 \' .
            \' AND blog_id = "new" \'.
            \' AND meta_type = "serie" AND ( \';
            foreach ($metas[\'serie\'] as $key => $meta) {
                $sql .= " meta_id = \'" . $meta . "\' ";
                if ($key < count($metas[\'serie\']) - 1) {
                    $sql .= \' OR \';
                }
            }
            $sql .= \')\';
            $order = \'asc\';
            $sql .= \' ORDER BY meta_id \' . ($order == \'asc\' ? \'ASC\' : \'DESC\') . \', \';
            $sort = \'date\';
            $order = \'asc\';

            $sql .= ($sort == \'date\' ? \'p.post_dt\' : \'p.post_title\') . \' \' . ($order == \'asc\' ? \'ASC\' : \'DESC\');
            $rs = $core->con->select($sql);
            if ($rs->isEmpty()) {
                return;
            }
        } else {
            return;
        }

        $res = "";

        $serie = "";
        $list  = "";
        while ($rs->fetch()) {
            $class = "";
            $link  = true;
            if ($rs->post_id == $_ctx->posts->post_id) {
                $class = \' class="current"\';
                $link = false;
            }

            if ($rs->meta_id != $serie) {
                if ($serie != "") {
                    $list .= \'</ul>\' . "\n";
                }

               $list .= \'<ul>\' . "\n";
                $serie = $rs->meta_id;
            }

            $list .= \'<li\' . $class . \'>\' .
            ($link ? \'<a href="\' . $core->blog->url . $core->getPostPublicURL($rs->post_type, html::sanitizeURL($rs->post_url)) . \'">\' : "") .
            tplEntryImages::EntryImagesHelper($size, $html_tag, $link, $exif, $legend, $bubble, $from, $start, $length, $class, $alt, $img_dim, $def_size, $rs) .
                ($link ? \'</a>\' : \'\') .
                \'</li>\' . "\n";
        }
        if ($list == "") {
            return;
        }
        $res .= $list . \'</ul>\' . "\n";

	echo $res;
        ?>';
    }
}

Et c'est visible ici (en bas de page : Dans les mêmes teintes)

Dernière modification par Philippe (2018-06-25 09:05:52)

Hors ligne

#9 2018-06-26 09:19:05

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

Re : Obtenir la liste des billets d'une série

En fait le code est pas mal (pas testé mais il a l'air), sauf qu'en l'espèce, la fonction appelée EntrySeriesImages() lorsque le thème est compilé, devrait retourner le code PHP qui doit tourner, pas son résultat, ce que tu fais :-)

Donc ce que devrais normalement faire cette fonction : récupérer les paramètres du bloc <tpl:… ou de la valeur {{tpl:… et composer avec le code PHP qui retournera la liste qui t'intéresse.

Regarde dans le _public.php du plugin series si tu cherches des exemples


Dotclear addicted since 2004

Hors ligne

#10 2018-06-26 10:11:56

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

Re : Obtenir la liste des billets d'une série

Franck a écrit :

...la fonction appelée EntrySeriesImages() lorsque le thème est compilé, devrait retourner le code PHP qui doit tourner, pas son résultat, ce que tu fais :-)

Là je dois avouer que je ne comprends pas cette notion...

Hors ligne

#11 2018-06-26 11:35:02

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

Re : Obtenir la liste des billets d'une série

Quand le compilateur de template rencontre une balise <tpl… ou un {{tpl:… dans un fichier, il va utiliser la fonction déclarée pour récupérer le code PHP qui sera ensuite inséré dans le fichier compilé (et rangé dans le cache des templates).

Ensuite, quand cette page sera demandée, elle sera lue dans le cache des template et c'est donc ce code qui aura été fourni par la fonction template qui tournera.

Ce que tu fais c'est fournir directement une liste de billet (<ul…) et pas le code qui génère cette liste, d'où ta liste qui ne varie jamais (c'est la 1re demandée qui reste en permanence).

Tu vois l'idée ?


Dotclear addicted since 2004

Hors ligne

#12 2018-06-26 12:27:17

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

Re : Obtenir la liste des billets d'une série

Euh... non, la liste n'est pas toujours la même car c'est bien le code qui génère la liste qui est placé dans le cache de templates. En #8 la fonction commence par

return

'<?php
...

Et ça fonctionne bien avec le cache de templates et staticCache activés.
Maintenant, je te crois sur parole si tu me dis qu'il y avait plus simple;)

Hors ligne

#13 2018-06-26 16:59:43

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

Re : Obtenir la liste des billets d'une série

Philippe a écrit :

Euh... non, la liste n'est pas toujours la même car c'est bien le code qui génère la liste qui est placé dans le cache de templates. En #8 la fonction commence par

return

'<?php
...

Et ça fonctionne bien avec le cache de templates et staticCache activés.
Maintenant, je te crois sur parole si tu me dis qu'il y avait plus simple;)

Ah mais tu as raison, my bad!


Dotclear addicted since 2004

Hors ligne

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

Pied de page des forums

Sites map