it-swarm.asia

كيف أحصل على معرف العقدة من عنوان URL؟

حتى الآن ، صادفت هذه الوظائف الثلاث في Drupal 7 ، لكنني لست متأكدًا حقًا من الفرق بينها ، والأكثر ملاءمة للحصول على معرف العقدة في وظيفة معالجة ما قبل المعالجة .

هل يمكنك أن تعطيني أي رؤية؟

47
silkAdmin

لست متأكدا حقا ما هو الفرق بينهما

  • menu_get_object () تُرجع الكائن المرتبط بالصفحة المعروضة حاليًا. إذا تم تنفيذ الرمز عندما يعرض Drupal الصفحة example.com/node/1 ، فإن menu_get_object() سيعيد كائن العقدة للعقدة التي يكون معرفها 1 ؛ إذا كانت الصفحة المعروضة هي example.com/user/1 ، فإن menu_get_object('user') سيعرض كائن المستخدم للمستخدم الذي يكون معرفه 1.
  • menu_get_item () تُرجع مصفوفة تحتوي على فهرس لكل حقل موجود في جدول "menu_router". هذا يتضمن:
    • المسار: المسار الحالي لاستدعاء القائمة
    • load_functions: مصفوفة من أسماء الوظائف (مثل node_load) ليتم استدعاؤها لتحميل كائن يتوافق مع جزء من المسار الحالي
    • access_callback: رد الاتصال الذي يتحقق مما إذا كان المستخدم الذي قام بتسجيل الدخول حاليًا لديه حق الوصول إلى عنصر القائمة
    • page_callback: اسم الوظيفة التي تعرض الصفحة
    • title: عنوان الصفحة المرتبطة بعنصر القائمة
  • drupal_lookup_path () هي الوظيفة التي تُرجع لك المسار الداخلي المرتبط بالاسم المستعار الذي تم تمريره كوسيطة. إذا كانت "الصفحة الرئيسية" هي الاسم المستعار المقترن بـ example.com/node/1 ، فإن drupal_lookup_path("homepage") سيعرض "node/1". يمكن ربط الأسماء المستعارة للمسارات بأي مسارات داخلية ، وليس فقط لمسارات العقدة.

وهو أكثر ملاءمة للحصول على معرف العقدة في وظيفة ما قبل المعالجة.

إذا كان كل ما تريد الحصول عليه هو معرف العقدة للعقدة المعروضة حاليًا ، فأنت بحاجة فقط إلى استخدام الرمز التالي:

if (arg(0) == 'node') {
  $nid = arg(1);
}

إذا كنت بحاجة إلى الحصول على كائن العقدة ، فيمكنك استخدام الكود التالي:

if ($node = menu_get_object()) {
  // Use the node object.
}

من بين هذه المقتطفات ، الأفضل هو الثاني ، حيث يُرجع كائن العقدة الصحيح للمسارات الداخلية مثل العقدة/1/المراجعات/3/العرض.

ضع في اعتبارك أن بعض وظائف ما قبل المعالجة ، مثل تلك الخاصة بالصفحة أو العقدة ، لديها بالفعل $variables['node']. هذا يعني أنه في تلك الحالات ، تحتاج فقط إلى استخدام المقتطف التالي في وظيفة ما قبل المعالجة ، دون القلق بشأن الوظيفة التي ستستخدمها.

if (isset($variables['node'])) {
  // Check the node ID or other properties.
}

بالنسبة لوظائف المعالجة المسبقة الأخرى ، تحقق من الوثائق لمعرفة ما إذا كان هناك أي متغير يحتوي على كائن العقدة. على سبيل المثال ، هذا هو الحال بالنسبة template_preprocess_comment() مما يجعل $variables['node'] متاحًا لوظائف المعالجة المسبقة للتعليقات.

63
kiamlaluno

كيف يتم ذلك في Drupal Core's template_preprocess_page :

السطر 2267 من theme.inc وما يليه:

if ($node = menu_get_object()) {
    $variables['node'] = $node;
}

يستخدم نموذج template_preprocess_page menu_get_object . بعد ذلك ، الأمر يتعلق فقط بالتحقق مما إذا تم تحديد العقدة والحصول على $ node-> nid.

7
Bart

شيء واحد يجب أن تكون حذراً منه هو الاسم المستعار للمسار.

drupal_get_normal_path($path)

للحصول على المسار الحالي استخدم متغير النظام $_SERVER["REQUEST_URI"]

(إذا كنت في صفحة العقدة يمكنك الاتصال بـ $node->uri['path'] ، سيؤدي هذا إلى إرجاع مسار غير مستعار. ثم مرة أخرى إذا كنت في صفحة العقدة ، يمكنك فقط استخدام $node->nid.)

سيؤدي هذا إلى إرجاع العقدة/XXXX

لذا جرب شيئًا مثل

  $node_path = explode('/', drupal_get_normal_path($path));
  $nid = $node_path[1];
4
iStryker
arg(1);

ليست طريقة سيئة للقيام بذلك. arg () يعمل على المسار الداخلي ، لذلك لن يتأثر بالأسماء المستعارة للمسار.

3
Jeremy French

في Drupal 8 ، يمكنك الحصول على وسائط url بناءً على ما هو موجود في التوجيه.

للحصول على المعرف وحده:

$nid = \Drupal::routeMatch()->getRawParameter('node');

إذا كنت تخطط لتحميل كائن العقدة ، يمكنك ببساطة الحصول عليه بهذه الطريقة:

$node = \Drupal::routeMatch()->getParameter('node');

للعثور على أسماء المعلمات ، يمكنك استخدام:

$possible_parameters = \Drupal::routeMatch()->getParameters();
2
oknate