it-swarm-ko.tech

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. Drupal 7에 i18n 모듈을 사용하고 있으므로 $conf['i18n_variables']settings.php 그런 식으로 :

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

그러나 나는 그것을 성공하지 못했습니다. 당신은 어떤 제안이 있습니까?

6
Ek Kosmos

page--front.tpl.php를 사용하면 기본 page.tpl.php 템플릿과 다른 페이지 템플릿을 만들 수 있습니다. drupal 홈페이지를로드하고 page.front.tpl.php 페이지가있을 때 대신 해당 템플릿을 배치합니다.

홈페이지에 있는지 확인하려면 is_front 변수를 사용할 수 있습니다. 사용자 정의 모듈에서 hook_boot를 사용하는 것이 가장 좋습니다.

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

drupal_goto () 를 사용하여 리디렉션을 처리 할 수 ​​있습니다.

7
Jepedo

예를 들어, "frontpage"에 대한 메뉴 핸들러를 구현하는 사용자 정의 모듈을 사용하면 Default front page를 "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

관리"구성"시스템"사이트 정보에서 기본 프론트 페이지 (site_frontpage 변수)의 값을 node/[NID]로 설정하지 않겠습니까? 다른 언어에 대해 다른 노드를 원하면 settings.php의 site_frontpagei18n_variables를 유지하고 각 언어의 사이트 정보 페이지를 방문하십시오.

1
Pierre Buyle

코딩 할 필요가 없습니다. 구성 사이트 정보로 이동 거기에서 '기본 프론트 페이지'를 찾을 수 있습니다. 가져 오려는 노드의 링크를 삽입하십시오.

1
Amaral

정확히 이것을 수행하기 위해 (샌드 박스) 모듈을 만들었습니다 Front page redirect :

Drupal을 사용하면 홈 페이지에서 제공 할 컨텐츠를 정의 할 수 있습니다. 그러나 Drupal는 방문자를 해당 페이지로 리디렉션하지 않고 대신 첫 페이지에서 해당 페이지의 콘텐츠를 제공합니다.
...
이 문제를 완화하기 위해이 모듈은 실제로 첫 페이지에 도착한 방문자를 첫 페이지로 정의 된 페이지로 리디렉션합니다. 301 (영구적으로 이동) 상태 코드를 사용합니다.

1
fietserwin

googletorp의 솔루션은 그대로 작동하지 않습니다.

Hook_boot에서 drupal_is_front_page() 을 사용하려고하면 함수 라이브러리가 부팅 후에도로드되지 않았기 때문에 오류가 발생합니다.

이것이 EK Kosmos가 빈 화면을 표시하는 이유입니다 (오류 메시지를 끈 상태에서 개발중인 사람은 무엇입니까?).

해결책은 hook_boot() 을 사용하는 것이 좋지만 URL이 첫 페이지인지 아닌지 URL에서 직접 평가하는 것입니다.

1
Webdesigner007

리디렉션의 경우 페이지를 렌더링 할 필요가 없으므로 hook_menu 대신 hook_boot를 사용해야합니다. hook_boot에서는 모든 Drupal 함수에 액세스 할 수 없으므로 native 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