Skip to main content Help Control Panel

Alain Lesage


on Mar. 28 2007
from Montréal ou Chambly, Québec

YACS team (Quebec)
Share
Post to Facebook
Tweet about this
Share at LinkedIn
Invite participants
Reference this page
Monitor
Recent files
support »
See also
 

support «   Besoin d'aide «  

Un menu contextuel personnalisé

PreviousNextIndex

besoin d'aide avec le code PHP

J'ai joué à l'apprenti-sorcier et ajouté le code suivant au fichier template.php de mon skin :

// display side content, including extra data
Page::side(FALSE);

// display contextual menu, despite above rule of FALSE, except on front page
if($context['skin_variant'] != 'home') {
    echo 
Skin::build_box('Dans cette section'Skin::build_contextual_menu($context['current_focus']), 'navigation');
}


Ça fonctionne à ma satisfation, sauf que ça ne ressemble pas au menu contextuel avec arborescence des fichiers. Je suppose qu'il faut appeller une autre fonction pour ça, mais je n'ai aucune idée de quoi chercher. Si quelqu'un sait, prière de partager l'info.

Ma vraie question urgente est plutôt celle-ci : que dois-je ajouter (vraisemblablement une condition if...) pour éviter d'avoir l'erreur suivante sur les pages qui ne sont pas des sections :

<b>Fatal error</b>:  Undefined class name 'sections' in <b>/home/lesageco/public_html/prevtec/skins/skin_skeleton.php</b> on line <b>338</b>


J'utilise yacs 6.12, avec un skin dérivé de grigloo (lui-même dérivé de digital) et voici la ligne 337 et suivantes de mon skin_skeleton.php

// list underneath level
        
if($children =& Sections::get_children_of_anchor($anchors[count($anchors)-1], 'index')) {

            
// place children
            
foreach($children as $child) {
                if(
$anchor get_anchor($child))
                    
$tree[] = array($anchor->get_url(), NULL$anchor->get_title(), NULL'below'NULL$anchor->get_teaser('hover'));

            }

        }


_____________

L'apprenti-sorcier qui ne sait faire que le début de la potion magique

Comments

GnapZ - on Mar. 28 2007
Bonjour,

Pour le premier cas, je ne sais pas mais pour le second j'ai un doute. Pourquoi est-il nécessaire de modifier skin_skeleton.php alors que c'est un script de référence qui fonctionne ?

Les fonctions de ce script peuvent-êtres reprises dans le skin dérivé avec le fichier skin.php.

Enfin, pour ce genre d'erreur, c'est une ligne "include_once('../sections/sections.php') qu'il faut insérer avant l'appel de la fonction Sections:: .

Encore une fois, bizarre que vous ayez à toucher à ce script (qui sera effacé lors des mises à jour).
Lasares - on Mar. 28 2007
GnapZ:

J'ai modifié le script de la template.php mais je n'ai pas touché à skin_skeleton.php, que je ne reproduis ici que pour référence à sa version 6.12. La modif ne sera donc pas perdue lors d'une mise à jour.

La raison pour laquelle j'ai procédé comme suit (et quelqu'un a peut-être une suggestion pour une solution plus appropriée), c'est que je voulais afficher un menu contextuel mais aucune autre des boîtes extra, comme celle des catégories ou des références. Or, je n'y parvenais pas, je ne trouvais aucune place où ces options pourraient être réglées. Alors...

Je suis allé dans le script de template.php et j'ai réglé Page::side(FALSE);. Ainsi, aucune boîte extra ne s'affiche. Ensuite, j'ai ajouté les lignes de codes mentionnées ci-dessus (premier bloc de code de cette page) pour faire afficher un menu contextuel. Et ça fonctionne.

Mais ce code semble supposer l'existence d'une section, de sorte qu'il affiche bien sur une page d'index de section mais pas sur une autre page. Dans ce dernier cas, la boîte extra du menu contextuel est remplacé par le message d'erreur.

Il me semble que j'aurais besoin d'un ligne qui dise (en PHP correct) quelque chose comme IF nous sommes sur une page d'index de section THEN affiche le menu contextuel ELSE fais rien !.

Ce que je ne sais pas formuler c'est le IF...
GnapZ - on Mar. 28 2007
Lasares : Ok, moi comprendre mieux.

Bon alors il faut que je regarde parce que si la condition IF n'est pas très difficile à réaliser, il faut s'assurer que le menu contextuel est prévu pour fonctioner sur la page d'accueil car il semble qu'il ait besoin d'une section de référence. Hors la page d'acceuil ou plutôt le plan du site (origine des sections) n'a pas de numéro puisqu'il est établi par sections/index.php (d'où peut-être l'erreur).
Lasares - on Mar. 28 2007
GnapZ:

Je n'en ai pas besoin sur la page d'accueil, ni sur aucune page qui n'est pas un index de section, d'ailleurs.

Si vous me trouvez une solution générale qui s'applique à toutes ces pages, je suis preneur, bien sûr. Mais pour l'instant, je me contenterais d'une solution plus restreinte pour le site spécifique que je suis en train de finaliser et qui repose essentiellement sur des pages d'index.

Merci de votre aide !!!
Bernard - on Mar. 28 2007
En partant du code qui se trouve dans sections/view.php, on pourrait écrire :

// ensure we are in a section
include_once $context['path_to_root'].'sections/sections.php';
if(
strpos($context['skin_variant'], 'section:') == 0) {

    
// the contextual menu, in a navigation box, if this has not been disabled
    
if( (!is_object($anchor) || !$anchor->has_option('no_contextual_menu'))
        && (!isset(
$item['options']) || !preg_match('/\bno_contextual_menu\b/i'$item['options']))
         && isset(
$context['current_focus']) && ($menu =& Skin::build_contextual_menu($context['current_focus']))) {
    
        
// use title from topmost level
        
if(count($context['current_focus']) && ($anchor get_anchor($context['current_focus'][0]))) {
            
$box_title $anchor->get_title();
            
$box_url $anchor->get_url();
    
        
// generic title
        
} else {
            
$box_title i18n::s('Navigation');
            
$box_url '';
        }
    
        
// in a navigation box
        
$box_popup '';
        echo 
Skin::build_box($box_title$menu'navigation''contextual_menu'$box_url$box_popup)."\n";
    }
}

GnapZ - on Mar. 28 2007
Ben voilà, j'étais dessus mais j'aurais pas fait aussi bien, Merci Bernard.
Lasares - on Mar. 29 2007
Oui, merci Bernard, mille fois merci ! hail

J'ai pas tout compris (quoique je sois bien décidé à apprendre) mais ça fait le travail de façon impeccable.

Si ma compréhension s'améliore, je crois qu'il manque juste une barre oblique avant le dernier n, comme ça : "\n";

Je ne comprends pas !preg_match('/bno_contextual_menub/i' mais ce n'est pas grave. Ça m'amène juste une question si bête que j'ai presque honte de la poser et révéler ainsi mon ignorance de débutant : on les trouve où toutes ces variables comme $context, $anchor ou autres ? Certaines sont propres à un script donné, mais plusieurs semblent être plus globales. Il y a un endroit où je devrais regarder pour commencer ?

En tous cas, merci pour la solution. Je poste sans tarder l'adresse de mon nouveau site dans le showcase et je partage mon skin aussitôt que j'ai le temps de le finaliser pour publication.
Bernard - on Mar. 31 2007
Lasares: $context est effectivement THE variable globale, utilisée partout dans le code, et initialisée dans shared/global.php, vers le début du fichier.

PreviousNextIndex