কীভাবে প্রোগ্রামের মাধ্যমে বর্তমান নোডের এনআইডি পাবেন


26

আমি এই পুরাতন থ্রেডটি ড্রুপাল.আরজে ছুঁড়েছি এবং এটি কেবল আমার মাথা ঘিরে দেয়। পথটি টানছেন এবং এর মধ্যে থেকে এনআইডি পার্স করার চেষ্টা করছেন? এখানে অবশ্যই একটি ভাল রাস্তা আছে।

এবং সমাধান মত

global $node;
$nid = $node->nid;

আমার কাস্টম মডিউলে কাজ করবেন না (যদিও তারা আমাকে বলেছে যে তারা টেম্পলেটগুলিতে কাজ করে?) কোনও ত্রুটি বা কোনও কিছুই নয়, এটি কেবল $nodeএকটি NULLমান দিয়ে ইনস্ট্যান্ট করে তোলে ।

মনে হচ্ছে সত্যিকারের স্পষ্ট কিছু আছে যা আমি মিস করছি।

সুতরাং, সেরা অনুশীলনগুলি অনুসরণ করে এবং যুক্তিসঙ্গত দৃust় মডিউল তৈরি করার সময় আপনি কীভাবে বর্তমান নোডটির এনআইডি পাবেন?

উত্তর:


50

আপনার কোডটি নোড পৃষ্ঠার জন্য চলছে বলে ধরে নেওয়া, মূল / অবদান মডিউলগুলিতে আমি প্রায়শই যে পদ্ধতিগুলি ব্যবহার করি তা হয় হয় menu_get_object()বা তা ব্যবহার করছে arg():

if ($node = menu_get_object()) {
  // Get the nid
  $nid = $node->nid;
}

অথবা

if (arg(0) == 'node' && is_numeric(arg(1))) {
  // Get the nid
  $nid = arg(1);

  // Load the node if you need to
  $node = node_load($nid);
}

আমি ব্যক্তিগতভাবে প্রথম পদ্ধতিটি পছন্দ করি (যদিও শর্তে অ্যাসাইনমেন্টটি কিছু লোকের দ্বারা ভাল ধারণা হিসাবে বিবেচিত হয় না) তবে উভয়ই পুরোপুরি বৈধ।


1
@ লেথারিওন হ্যাঁ প্রতিবার আমি এটি করার সময় কিছুটা অপরাধী বোধ করি;)
ক্লাইভ

1
@ আপনি কোন ফাংশন থেকে এটি ডাকছেন? এবং এটি অবশ্যই কোনও নোড পৃষ্ঠায় আপনি কল করছেন?
ক্লাইভ

1
@ তবে তারা ১০০% পথ অ্যালাইজিং সক্ষম করে নিয়ে কাজ করবে। পাথ আলিয়াজিংয়ের মেনু আইটেমের রাউটার পাথের সাথে কোনও সম্পর্ক নেই node/1, node/2ইত্যাদি etc. ইত্যাদি you're তারপরে আমরা সমস্যাটি কোথায় ঘটছে তা চিহ্নিত করতে সক্ষম হতে পারি
ক্লাইভ

1
একটি একক লাইন সমাধান$nid = ($node = menu_get_object()) ? $node->nid : NULL;
timofey.com

3
@ Sheldonkreger নোড ইতিমধ্যে সেই পয়েন্ট দ্বারা লোড হয়েছে, menu_get_object()(বা এমনকি node_load()) কেবল স্ট্যাটিক ক্যাশে থেকে এটি পাচ্ছে। এমনকি যদি আপনি এটিকে প্রথম দিকে কল করেন, তবুও এটি পরে পৃষ্ঠা বিল্ডে মূল মডিউল দ্বারা লোড হতে চলেছে (যেহেতু এটি একটি নোড পৃষ্ঠা), সেক্ষেত্রে আপনি কেবল পরবর্তী প্রক্রিয়ার জন্য স্থির ক্যাশে উষ্ণ করতে চাইবেন
ক্লাইভ

5

আর্গ () আর কাজ করে না তাই ড্রপাল 8 এ এটি করার সবচেয়ে সহজ উপায়:

$path_args = explode('/', current_path());
print $path_args[1];

রেকর্ড পরিবর্তন করুন


2
এটি ড্রুপাল in-এও কাজ করে However তবে আপনি যদি এমন কোনও পৃষ্ঠায় থাকেন যা কোনও নোড নয়, যেমন অ্যাডমিন / কাঠামো / ব্লক, তবে আপনি একটি অবৈধ মান পাবেন (এই ক্ষেত্রে, 'কাঠামো')। পাথ_আর্গস [1] একটি পূর্ণসংখ্যা এবং আপনি সম্ভবত ভাল আছেন কিনা তা খালি পরীক্ষা করে দেখুন।
শেলডোনক্রেজার

আপনি সম্ভবত বিস্ফোরণের পরিবর্তে আরগ
রবলচ

1
@ রবলোচ তবে আর্গ () D8- তে বিদ্যমান নেই
পোয়ায়া সানুই


