Drupal 7.で作成された多言語サイトがあります。そして、私がフロントページにいるかどうかを確認し、trueの場合、ユーザーを特定のノードにリダイレクトします。
私はさまざまな方法を試しました:
front--page.tpl.php
次に言語をチェックしてリダイレクトしますこのコードを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');
}
}
Drupal 7にi18nモジュールを使用しているので、$conf['i18n_variables']
in settings.php
のように:
$conf['i18n_variables'] = array(
'site_frontpage',
'site_name',
);
しかし、私はそれを成功させることができていません。何か提案はありますか?
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() を使用してリダイレクトを処理できます。
たとえば、「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');
}
}
私はhook_bootに行きます:
module_boot() {
global $language;
if (drupal_is_front_page() && $language->language == 'XX') {
drupal_goto('node/[NID]');
}
}
これはプロセスの初期なので、テーマ関数で実行するよりも速く、使用するリソースが少ないはずです。
デフォルトのフロントページ(the site_frontpage
変数)アドミニストレーション"構成"システム"サイト情報ノード/ [NID]?言語ごとに異なるノードが必要な場合は、site_frontpage
in i18n_variables
settings.phpで、各言語のサイト情報ページにアクセスします。
コーディングする必要はありません。構成サイトの情報に移動します。そこには、「デフォルトのフロントページ」があり、取得するノードのリンクを挿入するだけです。
これを正確に行うための(サンドボックス)モジュールを作成しました フロントページリダイレクト :
Drupalを使用すると、ホームページに提供するコンテンツを定義できます。ただし、Drupalは、訪問者をそのページにリダイレクトせず、そのページのコンテンツをフロントページに提供するだけです。
...
これらの問題を軽減するために、このモジュールは実際に、フロントページに到達したビジターをフロントページとして定義されているページにリダイレクトします。これは、301(永久に移動)ステータスコードを使用して行われます。
googletorpのソリューションは、そのままでは機能しません。
Hook_bootで drupal_is_front_page()
を使用しようとすると、ブート後まで関数ライブラリがロードされていないため、エラーが発生します。
これが、EKコスモスが空白の画面を表示する理由です(なぜエラーメッセージをオフにして開発しているのですか?)。
解決策は、提案どおり hook_boot()
を使用することですが、フロントページであるかどうかに関係なく、URLから直接評価します。
リダイレクトの場合、ページをレンダリングする必要はありません。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();
}
}