Как перенаправить на определенный узел с главной страницы в Drupal 7?


У меня есть многоязычный сайт, созданный на Drupal 7. И я хочу проверить, нахожусь ли я на главной странице, а затем, если верно, перенаправить пользователя на какой-то конкретный узел.

Я пробовал разные методы:

  1. для создания страницы front--page.tpl.php, а затем для проверки языка и последующего перенаправления
  2. Я вставил этот код в 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. Я использую модуль i18n для Drupal 7, поэтому я также пытался использовать $conf['i18n_variables'] в settings.php, как это:

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

Но мне не удалось этого сделать. У вас есть какие-нибудь предложения?

Author: Ek Kosmos, 2011-03-17

8 answers

Page--front.tpl.php просто позволяет создать шаблон страницы, отличный от шаблона по умолчанию page.tpl.php шаблон. Когда drupal загружает домашнюю страницу и появляется page--front.tpl.php вместо этого он будет использовать этот шаблон.

Если вы хотите проверить, находитесь ли вы на домашней странице, вы можете использовать переменную is_front. Было бы лучше использовать hook_boot в пользовательском модуле.

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

Вы можете использовать drupal_goto() для обработки перенаправления.

 7
Author: Jepedo, 2015-09-17 19:18:20

Используя пользовательский модуль, который реализует обработчик меню для "главной страницы", например, можно установить Для главной страницы по умолчанию значение "главная страница".

Затем модуль должен реализовать hook_menu() и обработчик страниц, аналогично следующему коду:

/**
 * 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
Author: kiamlaluno, 2011-03-18 08:47:19

Я бы выбрал hook_boot:

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

Это на ранней стадии процесса, поэтому должно быть быстрее и использовать меньше ресурсов, чем делать это в функции темы.

 1
Author: googletorp, 2011-03-17 14:19:16

Почему бы не установить значение главной страницы по умолчанию (переменная site_frontpage) в Администрирование "Конфигурация" Система"Информация о сайте для узла/[NID]? Если вам нужен другой узел для разных языков, оставьте site_frontpage в i18n_variables в settings.php и посетите страницу Информация о сайте на каждом языке.

 1
Author: Pierre Buyle, 2011-03-17 14:26:41

Я создал модуль (песочница), чтобы сделать именно это, Перенаправление на главную страницу:

Drupal позволяет вам определять, какой контент следует размещать на домашней странице. Однако Drupal не перенаправляет посетителей на эту страницу, а вместо этого просто отображает содержимое этой страницы на главной странице.
...
Чтобы устранить эти проблемы, этот модуль действительно перенаправляет посетителей, которые попадают на главную страницу, на страницу, которая определена как главная страница. Он делает это с помощью 301 (перемещенного Постоянно) код состояния.

 1
Author: fietserwin, 2014-02-11 18:04:41

Нет необходимости кодировать. Перейдите в раздел Конфигурация - Информация о сайте Там вы можете найти "Главную страницу по умолчанию", просто вставьте ссылку на узел, который вы хотите получить.

 1
Author: Amaral, 2015-06-27 09:09:17

Решение Googletorp не будет работать как есть.

Если вы попытаетесь использовать drupal_is_front_page() в hook_boot вы получите ошибки, потому что библиотеки функций даже не были загружены до завершения загрузки.

Вот почему EK Kosmos получает пустой экран (почему кто-то разрабатывает с отключенными сообщениями об ошибках?).

Решение состоит в том, чтобы использовать hook_boot(), как и предлагалось, но оценивать непосредственно по URL-адресу, является ли это главной страницей или нет.

 1
Author: Webdesigner007, 2015-10-01 15:16:03

Для перенаправления вам не нужно отображать страницу, поэтому вы должны использовать hook_boot вместо hook_menu. В hook_boot у вас нет доступа ко всем функциям Drupal, поэтому я старался как можно больше оставаться с родной функцией 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
Author: gagarine, 2014-07-03 12:40:40