Göreli menü bağlantılarını nasıl oluştururum?


10

Yerel ana bilgisayarımda Drupal'dan ayrı bir içeriğe bağlanması gereken bir sitede çalışmakla meşgulüm.

Ben bu kadarını akım menü yollara sahip: http://mylocalsite/the_folder_for_the_other_content. Ben dener <front>/the_folder_for_the_other_contentveya /the_folder_for_the_other_contentveya the_folder_for_the_other_content, "'whatever_I_use' yolu geçersiz veya buna erişiminiz yok" hatasını alıyorum.

Canlı olduğumda işaret etmek için tüm menü öğelerine ihtiyacım var http://myrealsite/the_folder_for_the_other_content.

Yayınlamaya başladığımda tüm menü yollarını düzenlemem gerekmeyecek şekilde nasıl ayarlayabilirim?


@irishbuzz'ın Drupal 6 için bir çözümü var, ancak bunu Drupal 7'de yapmaktan kaçınabileceğimi umuyordum.
Martin Duys

Drupal web sunucusunun kök dizinine kurulu mu?
kiamlaluno

Localhost sürümümde değil, ancak sonunda yayınlandığında public_html klasörünün kökünde olacak. Bu 'web sunucusunun kökü' olarak sayılıyor mu?
Martin Duys

"Web sunucusunun kök dizini" derken, Apache'de "DocumentRoot" yönergesiyle ayarlanan ve varsayılan olarak public_html dizini olan dizini kastediyorum. Gibi bir URL kullandığınızda Apache erişimi dizinidir http://example.com/.
kiamlaluno

Sonra: evet sonuçta site kök dizinde olacak
Martin Duys

Yanıtlar:


4

kiamlaluno'nun cevabı benim için pek işe yaramadı. % Menu_tail kullanımı, menu_tail_load işlevinin eksik argümanlarla ilgili sorun yaşadığına dair bir hata fırtınası oluşturdu:

Warning: Missing argument 2 for menu_tail_load(), called in  ... /includes/menu.inc on line 579 and defined in menu_tail_load() (line 827 of ... /includes/menu.inc).
Warning: Missing argument 3 for menu_tail_load(), called in ... /includes/menu.inc on line 579 and defined in menu_tail_load() (line 827 of ... /includes/menu.inc).

Benim için ne işe yaradı

function allow_menu_links_menu() {
  $items = array();
  $items['sites/d8/files/%'] = array(
    'title' => 'Folder Content',
    'page callback' => 'allow_menu_links_cb', /* never called */
    'access callback' => TRUE,
  );
  return $items;
}

Ardından, sites / d8 / files klasöründeki dosyaları (ve alt klasörleri), sites/d8/files/Documents/MyFile.pdf

Menü sistemi daha sonra aşağıdaki gibi bir bağlantı oluşturur: href="https://drupal.stackexchange.com/sites/d8/files/Documents/MyFile.pdf"

Özel menü modülünü kullanmazsanız, menü sistemi yukarıdaki gibi başlayan bir yolu reddeder.

Gibi bir yol kullanmaya çalışırsanız , sitenin kökünde olduğunuzda çalışacak http:sites/d8/files/Documents/MyFile.pdfgibi bir bağlantı üretecektir href="http:sites/d8/files/Documents/MyFile.pdf", ancak bir içerik sayfasında olduğunuzda, tarayıcı URL'yi içerik sayfasına göre yorumlayacaktır, ve işe yaramaz.

Gibi bir yol kullanırsanız http:/sites/d8/files/Documents/MyFile.pdf, menü sistemi bunu kabul eder, ancak menü sistemi href="http:/sites/d8/files/Documents/MyFile.pdf", tarayıcının (en azından Safari) olarak yorumlayacağı href="http://sites/d8/files/Documents/MyFile.pdf"ve "siteler" adlı sunucuyu bulmaya çalışmayan bir bağlantı üretir .

