এইচটিএমএল প্রিপ্রসেস ফাংশন থেকে পৃষ্ঠা প্রিপ্রোসেস ফাংশনে ভেরিয়েবলগুলি পাস করবেন?


10

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

function myTheme_preprocess_page(&$vars){
    $vars['myValue'] = 7;
}

function myTheme_preprocess_html(&$vars){
    //$vars['myValue'] should equal 7...
}

আমি এটি অন্য উপায়েও চেষ্টা করেছি (প্রিপ্রোসেস এইচটিএমএল ফাংশনে মান নির্ধারণ এবং তারপরে পৃষ্ঠা প্রিপ্রোসেস ফাংশনে এটি পুনরুদ্ধার করে) তবে এটি কার্যকর হয়নি। কোনটি সম্পর্কিত প্রশ্ন নিয়ে আসে: এই প্রিপ্রোসেস ফাংশনগুলি কীভাবে হয়, প্রসেস করা হয়? আমার কাছে মনে হচ্ছে পৃষ্ঠার প্রিপ্রসেস ফাংশনটি এইচটিএমএল এর আগে চলে আসে, এটি কি সঠিক?

উত্তর:


14

এটি সম্পাদন করার জন্য আপনার প্রয়োজন হয় একটি globalবা staticপরিবর্তনশীল ... ব্যক্তিগতভাবে আমি staticড্রপালের স্ট্যাটিক প্যাটার্নটি ব্যবহার করে জেনেরিক সহায়ক ফাংশনটি সঙ্গে নিয়ে প্রয়োগ করার পরামর্শ দিচ্ছি :

function _myTheme_var($var_name, $new_val = NULL) {
  $vars = &drupal_static(__FUNCTION__, array());

  // If a new value has been passed
  if ($new_val) {
    $vars[$var_name] = $new_val;
  }

  return isset($vars[$var_name]) ? $vars[$var_name] : NULL;
}

function myTheme_preprocess_page(&$vars){
  $vars['some_var'] = _myTheme_var('my_var', 7); // Set the value and retrieve it
}

function myTheme_preprocess_html(&$vars){
  $vars['some_var'] = _myTheme_var('my_var'); // Get the value
}

$varsপ্রতিটি preprocess ফাংশন জন্য অ্যারে মেমরি সম্পূর্ণ ভিন্ন বস্তু সুতরাং আপনি যে অ্যারে ব্যবহার করতে কিছু প্রায় পাস করতে সক্ষম হবে না। আমি ড্রপাল কোরটিতে এই ধরণের প্যাটার্নটি অনেক বেশি ব্যবহার করেছি তাই আমার মনে হয় এটি যাওয়ার সর্বোত্তম উপায় হবে।

সম্পাদনা

ওহ এবং হ্যাঁ, এর hook_preprocess_page()আগে বলা হয়েছিল hook_preprocess_html()... যতদূর আমি অবগত আছি দ্রুপাল "অভ্যন্তরীণ" পদ্ধতিতে কাজ করে তাই hook_preprocess_html()সম্ভবত এটি একটি পৃষ্ঠা বিল্ডে চলমান শেষের কাজ।


3

আমি 'নোড' এবং 'পৃষ্ঠা' এর অনুরূপ কেস দিয়ে এটি সম্পাদন করেছি:

function mymodule_preprocess_node(&$vars) {
  _mymodule_preprocess_vars($vars,'node');
}

function mymodule_preprocess_page(&$vars) {
  _mymodule_preprocess_vars($vars,'page');
}

function _mymodule_preprocess_vars(&$vars, $where) {

  // all vars common to both node and page set here

  switch($where) {

    case 'node':

      // node only vars set here;

      break;

    case 'page':

      // page only vars set here;

      break;
  }
}

সুতরাং আমি এটির পরিবর্তে এটি 'পৃষ্ঠা' এবং 'এইচটিএমএল' এর সাথে একইভাবে কাজ করবে তা কল্পনা করব।


হ্যাঁ, এটি কাজ করবে। তবে এটি খুব কার্যকরী নয় কারণ $ ভার্সগুলির যেগুলিতে এক ধরণের প্রসেসিং দরকার সেগুলি একাধিকবার প্রক্রিয়াজাত করে।
ম্যাক্সিডিসন

সত্য, যদি এটি প্রিপ্রোসেস ফাংশনগুলির মধ্যে কিছু সাধারণ ভারী ওজনের হয়, যেমন কোনও জটিল স্কয়ার ফলাফলের জন্য একটি ভেরিয়েবল সেট করা, হ্যাঁ, আপনি সম্ভবত এটি একাধিকবার করতে চান না, তবে static এটি প্রথম উত্তরের মতো কিছু প্রক্রিয়াজাতকরণের সাথে সহজেই সমাধান হয়ে গেছে । এবং হালকা ওজনের সেটিংস সম্ভবত দ্রুত হতে পারে যেহেতু আপনার প্রতিটি এবং প্রতিটি ভেরিয়েবল সেটের জন্য ফাংশন কল ওভারহেড নেই, মূল ফাংশন থেকে কল করার সময় প্রথমবার। এবং স্পষ্টতই প্রধান অংশগুলি (নোড এবং পৃষ্ঠা) কেবল একবার সেট হয়ে যায়।
জিমাজাম্মা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.