1

এই লিঙ্কটি আমাকে সহায়তা করেছে: http://www.webomelet.com/node-id-nid-url-path-alias - আপনি নোড আইডি দেখতে চান এমন সামগ্রী খুঁজে পেতে সামগ্রী এবং ফিল্টার ডাউনট এ যান এবং সম্পাদনার উপরে ঘোরাফেরা করুন লিঙ্ক। হাইপারলিংকটি দেখতে নীচে দেখুন আপনার ব্রাউজারটি আপনাকে বলে যে আপনি সম্পাদনাতে ক্লিক করলে এটি অনুসরণ করবে will


হাই আনা, দ্রুপাল উত্তরগুলিতে আপনাকে স্বাগতম। আপনার উত্তরটি ভাল (এবং আমি এটিকে প্রচেষ্টাতে ভোট দিয়েছি), তবে শিরোনামটিতে 'মডিউল থেকে' থাকায় প্রশ্নটি কীভাবে প্রোগ্রামটিগতভাবে এনআইডি পাবেন তা জিজ্ঞাসা করছে।
দারভেনেন

1

বর্তমানে গৃহীত উত্তরের দ্বিতীয় পদ্ধতিটি ডি 7-এ সবচেয়ে পরিষ্কার। প্রথম উত্তর:

if ($node = menu_get_object()) {
  // Get the nid
  $nid = $node->nid;
}

শুধুমাত্র দৃষ্টি পরিষ্কার। আসলে, menu_get_object()কোডকে প্রচুর কল করা এবং অপ্রত্যাশিত ত্রুটি হতে পারে। আমি এটি একটি hook_node_grants()ফাংশনের অভ্যন্তরে ব্যবহার করছি এবং একটি পিএইচপি মারাত্মক ত্রুটির মধ্যে দৌড়েছি:

'256' সর্বাধিক ফাংশন নেস্টিং স্তরে পৌঁছেছে, বাতিল করা হচ্ছে!

ব্যাখ্যাটি /drupal//a/69232/9158 এ পাওয়া গেছে

আপনি যে সীমাহীন লুপটি লক্ষ্য করছেন তা এই menu_get_object()কারণে তৈরি হয়েছে যে ড্রুপাল বর্তমানে লগ-ইন করা ব্যবহারকারীর নোডের অ্যাক্সেস রয়েছে তা যাচাই করার কারণ হয়ে থাকে, যার ফলে আপনার প্রয়োগটি hook_node_grants()আবারও চাওয়া হয়, যা কল করে menu_get_object(), যা আপনার বাস্তবায়নটিকে hook_node_grants()আবারও অনুরোধ করে causes , যা ...

এটি দ্বিতীয় পদ্ধতিটি ব্যবহার করে সমাধান করা হয়েছিল:

if (arg(0) == 'node' && is_numeric(arg(1))) {
  // Get the nid
  $nid = arg(1);

  // Load the node if you need to
  $node = node_load($nid);
}


-1

ডি 7 তে অন্য একটি বিকল্প:

function _my_module_get_nid() {
  $path_args = explode('/', current_path());
  //$nid = $path_args[1];
  if(is_int($path_args)) {
    return($path_args[1]);
  }
  // Log that we failed to load a NID.
  else {
    watchdog('my_module', 'Unable to gather NID at: ' . current_path(),  WATCHDOG_WARNING, NULL);
  return FALSE;
  }
}

আপনি যদি মডিউলটির বাইরে ফাংশনটি ব্যবহার করার পরিকল্পনা করেন তবে ফাংশনটির নামের শুরুতে নেতৃস্থানীয় _ ব্যবহার করবেন না।


1
এটি একই জিনিস তবে নোড নয় এমন সমস্ত পথে একটি ব্যয়বহুল ওয়াচডগ কল সহ।
বেথ

আমার কোডটি অপ্রত্যাশিতভাবে ব্যর্থ হচ্ছে কিনা তা জানতে চাই। আমি চাই না যে এই কোডটি নন-নোডগুলিতে কার্যকর করা হবে, ওয়াচডগ আমাকে দেখায় যে এটি কোথায় ঘটছে যাতে আমি এটি সংশোধন করতে পারি। অন্যথায় আমার কোনও চিহ্ন নেই যে এই কোডটি বিনা কারণে চলছে (নন-নোডগুলিতে)। অন্যথায় এটি উপরে উল্লিখিত ডি 8 পদ্ধতির মতো।
শেলডোনক্রেজার

-1
<?php
if (isset($node->nid) && count($node->nid) > 0){
  $mynodeid = $node->nid;
}
?>

আপনি কি দয়া করে আপনার উত্তরে কিছু "হুইস" এবং "হাওস" যুক্ত করতে পারেন? কোড-কেবল উত্তরটি কার্যকর হতে পারে তবে এটি কারওর ভুল বুঝতে বুঝতে পারে না।
Mołot

এটি প্রথমে পরীক্ষা করে দেখায় যে কার্যকর করার আগে নোড সংজ্ঞায়িত করা হয়েছে।
cptstarling
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.