(Daha fazla araştırmada, menu_tail kullanan kodun başarısız olmasının nedeni, burada belirtildiği gibi 'yükleme argümanlarını' eklemeniz gerektiğidir: http://api.drupal.org/api/drupal/includes--menu.inc/function / menu_tail_load / 7.'load arguments' => array('%map', '%index'), Kiamlaluno kodunda $ item tanımına eklerseniz , işe yarayacaktır menu_tail_load öğesinin açık yükleme bağımsız değişkenleri gerektirip gerektirmediği konusu burada da tartışılmaktadır: http://drupal.org/node/298561 )

(Yeni modülünüzü etkinleştirmeyi unutmayın, aksi takdirde menü sistemi yeni bağlantıları kabul etmez)


5

Yeni bir bağlantı eklediğinizde, bağlantının yolun geçerli olup olmadığını veya kullanıcıdan erişilebildiğini kontrol etmek için drupal_valid_path () öğesini çağıran menu_edit_item_validate () yönteminden doğrulanır . eğer döner
drupal_valid_path()TRUE

  • Yol <front>( <front>/directoryveya benzer yollar hariç tutulur)
  • Yol harici bir yoldur ( url_is_external () işlevi döndürür TRUE)
  • Yol, bir menü geri aramayla ilişkilidir

Mutlak URL'leri kullanmanın yanı sıra, tek çözüm kullanmak istediğiniz yolla ilişkilendirilmiş bir menü geri aramasını tanımlayan özel bir modüle sahip olmaktır.
Bir dosyaya veya dizine işaret eden URL'yi kullandığınızda, web sunucusu bu dosyayı veya dizini Drupal'ı çağırmadan göstermelidir. Drupal ile birlikte gelen .htaccess dosyası aşağıdaki yönergeleri içerdiğinden Apache ile olan budur:

# Pass all requests not referring directly to files in the filesystem to
# index.php. Clean URLs are handled in drupal_environment_initialize().
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !=/favicon.ico
RewriteRule ^ index.php [L]

Sizin durumunuzda, özel modül aşağıdakine benzer bir kod içermelidir:

function mymodule_menu() {
  $items = array();

  $items['the_folder_for_the_other_content/%menu_tail'] = array(
    'title' => 'Folder content', 
    'page callback' => 'mymodule_view', 
    'access callback' => TRUE,
    'load arguments' => array('%map', '%index'), 
  );

  return $items;
}

Başlık ve sayfa geri araması için herhangi bir değer kullanabilirsiniz , çünkü bu menü geri araması asla çağrılmamalıdır. Erişim geri aramasının değeri, Drupal'a her kullanıcının o menü geri aramasına erişimi olduğunu söylüyor.

Alternatif olarak, kullanıcıyı gördükleri dizine yönlendiren ( drupal_goto () kullanarak ) "alias_for_directory /% menu_tail" ile ilişkili bir menü geri çağrısı tanımlayabilirsiniz . Sunucu .htaccess içeriğini kullanmadığında ve URL varolan bir dosyaya veya dizine işaret ederken bile Drupal'ı çağırdığında bu çözümü kullanırdım.


3

Benim için aşağıdaki hile yaptı (drupal 6'da).

Aynı alan adında başka bir URL'ye yönlendirmek istiyorum, diyelim ki Drupal çalışıyor http://www.example.comvehttp://www.example.com/frontend

Menü öğesine, lütfen yol olarak girin:

http:/frontend

Drupal menüsü aşağıdakilere bağlanır: http://www.example.com/frontend

Https kullandığınızda, menü öğesinin yol alanına https: / frontend girmelisiniz.



Bilmiyorum, sadece bir deneyin.
Paul

Bu yöntemi sürüm 7.22 olarak çalışmıyor buluyorum.
Rick

1
Bu Drupal 7.23 üzerinde çalışır. Bunu bir süredir yapmaya çalışıyorum, eğer yapabilseydim +10
DrCord


1

Menü yapısındaki bağlantıyı değiştirmek için sql kullandım:

UPDATE menu_links SET link_path = replace(link_path, "livesite.com", "localhost.com");

Bunu yapmak gerekiyordu ama sonra menü önbellekleri temizlendi emin değilim.


sorguyu neden değiştirmek istesin ki? Tavsiye edilmez.
gerl
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.