আমি কীভাবে হুক_মেনু () প্রয়োগ করব?


103

বাস্তবায়নের মৌলিক বিষয়গুলি কী কী hook_menu()?

একই অনুরূপ কিন্তু বিভিন্ন প্রশ্নের উত্তর বারবার না দেওয়াতে আমি একক প্রশ্নের আওতায় থাকা বেসিকগুলি দেখতে চাই।

উত্তর:


148

এই তথ্যটি বৈধ Drupal এর 6 ও 7. Drupal এর 8 জন্য, hook_menu()দ্বারা প্রতিস্থাপিত হয়েছে নতুন রাউটিং সিস্টেম । নীচে আমরা hook_menu()তিনটি সহজ পদক্ষেপে প্রয়োগ করি ।

প্রথম ধাপ

খালি মডিউলটি কীভাবে তৈরি করা যায় তার নির্দেশাবলী অনুসরণ করে একটি খালি মডিউল তৈরি করুন । এখানে প্রদর্শিত কোডটিতে, ধরে নেওয়া হয়েছে মডিউলটির নাম হেলোরওর্ল্ড

ধাপ দুই

মডিউল ফাইলটিতে নিম্নলিখিত কোড যুক্ত করুন।

/**
 * 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 দেখুন । (উদাহরণস্বরূপ.কমকে আপনার সার্ভারের ডোমেন নাম দিয়ে প্রতিস্থাপন করুন))
আপনার "হ্যালো ওয়ার্ল্ড!" বার্তাটি দেখতে পাওয়া উচিত। এটাই! আপনার পুরোপুরি কার্যকরী hook_menu()বাস্তবায়ন রয়েছে। নিম্নলিখিত আরও বিভিন্ন উন্নত বিষয় সম্পর্কিত hook_menu()। বিশেষত, আপনি অনুমতিগুলি সম্পর্কে পড়তে চাইতে পারেন, কারণ উপরের পৃষ্ঠাটি যে কেউ দেখতে পাবে।

যুক্তি

আপনি যদি পেজ কলব্যাকের আরও ডেটা পাস করতে চান তবে এটি অর্জনের জন্য আপনি পৃষ্ঠা আর্গুমেন্ট ব্যবহার করতে পারেন। পেজ কলব্যাকটি প্রেরণ করার জন্য পৃষ্ঠা আর্গুমেন্টগুলি আর্গুমেন্টের একটি অ্যারে হওয়া উচিত। যদি কোনও পূর্ণসংখ্যাটি আর্গুমেন্ট হিসাবে ব্যবহৃত হয় তবে এটি 0 থেকে শুরু করে প্রতিটি স্ল্যাশ (/) এর জন্য একবার বাড়ানো URL এর একটি অংশকে উপস্থাপন করবে। নিম্নলিখিত উদাহরণে, এর অর্থ 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;
}

"ওয়াইল্ডকার্ডস" ইউআরএল থেকে স্বেচ্ছাসেবী ডেটা গ্রহণ করতে ব্যবহার করা যেতে পারে।

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

  return $items;
}

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

হ্যালো / বিশ্ব দেখা, $argument1সমান হবে world

তর্ক অটোলয়েডিং

প্রায়শই একটি ইউআরএল যুক্তি হ'ল নম্বর শনাক্তকরণ, উদাহরণস্বরূপ, একটি সত্তা। সদৃশ কোডটি এড়ানোর জন্য যা এই আইডিটিকে তার সংশ্লিষ্ট আইটে রূপান্তরিত করে, ড্রুপাল "নামকরণ" ওয়াইল্ডকার্ডগুলির জন্য অটোলয়েড সমর্থন করে। যখন একটি নামে ওয়াইল্ডকার্ড ব্যবহার করা হয়, Drupal এর ওয়াইল্ডকার্ড দ্বারা suffixed নামেই একটি ফাংশন জন্য চেক করবে _load। যদি এই জাতীয় কোনও ফাংশন পাওয়া যায়, তবে এটি ইউআরএল এর মানটির সাথে ডাকা হবে এবং লোডার ফাংশন দ্বারা যা কিছু ফিরিয়ে দেওয়া হবে তা মূল মানের পরিবর্তে পৃষ্ঠা কলব্যাকে পাঠানো হবে। যেহেতু দ্রুপালের নোডগুলি লোড করার জন্য ইতিমধ্যে এ জাতীয় ফাংশন রয়েছে 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));
}

উন্নত স্বয়ংক্রিয়তা

কখনও কখনও, একাধিক যুক্তির ভিত্তিতে আরও বেশি স্বয়ংক্রিয়-লোড করা প্রয়োজন। যেহেতু কেবলমাত্র নামযুক্ত যুক্তিটি ডিফল্টরূপে লোডারকে দেওয়া হয়, তাই দ্রুপালকে স্পষ্ট করে বলতে হবে কোন অতিরিক্ত লোড আর্গুমেন্টটি লোডারকে দেওয়া উচিত। উদাহরণস্বরূপ, নোডের একটি নির্দিষ্ট সংশোধন লোড করার জন্য 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,উপরের সাধারণ উদাহরণটি একেবারে দেখার জন্য প্রয়োজনীয়, তবে এটি খুব কমই আদর্শ, কারণ এটি এখন পর্যন্ত কোনও নিয়ন্ত্রণ করতে দেয় না। যে কেউ / হ্যালো দেখার চেষ্টা করে তাকে অ্যাক্সেস দেওয়া হবে granted নিয়ন্ত্রণের কিছু পরিমাপ সরবরাহের সবচেয়ে সহজ উপায় হ'ল অ্যাক্সেস কলব্যাক সরবরাহ করা, এটি উপরের পৃষ্ঠা কলব্যাকের মতো much নিম্নলিখিত কোডটি এখনও কারও অ্যাক্সেসের অনুমতি দেয়, তবে কীভাবে যুক্তিকে অ্যাক্সেসের সময় বলা একটি ফাংশনে স্থানান্তরিত করা যায় তা দেখায়, যার ফলে আরও জটিল যুক্তিকে মঞ্জুরি দেওয়া হয়।

/**
 * 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;
}

যেহেতু ডিফল্টরূপে অ্যাক্সেস কলব্যাকটি ব্যবহারকারীর_অ্যাক্সেস, তাই উপরের কোডের মতো এটি বাদ দেওয়া যেতে পারে।

আরও উন্নত বিষয়

অফিসিয়াল hook_menu()ডকুমেন্টেশন হুকের জন্য সবচেয়ে জটিল ব্যবহারের ক্ষেত্রে অনেক বেশি তথ্য সরবরাহ করে।


3
অসাধারণ! কেবল সম্পূর্ণতার স্বার্থে, titleসম্পত্তিটি সমস্ত আইটেম থেকে ফিরে আসতে হবেhook_menu()
ক্লাইভ

1
আমি জানি যে দস্তাবেজগুলি তাই বলে, কিন্তু যখন আমি ডি 7-তে পরীক্ষা করেছিলাম তখন তেমনটি হয়নি। আমি প্রথম উদাহরণ আমি এটি যোগ পারে, কিন্তু আমি কিছু রাখতে চেয়েছিলেন পরম এটি যতটা সম্ভব সহজ করতে ন্যূনতম।
লেথারিয়ন

1
আমি বলব কোনও পৃষ্ঠায় শিরোনাম যুক্ত করা হুক_মেনু () দিয়ে আপনি যে নিখুঁত নূন্যতম জিনিসগুলি করতে চান তা হ'ল তবে এটি আপনার পোস্ট: পি বাক্য গঠন ত্রুটিগুলি ঠিক করার উপযুক্ত হতে পারে (কোড উদাহরণ 2, 4, 5 এবং )), যাতে লোকেরা অনুলিপি এবং পেস্ট করতে পারে
ক্লাইভ

1
আরেগ, আমি কোডটি চালাতে প্রথমে পরিশ্রমী ছিলাম, কিন্তু সময় যেতে যেতে আমি ঝাল হয়ে উঠলাম এবং অনুলিপি কপি করা শুরু করলাম। সিনট্যাক্স ত্রুটিগুলি স্থির করে ফেললাম, কমপক্ষে যা আমি দেখেছি;) ভাল, আপনি ঠিক বলেছেন যে অবশ্যই একটি শিরোনাম থাকা উচিত , তাই আমি প্রাথমিক উদাহরণটিতে একটি যুক্ত করেছি।
লেটারিয়ান

1
আমি কীভাবে হুক_মেনু ব্যবহার করে কোনও পিএইচপি ফাইল নিবন্ধ করতে পারি? এটি একটি কাস্টম লিখিত পিএইচপি ফাইল যাতে ড্রুপাল বুটস্ট্র্যাপ অন্তর্ভুক্ত রয়েছে, ড্রুপাল সেশন ভেরিয়েবলগুলি ব্যবহার করে এবং একটি যুক্তি স্বীকার করে যা একটি ব্যবহারকারী আইডি।
Елин Й.
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.