it-swarm.asia

كيف أقوم بإنشاء ارتباطات قائمة نسبية؟

أنا مشغول بالعمل على موقع على المضيف المحلي الخاص بي الذي يحتاج إلى الارتباط ببعض المحتوى المنفصل عن دروبال.

لقد قمت بإعداد مسارات القائمة الحالية على النحو التالي: 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.

كيف يمكنني إعداده حتى لا أضطر إلى تعديل جميع مسارات القائمة عندما أبدأ البث المباشر؟

10
Martin Duys

إجابة 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;
}

بعد ذلك ، يمكنني تقديم الملفات في مجلد files/d8/files (والمجلدات الفرعية) باستخدام عناصر القائمة ذات المسارات مثل sites/d8/files/Documents/MyFile.pdf

سيقوم نظام القائمة بعد ذلك بإنشاء ارتباط مثل href="/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" ، والذي سيفسره المتصفح (على الأقل Safari) على أنه href="http://sites/d8/files/Documents/MyFile.pdf" ، وفشلت في محاولة العثور على الخادم المسمى "مواقع".

(في مزيد من التحقيق ، فإن سبب فشل الكود باستخدام menu_tail هو أنك تحتاج إلى إضافة "وسائط التحميل" ، كما هو موضح هنا: http://api.drupal.org/api/drupal/includes--menu .inc/function/menu_tail_load/7 . إذا أضفت 'load arguments' => array('%map', '%index'), إلى تعريف $ items في كود kiamlaluno ، فستعمل. كما تتم مناقشة مسألة ما إذا كان يجب على menu_tail_load أن تتطلب وسيطات الحمل الصريحة هنا: http://drupal.org/node/298561 )

(لا تنس تمكين وحدتك الجديدة ، وإلا فلن يقبل نظام القائمة الروابط الجديدة)

4
nachbar

عند إضافة رابط جديد ، يتم التحقق من الرابط من menu_edit_item_validate () ، والذي يستدعي drupal_valid_path () للتحقق مما إذا كان المسار صالحًا ، أو يمكن الوصول إليه من المستعمل.
drupal_valid_path() تُرجع TRUE إذا

  • المسار <front> (<front>/directory ، أو مسارات مماثلة مستثناة)
  • المسار هو مسار خارجي (الوظيفة rl_is_external () تُرجع TRUE)
  • المسار مرتبط باستدعاء القائمة

بصرف النظر عن استخدام عناوين URL المطلقة ، فإن الحل الوحيد هو أن يكون لديك وحدة مخصصة تحدد استدعاء القائمة المرتبط بالمسار الذي تريد استخدامه.
عند استخدام URL الذي يشير إلى ملف أو دليل ، يجب أن يعرض خادم الويب هذا الملف أو الدليل ، دون استدعاء Drupal. هذا ما يحدث مع أباتشي ، حيث أن ملف .htaccess الذي يأتي مع Drupal يحتوي على التوجيهات التالية:

# 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 إلى ملف أو دليل موجود.

5
kiamlaluno

بالنسبة لي ما يلي خدعة (على drupal 6).

أريد التوجيه إلى عنوان URL آخر على نفس المجال ، لنفترض Drupal يعمل على http://www.example.com واريد ان يكون لدي رابط http://www.example.com/frontend

في عنصر القائمة ، يرجى إدخال كمسار:

http:/frontend

قائمة drupal ستصل إلى: http://www.example.com/frontend

عند استخدام https ، يجب عليك إدخال https:/frontend في حقل المسار لعنصر القائمة.

3
Paul

قمت بحل مشاكل الارتباط الخاصة بي مع ما يلي:

http://groups.drupal.org/node/210308 و http://drupal.org/node/372252

اتضح أن موضوعي كان يطبع القائمة بشكل غير صحيح بحيث تكون جميع العناصر متعلقة بموقعي الحالي (أي admin/logout ، بدلاً من/logout).

أتمنى أن يساعدك هذا.

1
the_dillio

استخدمت SQL لاستبدال الرابط في بنية القائمة:

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

لست متأكدًا مما إذا كنت بحاجة إلى القيام بذلك ولكنني قمت بعد ذلك بمسح ذاكرة التخزين المؤقت القائمة.

1
streamfan