web-dev-qa-db-fra.com

Comment rediriger vers un nœud spécifique à partir de la première page dans Drupal 7?

J'ai un site multilingue créé en Drupal 7. Et je veux vérifier si je suis en première page, puis si c'est vrai pour rediriger l'utilisateur vers un vers un nœud spécifique.

J'ai essayé différentes méthodes:

  1. pour créer une page front--page.tpl.php puis pour vérifier la langue et rediriger
  2. J'ai mis ce code dans page.tpl.php:

     global $language;
    
     if ($node->nid == 1) {
         if ($language->language == "en") {
             header('Location: en/home');
         } elseif ($language->language == "fr") {
             header('Location: fr/accueil');
         }
     }
    
  3. J'utilise le module i18n pour Drupal 7 donc j'ai également essayé d'utiliser $conf['i18n_variables'] dans settings.php comme ça:

      $conf['i18n_variables'] = array(
         'site_frontpage',
         'site_name',
      );
    

Mais je n'ai pas réussi à le faire. Avez-vous des suggestions?

6
Ek Kosmos

page - front.tpl.php vous permet simplement de créer un modèle de page différent du modèle page.tpl.php par défaut. Lorsque drupal charge la page d'accueil et qu'il y a une page - front.tpl.php, il va à la place déposer ce modèle.

Si vous souhaitez vérifier si vous êtes sur la page d'accueil, vous pouvez utiliser la variable is_front. Il serait préférable d'utiliser hook_boot dans un module personnalisé.

hook_boot(&$vars) {
  if($vars['is_front']) {
    // do your redirect
  }
}

Vous pouvez utiliser drupal_goto () pour gérer la redirection.

7
Jepedo

En utilisant un module personnalisé qui implémente un gestionnaire de menu pour "frontpage", par exemple, il est possible de définir Page d'accueil par défaut sur "frontpage".

Le module doit ensuite implémenter hook_menu() et un gestionnaire de page, de la même manière que le code suivant:

/**
 * Implements hook_menu().
 */
function mymodule_menu() {
  $items = array();

  $items['frontpage'] = array(
    'page callback' => 'mymodule_view',
    'access arguments' => array('access content'),
    'type' => MENU_CALLBACK,
  );

  return $items;
}

/**
 * Menu callback; shows the frontpage node.
 */
function mymodule_view() {
  $langcode = $GLOBALS['language']->language;

  if ($langcode == "en") {
    drupal_goto('en/home');
  }
  elseif ($langcode == "fr") {
    drupal_goto('fr/accueil');
  }
}
4
kiamlaluno

Je choisirais hook_boot:

module_boot() {
  global $language;
  if (drupal_is_front_page() && $language->language == 'XX') {
    drupal_goto('node/[NID]');
  }
}

Il est tôt dans le processus, devrait donc être plus rapide et utiliser moins de ressources que de le faire dans une fonction de thème.

1
googletorp

Pourquoi ne pas définir la valeur de Première page par défaut (le site_frontpage variable) dans Administration "Configuration" Système "Informations sur le site vers le nœud/[NID]? Si vous voulez un nœud différent pour les différentes langues, gardez site_frontpagedans i18n_variables dans settings.php et visitez la page Site Information dans chaque langue.

1
Pierre Buyle

Il n'est pas nécessaire de coder. Allez à Configuration-Site Information Là, vous pouvez trouver 'Front page par défaut', insérez simplement le lien du nœud que vous souhaitez obtenir.

1
Amaral

J'ai créé un module (bac à sable) pour faire exactement cela, Redirection de la page d'accueil :

Drupal vous permet de définir le contenu à diffuser sur la page d'accueil. Cependant, Drupal ne redirige pas les visiteurs vers cette page mais sert simplement le contenu de cette page sur la première page.
...
Pour atténuer ces problèmes, ce module redirige vraiment les visiteurs qui arrivent sur la page d'accueil vers la page définie comme page d'accueil. Il le fait en utilisant un code d'état 301 (déplacé en permanence).

1
fietserwin

la solution de googletorp ne fonctionnera pas telle quelle.

Si vous essayez d'utiliser drupal_is_front_page() dans un hook_boot, vous obtiendrez des erreurs car les bibliothèques de fonctions n'ont même pas été chargées avant le démarrage.

C'est pourquoi EK Kosmos obtient un écran vide (pourquoi quelqu'un développe-t-il avec la messagerie d'erreur désactivée?).

Une solution consiste à utiliser hook_boot() , comme suggéré, mais à évaluer directement à partir de l'URL s'il s'agit de la première page ou non.

1
Webdesigner007

Pour une redirection, vous n'avez pas besoin de rendre la page à cet effet, vous devez utiliser hook_boot au lieu de hook_menu. Dans hook_boot, vous n'avez pas accès à toutes les fonctions Drupal), j'ai donc essayé autant que possible de rester avec la fonction native PHP.

/**
 * hook_boot
 */
function modulename_boot() {
  // Check if it's the front page
  // using hook_boot we avoid wasting resources
  // It's to early to use drupal_is_front_page and we should avoid loading unnecessary extra resource
  if ($_GET['q'] == '') {
    // http_negotiate_language() is a better option but require  pecl_http >= 0.1.0
    // Locale::acceptFromHttp() require intl extension
    $langBrowser = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'],0,2);

    // Get the activated languages on your drupal site
    $langAvailable = language_list();

    // set a default in case the language is not avaible
    $lang = 'en';

    if(isset($langAvailable[$langBrowser]) ){
      $lang = $langAvailable[$langBrowser]->prefix;
    }

    $http_response_code = 302;
    header('Location: ' . $lang, TRUE, $http_response_code);

    drupal_exit();
  }
}
0
gagarine