আমি কীভাবে হুকগুলির মধ্যে ডেটা পাস করব যা ইন্টারঅ্যাক্ট করে না?


10

আমি কীভাবে হুকগুলির মধ্যে ডেটা পাস করব যা তাদের মধ্যে যোগাযোগ করে না বা মেনু কলব্যাক এবং একটি হুকের মধ্যে থাকে?

ক্ষেত্রে দুটি হুকের একটি প্যারামিটার মিল রয়েছে এবং সেই পরামিতিটি রেফারেন্স দ্বারা পাস করা হয়েছে, এটি সহজ। হুকস, বা মেনু কলব্যাক এবং হুক একটি সাধারণ প্যারামিটার না পেলে আমি কী করব?

উত্তর:


12

ড্রুপাল 7 বা ততোধিক ক্ষেত্রে , ড্রুপাল_স্ট্যাটিক () এর সাথে পরিচালিত একটি স্ট্যাটিক ভেরিয়েবল ব্যবহার করুন ।
drupal_static()স্ট্যাটিক ভেরিয়েবলের জন্য কেন্দ্রীয় স্টোরেজ পরিচালনা করে এমন একটি ফাংশন। মূলশব্দ ব্যবহার করে ঘোষিত ভেরিয়েবলগুলির থেকে পৃথকভাবে static, স্ট্যান্ডিক ভেরিয়েবলগুলি হ্যান্ডল drupal_static()করে প্রতিটি ফাংশন থেকে অ্যাক্সেসযোগ্য; এটি সম্ভব কারণ কারণ drupal_static()প্রতিটি ফাংশনকে এটিকে পরিবর্তন করার অনুমতি দিয়ে রেফারেন্সের মাধ্যমে ভেরিয়েবলের সামগ্রীটি প্রদান করে।

মনে করুন যে আপনাকে একটি মেনু হ্যান্ডলার এবং হুক_ব্লক_ভিউ () প্রয়োগকরণের মধ্যে একটি মান পাস করতে হবে ; আপনি নিম্নলিখিত কোড ব্যবহার করতে পারে।

function mymodule_menu() {
  return array('path/%' => array(
    'page callback' => 'mymodule_callback_function',
    'page arguments' => array(1),
  ));
}

function mymodule_callback_function($data) {
  $data_passer = &drupal_static('mymodule_block_data');

  $data_passer = $data;

  // Other logic specific to this page callback.
}

function mymodule_block_view($delta = '') {
  // $data_passer will now contain the value of $data, from above.
  $data_passer = &drupal_static('mymodule_block_data');

  // Change the block content basing on the content of $data_passer.
}

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

  // Use the advanced drupal_static() pattern, since this is called very often.
  static $drupal_static_fast;
  if (!isset($drupal_static_fast)) {
    $drupal_static_fast['perm'] = &drupal_static(__FUNCTION__);
  }
  $perm = &$drupal_static_fast['perm'];

প্রত্যাবর্তিত মানটি drupal_static()প্রতিবারই ড্রুপাল বুটস্ট্র্যাপ পুনরায় সেট করা হয়; আপনার যদি এমন কোনও মান প্রয়োজন হয় যা বিভিন্ন পৃষ্ঠাগুলির মধ্যে সংরক্ষিত থাকে, তবে আপনাকে মানটি সংরক্ষণ করতে ডাটাবেস টেবিল ব্যবহার করতে হবে বা ভেরিয়েবল_জেট () / ভ্যারিয়েবল_সেট () ব্যবহার করতে হবে

ড্রুপাল 6 কার্যকর করে না drupal_static(), তবে আপনি নিজের কোডটি নিজের মডিউলে সংজ্ঞায়িত কোনও ফাংশনে কোডটি অনুলিপি করতে পারেন।

