it-swarm-eu.dev

Jak přesměrovat na konkrétní uzel z přední stránky v Drupal 7?

Mám vícejazyčný web vytvořený v Drupal 7. A já chci zkontrolovat, jestli jsem na přední stránce, pak, pokud je pravda, přesměrovat uživatele na konkrétní uzel.

Vyzkoušel jsem různé metody:

  1. vytvořit stránku front--page.tpl.php a poté zkontrolovat jazyk a poté přesměrovat
  2. Vložil jsem tento kód do 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. Používám i18n modul pro Drupal 7, takže jsem se také pokusil použít $conf['i18n_variables'] v settings.php takhle:

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

Ale nepodařilo se mi to. Máte nějaké návrhy?

6
Ek Kosmos

page - front.tpl.php jednoduše umožňuje vytvořit jinou šablonu stránky než výchozí šablonu page.tpl.php. Když drupal načte domovskou stránku a existuje stránka - front.tpl.php, místo ní bude tato šablona laodována).

Pokud chcete zkontrolovat, zda jste na domovské stránce, můžete použít proměnnou is_front. Nejlepší je použít hook_boot ve vlastním modulu.

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

K přesměrování můžete použít drupal_goto () .

7
Jepedo

Pomocí uživatelského modulu, který implementuje obslužný program nabídky pro „frontpage“, je například možné nastavit výchozí přední strana na „frontpage“.

Modul by pak měl implementovat hook_menu() a popisovač stránky, podobně jako následující kód:

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

Chtěl bych jít na hook_boot:

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

Je to na začátku procesu, takže by mělo být rychlejší a spotřebovávat méně zdrojů, než dělat v tematické funkci.

1
googletorp

Proč nenastavit hodnotu výchozí přední strana (site_frontpage proměnná) v Administrace "Konfigurace" Systém "Informace o web do uzlu/[NID]? Pokud chcete pro různé jazyky jiný uzel, ponechte site_frontpagev i18n_variables in settings.php a navštivte stránku Informace o web v každém jazyce.

1
Pierre Buyle

Není třeba kódovat. Přejít na informace o konfiguračním serveru Zde najdete „Výchozí přední stránka“, stačí vložit odkaz na uzel, který chcete získat.

1
Amaral

Vytvořil jsem modul (karanténa), abych to přesně udělal, přesměrování na přední stránk :

Drupal vám umožňuje definovat, jaký obsah se má na domovské stránce zobrazovat. Drupal však nepřesměruje návštěvníky na tuto stránku, ale pouze slouží obsahu této stránky na přední stránce).
...
Pro zmírnění těchto problémů tento modul skutečně přesměruje návštěvníky, kteří dorazí na přední stránku, na stránku, která je definována jako přední stránka. Provádí to pomocí stavového kódu 301 (trvale přesunutý).

1
fietserwin

řešení googletorp nebude fungovat tak, jak je.

Pokud se pokusíte použít drupal_is_front_page() v hook_bootu, dostanete chyby, protože funkční knihovny nebyly načteny až po zavedení.

To je důvod, proč EK Kosmos dostává prázdnou obrazovku (proč se někdo vyvíjí s vypínáním chybových zpráv?).

Řešením je použít hook_boot() , jak bylo navrženo, ale vyhodnotit přímo z adresy URL, pokud se jedná o přední stránku nebo ne.

1
Webdesigner007

Pro přesměrování nemusíte tuto stránku vykreslovat, měli byste místo hook_menu použít hook_boot. V hook_bootu nemáte přístup ke všem funkcím Drupal, takže jsem se pokusil co nejvíce z pobytu s nativní funkcí PHP funkce).

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