it-swarm.asia

كيفية إعادة التوجيه نحو عقدة معينة من الصفحة الأمامية في 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',
      );
    

لكني لم أنجح في ذلك. هل لديك أي اقتراحات؟

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

باستخدام وحدة نمطية مخصصة تقوم بتنفيذ معالج قائمة لـ "الصفحة الأولى" ، على سبيل المثال ، من الممكن تعيين الصفحة الأمامية الافتراضية على "الصفحة الأمامية".

يجب على الوحدة النمطية بعد ذلك تنفيذ 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

لماذا لا تقوم بتعيين قيمة الصفحة الأمامية الافتراضية (المتغير site_frontpage) في الإدارة "التكوين" النظام "معلومات الموقع للعقدة/[NID]؟ إذا كنت تريد عقدة مختلفة للغات مختلفة ، فاحتفظ site_frontpage في i18n_variables في settings.php وقم بزيارة معلومات الموقع صفحة في كل لغة.

1
Pierre Buyle

ليست هناك حاجة إلى رمز. انتقل إلى معلومات التكوين - الموقع هناك ، يمكنك العثور على "الصفحة الأمامية الافتراضية" ، فقط أدخل رابط العقدة التي تريد الحصول عليها.

1
Amaral

لقد أنشأت وحدة (sandbox) للقيام بذلك بالضبط ، إعادة توجيه الصفحة الأمامية :

يسمح لك دروبال بتحديد المحتوى الذي سيتم عرضه على الصفحة الرئيسية. ومع ذلك ، Drupal لا يعيد توجيه الزائرين إلى تلك الصفحة ولكن بدلاً من ذلك يقدم فقط محتوى تلك الصفحة على الصفحة الأولى.
...
للتخفيف من هذه المشاكل ، تعيد هذه الوحدة توجيه الزوار الذين يصلون إلى الصفحة الأولى إلى الصفحة التي تم تعريفها على أنها الصفحة الأولى. يفعل ذلك باستخدام رمز حالة 301 (تم نقله بشكل دائم).

1
fietserwin

لن يعمل حل googletorp كما هو.

إذا حاولت استخدام drupal_is_front_page() في ملف ربط ، فستحصل على أخطاء لأن مكتبات الوظائف لم يتم تحميلها حتى بعد التمهيد.

هذا هو السبب في حصول EK Kosmos على شاشة فارغة (لماذا يتم إيقاف أي شخص يتطور مع إيقاف تشغيل رسائل الخطأ؟).

الحل هو استخدام hook_boot() ، كما هو مقترح ، ولكن للتقييم مباشرة من عنوان url إذا كانت الصفحة الأولى أم لا.

1
Webdesigner007

لإعادة التوجيه ، لا تحتاج إلى عرض الصفحة لذلك ، يجب عليك استخدام 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
gagarine