function &mymodule_static($name, $default_value = NULL, $reset = FALSE) {
  static $data = array(), $default = array();

  // First check if dealing with a previously defined static variable.
  if (isset($data[$name]) || array_key_exists($name, $data)) {
    // Non-NULL $name and both $data[$name] and $default[$name] statics exist.
    if ($reset) {
      // Reset pre-existing static variable to its default value.
      $data[$name] = $default[$name];
    }
    return $data[$name];
  }

  // Neither $data[$name] nor $default[$name] static variables exist.
  if (isset($name)) {
    if ($reset) {
      // Reset was called before a default is set and yet a variable must be
      // returned.
      return $data;
    }
    // First call with new non-NULL $name. Initialize a new static variable.
    $default[$name] = $data[$name] = $default_value;
    return $data[$name];
  }

  // Reset all: ($name == NULL). This needs to be done one at a time so that
  // references returned by earlier invocations of drupal_static() also get
  // reset.
  foreach ($default as $name => $value) {
    $data[$name] = $value;
  }

  // As the function returns a reference, the return should always be a
  // variable.
  return $data;
}

drupal_static()(বা আপনার মডিউলে সংজ্ঞায়িত ব্যাক পোর্টড ফাংশন) দিয়ে স্ট্যাটিক ভেরিয়েবল ব্যবহার করার আগে আপনার এই বিবেচনাগুলি মাথায় রাখা উচিত:

  • স্ট্যাটিক ভেরিয়েবল সেট করে এমন কোডটি কোডটির আগে তার মান পাওয়ার জন্য কোডটি চালিত হয়; যদি মৃত্যুদন্ড কার্যকর করার আদেশটি চিন্তিত না হয় তবে কোডটি কাজ করে না। যখন দ্রুপাল ডকুমেন্টেশনে ফাঁসির আদেশটি স্পষ্টভাবে সংজ্ঞায়িত করা হয় না, তখন ড্রুপালের ভবিষ্যতের সংস্করণগুলিতে ক্রমটি পরিবর্তনের ঝুঁকি থাকে; কার্যকর করা আদেশটি ড্রপাল সংস্করণে পরিবর্তিত হয় না যার জন্য আপনি আপনার কোডটি প্রয়োগ করছেন।
  • দ্রুপাল বিভিন্ন হুকের মধ্যে ডেটা ভাগ করার একটি প্রক্রিয়া প্রয়োগ করতে পারত। উদাহরণস্বরূপ, hook_for_alter () এর বিভিন্ন প্রয়োগের ক্ষেত্রে , প্রতিটি hook_form_alter()বাস্তবায়ন ব্যবহার করে অন্যান্য বাস্তবায়নের সাথে ডেটা ভাগ করতে পারে $form_state; একইভাবে, ফর্ম বৈধকরণ হ্যান্ডলারগুলি এবং ফর্ম জমা হ্যান্ডলারগুলি, $form_stateরেফারেন্স দ্বারা পাস হওয়া পরামিতি ব্যবহার করে ডেটা ভাগ করতে পারে । আপনার নিজস্ব কোড প্রয়োগ করার আগে, নির্দিষ্ট ক্ষেত্রে দ্রুপাল দ্বারা ইতিমধ্যে প্রয়োগ করা একটি পৃথক প্রক্রিয়া ব্যবহার করে ডেটা ভাগ করা সম্ভব কিনা তা যাচাই করুন।

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

"অনুরোধ অনেক হ্যান্ডলিং সাইটগুলির জন্য যে, আসলে ভেরিয়েবল সম্পূর্ণ সেট প্রতিটি সময় লোড হয় বকেয়া" @therobyouknow ভেরিয়েবল যে টেবিল , এবং না কোন স্ট্যাটিক পরিবর্তনশীল, যা একটি সম্পূর্ণ ভিন্ন জিনিস। স্থিতিশীল ভেরিয়েবলগুলি তাদের নগণ্য কর্মক্ষমতা প্রভাব থাকে। এমনকি ভেরিয়েবল টেবিলের ক্ষেত্রেও সমস্যা তৈরি করতে আপনাকে সিস্টেমটিকে প্রচুর অপব্যবহার করতে হবে। ইকোনমিস্ট ডটকমের সহজেই এক ঘন্টার মধ্যে বেশ কয়েকটি 100 কে হিট করতে পারে, এর সবগুলিই ভেরিয়েবল টেবিলটি লোড করে। ভেরিয়েবলগুলি কোনও সমস্যা নয়, তবে অবশ্যই আমরা প্রতিটি ভেরিয়েবলে কেবলমাত্র তথ্যের ছোট ছোট টুকরো সংরক্ষণ করি।
লেথারিয়ন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.