it-swarm-tr.com

Drupal 7] 'deki ön sayfadan belirli bir düğüme nasıl yönlendirilirsiniz?

Drupal 7 yapılan bir çok dilli sitem var. Ve ben ön sayfada olup olmadığını kontrol etmek istiyorum sonra kullanıcı belirli bir düğüme yönlendirmek için doğru.

Farklı yöntemler denedim:

  1. sayfa oluşturmak için front--page.tpl.php ve sonra dili kontrol edip yeniden yönlendirmek için
  2. Bu kodu 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 için i18n modülünü kullanıyorum, bu yüzden $conf['i18n_variables'] içinde settings.php bunun gibi:

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

Ama bunu başaramadım. Herhangi bir öneriniz var mı?

6
Ek Kosmos

page - front.tpl.php basitçe varsayılan page.tpl.php şablonundan farklı bir sayfa şablonu oluşturmanıza izin verir. drupal ana sayfayı yüklediğinde ve bir sayfa varsa - front.tpl.php bunun yerine bu şablonu kullanamaz.

Ana sayfada olup olmadığınızı kontrol etmek istiyorsanız is_front değişkenini kullanabilirsiniz. Özel bir modülde hook_boot kullanmak en iyisidir.

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

Yönlendirmeyi işlemek için drupal_goto () kullanabilirsiniz.

7
Jepedo

Örneğin, "ön sayfa" için bir menü işleyici uygulayan özel bir modül kullanarak Varsayılan ön sayfa öğesini "ön sayfa" olarak ayarlamak mümkündür.

Modül daha sonra aşağıdaki koda benzer şekilde hook_menu() ve bir sayfa işleyici uygulamalıdır:

/**
 * 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 için gitmek istiyorum:

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

İşlemin başlarında olduğundan, bir tema işlevinde yapmaktan daha hızlı olmalı ve daha az kaynak kullanmalıdır.

1
googletorp

Neden Varsayılan ön sayfa (site_frontpage değişken) in Yönetim "Yapılandırma" Sistem "Site bilgileri düğüme/[NID]? Farklı diller için farklı bir düğüm istiyorsanız, site_frontpageiçinde i18n_variables_tr.php adresine gidin ve her dilde Site Bilgisi sayfasını ziyaret edin.

1
Pierre Buyle

Kodlamaya gerek yoktur. Yapılandırma-Site Bilgilerine Git Burada, 'Varsayılan ön sayfa' bulabilirsiniz, sadece almak istediğiniz düğümün bağlantısını ekleyin.

1
Amaral

Tam olarak bunu yapmak için bir (sanal alan) modülü oluşturdum, Ön sayfa yönlendirmesi :

Drupal, ana sayfada hangi içeriğin sunulacağını tanımlamanızı sağlar. Ancak, Drupal ziyaretçileri bu sayfaya yönlendirmez, bunun yerine yalnızca ön sayfada o sayfanın içeriğini sunar.
...
Bu modülleri hafifletmek için, bu modül gerçekten ön sayfaya gelen ziyaretçileri ön sayfa olarak tanımlanan sayfaya yönlendiriyor. Bunu 301 (Kalıcı Olarak Taşındı) durum kodu kullanarak yapar.

1
fietserwin

googletorp çözümü olduğu gibi çalışmaz.

Hook_boot'ta drupal_is_front_page() kullanmaya çalışırsanız, işlev kitaplıkları önyüklemeden sonraya kadar yüklenmemiş olduğundan hata alırsınız.

Bu yüzden EK Kosmos boş bir ekran alıyor (neden hata mesajıyla gelişen herhangi biri kapalı?).

Çözüm, önerildiği gibi hook_boot() kullanmaktır, ancak ön sayfa olup olmadığını doğrudan url'den değerlendirmektir.

1
Webdesigner007

Yeniden yönlendirme için sayfayı oluşturmanız gerekmez. Bunun için hook_menu yerine hook_boot kullanmanız gerekir. Hook_boot içinde tüm Drupal işlevine erişiminiz yok, bu yüzden native PHP işlevi ile mümkün olan en fazla kalış denedim.

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