Dotclear

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

Annonce

13 février 2024 Sortie de Dotclear 2.29

#1 2021-05-12 17:08:54

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

Problème dans un configurateur de thème

Bonjour,

Je bricole un nouveau thème (Éditorial) et j'essaie d'ajouter un configurateur. Les options du thème permettent d'afficher sur la page d'accueil :

- soit la liste des billets, avec le plus récent mis en valeur et les autres à la suite
- soit un billet particulier mis en valeur, puis à la suite les autres billets

Il me faut donc, en fonction du choix opéré par l'utilisateur dans la configuration du thème, servir une page home.html différente

Côté administration du thème, je parviens à enregistrer l'option choisie, mais côté public je coince. J'ai créé une balise de template qui devrait permettre de choisir un fichier de template différent pour la page d'accueil, mais je ne parviens pas à inclure le fichier correspondant au choix

Voici où j'en suis (le thème est basé sur le jeu de templates dotty):

home.html

{{tpl:extends parent="__layout.html"}}

<tpl:Block name="main-content">
{{tpl:editorialEntriesList}}
</tpl:Block>

J'ai ensuite deux templates home-default.html et home-featured-post.html

home-default.html

<div class="posts">
    <tpl:Entries>
        <!-- # First page -->
        <tpl:SysIf current_mode="default">
            <tpl:LoopPosition start="1" length="1">
                {{tpl:include src="_entry-featured.html"}}
            </tpl:LoopPosition>
            <tpl:LoopPosition start="2">
                {{tpl:include src="_entry-short.html"}}
            </tpl:LoopPosition>
        </tpl:SysIf>
        <!-- # Next pages -->
        <tpl:SysIf current_mode="!default">
            {{tpl:include src="_entry-short.html"}}
        </tpl:SysIf>
    </tpl:Entries>
</div>

<tpl:Entries>
    <tpl:EntriesFooter>
        {{tpl:include src="_pagination.html"}}
    </tpl:EntriesFooter>
</tpl:Entries>

home-featured-post.html

<div class="posts">
    <tpl:Entries">
        <!-- # First page -->
        <tpl:SysIf current_mode="default">
            <tpl:Entries url="{{tpl:featuredPostURL}}">
                {{tpl:include src="_entry-featured.html"}}
            </tpl:Entries>
            <tpl:EntryIf url="!{{tpl:featuredPostURL}}">
                {{tpl:include src="_entry-short.html"}}
            </tpl:EntryIf>
        </tpl:SysIf>
        <!-- # Next pages -->
        <tpl:SysIf current_mode="!default">
            <tpl:EntryIf url="!{{tpl:featuredPostURL}}">
                {{tpl:include src="_entry-short.html"}}
            </tpl:EntryIf>
        </tpl:SysIf>
        </tpl:Entries>
</div>

<tpl:Entries>
    <tpl:EntriesFooter>
        {{tpl:include src="_pagination.html"}}
    </tpl:EntriesFooter>
</tpl:Entries>

et enfin le fichier _public.php qui contient la balise de template {{tpl:editorialEntriesList}} appelée par home.html

if (!defined('DC_RC_PATH')) { return; }

l10n::set(dirname(__FILE__).'/locales/'.$_lang.'/main');

$core->tpl->addValue('editorialEntriesList', ['featuredPostTpl', 'editorialEntriesList']);
$core->tpl->addValue('featuredPostURL', ['featuredPostTpl', 'featuredPostURL']);

class featuredPostTpl
{
    public static function editorialEntriesList($attr)
    {
        global $core;

        $editorial_user = $core->blog->settings->themes->get($core->blog->settings->system->theme . '_featured');
        $editorial_user = @unserialize($editorial_user);

        $featuredPostURL = $editorial_user['static_home_url'];

        if ($featuredPostURL =='') {
            return '<?php echo "<p>default</p>" ?>';
            $core->tpl->includeFile(dirname(__FILE__) . '/tpl/home-default.html');
            
        } else {
            return '<?php echo "<p>home featured post</p>" ?>';
            $core->tpl->includeFile(dirname(__FILE__) . '/tpl/home-featured-post.html');
            
        }

    }

    

