it-swarm.it

Come reindirizzare verso un nodo specifico dalla prima pagina in Drupal 7?

Ho un sito in più lingue creato in Drupal 7. E voglio verificare se sono in prima pagina, quindi se è vero per reindirizzare l'utente a un nodo specifico.

Ho provato diversi metodi:

  1. creare una pagina front--page.tpl.php e quindi per controllare la lingua e quindi reindirizzare
  2. Ho inserito questo codice in 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. Sto usando il modulo i18n per Drupal 7, quindi ho provato anche a usare $conf['i18n_variables'] in settings.php come quello:

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

Ma non ci riesco. Hai qualche suggerimento?

6
Ek Kosmos

page - front.tpl.php consente semplicemente di creare un modello di pagina diverso rispetto al modello predefinito page.tpl.php. Quando drupal carica la homepage e c'è una pagina - front.tpl.php invece sostituirà quel modello.

Se vuoi controllare se sei nella homepage puoi usare la variabile is_front. Sarebbe meglio usare hook_boot in un modulo personalizzato.

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

Puoi usare drupal_goto () per gestire il reindirizzamento.

7
Jepedo

Utilizzando un modulo personalizzato che implementa un gestore di menu per "frontpage", ad esempio, è possibile impostare pagina iniziale predefinita su "frontpage".

Il modulo dovrebbe quindi implementare hook_menu() e un gestore di pagine, in modo simile al seguente codice:

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

Vorrei hook_boot:

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

È all'inizio del processo, quindi dovrebbe essere più veloce e utilizzare meno risorse rispetto a farlo in una funzione tema.

1
googletorp

Perché non impostare il valore di pagina iniziale predefinita (il site_frontpage variabile) in Amministrazione "Configurazione" Sistema "Informazioni sul sito al nodo/[NID]? Se vuoi un nodo diverso per le diverse lingue, mantieni site_frontpagein i18n_variables in settings.php e visita la pagina Informazioni sul sito in ogni lingua.

1
Pierre Buyle

Non è necessario codificare. Vai a Informazioni sul sito di configurazione Qui puoi trovare "Front page predefinita", basta inserire il link del nodo che vuoi ottenere.

1
Amaral

Ho creato un modulo (sandbox) per fare esattamente questo, Reindirizzamento alla prima pagina :

Drupal ti consente di definire quali contenuti pubblicare nella home page. Tuttavia, Drupal non reindirizza i visitatori a quella pagina ma serve solo il contenuto di quella pagina sulla prima pagina.
...
Per alleviare questi problemi, questo modulo reindirizza davvero i visitatori che arrivano alla prima pagina alla pagina definita come prima pagina. Lo fa usando un codice di stato 301 (spostato permanentemente).

1
fietserwin

la soluzione di googletorp non funzionerà così com'è.

Se si tenta di utilizzare drupal_is_front_page() in un hook_boot si otterranno errori perché le librerie di funzioni non sono state nemmeno caricate fino a dopo l'avvio.

Questo è il motivo per cui EK Kosmos sta ottenendo uno schermo vuoto (perché qualcuno sta sviluppando con la messaggistica di errore disattivata?).

Una soluzione consiste nell'utilizzare hook_boot() , come suggerito, ma per valutare direttamente dall'URL se è la prima pagina o meno.

1
Webdesigner007

Per un reindirizzamento non è necessario eseguire il rendering della pagina per cui è necessario utilizzare hook_boot anziché hook_menu. In hook_boot non hai accesso a tutte le Drupal, quindi ho provato il più possibile a rimanere con 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