Forum CMS Made Simple FR
[résolu]Menus. gabarits perso ? - Version imprimable

+- Forum CMS Made Simple FR (https://forum.cmsmadesimple.fr)
+-- Forum : Général (https://forum.cmsmadesimple.fr/forum-3.html)
+--- Forum : Général (https://forum.cmsmadesimple.fr/forum-10.html)
+--- Sujet : [résolu]Menus. gabarits perso ? (/thread-2352.html)



[résolu]Menus. gabarits perso ? - elz64 - 09/11/2012

Citation :#~~~~~ DEBUT BLOC A NE PAS SUPPRIMER ~~~~~
#~ Version du CMS: 1.11.2.1
#~ Url du site :
#~ Hébergeur / Soft :
#~ Informations Système :
#~~~~~ FIN BLOC A NE PAS SUPPRIMER ~~~~~

Bonjour,

Je ne trouve pas de doc sur comment faire un tpl de menu.

le tag {menu} n'est pas trop mal fichu mais je veux faire autre chose et maitriser la totalité des class et la structure (avec <nav> notamment).

Je veux appliquer ceci: berkhamsted-web-design.co.uk/2012/07/cmsms-menus-and-twitter-bootstrap/
mais en fait je ne vois pas où le faire ?

voila le haut du tpl perso:
Code :
[== Indéfini ==]
{process_pagedata}
{strip} {* use strip to get rid of whitespace *}

{if !isset($get_title)}
{title assign='get_title'}
{/if}
{/strip}
{* With cms_lang_info we retrieve current language information, assign gives us $nls variable we can work with *}
{cms_lang_info assign='nls'}
{* using strip as we don't want useless whitespace, especially not before doctype *}
{/strip}
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html lang='{$nls->htmlarea()}' dir='{$nls->direction()}' class='no-js'>
<head>
<meta name="title" content="{$get_title} - {sitename}" />
<meta name="copyright" content="{sitename}" />
<meta name="description" content="{$get_content|strip_tags|truncate:'150'|strip}" />
<meta name="keywords" content="{search action='keywords' count='15'}" />
<meta name="language" content="{$lang}" />
<meta name="url" content="{root_url}" />
<meta name="identifier-URL" content="{root_url}" />
<meta name="revised" content="{modified_date format="%a, %d %b %Y %H:%M:%S"}" />
<meta name="original-source" content="{if isset($canonical)}{$canonical}{elseif isset($content_obj)}{$content_obj->GetURL()}{/if}" />

<meta name='viewport' content='initial-scale=1.0 maximum-scale=1.0 user-scalable=no' />
<meta name='HandheldFriendly' content='true' />
{* Don't remove this! Metadata is entered in Site Admin/Global settings. *}
{metadata}

{* See in news detail template how cannonical url can be assigned from module *}
{if isset($canonical)}<link rel='canonical' href='{$canonical}' />{elseif isset($content_obj)}<link rel='canonical' href='{$content_obj->GetURL()}' />{/if}

<link href="uploads/Bootstrap00/css/bootstrap.css" rel="stylesheet">
<link href="uploads/Bootstrap00/css/bootstrap-responsive.css" rel="stylesheet">
{cms_stylesheet}
<script src="lib/jquery/js/modernizr-2.6.2.js"></script>

{* Relational links for interconnections between pages, good for accessibility and Search Engine Optmization *}
{cms_selflink dir='start' rellink='1'}
{cms_selflink dir='prev' rellink='1'}
{cms_selflink dir='next' rellink='1'}
</head>
<body>

<!-- start header -->
<div id="header">
  <h1>{sitename}</h1>
</div>
<!-- end header -->

<!-- start menu -->
<div id="menu">
  {menu}
</div>
<!-- end menu -->

<!-- start content -->....


Merci



ps: le forum refuse les url dans les posts



[résolu]Menus. gabarits perso ? - bess - 09/11/2012

ouais, pas d'url pour les comptes < 15 posts, :/ ça nous évite totalement le spam depuis 6 mois, désolé pour le désagrément

Tu cherches à personnaliser ton propre gabarit de menu : va dans les options du module MenuManager, tu y trouveras sa liste de gabarit


[résolu]Menus. gabarits perso ? - elz64 - 09/11/2012

ok,

j'ai capté les tpl de menu mais j'ai encore pas mal de soucy pour les multi levels ( on va aller jusqu'à 2 subs) :

le code trouvé là :
berkhamsted-web-design.co.uk/2012/07/cmsms-menus-and-twitter-bootstrap/comment-page-1/#comment-6490

est imparfait ca ne marche pas pour déjà une histoire de class manquantes. Voici ma 1ère correction avec usage d'un nav parent :

Code :
[== Indéfini ==]
<ul class="nav"><li>
{foreach from=$nodelist item=node}
{if $node->depth > $node->prevdepth}
{repeat string="<ul class='dropdown-menu'>" times=$node->depth-$node->prevdepth}
{elseif $node->depth < $node->prevdepth}
{repeat string="</li></ul>" times=$node->prevdepth-$node->depth}
</li>
{elseif $node->index > 0}</li>
{/if}

{if $node->parent == true }

<li><a href="{$node->url}" data-toggle="dropdown">{$node->menutext} <b></b></a>

{elseif $node->haschildren == true and $node->type != 'sectionheader' and $node->type != 'separator'}
<li class='dropdown'><a href="{$node->url}" data-toggle="dropdown">{$node->menutext} <b></b></a>

{elseif $node->current == true}
<li><a href="{$node->url}">{$node->menutext}</a>

{elseif $node->type == 'sectionheader'}
<li><a href="{$node->url}" data-toggle="dropdown">{$node->menutext} <b></b></a>

{else}
<li><a href="{$node->url}">{$node->menutext}</a>

{/if}

{/foreach}
{repeat string="</li></ul>" times=$node->depth-1}</li>
</ul>


</div></div></nav>
{/if}

Bon mais c'est pas assez et là il me faut l'aide des dev qui maitrisent l'api MS:

il faut <li class='dropdown'> UNIQUEMENT pour les li qui contiennent des sous UL.
Là avec ma bidouille TOUS les li de 1er niveau prennent la classe .dropdown, et c'est mauvais.
[edit] non c'est bon ca en fait.

PUIS (c'est pas fini!...)
il faut pour le niveau 2 (ul > ul > ul ) une classe .sub-menu. et ca je vois pas.

enfin tout cà:
Code :
[== Indéfini ==]
<ul class="nav">

<li class="dropdown">

    <ul class="dropdown-menu">
        <li>......

       <ul class="dropdown-menu sub-menu">

voir exemple ici (mais pas sous MS) imdev.in/twitter-bootstrap-multi-level-dropdown-menu-system/


Merci


[résolu]Menus. gabarits perso ? - elz64 - 09/11/2012

Bon je crois avoir trouvé.

C'est un peu embêtant de devoir mettre les mains ds le cambouis de smarty pour faire de simple personnalisation.
En même temps,c 'est aussi vrai qu'il n'est pas nécessaire de faire du php du coup..

Mais globalement, je trouve qu'il manque un menu manager digne de ce nom. pour décider simplement des classes souhaitées, des structures des tpl (notamment en fonction des sous niveaux)...Vision d'un débutant..

(Les habitués de MS pourraient découvrir ModX, ils seraient surement opérationnels très vite...et trouveraient ca fachement + simple...)

bref :
voilà mon menu tpl.

Code :
[== Indéfini ==]
{* port  Bootstrap nav  http://berkhamsted-web-design.co.uk/2012/07/cmsms-menus-and-twitter-bootstrap/
    ok for full top horizontal nav bar 2 sous niveaux.
    *}

{assign var='number_of_levels' value=10000}
{assign var='level_class' value='dropdown-menu sub-menu'}
{if isset($menuparams.number_of_levels)}
  {assign var='number_of_levels' value=$menuparams.number_of_levels}
{/if}

{if $count > 0}
<nav class="navbar navbar-fixed-top" id="menutop">
<div class="navbar-inner">
        <div class="container">
          <h1 class="brand" >
            Nom du projet
          </h1>
<ul class="nav">
{foreach from=$nodelist item=node name=menuitem}
{if $node->depth > $node->prevdepth}
    {if $node->depth == 3} {* si on est ul>ul>ul on met .sub-menu dessus *}
    {repeat string="<ul class='dropdown-menu sub-menu'>" times=$node->depth-$node->prevdepth}
    {else}
    {repeat string="<ul class='dropdown-menu'>" times=$node->depth-$node->prevdepth}
    {/if}
{elseif $node->depth < $node->prevdepth}
    {repeat string="</li></ul>" times=$node->prevdepth-$node->depth}

{elseif $node->index > 0}</li>
{/if}

{if $node->parent == true}
<li {if $smarty.foreach.menuitem.last} class='last-menu-item'{/if}>
<a href="{$node->url}" data-toggle="dropdown">{$node->menutext} <b></b></a>

{elseif $node->haschildren == true and $node->type != 'sectionheader' and $node->type != 'separator'}
<li {if $smarty.foreach.menuitem.last} class='last-menu-item dropdown'
{else}class='dropdown'{/if}><a href="{$node->url}" data-toggle="dropdown">{$node->menutext} <b></b></a>

{elseif $node->current == true}
<li {if $smarty.foreach.menuitem.last} class='last-menu-item'{/if}><a href="{$node->url}">{$node->menutext}</a>

{elseif $node->type == 'sectionheader'}
<li {if $smarty.foreach.menuitem.last} class='last-menu-item'{/if}><a href="{$node->url}" data-toggle="dropdown">{$node->menutext} <b></b></a>

{else}
<li {if $smarty.foreach.menuitem.last} class='last-menu-item'{/if}><a href="{$node->url}">{$node->menutext}</a>

{/if}

{/foreach}


{repeat string="</li></ul>" times=$node->depth-1}</li>
</ul>


</div></div></nav>
{/if}

reste à gérer une class .last-menu-item . Là ca marche sur tous les derniers li SAUF les li de 1er niveau.

Comprends pas.


Merci


[résolu]Menus. gabarits perso ? - didjeko - 10/11/2012

mmm, si je ne m'abuse, parce que au 1er niveau tu passes pas dans le test
Code :
[== Indéfini ==]
{if $node->parent == true}
puisque le noeud n'est pas un parent de la page courante (pas de parent au niveau 1).
Citation :C'est un peu embêtant de devoir mettre les mains ds le cambouis de smarty pour faire de simple personnalisation.
Là, je pense que tu te trompes, puisque le principe de base de CMSMS c'est l'utilisation de smarty pour faire toutes les personnalisations. De ce fait, ce n'est pas
Citation :mettre les mains dans le cambouis de smarty
mais
Citation :utiliser smarty au mieux pour coder les templates qui répondent à tes besoins car telle est sa fonction :p
Pour ma part, je trouve que c'et un petit langage fort agréable à programmer - et, cerise sur le gâteau, qui est utilisable dans les css.


[résolu]Menus. gabarits perso ? - bess - 10/11/2012

je rejoins l'avis de didjeko Wink


[résolu]Menus. gabarits perso ? - elz64 - 10/11/2012

voui voui jvois vois. Mais j'ai pas encore compris le flux du test. Je vais creuser.


[résolu]Menus. gabarits perso ? - Jean le Chauve - 11/11/2012

Difficile de pouvoir t'aider sans voir le code html déployé.
A quoi correspond last-menu-item ?
Je suppose que c'est au tout dernier élément du menu puisque tu utilises {if $smarty.foreach.menuitem.last}

Aussi je me demande si ce ne serait pas plutôt le dernier élément d'un niveau, et dans ce cas, tu devrais utiliser :
$node->first -- existe, et mis à 1 si c'est le premier élément dans un niveau.
$node->last -- existe, et mis à 1 si c'est le dernier élément dans un niveau.

En plaçant <pre>{$node|print_r}</pre> dans ton foreach, tu auras accès aux valeurs de chaque $node.
Tu verras que $node->parent n'est true que dans 1 seul cas : la page niveau 1 de la page en cours si cette dernière est enfant.

Je te propose de regarder cet excellent article sur un menu mega-dropdown de Goran Ilic sur son site consacré à cmsms (je pense que tu en feras un bookmark Wink).
Après, tu ne pourras plus écrire "Comprends pas" et critiquer cet outil qui te permet de paramétrer ton menu très finement si tu trouves le bon algorithme.

Tu t'es présenté comme un noob, ce que tu n'es sûrement pas au vu de ta compréhension très rapide de smarty et du gestionnaire de menu. D'ici peu de temps, tu passeras à la construction de modules.

Bon amusement sur ce cms Smile


[résolu]Menus. gabarits perso ? - elz64 - 11/11/2012

Merci Jean pour tes encouragements.

Malheureusement ce que j'ai fais, je l'ai fais mar mimétisme et je continue à ne pas comprendre la stricture de smarty.

ou à peine.

Je ne vois pas les imbrications de if et donc pas du tout la logique des tests du coup (malgré un passage sur la doc smarty)

Il me manque aussi la signaification (une liste exhaustive) des $machin de cmsms. le printr sort les contenus des $node certes mais je bloque sur la vision d'ensemble). le prevdepth notamment.

Fait on plusieurs tests indépendants les uns des autres (un bloc pour chaque niveau) ?


[résolu]Menus. gabarits perso ? - Jean le Chauve - 11/11/2012

Tu n'as pas répondu à mes demandes :
Citation :Difficile de pouvoir t'aider sans voir le code html déployé.
A quoi correspond last-menu-item ?
Si tu as placé le print_r tu verras la valeur de prevdepth pour chaque $node. Si tu changes de page sur le frontend, tu verras comment elle évolue.
Si, par exemple, tu es sur le premier node du second niveau (depth), il aura 1 comme valeur pour son prevdepth et 2 pour son depth. Il sera également 1 pour thirst. S'il n'a pas de frère, il aura également 1 pour last.
La prevdepth sert, entre autre, à évaluer quelles sont les balises à fermer ou à ouvrir.
{if $node->depth > $node->prevdepth} : si le depth du node actuel est supérieur à la depth du node précédent, je me trouve donc dans le premier enfant du node précédent, donc j'ouvre un <ul> et je ne ferme pas le <li> du node précédent.


[résolu]Menus. gabarits perso ? - elz64 - 11/11/2012

hmmm. ok.

le code est sur mon lab : cms-ms.dzi-neo.net/

Le but est que je me forme en intégrant des structures pour Bootstrap.

Merci


[résolu]Menus. gabarits perso ? - Jean le Chauve - 11/11/2012

Tu n'as toujours pas répondu à mes demandes, le lien donné contient un menu avec une seule classe : dropdown-menu
Il me faut le code (en dur) tel que tu le souhaiterais, avec toutes ses classes déployées pour pouvoir créer le code smarty.


[résolu]Menus. gabarits perso ? - elz64 - 11/11/2012

Désolé.
J'avais hier un meilleur résultat...

Voici un exemple (menu tronqué) de code rendu souhaité. J'ai viré tout le traitement des title pour ne pas encombrer.


Il y manquerait encore un class = "last" pour chaque DERNIER li d'un niveau.

Pour le code Bootstrap si un li est paraent d'un sous ul, alors il doit recevoir .dropdown.

un sous ul DOIT recevoir un .dropdown-menu

et si ce ul.dropdown-menu est de sous-niveau 2 (ul>ul>ul) il doit recevoir en + .sub-menu

Cordialement,


Code :
[== Indéfini ==]
<nav id="menutop" class="navbar navbar-fixed-top">
<div class="navbar-inner">
    <div class="container">
        <h1 class="brand">
            CMS Made Simple démo
        </h1>
        <ul>

            <li><a href="http://cms-ms.dzi-neo.net/">Accueil</a>
            </li>

            <li  class="dropdown">
                <a data-toggle="dropdown" href="http://cms-ms.dzi-neo.net/how-cmsms-works.html">How CMSMS Works <b></b></a>


                <ul class="dropdown-menu">

        
                    <li><a href="http://cms-ms.dzi-neo.net/how-cmsms-works/templates-and-stylesheets.html">Templates and stylesheets</a>


                    </li>

                    <li><a href="http://cms-ms.dzi-neo.net/how-cmsms-works/pages-and-navigation.html">Pages and navigation</a>


                    </li>

                    <li><a href="http://cms-ms.dzi-neo.net/how-cmsms-works/content_types.html">Content</a>

                    </li>

                    <li><a href="http://cms-ms.dzi-neo.net/how-cmsms-works/menu-manager.html">Menu Manager</a>

                    </li>

                    <li><a href="http://cms-ms.dzi-neo.net/how-cmsms-works/extensions.html">Extensions</a>

                    </li>

                    <li><a href="http://cms-ms.dzi-neo.net/how-cmsms-works/event-manager.html">Event Manager</a>

                    </li>

                    <li><a href="http://cms-ms.dzi-neo.net/how-cmsms-works/workflow.html">Workflow</a>

                    </li>

                    <li><a href="http://cms-ms.dzi-neo.net/how-cmsms-works/where-do-i-get-help.html">Where do I get help?</a>

                    </li></ul>
            </li>
        
            <li class="dropdown"><a data-toggle="dropdown" href="http://cms-ms.dzi-neo.net/default_templates.html">Default Templates Explained <b></b></a>

                <ul class="dropdown-menu">
    
                    <li><a href="http://cms-ms.dzi-neo.net/default_templates/cmsms_tags.html">CMSMS tags in the templates</a>

                    </li>

                    <li><a href="http://cms-ms.dzi-neo.net/default_templates/navleft.html">Left simple navigation + 1 column</a>

                    </li>

                    <li><a href="http://cms-ms.dzi-neo.net/default_templates/top_left.html">Top simple navigation + left subnavigation + 1 column</a>

                    </li>

                    <li><a href="http://cms-ms.dzi-neo.net/default_templates/cssmenu_horizontal.html">CSSMenu top + 2 columns</a>

                    </li>

                    <li><a href="http://cms-ms.dzi-neo.net/default_templates/cssmenu_vertical.html">CSSMenu left + 1 column</a>


                    </li>

                    <li><a href="http://cms-ms.dzi-neo.net/default_templates/minimal-template.html">Minimal template</a>

                    </li>

                    <li class="dropdown"><a data-toggle="dropdown" href="http://cms-ms.dzi-neo.net/default_templates/higher-end.html">Higher End <b></b></a>

                        <ul class="dropdown-menu sub-menu">

                            <li><a href="http://cms-ms.dzi-neo.net/default_templates/higher-end/ncleanblue.html">NCleanBlue</a>

                        </li>

                            <li><a href="http://cms-ms.dzi-neo.net/default_templates/higher-end/shadowmenu-tab-2-columns.html">ShadowMenu Tab + 2 columns</a>

                            </li>

                            <li><a href="http://cms-ms.dzi-neo.net/default_templates/higher-end/shadowmenu-left-1-column.html">ShadowMenu left + 1 column</a>

                            </li></ul>
                    </li></ul>
</li>

</ul>


</div>
</div>
</nav>



[résolu]Menus. gabarits perso ? - Jean le Chauve - 11/11/2012

Citation :Il y manquerait encore un class = "last" pour chaque DERNIER li d'un niveau.
Il suffit alors de placer en première condition dans ta boucle : {if $node->last == true}<li class="last"...
{elseif ...
Voici le code dans lequel j'ai ajouté quelques fonctions smarty très utiles qui permettent d'éviter les répétitions de sous-conditions :
Code :
{assign "class" "bootstrap"}{* on assigne une valeur quelquonque à $class voir smarty : http://www.smarty.net/docs/en/language.function.assign.tpl *}

{if $count > 0}
<nav class="navbar navbar-fixed-top" id="menutop"><div class="navbar-inner"><div class="container"><h1 class="brand" >Nom du projet</h1><ul class="nav">
{foreach $nodelist as $node}{* raccourci d'écriture : voir smarty : http://www.smarty.net/docs/en/language.function.foreach.tpl *}
{if $node->depth > $node->prevdepth}{* si on est ul>ul *}    
{if $node->depth > 2}
{* si on est ul>ul>ul ou + on met .sub-menu dessus *}
{repeat string='<ul class="dropdown-menu sub-menu">' times=$node->depth-$node->prevdepth}
{else}
{repeat string='<ul class="dropdown-menu">' times=$node->depth-$node->prevdepth}
{/if}
{elseif $node->depth < $node->prevdepth}{* si on descend de niveau *}
{repeat string='</li></ul>' times=$node->prevdepth-$node->depth}
{elseif $node->index > 0}</li>
{/if}
{if $node->last == true}{* si on est sur le dernier élément d'un niveau, on concatène $class avec last-menu-item voir smarty : http://www.smarty.net/docs/en/language.modifier.cat.tpl ET http://www.smarty.net/docs/en/language.function.capture.tpl*}
{capture class assign=class}{$class|cat:" last-menu-item"}{/capture}
{/if}
{if $node->haschildren == true and $node->type != 'sectionheader' and $node->type != 'separator'}
{capture class assign=class}{$class|cat:" dropdown"}{/capture}
<li class='{$class}'>children<a href="{$node->url}" data-toggle="dropdown">{$node->menutext} <b></b></a>
{elseif $node->type == 'sectionheader'}{* à vérifier si c'est ce que tu veux *}
<li class='{$class}'><a href="{$node->url}" data-toggle="dropdown">{$node->menutext} <b></b></a>
{else}
<li class='{$class}'>else<a href="{$node->url}">{$node->menutext}</a>
{/if}
{assign "class" "bootstrap"}{* important : on réinitialise $class pour l'élément suivant *}
{/foreach}
{repeat string="</li></ul>" times=$node->depth-1}</li>
</ul></div></div></nav>{/if}

Post à déplacer dans Modules, Tags


[résolu]Menus. gabarits perso ? - elz64 - 12/11/2012

Merci. Ca marche super.

Je creuse.


J'ai toujours du mal avec la logique de traitement:
Je vois des tests indépendants dans lesquels on ne traite qu'une partie des choses.

une 1ère partie qui ne semble faire que les <ul> et <li> sans les remplir.
PUIS

Un autre traitement (série de tests) qui les rempli avec les <a>

Ce qui me perturbe vraiment c'est qu'on referme d'abords les balises , et qu'on continue les tests pour remplir l'intérieur.

Soit j'ai rien compris soit ca va à l'encontre de tout ce que je connais. Pour moi un test de traitement d'un niveau devrait faire toute la hiérarchie avec toute une série de if/else imbriqués, puis on referme en remontant.
Là ce n'est pas le cas je crois.

J'ai bien compris la logique de smarty ?


[résolu]Menus. gabarits perso ? - elz64 - 12/11/2012

Voilà le dernier code plus abouti avec gestion des title et tooltips
J'ai tenté d'user de variables le plus possible, ca me gêne de faire des appels à l'api ($node->trucmachin) X fois quand une seule fois suffit.

Code :
[== Indéfini ==]
{assign "class" ""}{* on assigne une valeur quelquonque à $class voir smarty : http://www.smarty.net/docs/en/language.function.assign.tpl *}

{assign var='number_of_levels' value=10000}
{if isset($menuparams.number_of_levels)}
  {assign var='number_of_levels' value=$menuparams.number_of_levels}
{/if}

{if $count > 0}
<nav class="navbar navbar-fixed-top" id="menutop">
    <div class="navbar-inner">
    <div class="container"><h1 class="brand" >Nom du projet</h1>
<!-- 1er niveau de menu ds son ul -->    
    <ul class="nav">
{foreach $nodelist as $node}{* raccourci d'écriture : voir smarty : http://www.smarty.net/docs/en/language.function.foreach.tpl *}
{assign "niv" $node->depth}
{assign "title" $node->pagetitle}
{assign "Description" $node->titleattribute}

{if $description == ""}
{assign var="Titre" value="`$title` "}
{else}
{assign var="Titre" value="`$title`, ` -` `$Description` "}
{/if}



{if $niv > $node->prevdepth}{* on est au moins ul>ul node->depth*}    
    {if $niv  > 2}
    {* si on est ul>ul>ul ou + on met .sub-menu dessus *}
    {repeat string='<ul class="dropdown-menu sub-menu">' times=$node->depth-$node->prevdepth}
    
    {else} {* on est ul>ul *}    
    {repeat string='<ul class="dropdown-menu">' times=$node->depth-$node->prevdepth}
    {/if}
    
    {elseif $niv  < $node->prevdepth}{* si on descend de niveau *}
    {repeat string='</li></ul>' times=$node->prevdepth-$node->depth}
    
    {elseif $node->index > 0}</li>
{/if}

{if $node->first == true}{* si on est sur le 1er élément d'un niveau, on concatène $class avec 'first' *}

{capture class assign=class}{$class|cat:" first"}{/capture}
{/if}

{if $node->last == true}{* si on est sur le dernier élément d'un niveau, on concatène $class avec 'last' voir smarty : http://www.smarty.net/docs/en/language.modifier.cat.tpl ET http://www.smarty.net/docs/en/language.function.capture.tpl*}

{capture class assign=class}{$class|cat:" last"}{/capture}
{/if}

{if $node->haschildren == true and $node->type != 'sectionheader' and $node->type != 'separator'}
{capture class assign=class}{$class|cat:" haschildren dropdown"}{/capture}


    <li class='{$class}'><a rel="tooltip" href="{$node->url}" data-toggle="dropdown" title="{$Titre}">{$node->menutext}  <b></b></a>
{elseif $node->type == 'sectionheader'}
    <li class='{$class}'><a rel="tooltip" href="{$node->url}" data-toggle="dropdown" title="{$Titre}">{$node->menutext} <b></b></a>
{else}
    <li class='{$class}'><a rel="tooltip" href="{$node->url}" title="{$Titre}">{$node->menutext}</a>
{/if}


{assign "class" ""}{* important : on réinitialise $class pour l'élément suivant *}
{/foreach}

{repeat string="</li></ul>" times=$node->depth-1}
</li>

</ul></div></div></nav>{/if}



[résolu]Menus. gabarits perso ? - Jean le Chauve - 12/11/2012

Est-ce que tu as compris le principe de la variable $class ?


[résolu]Menus. gabarits perso ? - elz64 - 12/11/2012

ben oui.
Y'a un truc qui m'aurait échappé?

Pour gérer les title la concat ne fonctionne pas pareil et le modifier cat ne semble pas pouvoir être utilisé dans ce cas.( mélanger plusieurs contenus de var et des string)


Edit:


J'ai défini $niv:
pb:
si je fais ca {$niv|cat:" lev"} ca va donner 1lec ou 2lev par exemple.

et il faudrait ne pas commencer par une valeur numérique (lev2).


J'ai plus du mal pour ajouter la valeur du niveau courant dans $class.

dans chaque cas je tente d'avoir <li class="valeur_$niv et les valeurs tq déja fait jusqu'à présent">

ex: <li class="lev1 dropdown.....">


[résolu]Menus. gabarits perso ? - Jean le Chauve - 12/11/2012

Oui, je vois que tu as compris les classes. Je te prépare une petite explication sur l'ordre des conditions.
Tu n'as pas besoin de ceci, puisque tu n'utilises $number_of_levelsn nulle part :
Code :
[== Indéfini ==]
{if isset($menuparams.number_of_levels)}
  {assign var='number_of_levels' value=$menuparams.number_of_levels}
{/if}



[résolu]Menus. gabarits perso ? - Jean le Chauve - 12/11/2012

Que veux-tu dire par
Citation :Pour gérer les title la concat ne fonctionne pas pareil et le modifier cat ne semble pas pouvoir être utilisé dans ce cas.( mélanger plusieurs contenus de var et des string)
Que souhaites-tu exactement ?


[résolu]Menus. gabarits perso ? - Jean le Chauve - 12/11/2012

On ira plus vite si tu me donnes exactement tout ce que tu veux (donc un code html déployé avec toutes les classes nécessaires et pas un gabarit).
Je te fais le code puis te l'explique.


[résolu]Menus. gabarits perso ? - Jean le Chauve - 12/11/2012

J'ai modifié le code, il devrait t'être plus compréhensible (+ de classes).
Essaye de le comprendre puis pose tes questions.
Code :
[== Indéfini ==]
{if $count > 0}
    <nav class="navbar navbar-fixed-top" id="menutop">
        <div class="navbar-inner">
            <div class="container"><h1 class="brand" >Nom du projet</h1>
            {* 1er niveau de menu ds son ul *}    
                <ul class="nav">
                {foreach $nodelist as $node}
                    {capture class assign=class}index{$node->index} lev{$node->depth} prevLev{$node->prevdepth}{/capture}
                    {capture title assign=title}{$node->pagetitle}{if $node->titleattribute neq ""}, - {$node->titleattribute}{/if}{/capture}
                    {if $node->depth > $node->prevdepth}{* on est au moins ul>ul node->depth *}    
                        {if $node->depth > 2}
                            {repeat string='<ul class="dropdown-menu submenu">' times=$node->depth-$node->prevdepth}
                        {else}
                            {repeat string='<ul class="dropdown-menu">' times=$node->depth-$node->prevdepth}
                        {/if}
                        {elseif $node->depth < $node->prevdepth}{* si on descend de niveau *}
                        {repeat string='</li></ul>' times=$node->prevdepth-$node->depth}    
                        {elseif $node->index > 0}
                            </li>{* si on reste sur le même niveau que l'élément précédent}
                        {/if}
                    {/if}
                    {if $node->first == true}{* si on est sur le 1er élément d'un niveau, on concatène $class avec 'first' *}
                        {capture class assign=class}{$class|cat:" first"}{/capture}
                    {/if}
                    {if $node->last == true}{* si on est sur le dernier élément d'un niveau, on concatène $class avec 'last' *}
                        {capture class assign=class}{$class|cat:" last"}{/capture}
                    {/if}
                    {if $node->haschildren == true and $node->type != 'sectionheader' and $node->type != 'separator'}
                        {capture class assign=class}{$class|cat:" haschildren dropdown"}{/capture}
                        <li class='{$class}'><a rel="tooltip" href="{$node->url}" data-toggle="dropdown" title="{$title}">{$node->menutext}  <b></b></a>
                    {elseif $node->type == 'sectionheader'}
                        <li class='{$class}'><a rel="tooltip" href="{$node->url}" data-toggle="dropdown" title="{$title}">{$node->menutext} <b></b></a>
                    {else}
                        <li class='{$class}'><a rel="tooltip" href="{$node->url}" title="{$title}">{$node->menutext}</a>
                    {/if}
                {/foreach}
                        {repeat string="</li></ul>" times=$node->depth-1}
                    </li>
                </ul>
            </div>
        </div>
    </nav>
{/if}



[résolu]Menus. gabarits perso ? - Jean le Chauve - 12/11/2012

Je viens de modifier


[résolu]Menus. gabarits perso ? - elz64 - 12/11/2012

ok.

je vois que tu aimes les capture.

Effectivement on peut donc les utiliser pour concaténer dedans plusieurs valeurs.
Mais justement ces valeurs sont à chaque fois redemandées, ppar exemple dans :
Code :
[== Indéfini ==]
{capture titre assign=titre}{$node->pagetitle}{if $node->titleattribute neq ""},  {$node->titleattribute}{/if}{/capture}
on fait 2 appels $node->titleattributes coup sur coup. Ca me semble dispendieux en perf.
Ne serait-il pas plus efficace de reprendre en début de boucle la déf des appels en var (pour toute valeurs qui sera utilisé + d'une fois) pour ne plus faire appel qu'à ces var au lieu de l'api?

par ex: je remets
Code :
[== Indéfini ==]
{assign "Description" $node->titleattribute}

et ensuite
Code :
[== Indéfini ==]
{capture titre assign=titre}{$node->pagetitle}{if {$Description} neq ""},  {$Description}{/if}{/capture}



[résolu]Menus. gabarits perso ? - elz64 - 12/11/2012

Jean le Chauve a écrit :Je viens de modifier
oui il y avait qq typo , mais j'avais corrigé ;° )