لدي موقع متعدد اللغات تم إنشاؤه في Drupal 7. وأريد التحقق مما إذا كنت في الصفحة الأمامية ثم إذا كان صحيحًا لإعادة توجيه المستخدم إلى عقدة معينة.
لقد جربت طرقًا مختلفة:
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');
}
}
أنا أستخدم وحدة i18n من أجل Drupal 7 لذا حاولت أيضًا استخدام $conf['i18n_variables']
في 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 () لمعالجة إعادة التوجيه.
باستخدام وحدة نمطية مخصصة تقوم بتنفيذ معالج قائمة لـ "الصفحة الأولى" ، على سبيل المثال ، من الممكن تعيين الصفحة الأمامية الافتراضية على "الصفحة الأمامية".
يجب على الوحدة النمطية بعد ذلك تنفيذ 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]');
}
}
إنه مبكر في العملية ، لذا يجب أن يكون أسرع واستخدام موارد أقل من القيام بذلك في وظيفة السمة.
لماذا لا تقوم بتعيين قيمة الصفحة الأمامية الافتراضية (المتغير site_frontpage
) في الإدارة "التكوين" النظام "معلومات الموقع للعقدة/[NID]؟ إذا كنت تريد عقدة مختلفة للغات مختلفة ، فاحتفظ site_frontpage
في i18n_variables
في settings.php وقم بزيارة معلومات الموقع صفحة في كل لغة.
ليست هناك حاجة إلى رمز. انتقل إلى معلومات التكوين - الموقع هناك ، يمكنك العثور على "الصفحة الأمامية الافتراضية" ، فقط أدخل رابط العقدة التي تريد الحصول عليها.
لقد أنشأت وحدة (sandbox) للقيام بذلك بالضبط ، إعادة توجيه الصفحة الأمامية :
يسمح لك دروبال بتحديد المحتوى الذي سيتم عرضه على الصفحة الرئيسية. ومع ذلك ، Drupal لا يعيد توجيه الزائرين إلى تلك الصفحة ولكن بدلاً من ذلك يقدم فقط محتوى تلك الصفحة على الصفحة الأولى.
...
للتخفيف من هذه المشاكل ، تعيد هذه الوحدة توجيه الزوار الذين يصلون إلى الصفحة الأولى إلى الصفحة التي تم تعريفها على أنها الصفحة الأولى. يفعل ذلك باستخدام رمز حالة 301 (تم نقله بشكل دائم).
لن يعمل حل googletorp كما هو.
إذا حاولت استخدام drupal_is_front_page()
في ملف ربط ، فستحصل على أخطاء لأن مكتبات الوظائف لم يتم تحميلها حتى بعد التمهيد.
هذا هو السبب في حصول EK Kosmos على شاشة فارغة (لماذا يتم إيقاف أي شخص يتطور مع إيقاف تشغيل رسائل الخطأ؟).
الحل هو استخدام hook_boot()
، كما هو مقترح ، ولكن للتقييم مباشرة من عنوان url إذا كانت الصفحة الأولى أم لا.
لإعادة التوجيه ، لا تحتاج إلى عرض الصفحة لذلك ، يجب عليك استخدام 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();
}
}