web-dev-qa-db-fra.com

Comment changer dynamiquement un lien de menu? (D7)

J'essaie de changer le lien d'un élément de menu dynamiquement en fonction de la langue sélectionnée dans le sélecteur de langue.

Disons que j'ai les liens suivants dans mon menu principal:
-Accueil
-À propos de
-Des produits

Si la langue sélectionnée est l'anglais, je souhaite que l'élément À propos soit lié au nœud/73. Si la langue sélectionnée est le néerlandais, je souhaite que l'élément À propos soit lié au nœud/74.

Est-ce possible et comment pourrais-je m'y prendre au mieux?

Toute aide est fortement appréciée.

EDIT: Quelques informations supplémentaires. J'ai installé les modules Internationalisation, Traduction de contenu et Traduction d'entité. En raison de la hiérarchie du menu et d'un mélange entre les nœuds traduits par le contenu et les nœuds traduits par l'entité, je ne veux pas ajouter deux liens séparés au menu, mais avoir un lien et changer le chemin dynamiquement dans le code.

5
Smos

Vous souhaitez implémenter hook_translated_menu_link_alter () .

Ce crochet n'est pas appelé pour tous les éléments de menu. Selon la documentation de l'API:

Elle n'est invoquée que si $ item ['options'] ['alter'] a été défini sur une valeur non vide (par exemple, TRUE). Cet indicateur doit être défini à l'aide de hook_menu_link_alter ().

Voici un exemple:

function MODULE_menu_link_alter(&$link) {
  if ($link['link_title'] == 'foo') {
    $link['options']['alter'] = TRUE;
  }
}

function MODULE_translated_menu_link_alter(&$link) {
  if ($link['link_title'] == 'foo') {
    $link['href'] = 'node/5';
  }
}

Quelques notes:

  • vous pouvez également filtrer par $ link ['menu_name']
  • MODULE_menu_link_alter () est invoqué lors de la suppression du cache pour tous les éléments de menu déclarés via hook_menu ().
  • Pour les éléments de menu créés via le Web , il n'est invoqué que lors de la sauvegarde , c'est-à-dire que pour que ce code prenne effet, vous devez modifier et enregistrer les liens du menu vous voulez modifier.

Pour référence, cette technique est implémentée par core dans user.module (voir ser_menu_link_alter et ser_translated_menu_link_alter ) et par menu_token module.

11
jonhattan

Si vous installez le module Internationalisation , vous aurez la sélection de la langue sur votre page de configuration de menu, par exemple, admin/structure/menu/manage/main-menu/add. Sélectionnez la langue et définissez le chemin d'accès correspondant à la langue.

Si vous avez deux langues, vous devrez créer deux éléments de menu pour chaque langue. Ensuite, si vous sélectionnez une langue, les éléments de menu avec la langue respective seront affichés.

5
Sithu

Après des jours à me casser la tête, j'ai finalement trouvé un moyen de résoudre mon problème !!!

Donc, un petit récapitulatif: j'ai trois nœuds qui sont des traductions les uns des autres (avec traduction du contenu).
Noeud 157 = anglais
Noeud 158 = néerlandais
Noeud 159 = Français

J'avais besoin d'un élément de menu qui afficherait dynamiquement le nœud correct en fonction de la langue de l'interface. Mais je n'ai pas pu créer trois éléments de menu séparés, car cet élément de menu a des liens enfants vers des nœuds qui sont traduits avec la traduction d'entité. Ensuite, j'ai eu quelques problèmes avec l'affichage du menu pour les traductions car elles n'étaient pas dans le menu. Pour faire une longue histoire, voici le code que j'ai utilisé:

mymodule.module

function mymodule_node_view($node, $view_mode, $langcode) {
    if($node->nid == 157) {
        if($langcode == 'nl') {
            drupal_goto('node/158');
        }elseif($langcode == 'fr') {
            drupal_goto('node/159');
        }
    } elseif($node->nid == 158 || $node->nid == 159) {
        menu_tree_set_path('main-menu', 'node/157');
    }
}

template.php

function mytheme_preprocess_page(&$variables) {
    if(!empty($variables['node'])){
        switch ($variables['node']->nid) {
            case 158:
                $variables['node']->title = '';
                menu_set_active_item('node/157');
                break;
            case 159:
                $variables['node']->title = '';
                menu_set_active_item('node/157');
                break;
        }
    }
}

Si cela ne vous donne aucun sens, n'hésitez pas à me le demander, je peux à peine le comprendre moi-même mais ça fait l'affaire!

0
Smos