motercalo Analyse fonctionnelle - www.yacs.fr

Skip to main content Help Control Panel

 

Communauté «   Horizontal drop-down menu «  

Analyse fonctionnelle

J'ai commencé à m'y atteler, voici les solutions vers lesquelles je m'oriente.

  • création d'une nouvelle fonction page::hdd_menu() dans page.php pour réaliser le menu.
  • le code pourra cependant se placer dans le skin.php de notre thème pour les anciens serveurs.
  • Le canevas de la fonction ressemble fortement à page::tabs().
  • j'ai seulement en plus un argument $layout qui permet de choisir la mise en forme du listage des sous-sections. (avec ou sans vignette, layout personnalisé, etc...)
  • la fonction utilise les outils yacs existant sections::list_by_titles_for_anchor() et skin::build_list()
  • le lien vers une sections mère (en onglet) n'est actif que si elle ne possède pas de sous-sections (donc pas de menu déroulant).
  • le nb d'onglets affichés est limité par le nb de sections affichées à la raçine.
  • le nb de sections listées en sous-menu est défini par la constante HDDM_LIST_SIZE. (peut être surchargé dans skin.php)
avatar
Christophe Battarelfrom Grenoble-Chambery
906 posts

on June 15


Je me demandais si il était vraiment nécessaire de rajouter une fonction à la classe Page ?

un simple layout passé en paramètre à la fonction Page::tabs ne serait-il pas suffisant ?

Il suffirait ensuite d'utiliser ce layout au lieu de "tabs" (que l'on garde en valeur par défaut) lors de l'appel à la fonction Sections::list_by_title_for_anchor.

