मैं सापेक्ष मेनू लिंक कैसे बनाऊं?


10

मैं अपने लोकलहोस्ट पर एक साइट पर काम करने में व्यस्त हूं जिसे कुछ सामग्री से लिंक करने की आवश्यकता है जो ड्रुपल से अलग है।

मैं वर्तमान मेनू रास्तों इस तरह की स्थापना की है: http://mylocalsite/the_folder_for_the_other_content। यदि मैं कोशिश करता हूं <front>/the_folder_for_the_other_contentया /the_folder_for_the_other_contentया the_folder_for_the_other_content, मुझे त्रुटि मिलती है "पथ 'जो भी हो \ _ \ _' या तो अमान्य है या आपके पास इसका उपयोग नहीं है।"

जब मैं लाइव होता हूं तो मुझे स्पष्ट रूप से इंगित करने के लिए सभी मेनू आइटम की आवश्यकता होती है http://myrealsite/the_folder_for_the_other_content

मैं इसे कैसे सेट कर सकता हूं ताकि मुझे लाइव होने पर सभी मेनू पथों को संपादित न करना पड़े?


@irishbuzz के पास Drupal 6 के लिए वर्कअराउंड है, लेकिन मैं उम्मीद कर रहा था कि मैं Drupal 7 में ऐसा करने से बच सकता हूं। क्या मेरी तरफ से यह इच्छाधारी सोच है?
मार्टिन ड्यूस

क्या Drupal वेब सर्वर की मूल निर्देशिका में स्थापित है?
kiamlaluno

मेरे लोकलहोस्ट संस्करण पर नहीं, लेकिन जब यह लाइव हो जाएगा तो यह public_html फ़ोल्डर की जड़ में होगा। क्या वह 'वेब सर्वर की जड़' के रूप में गिना जाता है?
मार्टिन ड्यूस

"वेब सर्वर की रूट डायरेक्टरी" से मेरा मतलब है कि अपाचे में "डॉक्यूमेंटरूट" निर्देश के साथ सेट किया गया है और जो डिफ़ॉल्ट रूप से, public_html निर्देशिका है। जब आप किसी URL का उपयोग करते हैं तो यह निर्देशिका अपाचे एक्सेस होता है http://example.com/
kiamlaluno

तब: हाँ अंततः साइट रूट डायरेक्टरी में होगी
मार्टिन ड्यूस

जवाबों:


4

kiamlaluno का जवाब मेरे लिए काफी काम का नहीं था। % Menu_tail का उपयोग करने से त्रुटियों का एक तूफान उत्पन्न हुआ, जो menu_tail_load फ़ंक्शन को लापता तर्कों के साथ समस्या हो रही थी:

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).

मेरे लिए क्या काम था

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;
}

उसके बाद, मैं साइटों / d8 / फ़ाइलें फ़ोल्डर (और सबफ़ोल्डर) में पथ के साथ मेनू आइटम का उपयोग करके फ़ाइलों की सेवा कर सकता हूं sites/d8/files/Documents/MyFile.pdf

मेनू सिस्टम फिर एक लिंक उत्पन्न करेगा href="https://drupal.stackexchange.com/sites/d8/files/Documents/MyFile.pdf"

यदि आप कस्टम मेनू मॉड्यूल का उपयोग नहीं करते हैं, तो मेनू सिस्टम ऊपर के रूप में शुरू होने वाले मार्ग को अस्वीकार कर देगा।

यदि आप किसी पथ का उपयोग करने का प्रयास करते हैं http:sites/d8/files/Documents/MyFile.pdf, तो यह एक लिंक का उत्पादन करेगा href="http:sites/d8/files/Documents/MyFile.pdf", जो तब काम करेगा जब आप साइट के मूल में होंगे, लेकिन जब आप किसी सामग्री पृष्ठ पर होंगे, तो ब्राउज़र सामग्री पृष्ठ के सापेक्ष url की व्याख्या करेगा, और यह काम नहीं करेगा।

यदि आप जैसे किसी पथ का उपयोग करते हैं http:/sites/d8/files/Documents/MyFile.pdf, तो मेनू सिस्टम इसे स्वीकार करेगा, लेकिन मेनू सिस्टम एक लिंक का उत्पादन करेगा href="http:/sites/d8/files/Documents/MyFile.pdf", जिसे ब्राउज़र (कम से कम सफारी) के रूप में व्याख्या करेगा href="http://sites/d8/files/Documents/MyFile.pdf", और "साइटों" नामक सर्वर को खोजने की कोशिश करने में विफल रहेगा।

