8768 sujets

Développement web côté serveur, CMS

Bonjour tout le monde,

Je viens de lire et de copier/coller un tuto pour me rajouter un menu déroulant sous Bartik || Drupal 7.

ça à l'air de marcher, enfin presque. .

J'ai ce message qui apparait : Warning : Illegal string offset 'title' dans theme_menu2levels_menu() (ligne 47 dans C:\wamp\www\....\sites\all\modules\menu2level\menu2levels.module).
Warning : Illegal string offset 'link' dans theme_menu2levels_menu()....

Et je ne sais pas à quoi c'est dû.. En même temps je suis une vrai B.. en programmation Smiley lol bien pour ça que j'ai chercher un tutoriel Smiley lol

ligne 47 ->
 $output.="<li>".l(t($item["title"]),$item["link"]);


Quelqu'un peut me dire à quoi c'est dû ?
Bonjour.

Vous avez fait un var_dump sur $item ?

Smiley smile

(Je ne sais pas si ça change quelque chose mais moi j'utilise plutôt des guillemets simples dans ce genre de situations...)
Modérateur
Bonjour, cela signifie que $item est un string et non un array. Donc il y a une erreur dans ton code à un certain point. peut-on voir la fonction de thème theme_menu2levels_menu dans son intégralité?
Merci de votre soutient.. Smiley cligne

le code .. .

<?php
/*
* Implements hook_preprocess_HOOK
*/
function menu2levels_preprocess_page(&$variables) {
  $clean_menu=array();
  $menu=menu_tree_all_data("main-menu");
  // Création du tableau que l'on enverra au moteur de template
  foreach($menu as $item) {
    $clean_menu[]=array("link"=>$item["link"]["link_path"],"title"=>$item["link"]["title"],"childs"=>parse_menu_child($item["below"]));
  }
  // Injection du menu dans les variables utilisées par le moteur de template
  $variables["menu2levels_menu"]=$clean_menu;
}

// Traitement des sous menus
function parse_menu_child($items) {
   $child_menu=array();
   foreach($items as $key=>$item)
      $child_menu[]=array("link"=>$item["link"]["link_path"],"title"=>$item["link"]["title"],"childs"=>parse_menu_child($item["below"]));
  return($child_menu);
} 


/*
* Implements hook_theme
*/
function menu2levels_theme($existing,$type,$theme,$path) {
  return(array("menu2levels_menu"=>array("variables"=>array())));
} 

// Génération du code HTML du menu
function theme_menu2levels_menu($menu) {
  static $first;
  $output="";
  if(count($menu)>=1) {
    $first++;
    if($first==1){
      $output.="<ul id='main-menu-links'>";
    } else {
      $output.="<ul>";
    }
    foreach($menu as $item) {
      if($first==1)
        $output.="<li class='inline clearfix'>".l(t($item["title"]),$item["link"]);
     else
       $output.="<li>".l(t($item["title"]),$item["link"]);
      if(isset($item["childs"])) {
        if(count($item["childs"]>=1)) {
          $output.=theme_menu2levels_menu($item["childs"]);
        }
      }
      $output.="</li>";
    }
    $output.="</ul>";
  }
  return($output);
} 

Modifié par blond1n (08 Mar 2017 - 15:16)
salut,
va falloir déboguer (xdebug, ou du var_dump),
comme déjà indiqué $item n'est pas un tableau, donc $menu est un tableau mais il ne contient pas (ou ne contient pas que) de(s) tableau(x).

Dans l'état on ne peu pas plus t'aider il n'y a pas l'appel d'origine de cette fonction (theme_menu2levels_menu).
Il y a bien l'appel récursif, est ce que $menu['child'] est bien un tableau ?

attention il semble que $menu soit un tableau de chaînes de caractères et la syntaxe "tableau" est donc correct puisse que l'on peux prendre un caractère d'une chaîne directement avec son index (c'est un tableau de caractère). Par contre l'index est forcément numérique Smiley cligne

peux être est-ce simplement une erreur de niveau ($menu est un élément du menu et pas un tableau de ligne de menu ?).

@+
Salut MoogliBZH,

Je n'ai pas compris grand chose.. Smiley lol Smiley biggol

Je mets le code qui appel la fonction.. C'est un menu drop down

<?php if ($menu2levels_menu): ?>
    <div id="main-menu" class="navigation">
      <?php 
       // Appel de la fonction menu2levels_menu du module via la fonction theme() de drupal
       print theme("menu2levels_menu",$menu2levels_menu);        
       ?>
     </div> <!-- /#main-menu -->
   <?php endif; ?>


Vive la Breizh ! Smiley cligne
Modérateur
Bonjour, c'est parce que la manière de transmettre les variables à la fonction de theme n'est pas correcte.

Les fonctions de theme utilisent des tableaux associatifs. La fonction theme ainsi que les différents preprocess vont remplir certains éléments du tableau de variable. tu vas donc boucler sur des éléments qui seront des strings ou autres.

Afin d'éviter cela, il faut toujours passer par des variables nommées ainsi:


// appel:
print theme("menu2levels_menu", array('menu2levels' => $menu2levels_menu));

// fonction de theme: 
function theme_menu2levels_menu($variables){
  $menu = $variables['menu2levels'];
} 


Si tu faisais un var_dump ou print_r de $menu dans ta fonction actuelle, tu constaterais qu'il contient des éléments auxquels tu ne t'attends pas.
Il existe aussi le module menu_block qui permet de créer des blocks de menu, de limiter la profondeur, etc.
Bonjour Kustolovic,

Ne sachant pas faire de php, je comprends en partie ce que tu m'explique mais ça reste assez occulte pour moi quand même. J'aimerai avoir le temps d'apprendre ce langage qui me soulagerait bien des galères et me permettrai d'être libre. Smiley confused

J'ai trouvé ce tutoriel mercredi utilisant menu block. Je connaissais ce système mais à force d'utiliser des nouveaux modules pour chaque nouvelles embardées je l'avais oublié ! Smiley rolleyes

Merci à tous de vos explications/réflexions... Smiley cligne

A+ pour un nouveau problème ! Smiley lol