it-swarm.asia

كيف يمكنني تنفيذ hook_menu ()؟

ما هي أساسيات تطبيق hook_menu()؟

أود أن أرى الأساسيات مغطاة في سؤال واحد ، لتجنب الاضطرار إلى الإجابة على نفس الأسئلة المتشابهة ولكن المختلفة مرارًا وتكرارًا.

102
Letharion

هذه المعلومات صالحة لـ Drupal 6 و 7. في Drupal 8، hook_menu() بـ - نظام توجيه جديد . أدناه ننفذ hook_menu() في ثلاث خطوات بسيطة.

الخطوةالاولى

إنشاء وحدة فارغة باتباع التعليمات الواردة في كيفية إنشاء وحدة فارغة . في الكود الموضح هنا ، من المفترض أن الوحدة تسمى helloworld .

الخطوة الثانية

أضف التعليمات البرمجية التالية إلى ملف الوحدة النمطية.

/**
 * Implements hook_menu().
 */
function helloworld_menu() {
  $items['hello'] = array(
    'title' => 'Hello world!',
    'page callback' => 'helloworld_page',
    'access callback' => TRUE,
  );

  return $items;
}

/**
 * Page callback for /hello.
 */
function helloworld_page() {
  return 'Hello world!';
}

الخطوة الثالثة

قم بتمكين الوحدة ، وقم بزيارة http://example.com/hello . (استبدل example.com باسم المجال لخادمك.)
يجب أن تشاهد الرسالة "Hello world!". هذا هو! لديك تطبيق hook_menu() يعمل بشكل كامل. فيما يلي العديد من المواضيع الأكثر تقدمًا بخصوص hook_menu(). على وجه الخصوص ، قد ترغب في القراءة عن الأذونات ، حيث يمكن لأي شخص مشاهدة الصفحة أعلاه.

الحجج

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

function helloworld_menu() {
  $items['hello'] = array(
    'page callback' => 'helloworld_page',
    'page arguments' => array(0),
  );

  return $items;
}

function helloworld_page($argument1) {
  return $argument1;
}

سيتم إرسال السلاسل النصية حرفياً ، لذلك يمكن استخدام array(0, 'world') لإخراج hello world مرة أخرى.

function helloworld_page($argument1, $argument2) {
  return $argument1 . ' ' . $argument2;
}

يمكن استخدام "أحرف البدل" لقبول بيانات عشوائية من عنوان URL.

function helloworld_menu() {
  $items['hello/%'] = array(
    'page callback' => 'helloworld_page',
    'page arguments' => array(1),
  );

  return $items;
}

function helloworld_page($argument1) {
  return $argument1;
}

زيارة مرحبًا/العالم ، $argument1 ستساوي world.

تحميل الوسيطة تلقائيًا

غالبًا ما تكون وسيطة URL هي الرقم الذي يحدد ، على سبيل المثال ، كيان. لتجنب تكرار التعليمات البرمجية التي تحول هذا المعرّف إلى الكائن المقابل له ، Drupal يدعم التحميل التلقائي لأحرف البدل "المسماة". عند استخدام حرف بدل مسمى ، Drupal سيتحقق لدالة لها نفس اسم حرف البدل ، تليها _load. إذا تم العثور على مثل هذه الوظيفة ، فسيتم استدعاؤها بقيمة القيمة في عنوان URL ، وكل ما يتم إرجاعه بواسطة وظيفة المُحمل سيتم تمريرها إلى استدعاء الصفحة بدلاً من القيمة الأصلية. نظرًا لأن Drupal لديه بالفعل مثل هذه الوظيفة لتحميل العقد ، [node_load() ، يمكننا الحصول على العقد تلقائيًا وتمريرها إلى معاودة الاتصال بالصفحة.

function helloworld_menu() {
  $items['hello/%node'] = array(
    'page callback' => 'helloworld_page',
    'page arguments' => array(1),
  );

  return $items;
}

function helloworld_page($node) {
  return t('Hello node (ID = !nid)', array('!nid' => $node->nid));
}

التحميل التلقائي المتقدم

في بعض الأحيان ، سيكون من الضروري تحميل المزيد تلقائيًا بناءً على أكثر من وسيطة. نظرًا لأنه يتم تمرير الوسيطة المسماة فقط إلى المُحمل افتراضيًا ، يحتاج المرء إلى معرفة Drupal أي وسيطات الحمل الإضافية التي يجب تمريرها إلى المُحمل. على سبيل المثال ، لتحميل نسخة محددة من العقدة ، من الضروري التمرير إلى node_load() معرف العقدة ومعرف المراجعة ، ويمكن تحقيق ذلك من خلال التعليمات البرمجية التالية.

function helloworld_menu() {
  $items['hello/%node/revision/%'] = array(
    'page callback' => 'helloworld_page',
    'page arguments' => array(1),
    'load arguments' => array(3),
  );

  return $items;
}

function helloworld_page($node) {
  return t('Hello node (ID = !nid, revision ID = !rid)', array('!nid' => $node->nid, '!rid' => $node->vid));
}

أذونات

'access callback' => TRUE, ضروري لجعل المثال البسيط أعلاه قابلاً للعرض على الإطلاق ، ولكنه بالكاد مثالي ، لأنه لا يسمح بأي تحكم على الإطلاق. سيتم منح أي شخص يحاول زيارة/مرحبا الوصول. إن أسهل طريقة لتوفير قدر من التحكم ، هي توفير رد اتصال وصول ، مثل رد اتصال الصفحة من الأعلى. لا تزال الشفرة التالية تسمح بالوصول إلى أي شخص ، ولكنها توضح كيفية نقل المنطق إلى وظيفة تسمى وقت الوصول ، مما يسمح بمنطق أكثر تعقيدًا.

/**
 * Implements hook_menu().
 */
function helloworld_menu() {
  $items['hello'] = array(
    'page callback' => 'helloworld_page',
    'access callback' => 'helloworld_access',
  );

  return $items;
}

/**
 * Access callback for /hello.
 */
function helloworld_access() {
  return TRUE;
}

هذه ليست بالضرورة أفضل طريقة ، لأن استخدام وظيفة مخصصة غالبًا ما سيكرر التعليمات البرمجية دون داع. أفضل طريقة هي استخدام معظم الوقت [user_access() . معا من خلال استدعاء الوصول ، من الممكن تعيين وسيطات الوصول. من الممكن أن تطلب أن تكون الصفحة قابلة للعرض من المستخدمين الذين لديهم إذن الوصول إلى ملفات تعريف المستخدمين باستخدام الشفرة التالية.

/**
 * Implements hook_menu().
 */
function helloworld_menu() {
  $items['hello'] = array(
    'page callback' => 'helloworld_page',
    'access callback' => 'user_access',
    'access arguments' => array('access user profiles'),
  );

  return $items;
}

نظرًا لأن رد اتصال الوصول افتراضيًا هو user_access ، يمكن استبعاده ، كما هو الحال في الرمز أعلاه.

المزيد من المواضيع المتقدمة

المسؤول hook_menu() تقدم الوثائق مزيدًا من المعلومات حول حالات الاستخدام الأكثر تعقيدًا للخطاف.

147
Letharion