    public static function featuredPostURL($attr)
    {
        global $core;
        
        $editorial_user = $core->blog->settings->themes->get($core->blog->settings->system->theme . '_featured');
        $editorial_user = @unserialize($editorial_user);

        $featuredPostURL = $editorial_user['static_home_url'];
        return $featuredPostURL;
    }
}

Ce qui marche : si l'utilisateur a choisi l'affichage par défaut, la page d'accueil affiche "default", s'il a choisi l'affichage d'un billet particulier la page d'accueil affiche "home featured post". La balise est donc bien interprétée et renvoie le paragraphe voulu selon le réglage choisi. Mais l'inclusion du template correspondant n'est pas effectuée, sur la ligne :

$core->tpl->includeFile(dirname(__FILE__) . '/tpl/home-default.html');

Quelqu'un pourrait-il me dire ce que je fais mal ?

Hors ligne

#2 2021-05-13 06:32:38

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

Re : Problème dans un configurateur de thème

J'ai un peu avancé et repris depuis le début. J'arrive maintenant à servir le template voulu pour la page d'accueil avec le code suivant

home.html

<tpl:Block name="main-content">
    <tpl:editorialDefaultIf>
        {{tpl:include src="home-default.html"}}
    </tpl:editorialDefaultIf>
    <tpl:editorialFeaturedIf>
        {{tpl:include src="home-featured-post.html"}}
    </tpl:editorialFeaturedIf>
</tpl:Block>

et dans _public.php, avec deux nouvelles balises de type block

if (!defined('DC_RC_PATH')) { return; }

l10n::set(dirname(__FILE__).'/locales/'.$_lang.'/main');

$core->tpl->addBlock('editorialDefaultIf', ['featuredPostTpl', 'editorialDefaultIf']);
$core->tpl->addBlock('editorialFeaturedIf', ['featuredPostTpl', 'editorialFeaturedIf']);

$core->tpl->addValue('featuredPostURL', ['featuredPostTpl', 'featuredPostURL']);


class featuredPostTpl
{
    public static function editorialDefaultIf($attr, $content)
    {
        global $core;

        $editorial_user = $core->blog->settings->themes->get($core->blog->settings->system->theme . '_featured');
        $editorial_user = @unserialize($editorial_user);

        $featuredPostURL = $editorial_user['static_home_url'];

        if ($featuredPostURL =='') {
            return $content;
            
        } else {
            return;
        }

    }

    public static function editorialFeaturedIf($attr, $content)
    {
        global $core;

        $editorial_user = $core->blog->settings->themes->get($core->blog->settings->system->theme . '_featured');
        $editorial_user = @unserialize($editorial_user);

        $featuredPostURL = $editorial_user['static_home_url'];

        if ($featuredPostURL !='') {
            return $content;
            
        } else {
            return;
        }

    }
    
    public static function featuredPostURL($attr)
    {
        global $core;
        
        $editorial_user = $core->blog->settings->themes->get($core->blog->settings->system->theme . '_featured');
        $editorial_user = @unserialize($editorial_user);

        $featuredPostURL = $editorial_user['static_home_url'];
		return
		'<?php echo "'.$featuredPostURL.'"; ?>';       
    }
}

Les deux fichiers home-default.html et home-featured-post.html sont maintenant servis avec succès selon le choix opéré dans l'administration du thème : affichage standard (à la une le billet le plus récent) ou affichage personnalisé (à la une le billet choisi par l'utilisateur).

L'affichage standard fonctionne, mais pas l'affichage personnalisé, à cause de la balise {{tpl:entryFeaturedPost}} dans home-featured-post.html, qui est elle-même incluse dans la balise  <tpl:Entries>

<tpl:Entries url="{{tpl:featuredPostURL}}">

Il semble que cette inclusion ne soit pas possible, car dans le cache de templates (cbtpl) elle est rendue telle quelle et non interprétée

$params['post_url'] = '{{tpl:featuredPostURL}}';

