সামগ্রীতে প্রকারভেদ ফাংশন


25

আমার কাছে বেশ কয়েকটি সামগ্রীর প্রকার রয়েছে যা আমার বিভিন্ন উপায়ে প্রিপ্রোসেস করতে হবে। সুতরাং template.phpআমার থিমটিতে fooবর্তমানে এর মতো দেখাচ্ছে:

function foo_preprocess_node(&$variables) {
    if ('news' ==$variables['type']) _preprocess_news($variables);
    if ('event'==$variables['type']) _preprocess_event($variables);
    if ('alert'==$variables['type']) _preprocess_alert($variables);
    ...
}

function _preprocess_news(&$variables) {
    ...
}

function _preprocess_event(&$variables) {
    ...
}

function _preprocess_alert(&$variables) {
    ...
}

আমি একটি ড্রুপাল নির্দিষ্ট প্রিপ্রোসেস ফাংশন নির্দিষ্ট করতে সক্ষম হতে চাই যা সামগ্রীর প্রকারের মেশিনের নামটিতে আবদ্ধ থাকে। আমি চেষ্টা করার চেষ্টা করেছি foo_preprocess_newsকিন্তু এটি কখনও বলা হয় না।

একটি ভাল উপায় আছে কি?

উত্তর:


10

প্রিপ্রোসেস ফাংশনটির নাম থিমের নামের উপর ভিত্তি করে তৈরি করা হয়, সুতরাং theme_table()আপনার প্রিপ্রোসেস ফাংশনের জন্য MYTHEME_preprocess_table()

যেহেতু নেই theme_node_node_typeফাংশন একটি preprocess হুক যেমন foo_preprocess_newsবা foo_preprocess_node_newsবাক্সের বাইরে কাজ করবে না।

আপনি পারে থিম রেজিস্ট্রি অগ্রাহ্য যাতে এটি নোড জন্য ভিন্নভাবে আচরণ করবে সম্পর্কে যেতে, কিন্তু আমি সত্যিই এটা না করার পরামর্শ দিচ্ছি; এটা খুব অগোছালো পেতে পারে।

আমি রিফ্যাক্টরিং কোডের একটি বিশাল ফ্যান তবে আপনার ক্ষেত্রে আমি এটি প্রয়োজনীয় মনে করি না; আপনার যদি এমন জটিল যুক্তি থাকে যা আপনার প্রিপ্রোসেস হুকটি নোডের উপর নির্ভর করে চালানো দরকার তবে আপনি বর্তমানে যেভাবে করছেন তা বিভিন্ন ফাংশনে এটির জন্য চাষ করা আমার কাছে ভাল অনুশীলনের মতো বলে মনে হয়।

অবশ্যই অন্য পদ্ধতিটি হ'ল বিভিন্ন সামগ্রীর ধরণের প্রত্যেকটির জন্য একটি কাস্টম মডিউল প্রয়োগ করা hook_preprocess_node()এবং প্রতিটিটিতে প্রয়োগ করা। এইভাবে, প্রতিটি মডিউলের প্রাকপ্রসেস ফাংশন একটি ভিন্ন সামগ্রী ধরণের জন্য দায়ী হতে পারে।

তবে এটি আপনার পরিস্থিতির জন্য ওভারকিল হতে পারে; যদি প্রতিটি সামগ্রীর প্রকারের জন্য আপনার কাছে অতিরিক্ত যুক্তি (যেমন নন থিম প্রিপ্রোসেস যুক্তি) না থাকে তবে এই পদ্ধতিতে কোনও অতিরিক্ত মান যুক্ত হবে না।


1
ঠিক আছে. আইএফএস পুনরাবৃত্তি এড়ানোর জন্য আমি foo_preprocess_nodeএটিকে প্রয়োগ করে "স্বয়ংক্রিয় "ও করতে পারতাম call_user_func('_preprocess_' . $vars['type'], $vars);তবে সহজ থাকাই সবচেয়ে ভাল।
চেরোভিম

