it-swarm-es.com

¿Cómo redirigir hacia un nodo específico desde la primera página en Drupal 7?

Tengo un sitio en varios idiomas hecho en Drupal 7. Y quiero verificar si estoy en la página principal, si es verdadero para redirigir al usuario a un nodo específico.

He probado diferentes métodos:

  1. para crear una página front--page.tpl.php y luego para verificar el idioma y luego redirigir
  2. He puesto este código en 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. Estoy usando el módulo i18n para Drupal 7, así que también he intentado usar $conf['i18n_variables'] en settings.php como eso:

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

Pero no he logrado hacerlo. ¿Tienes alguna sugerencia?

6
Ek Kosmos

page - front.tpl.php simplemente le permite crear una plantilla de página diferente a la plantilla page.tpl.php predeterminada. Cuando drupal carga la página de inicio y hay una página - front.tpl.php, cargará esa plantilla en su lugar.

Si desea verificar si está en la página de inicio, puede usar la variable is_front. Sería mejor usar hook_boot en un módulo personalizado.

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

Puede usar drupal_goto () para manejar la redirección.

7
Jepedo

Usando un módulo personalizado que implementa un controlador de menú para "portada", por ejemplo, es posible establecer Página frontal predeterminada en "portada".

El módulo debe implementar hook_menu() y un controlador de página, de forma similar al siguiente código:

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

Yo iría por hook_boot:

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

Es temprano en el proceso, por lo que debería ser más rápido y usar menos recursos que hacerlo en una función de tema.

1
googletorp

¿Por qué no establecer el valor de portada predeterminada (la site_frontpage variable) en Administración "Configuración" Sistema "Información del sitio al nodo/[NID]? Si desea un nodo diferente para los diferentes idiomas, mantenga site_frontpageen i18n_variables en settings.php y visite la página Información del sitio en cada idioma.

1
Pierre Buyle

No hay necesidad de codificar. Vaya a Información del sitio de configuración Allí, puede encontrar la 'Página principal predeterminada', simplemente inserte el enlace del nodo que desea obtener.

1
Amaral

Creé un módulo (sandbox) para hacer exactamente esto, redirección de la página principal :

Drupal le permite definir qué contenido servir en la página de inicio. Sin embargo, Drupal no redirige a los visitantes a esa página, sino que solo sirve el contenido de esa página en la página principal.
...
Para aliviar estos problemas, este módulo realmente redirige a los visitantes que llegan a la página principal a la página que se define como página principal. Lo hace usando un código de estado 301 (movido permanentemente).

1
fietserwin

la solución de googletorp no funcionará como está.

Si intenta usar drupal_is_front_page() en un hook_boot obtendrá errores porque las bibliotecas de funciones ni siquiera se han cargado hasta después del inicio.

Es por eso que EK Kosmos está obteniendo una pantalla en blanco (¿por qué alguien está desarrollando con mensajes de error desactivados?).

Una solución es usar hook_boot() , como se sugiere, pero evaluar directamente desde la url si es la portada o no.

1
Webdesigner007

Para una redirección no necesita renderizar la página, por lo tanto, debe usar hook_boot en lugar de hook_menu. En hook_boot no tienes acceso a todas las funciones Drupal), así que intenté tanto como sea posible permanecer con nativo PHP función.

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