سؤال

في تنفيذ hook_menu. للحصول على وحدة نمطية، أحاول وضع بعض العناصر في قائمة فرعية.

حتى الآن لدي شيء مثل هذا

$items['MyModule'] = array(
  //...
  'page callback' => 'system_admin_menu_block_page',
  'file' => 'system.admin.inc',
  'file path' => drupal_get_path('module','system'),
);

$items['MyModule/MenuItem1'] = array(
  //...
);

$items['MyModule/SubMenu'] = array(
  //...
  'page callback' => 'system_admin_menu_block_page',
  'file' => 'system.admin.inc',
  'file path' => drupal_get_path('module','system'),
);

$items['MyModule/SubMenu/SubMenuItem1'] = array(
  //...
);

أتوقع SubMenu لتظهر كما، حسنا، الفرعية إلى MyModule القائمة، ول SubMenuItems لتظهر تحت هذا الفرع. هذا هو السلوك الافتراضي الموضح في Drupal API. توثيق.

  • MyModule.
    • menuitem1.
    • الفرعية
      • submenuitem1.

ومع ذلك، تظهر جميع البنود تحت MyModule قائمة.

  • MyModule.
    • menuitem1.
    • submenuitem1.
    • الفرعية

ما الخطأ الذي افعله؟

* تحرير: خطأ مطبعي (الذي قمت بإصلاحه) SubMenu أن تكون عنصر منفصل بدلا من عنصر الطفل MyModule. وبعد ما زلت لا أفهم لماذا SubMenuItem1 لا يجعل تحت SubMenu, ، على أية حال.

هل كانت مفيدة؟

المحلول

لا أستطيع إعادة إنتاج مشكلتك - باستخدام التسلسل الهرمي القائمة الخاصة بك، تظهر جميع الإدخالات ضمن قائمة التنقل في النظام المتوقع والتعشيش.

هل حاولت (إعادة) من حالة نظيفة (أي، مع إلغاء تثبيت الوحدة النمطية وإدخال القائمة)؟ لشرح لماذا أسأل هذا، يجب أن أشرف قليلا:

Drupal 6 تقسيم تخزين تعريف القائمة في طاولتين. هنالك ال menu_router الجدول، الذي يخزن المسار <> علاقات رد الاتصال المعرفة عبر hook_menu(). هذا لا يحدد أي إدخال قائمة "حقيقي" (كما هو الحال في قائمة القائمة، مثل قائمة التنقل). لا يحدد فقط هيكل القائمة الداخلية Drupal، والتي لا علاقة لها بالقوائم المعروضة، ولكن فقط مع التسلسل الهرمي الداخلي لمسارات تعيين وظائف رد الاتصال!

ثم هناك menu_links الجدول، الذي يخزن إدخالات القائمة "الحقيقية" كما تظهر تحت القوائم المعروضة المختلفة (مثل الملاحة والروابط الأساسية وغيرها). تقوم الإدخالات الموجودة أيضا بتحديد ترتيب التعشيش عن طريق تخزين "معرف القائمة الأصل" (PELID) لكل إدخال، مشيرا إلى إدخال الوالدين، أو 0 لإدخال المستوى الأعلى.

الآن كلما حددت مجموعات المسار / رد الاتصال عبر hook_menu(), ، دروبال يضع هذا الدخول إلى menu_router جدول. إذا حددتهم MENU_NORMAL_ITEM أو MENU_SUGGESTED_ITEM, ، سوف drupal بالإضافة إلى ذلك محاولة لإنشاء إدخال في menu_links جدول. إذا كان إدخال لهذا المسار موجود بالفعل، فلن يغير Drupal موضعه في التسلسل الهرمي، حيث يفترض أن المستخدم نقله عن قصد. يجب أن تفكر في هذا menu_link إنشاء الدخول من قبل hook_menu() كملاحظة تضيف ذلك، يمكن أن يوفر لك المشكلة التي تضيفها صراحة عبر الوظائف المذكورة أدناه، ولكن الآلية ليست مرنة للغاية ويحاول عدم التدخل في التكوينات الموجودة (وإلا فإن قائمة تحرير يدويا ستحصل على إعادة ترتيبها باستمرار على كل إعادة بناء ذاكرة التخزين المؤقت القائمة).

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

لتحقيق هدفك المتمثل في توفير قائمة افتراضية مناسبة عند تثبيت الوحدة النمطية الخاصة بك (وللمزيد من السيطرة على ما يحدث)، يجب عليك إلقاء نظرة على menu_link_save() و menu_link_maintain() المهام. قد ترغب أيضا في القراءة متى وكيفية استخدام menu_links.

نصائح أخرى

hook_menu ليس حقا المكان المناسب لتعيين الترجيح، أنا متأكد من أنه يمكن القيام به هناك ولكن ستجد أن مجرد إنشاء عنصر قائمة عادي وسحبه في مكانه في حوار قوائم المسؤول سيوفر لك الكثير من المتاعب و الم.

السبب، كما أفهمه، هو أن التسلسل الهرمي القائمة يتم تحديدها جزئيا من خلال نظام الترجيح بدلا من المسار الذي قمت بتعيينه. تؤلي الاتفاقية بالتأكيد كيف يقوم الأشخاص بتعيين مسارهم، ولكن فقط جعل عنصر قائمة عادي في المسؤول / Monkey لا يضع عنصر قرد في قوائم المسؤول تلقائيا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top