আমি hook_preprocess_node()একটি কাস্টম মডিউল প্রয়োগ করেছি , এবং হুক ডেকে এলে তা সীমাবদ্ধ হবে আশা করেছিলাম, তবে তা হয় না। কন্টেন্টের ধরণের মাধ্যমে হুক ডাকলে সীমাবদ্ধ করার কোনও উপায়?
কেভেন

@ কেভেন আপনি যদি ফাংশনটি উপস্থিত থাকে তবে এটি আহ্বান করা বন্ধ করতে পারবেন না, তবে if ($vars['node']->type == 'foo') { ...আপনি যে ফলাফলটি সন্ধান করছেন তা অর্জন করবেন
ক্লাইভ

আমি সত্যিই সামান্য অপ্টিমাইজেশন খুঁজছি, আপনি যা করতে পারেন তার অনুরূপ hook_block_view_MODULE_DELTA_alter()। আপনি বর্তমানে যা বলছেন আমি তা এখনই করি তবে হুকটি আঘাত হানে এমন সময় সীমাবদ্ধ করার কোনও উপায় ছিল বলে আশা করি।
কেভেন

@ কেভেন - যদিও এটি একটি অপ্টিমাইজেশন হবে না - আপনি কেবল সিদ্ধান্তের প্রক্রিয়াটি কোডের অন্য অংশে সরিয়ে নিয়ে যাবেন। প্রকৃতপক্ষে যদি দ্রুপাল এই জাতীয় ওভাররাইড প্রস্তাব করে তবে এটি জেনেরিক হওয়া দরকার, এবং এটি সম্পাদন করতে অবশ্যই আরও প্রসেসরের সময় লাগবে। আপনি ইতিমধ্যে কেবলমাত্র শেষ মুহূর্তে সিদ্ধান্ত নিয়ে জিতে যাচ্ছেন
ক্লাইভ

28

জেন সাবথিম এটির থিম_প্রসেস_নোড ফাংশনে এটি যোগ করে এটি সম্পাদন করে:

function foo_preprocess_node(&$variables, $hook) {
  ...
    // Optionally, run node-type-specific preprocess functions, like
  // foo_preprocess_node_page() or foo_preprocess_node_story().
  $function = __FUNCTION__ . '_' . $variables['node']->type;
  if (function_exists($function)) {
    $function($variables, $hook);
  } 
  ...
}

যদি আপনার কাছে 'নিউজ' নামে পরিচিত সামগ্রীর ধরণ থাকে তবে আপনি আপনার টেমপ্লেট.এফপি ফাইলে foo_preprocess_node_news নামে একটি ফাংশন তৈরি করতে সক্ষম হবেন।


আমরা এটি আমাদের নিজস্ব বাস্তবায়ন, খুব দরকারী কোড স্নিপেটের সাথে ZURB ভিত্তিতে ব্যবহার করি use
মার্কো ব্লেজকোভিচ

2

আমার কেবলমাত্র একটি অনুরূপ সমস্যা ছিল যার কারণেই গুগল আমাকে এই পৃষ্ঠায় নিয়ে এসেছিল: আমার নোড প্রিপ্রোসেস ফাংশনটি এত বড় হয়ে উঠছিল যে আমি ফাংশনটি একাধিক ফাইলে বিভক্ত করব।

আমি ইতিমধ্যে আমার টেমপ্লেট.এফপি ফাইলে অনুরূপ পন্থা করেছি যার মধ্যে সমস্ত পরিবর্তনকারী ফাংশন রয়েছে এবং একই পদ্ধতিটি যেহেতু এখানে পুরোপুরি ভালভাবে কাজ করে, তাই আমি ভেবেছিলাম যে আমি আমার পদ্ধতিটি ভাগ করব:

ফোল্ডারের ভিতরে ফাইল সেটআপMYTHEME/preprocess :

- node.preprocess.inc
- node--blog-post.preprocess.inc
- node--device-variation.preprocess.inc
- (...)

আপনার নিজের ইতিমধ্যে থাকা উচিত node.preprocess.inc, অন্যরা নিজেরাই তৈরি করতে পারেন। আপনি কীভাবে তাদের ডাকছেন তা বরং স্বেচ্ছাচারিতামূলক, তবে তাদের এমন নাম দিন যা সুন্দরভাবে তাদের সনাক্ত করে এবং পুরো ড্রুপাল নামকরণ সিস্টেমের সাথে ফিট করে।
এই ফাইলগুলির বিষয়বস্তু পর্যন্ত!

node.preprocess.inc, এখানে আমি এই জাতীয় কিছু করছি:

<?php

function MYTHEME_preprocess_node(&$variables) {

    switch($variables['type']) {

      case 'blog_post':
        // if the type of the node is a Blog Post, include this:
        include 'node--blog-post.preprocess.inc';
        break;

      case 'device_variation':
        // if Device Variation, include this:
        include 'node--device-variation.preprocess.inc';
        break;

      case 'foo':
        // ...
        break;
    }

    // additional stuff for all nodes

}

আমরা মূলত বর্তমান নোডের ধরণের মাধ্যমে স্যুইচ করি। আপনি যা পরিবর্তন করেন তা আপনার উপর নির্ভর করে; #id, #view_modeসমস্ত আপনার সঠিক প্রয়োজনের উপর নির্ভর করে।
কোনও ম্যাচ হয়ে গেলে, এটি নির্দিষ্ট ফাইলটি লোড করে এবং তার বিষয়বস্তুর উপর ঠিক এমনভাবে কাজ করবে যেন ঠিক এই ফাংশনের ভিতরেই এটি লেখা হয়েছিল।

এই includedফাইলগুলির বিষয়বস্তু হুবহু দেখে মনে হচ্ছে আপনি এটিকে node.preprocess.incফাইলটিতে রেখেছিলেন , যদি না আমরা প্রিপ্রসেসিফিকেশন ফাংশনটিকে আবার কল না করি:

node--device-variation.preprocess.inc

<?php

    // Device Name
    $device = drupal_clean_css_identifier(strtolower($variables['title']));

    // Determine whether only Device Version is of type 'N/A' and set ppvHasVariations accordingly
    $deviceHasVariations = true;
    if( $variables['content']['product:field_model_variation'][0]['#options']['entity']->weight == 0 ) {
        $deviceHasVariations = false;
    }
    //...

আপনি মূলত এটি হিসাবে যতগুলি ফাইল চান তা করতে পারেন এবং একাধিক সুইচও ক্যাসকেড করতে পারেন, উদাহরণস্বরূপ, নির্দিষ্ট নোড প্রিপ্রোসেস ফাইলগুলি আরও উপর নির্ভর করে ভাগ করা মোডের #view_modeজন্য একটি ফাইল রয়েছে fullএবং অন্যটির জন্যteaser

আশা করি এটি সাহায্য করে, যদি কেউ আবার কখনও এই প্রশ্নে হোঁচট খায় (:


1

call_user_func()রেফারেন্স দ্বারা পরামিতি পাস না। সুতরাং, $variablesআপনার preprocess_foo()ফাংশনগুলির ক্ষেত্রে কেবলমাত্র মূল অ্যারের অনুলিপিগুলিতে কাজ করবে; বাকী রেন্ডার প্রক্রিয়া চলাকালীন অ-অবজেক্টে পরিবর্তনগুলি প্রয়োগ করা হবে না।


1

আপনার মূল হুক_প্রিপ্রসেস_নোডে শেষে নিম্নলিখিত কোডটি প্রয়োগ করুন

$preprocess_function = 'themename_node__' . $node->type . '__preprocess';
if (function_exists($preprocess_function)) {
 $preprocess_function($variables);
}

সুতরাং আপনি এখন নোড টাইপ দ্বারা প্রিপ্রেসেস করতে হবে

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