it-swarm-vi.com

Làm cách nào để chuyển hướng đến một nút cụ thể từ trang trước trong Drupal 7?

Tôi có một trang web đa ngôn ngữ được tạo trong Drupal 7. Và tôi muốn kiểm tra xem tôi có ở trang trước không nếu đúng để chuyển hướng người dùng đến một nút cụ thể.

Tôi đã thử các phương pháp khác nhau:

  1. để tạo một trang front--page.tpl.php và sau đó để kiểm tra ngôn ngữ và sau đó chuyển hướng
  2. Tôi đã đặt mã này vào 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. Tôi đang sử dụng mô-đun i18n cho Drupal 7 vì vậy tôi cũng đã thử sử dụng $conf['i18n_variables'] trong settings.php như thế:

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

Nhưng tôi đã không thành công để làm điều đó. Bạn có gợi ý nào không?

6
Ek Kosmos

page - front.tpl.php chỉ đơn giản cho phép bạn tạo một mẫu trang khác với mẫu page.tpl.php mặc định. Khi drupal tải trang chủ và có một trang - front.tpl.php, nó sẽ laod mẫu đó thay thế.

Nếu bạn muốn kiểm tra xem bạn có ở trang chủ không, bạn có thể sử dụng biến is_front. Tốt nhất nên sử dụng hook_boot trong một mô-đun tùy chỉnh.

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

Bạn có thể sử dụng drupal_goto () để xử lý chuyển hướng.

7
Jepedo

Ví dụ, sử dụng một mô-đun tùy chỉnh thực hiện trình xử lý trình đơn cho "frontpage", có thể đặt Trang trước mặc định thành "frontpage".

Sau đó, mô-đun sẽ triển khai hook_menu() và một trình xử lý trang, tương tự như đoạn mã sau:

/**
 * 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

Tôi sẽ đi cho hook_boot:

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

Đó là sớm trong quá trình, vì vậy nên nhanh hơn và sử dụng ít tài nguyên hơn so với thực hiện trong chức năng chủ đề.

1
googletorp

Tại sao không đặt giá trị của Trang trước mặc định (site_frontpage biến) trong Quản trị "Cấu hình" Hệ thống "Thông tin trang web đến nút/[NID]? Nếu bạn muốn nút khác nhau cho các ngôn ngữ khác nhau, hãy giữ site_frontpagetrong i18n_variables trong settings.php và truy cập trang Thông tin trang web trong mỗi ngôn ngữ.

1
Pierre Buyle

Không cần mã. Đi đến Cấu hình - Thông tin trang web Ở đó, bạn có thể tìm thấy 'Trang trước mặc định', chỉ cần chèn liên kết của nút bạn muốn nhận.

1
Amaral

Tôi đã tạo một mô-đun (hộp cát) để thực hiện chính xác điều này, Chuyển hướng trang trước :

Drupal cho phép bạn xác định nội dung nào sẽ phục vụ trên trang chủ. Tuy nhiên, Drupal không chuyển hướng khách truy cập đến trang đó mà thay vào đó chỉ phục vụ nội dung của trang đó trên trang đầu.
[.__.] ...
[.__.] Để giảm bớt những vấn đề này, mô-đun này thực sự chuyển hướng khách truy cập đến trang đầu đến trang được xác định là trang trước. Nó làm như vậy bằng cách sử dụng mã trạng thái 301 (Đã di chuyển vĩnh viễn).

1
fietserwin

giải pháp của googletorp sẽ không hoạt động như hiện tại.

Nếu bạn cố gắng sử dụng drupal_is_front_page() trong hook_boot, bạn sẽ gặp lỗi vì các thư viện hàm thậm chí không được tải cho đến sau khi khởi động.

Đây là lý do tại sao EK Kosmos đang có một màn hình trống (tại sao mọi người đang phát triển với thông báo lỗi bị tắt?).

Một giải pháp là sử dụng hook_boot() , như được đề xuất, nhưng để đánh giá trực tiếp từ url nếu nó có phải là trang đầu hay không.

1
Webdesigner007

Để chuyển hướng, bạn không cần hiển thị trang vì vậy bạn nên sử dụng hook_boot thay vì hook_menu. Trong hook_boot, bạn không có quyền truy cập vào tất cả các hàm Drupal vì vậy tôi đã cố gắng nhiều nhất có thể với chức năng gốc 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