ce qui provoque une erreur car ce n'est évidemment pas l'url du billet. Précisons que la balise fonctionne en dehors de la boucle tpl:Entries...

Me voilà encore bien embêté, toute piste serait la bienvenue :D

Hors ligne

#3 2021-05-13 06:46:42

nikrou
Membre
Inscription : 2007-10-02
Site Web

Re : Problème dans un configurateur de thème

J'étais en train de regarder mais tu vas plus vite que moi !

$core->tpl->includeFile(dirname(__FILE__) . '/tpl/home-default.html');

Ce code ne pouvait pas fonctionner car la méthode includeFile attend un tableau avec comme entrée src et un fichier relatif qui sera cherché dans les thèmes disponibles.

Mais j'en étais au même point que toi où il vallait mieux passer par une nouvelle balise en fonction du type choisi.

Dernière modification par nikrou (2021-05-13 06:47:31)


Je préfère être atteint de parkinson plutôt qu'alzheimer : je prefère renverser un peu de ma bière plutôt qu'oublier de la boire !

Présentez vos photos simplement avec Phyxo !

Hors ligne

#4 2021-05-13 06:57:37

nikrou
Membre
Inscription : 2007-10-02
Site Web

Re : Problème dans un configurateur de thème

Je ne pense pas qu'il soit possible de faire ce que tu veux faire. Les attributs des blocs ne sont pas interprétés comme d'éventuels blocs mais comme de simple valeur.

En revanche tu dois pouvoir injecter l'url dans la recherche des billets en utilisant le Behavior qui va bien


Je préfère être atteint de parkinson plutôt qu'alzheimer : je prefère renverser un peu de ma bière plutôt qu'oublier de la boire !

Présentez vos photos simplement avec Phyxo !

Hors ligne

#5 2021-05-13 07:03:18

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

Re : Problème dans un configurateur de thème

nikrou a écrit :

En revanche tu dois pouvoir injecter l'url dans la recherche des billets en utilisant le Behavior qui va bien

Merci d'avoir regardé nikrou. Pourrais-tu préciser ce que tu entends par le "Behaviorkivabien" ?

Hors ligne

#6 2021-05-13 07:10:15

nikrou
Membre
Inscription : 2007-10-02
Site Web

Re : Problème dans un configurateur de thème

J'ai trouvé le Behavior dans la classe dcBloc, dans la méthode getPosts() qui définit les paramètres pour récupérer les billets.

$core->tpl->addBlock('coreBlogBeforeGetPosts', ['behaviorFeaturedTheme', 'coreBlogBeforeGetPosts']);

class behaviorFeaturedTheme
{
   public static function coreBlogBeforeGetPosts($params)
  {
      // injection de l'URL en fonction du type
  }
}

Je préfère être atteint de parkinson plutôt qu'alzheimer : je prefère renverser un peu de ma bière plutôt qu'oublier de la boire !

Présentez vos photos simplement avec Phyxo !

Hors ligne

#7 2021-05-13 07:20:20

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

Re : Problème dans un configurateur de thème

Merci pour la piste, je vais essayer (quand j'aurai compris comment l'appliquer^^) de m'en inspirer

Hors ligne

#8 2021-05-13 09:28:29

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

Re : Problème dans un configurateur de thème

J'ai fait quelques modifications selon le conseil de nikrou, mais ce n'est pas encore ça^^

J'ai ajouté la balise de type block le behavior dans mon _public.php

$core->addBehavior('coreBlogBeforeGetPosts', ['featuredPostTpl', 'coreBlogBeforeGetPosts']);

public static function coreBlogBeforeGetPosts($params)
    {
        global $core;

        $editorial_user = $core->blog->settings->themes->get($core->blog->settings->system->theme . '_featured');
        $editorial_user = @unserialize($editorial_user);

        $featuredPostURL = $editorial_user['static_home_url'];

        if ($core->url->type == 'default' && $featuredPostURL !== '') {
            $params['post_url'] = $featuredPostURL;
        }
    }

et modifié home.html pour y inclure cette balise

{{tpl:extends parent="__layout.html"}}