Nous aurions comme modif de page.php :
function tabs($with_home=TRUE$with_reverse=FALSE$prefix=NULL$suffix=NULL [b],$layout='tabs'[/b]) {
        global 
$context;

        
// only for live servers
        
if(!file_exists($context['path_to_root'].'parameters/switch.on'))
            return;

        
// we have no database back-end
        
if(!is_callable(array('sql''query')))
            return;

        
// cache this across requests
        
$cache_id 'skins/page.php#tabs';
        if(!
$text =& Cache::get($cache_id)) {

            
// an array of tabs
            
$site_bar = array();

            
// prefix tabs, if any
            
if(is_array($prefix) && count($prefix))
                
$site_bar array_merge($site_bar$prefix);

            
// the first tab links to the front page
            
if($with_home && is_callable(array('i18n''s')))
                
$site_bar array_merge($site_bar, array($context['url_to_root'] => array(''i18n::s('Home'), '''home')));

            
// default number of sections to list
            
if(!isset($context['root_sections_count_at_home']) || ($context['root_sections_count_at_home'] < 1))
                
$context['root_sections_count_at_home'] = 5;

            
// query the database to get dynamic tabs
            
if(is_callable(array('Sections''list_by_title_for_anchor')) && ($items =& Sections::list_by_title_for_anchor(NULL0$context['root_sections_count_at_home'], [b]$layout[/b])))
                
$site_bar array_merge($site_bar$items);

            
// suffix tabs, if any
            
if(is_array($suffix) && count($suffix))
                
$site_bar array_merge($site_bar$suffix);

            
// the skin will reverse the order
            
if($with_reverse)
                
$site_bar array_reverse($site_bar);

            
// shape tabs
            
$text =& Skin::build_list($site_bar'tabs')."\n";
            
Cache::put($cache_id$text'sections');
        }
        echo 
$text;

    }



Christophe Battarel - Société altairis - yacspro-smallest.png
avatar
Alexis Raimbaultfrom Mulhouse
1156 posts

inspired from Christophe Battarel on June 15


Christophe Battarel : effectivement, qui peut le plus peut le moins ! aussi le menu horizontal devrait être capable d'afficher les onglets actuels.

Je vais donc considérer d'enrichir page::tabs plutôt que de faire une nouvelle fonction quasi identique.

Note qu'à l'intérieur de tabs il y aura quelques changements, car pour chaque item renvoyé par un premier list_by_title_for_anchor il faut recommencer la même requette pour trouver les sous-sections.

Le premier appel se fait toujours avec le layout tabs, et les suivants avec celui en paramètre de la fonction.




avatar
Jmarcfrom Cannes
630 posts

on June 15


" le lien vers une sections mère (en onglet) n'est actif que si elle ne possède pas de sous-sections (donc pas de menu déroulant). "

Dans ce cas, on ne peut plus utiliser l'onglet pour accéder à la section mère... on fait comment alors ?

N'est-il pas possible de dérouler la liste des sous-section en laissant le curseur de la souris dans l'onglet de la section mère ? (pour pouvoir continuer de cliquer dessus pour accéder à la section mère).

avatar
Alexis Raimbaultfrom Mulhouse
1156 posts

inspired from Jmarc on June 15


Jmarc : très bonne question Jmarc !

j'ai cogité dessus et même experimenté sur un site avec des usagers (en préparation)

  • à partir du moment où le menu se déroule, les utilisateurs se rendent rarement compte qu'ils peuvent cliquer sur l'onglet lui-même.
  • si on propose un menu déroulant, c'est pour gagner du temps. La vision de la section mère proposera rien de plus que le menu déroulant (surtout que l'on pourra afficher les vignettes, titres et intros des sous-sections dans le menu déroulant)
  • Et enfin et surtout, au niveau HTML produit par les fonctions, Je peux facilement utiliser le framework yacs existant en procédant ainsi (sinon le code me place une balise ul dans un span, je dois remanier plus de code pour l'en empecher)

C'est à débattre bien sur. Mais je ferais ainsi dans un premier temps, on verra après essai sur béta si cet accès manque.

La section mère est toujours accessible en remontant via le fil d'ariane ou bien via la carte du site.




avatar
Jmarcfrom Cannes
630 posts

inspired from Alexis Raimbault on June 15


Alexis a écrit :

" à partir du moment où le menu se déroule, les utilisateurs se rendent rarement compte qu'ils peuvent cliquer sur l'onglet lui-même. "

Mais si l'utilisateur ne sais pas quelle sous-section choisir, il voudra alors cliquer sur l'onglet de la section mère...

" La vision de la section mère proposera rien de plus que le menu déroulant "

c'est une bonne remarque !

" sinon ... je dois remanier plus de code "

Fainéant !

" je ferais ainsi dans un premier temps, on verra après essai sur béta si cet accès manque. "

Ok.

avatar
Alexis Raimbaultfrom Mulhouse
1156 posts

inspired from Jmarc on June 22


Jmarc : bonne nouvelle pour toi : j'affiche encore le lien vers la section mère, et sans me prendre la tête.

bounce




avatar
Jmarcfrom Cannes
630 posts

inspired from Alexis Raimbault on June 22


Alexis : excellent !

avatar
Alexis Raimbaultfrom Mulhouse
1156 posts

on June 22


J'ai quasiment terminé de quoi vous livrer une beta.

J'ai testé sur skeleton, differentb et 1 skin "vide", avec pour le dropdown des sous-sections un layout "compact" ainsi qu'un nouveau "smartlist".

note : le layout pour lister les sous-sections doit fournir une liste non-ordonnée.

j'ai encore des interférence CSS avec le "youarehere" des tabs.

voici les éléments impactés dans le code :

  • modifications sur page::tabs. Ajout d'un argument optionnel (un nom de layout) qui déclenche la recherche et l'affichage des sous-sections (avec le layout indiqué)
  • modifications sur yacs.css. Ajout de régles minimales pour un bon fonctionnement du dropdown.
  • ajout d'un layout layout_sections_as_smartlist.php qui contient dans une liste non ordonnée l'icone, le titre et l'intro (et aussi les new,updated, private...) de chaque section (icon alignée à gauche comme une colonne séparée)
  • modifications sur skin_skeleton::finalize_list() : ajout d'un "case: smartlist" pour la mise en forme finale du layout indiqué au dessus.

pouvez déjà réagir sur l'impact, les noms employés, etc.

pour smartlist j'aurais pu faire toute la mise en forme dans le layout mais en appelant skin::build_list il me fait tout le boulot. Comme il s'agit de mettre ce travail dans la référence, j'en profite.




avatar
Jmarcfrom Cannes
630 posts

inspired from Alexis Raimbault on June 24


Alexis a écrit:

" ajout d'un layout layout_sections_as_smartlist.php qui contient dans une liste non ordonnée l'icone, le titre et l'intro (et aussi les new,updated, private...) de chaque section (icon alignée à gauche comme une colonne séparée) "

ça fait beaucouo d'info... Visuellement, cela ne fait pas des listes déroulantes trop étendues en surface ?

j'ai hate de tester...

avatar
Alexis Raimbaultfrom Mulhouse
1156 posts

inspired from Jmarc on June 24


" j'ai hate de tester "

oui il faut que je vous fasse un paquet et une notice. ça vient bounce

" ..trop étendue... "

non je limite par CSS la taille des vignettes et par skin::strip la taille de l'intro. Chacun pourra adapter.




Download yacs