web-dev-qa-db-ja.com

Drupal 7でフロントページから特定のノードにリダイレクトする方法は?

Drupal 7.で作成された多言語サイトがあります。そして、私がフロントページにいるかどうかを確認し、trueの場合、ユーザーを特定のノードにリダイレクトします。

私はさまざまな方法を試しました:

  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. Drupal 7にi18nモジュールを使用しているので、$conf['i18n_variables'] in settings.phpのように:

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

しかし、私はそれを成功させることができていません。何か提案はありますか?

6
Ek Kosmos

page--front.tpl.phpを使用すると、デフォルトのpage.tpl.phpテンプレートとは異なるページテンプレートを作成できます。 drupalがホームページをロードし、ページがある場合--front.tpl.phpは、代わりにそのテンプレートをロードします。

ホームページにいるかどうかを確認したい場合は、is_front変数を使用できます。カスタムモジュールでhook_bootを使用するのが最善です。

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

drupal_goto() を使用してリダイレクトを処理できます。

7
Jepedo

たとえば、「frontpage」のメニューハンドラーを実装するカスタムモジュールを使用すると、デフォルトのフロントページを「frontpage」に設定できます。

次に、モジュールは次のコードと同様に、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
kiamlaluno

私はhook_bootに行きます:

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

これはプロセスの初期なので、テーマ関数で実行するよりも速く、使用するリソースが少ないはずです。

1
googletorp

デフォルトのフロントページ(the site_frontpage変数)アドミニストレーション"構成"システム"サイト情報ノード/ [NID]?言語ごとに異なるノードが必要な場合は、site_frontpagein i18n_variables settings.phpで、各言語のサイト情報ページにアクセスします。

1
Pierre Buyle

コーディングする必要はありません。構成サイトの情報に移動します。そこには、「デフォルトのフロントページ」があり、取得するノードのリンクを挿入するだけです。

1
Amaral

これを正確に行うための(サンドボックス)モジュールを作成しました フロントページリダイレクト

Drupalを使用すると、ホームページに提供するコンテンツを定義できます。ただし、Drupalは、訪問者をそのページにリダイレクトせず、そのページのコンテンツをフロントページに提供するだけです。
...
これらの問題を軽減するために、このモジュールは実際に、フロントページに到達したビジターをフロントページとして定義されているページにリダイレクトします。これは、301(永久に移動)ステータスコードを使用して行われます。

1
fietserwin

googletorpのソリューションは、そのままでは機能しません。

Hook_bootで drupal_is_front_page() を使用しようとすると、ブート後まで関数ライブラリがロードされていないため、エラーが発生します。

これが、EKコスモスが空白の画面を表示する理由です(なぜエラーメッセージをオフにして開発しているのですか?)。

解決策は、提案どおり hook_boot() を使用することですが、フロントページであるかどうかに関係なく、URLから直接評価します。

1
Webdesigner007

リダイレクトの場合、ページをレンダリングする必要はありません。hook_menuの代わりにhook_bootを使用する必要があります。 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
gagarine