(आगे की जाँच करने पर, मेनू_ कोड विफल होने का कारण यह है कि आपको 'लोड तर्क' जोड़ने की आवश्यकता है, जैसा कि यहाँ उल्लेख किया गया है: http://api.drupal.org/api/drupal/includes--menu.inc/function / menu_tail_load / 7। यदि आप 'load arguments' => array('%map', '%index'),kiamlaluno के कोड में $ आइटम की परिभाषा में जोड़ते हैं, तो यह काम करेगा। क्या menu_tail_load को स्पष्ट लोड तर्कों की आवश्यकता है, इस मुद्दे पर भी यहां चर्चा की गई है: http://drupal.org/node/298561 )

(अपने नए मॉड्यूल को सक्षम करने के लिए मत भूलना, या मेनू सिस्टम नए लिंक को स्वीकार नहीं करेगा)


5

जब आप एक नया लिंक जोड़ते हैं, तो लिंक menu_edit_item_validate () से मान्य होता है , जो drupal_valid_path () को यह जांचने के लिए कहता है कि क्या मार्ग वैध है, या इसे उपयोगकर्ता से एक्सेस किया जा सकता है। अगर
drupal_valid_path()लौटता TRUEहै

  • पथ है <front>( <front>/directoryया समान पथ को बाहर रखा गया है)
  • पथ एक बाहरी पथ है (फ़ंक्शन url_is_external () रिटर्न TRUE)
  • पथ एक मेनू कॉलबैक के साथ जुड़ा हुआ है

निरपेक्ष यूआरएल का उपयोग करने के अलावा, एकमात्र समाधान एक कस्टम मॉड्यूल है जो उस मेनू कॉलबैक को परिभाषित करता है जिसे आप उपयोग करना चाहते हैं।
जब आप उस URL का उपयोग करते हैं जो किसी फ़ाइल, या एक निर्देशिका की ओर इशारा करता है, तो वेब सर्वर को उस फ़ाइल या निर्देशिका को दिखाना चाहिए, जिसमें ड्रुपल को शामिल किए बिना। अपाचे के साथ ऐसा ही होता है, क्योंकि Drupal के साथ आने वाली .htaccess फाइल में निम्नलिखित निर्देश होते हैं:

# 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]

आपके मामले में, कस्टम मॉड्यूल में निम्नलिखित के समान कोड होना चाहिए:

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;
}

आप शीर्षक और पृष्ठ कॉलबैक के लिए किसी भी मान का उपयोग कर सकते हैं , क्योंकि उस मेनू कॉलबैक को कभी भी कॉल नहीं किया जाना चाहिए। एक्सेस कॉलबैक का मूल्य Drupal से कहता है कि प्रत्येक उपयोगकर्ता की उस मेनू कॉलबैक तक पहुंच है।

एक विकल्प के रूप में आप "alias_for_directory /% menu_tail" से संबंधित एक मेनू कॉलबैक को परिभाषित कर सकते हैं जो उपयोगकर्ता को उस निर्देशिका पर पुनर्निर्देशित करता है जिसे आप चाहते हैं कि वे ( drupal_goto () का उपयोग करके ) देखें। मैं इस समाधान का उपयोग तब करूँगा जब सर्वर .htaccess की सामग्री का उपयोग नहीं करता है, और यह तब भी Drupal को आमंत्रित करेगा, जब URL किसी मौजूदा फ़ाइल या निर्देशिका की ओर इशारा कर रहा हो।


3

मेरे लिए निम्न चाल चली (ड्रुपल 6 पर)।

मैं उसी डोमेन पर किसी अन्य URL को निर्देशित करना चाहता हूं, मान लें कि Drupal चल रहा है http://www.example.comऔर मैं एक लिंक करना चाहता हूंhttp://www.example.com/frontend

मेनू आइटम में, कृपया पथ के रूप में दर्ज करें:

http:/frontend

ड्रुपल मेनू इससे लिंक होगा: http://www.example.com/frontend

जब आप https का उपयोग करते हैं, तो आपको मेनू आइटम के लिए पथ फ़ील्ड में https: / frontend दर्ज करना चाहिए।


किसी भी विचार अगर यह 7 में काम करेगा /
मार्टिन ड्यूस

पता नहीं, बस इसे आज़माएं।
पॉल

मैं इस विधि को संस्करण 7.22 के रूप में काम नहीं कर रहा हूँ।
रिक

1
यह Drupal 7.23 पर काम करता है। मैं थोड़ी देर के लिए ऐसा करने की कोशिश कर रहा था, अगर मैं आपको 10 +
DrCord

1

मैंने निम्नलिखित के साथ अपने लिंक मुद्दों को हल किया:

http://groups.drupal.org/node/210308 और http://drupal.org/node/372252

यह पता चला कि मेरा विषय गलत तरीके से मेनू को प्रिंट कर रहा था ताकि सभी आइटम मेरे वर्तमान स्थान (यानी / लॉगआउट के बजाय व्यवस्थापक / लॉगआउट) के सापेक्ष हों।

उम्मीद है की यह मदद करेगा।


1

मेनू संरचना में लिंक को बदलने के लिए मैंने sql का उपयोग किया:

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

यकीन नहीं है कि अगर मुझे ऐसा करने की ज़रूरत है लेकिन मैंने फिर मेनू कैश फ्लश कर दिया।


हालांकि आप क्वेरी को क्यों बदलना चाहेंगे? यह अनुशंसित नहीं है।
gerl
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.