<tpl:Block name="main-content">
    <tpl:coreBlogBeforeGetPosts>
        <div class="posts">
            <tpl:Entries>
                <!-- # First page -->
                <tpl:SysIf current_mode="default">
                    <tpl:LoopPosition start="1" length="1">
                        {{tpl:include src="_entry-featured.html"}}
                    </tpl:LoopPosition>
                    <tpl:LoopPosition start="2">
                        {{tpl:include src="_entry-short.html"}}
                    </tpl:LoopPosition>
                </tpl:SysIf>
                <!-- # Next pages -->
                <tpl:SysIf current_mode="!default">
                    {{tpl:include src="_entry-short.html"}}
                </tpl:SysIf>
            </tpl:Entries>
        </div>

        <tpl:Entries>
            <tpl:EntriesFooter>
                {{tpl:include src="_pagination.html"}}
            </tpl:EntriesFooter>
        </tpl:Entries>
    </tpl:coreBlogBeforeGetPosts>
</tpl:Block> <!-- # main-content -->

Les fichiers de template home-default.html et home-featured-post.html ne sont donc plus appelés. Mais rien ne s'affiche (pas d'erreur ou warning).

Je croyais que coreBlogBeforeGetPosts, telle quelle, permettrait de n'afficher au moins, sur la page d'accueil, que le billet choisi. Mais rien. Et si aucun billet n'est choisi, pas d'affichage non plus. Je creuse...

Dernière modification par Philippe (2021-05-14 08:50:32)

Hors ligne

#9 2021-05-18 06:49:41

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

Re : Problème dans un configurateur de thème

Philippe a écrit :

Je croyais que coreBlogBeforeGetPosts, telle quelle, permettrait de n'afficher au moins, sur la page d'accueil, que le billet choisi. Mais rien. Et si aucun billet n'est choisi, pas d'affichage non plus. Je creuse...

Cent fois sur le métier remettez votre ouvrage...

Ça fonctionne maintenant un peu mieux en supprimant dans home.html la balise <tpl:coreBlogBeforeGetPosts> qui n'en est pas une ^^ (c'est un behavior).

Pour résumer donc :

- si je ne choisis pas de billet pour la une du blog, tout marche, c'est le billet le plus récent qui est à la une
- si je choisis un billet pour le mettre à la une, je n'ai que celui-ci, ce qui me paraît cohérent avec le code

Voici maintenant le contenu de _public.php

if (!defined('DC_RC_PATH')) { return; }

l10n::set(dirname(__FILE__).'/locales/'.$_lang.'/main');

$core->addBehavior('coreBlogBeforeGetPosts', ['featuredPostTpl', 'coreBlogBeforeGetPosts']);


class featuredPostTpl
{
    public static function coreBlogBeforeGetPosts($params)
    {
        global $core;

        $editorial_user = $core->blog->settings->themes->get($core->blog->settings->system->theme . '_featured');
        $editorial_user = @unserialize($editorial_user);

        $featuredPostURL = $editorial_user['static_home_url'];

        if ($core->url->type == 'default' && $featuredPostURL !== '') {
            $params['post_url'] = $featuredPostURL;
        }
    }
}

Le fichier home.html est maintenant celui d'origine (copie de dotty pour <tpl:Block name="main-content">)

Reste plus qu'à afficher les autres billets dans le cas où on choisit d'afficher un billet particulier à la une :D

Edit : si quelqu'un a une idée et veut tester, le thème est ici

Dernière modification par Philippe (2021-05-18 07:22:55)

Hors ligne

#10 2021-05-24 17:50:01

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

Re : Problème dans un configurateur de thème

\o/\o/\o/

J'ai finalement réussi. La solution est un peu alambiquée mais semble fonctionner parfaitement. J'ai repris l'idée de deux fichiers de template pour la page d'accueil : home-default.html et home-featured-post.html, appelés selon le choix de l'utilisateur dans la configuration du thème.

Le thème est disponible ici, pour les plus curieux, et arrivera bientôt sur dotaddict

Je vais pouvoir maintenant m'amuser à créer d'autres options de configuration ;)

Hors ligne

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

Pied de page des forums

Sites map