मेरे पास केवल एक समान मुद्दा था जिसके कारण Google ने मुझे इस पृष्ठ पर लाया: मेरा नोड प्रीप्रोसेस फ़ंक्शन इतना बड़ा हो रहा था, कि मैं फ़ंक्शन को कई फ़ाइलों में विभाजित कर दूंगा।
मैंने पहले ही अपने template.php फ़ाइल में एक समान दृष्टिकोण किया है जिसमें सभी परिवर्तन कार्य शामिल हैं, और चूंकि एक ही विधि पूरी तरह से यहां अच्छी तरह से काम करती है, मैंने सोचा कि मैं अपना दृष्टिकोण साझा करूंगा:
फ़ोल्डर के अंदर फ़ाइल सेटअप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
उम्मीद है कि यह मदद करता है, किसी को कभी इस सवाल पर ठोकर चाहिए (:
foo_preprocess_node
इसे लागू करने के रूपcall_user_func('_preprocess_' . $vars['type'], $vars);
में "स्वचालित" कर सकता था ताकि अगर दोहराव से बचा जा सके लेकिन यह सरल रहने के लिए सबसे अच्छा है।