2011-04-17 6 views
6

मैं एक बार देखा गया क्षेत्र टेम्पलेट में इस कोड (इस मामले विचारों पर-व्यू के क्षेत्र में uid.tpl.php - - सभी सदस्य) का उपयोग कर रहा:Drupal - मैं वैश्विक स्तर पर एक सरणी कैसे बना सकता हूं?

<?php 

$users_friends = flag_friend_get_friends($user->uid); 

$users_friends_ids = array(); 

foreach ($users_friends as $id => $value) {  
$users_friends_ids[] = $id;  
} 


?> 

यह मूल रूप से की उपयोगकर्ता आईडी हो जाता है दोस्तों और उन्हें एक सरणी में डालता है ताकि मैं जांच सकूं कि फ़ील्ड किसी भी उपयोगकर्ता आईडी से मेल खाता है या नहीं।

तो मेरी समस्या यह है कि मैं इसे इस टेम्पलेट (कुछ कारणों से) में नहीं रखना चाहता, लेकिन यदि मैं नहीं करता हूं तो मैं सरणी तक नहीं पहुंच सकता। मैं इस सरणी को विश्व स्तर पर सुलभ कैसे बना सकता हूं?

उत्तर

5

अपने "कुछ कारणों" को जानने के बिना, मैं यह नहीं कह सकता कि यह निश्चित रूप से उत्तर है या नहीं। मेरे अपने कारण शायद यह होगा कि मैं नहीं चाहता कि एक ही कोड कई गुना निष्पादित कर रहा हो, और मेरे पास एकाधिक स्थानों में एक ही सटीक कोड नहीं होगा।

मैं फिर मित्र सरणी को पकड़ने के लिए स्थिर चर के साथ एक फ़ंक्शन बनाउंगा।

function mymodule_get_friends_ids() { 
    // pull in the current global user variable 
    global $user; 

    // call up the static variable 
    static $users_friends_ids; 
    // return if this static var has already been set 
    if (is_array($users_friends_ids)) { 
    return $users_friends_ids; 
    } 

    // if we hit here, then this function has not been 
    // run yet for this page load. 

    // init array 
    $users_friends_ids = array(); 

    // if user is anon, no need to go on 
    if (user_is_anonymous()) { 
    return $users_friends_ids; 
    } 

    // get friends array 
    $users_friends = flag_friend_get_friends($user->uid); 

    // build ids array 
    foreach ($users_friends as $id => $value) {  
    $users_friends_ids[] = $id;  
    } 

    return $users_friends_ids; 
} 

अब अपने टेम्पलेट में, आप mymodule_get_friends_ids() के रूप में कई स्थानों में के रूप में आप चाहते हैं कॉल कर सकते हैं, और पहली वापसी नीचे काम कर कोड केवल पहली बार यह कहा जाता है निष्पादित कर दिया जाएगा।

+0

मैंने आपकी एक और पोस्ट देखी है कि आप इसका उपयोग कैसे कर रहे हैं। वास्तव में उपयोगकर्ता आईडी के उस सरणी को फिर से बनाने की आवश्यकता नहीं है। आप केवल $ user_friends ($ users_friends_ids के बजाय) सेट करने के लिए इस फ़ंक्शन का उपयोग कर सकते हैं और फिर आप यह देखने के लिए जांच सकते हैं कि उस सरणी में कोई विशिष्ट उपयोगकर्ता आईडी मौजूद है या नहीं: key_exists ($ some_uid, $ users_friends) – Coder1

+0

आप कैसे कॉल करते हैं मॉड्यूल, क्या मॉड्यूल_इनवोक का उपयोग कर है? वास्तव में यहां आप संघर्ष कर सकते हैं :( – james6848

+0

मेरे पास आमतौर पर जेनेरिक साइट सहायक कार्यक्षमता के लिए एक मॉड्यूल होता है, लेकिन यदि आप अभी तक मॉड्यूल के साथ काम करने में सहज नहीं हैं, तो आप बस उस फ़ंक्शन को अपनी template.php फ़ाइल में जोड़ सकते हैं। आपको शायद बदलना चाहिए फ़ंक्शन नाम में 'mymodule' आपके थीम नाम पर। फिर, प्रत्येक टेम्पलेट में आपको उस उपयोगकर्ता आईडी एरे तक पहुंचने की आवश्यकता होती है, बस $ user_friends_ids = mymodule_get_friend_ids(); – Coder1

2

कोडर 1 की सलाह बहुत अच्छी है - यह आपको अपने ग्लोबल वेरिएबल नेमस्पेस को बहुत सारे जंक के साथ पॉपुलटिंग करने से रोकती है। यह शायद सबसे अधिक "सुरुचिपूर्ण" है। यदि आप PHP के बजाय नए हैं तो यह उपयोग करना सबसे आसान नहीं हो सकता है (जो मुझे लगता है कि यदि मामला वापस लौटने के लिए अपने सिर को प्राप्त करना मुश्किल हो तो यह मामला हो सकता है, लेकिन यह ठीक है)।

हालांकि, यदि यह वास्तव में प्राथमिकता है, तो शायद आपको एक अतिरिक्त वैश्विक चर होने की परवाह नहीं है।

मुझे लगता है कि मैं यहां स्पष्ट बता रहा हूं - लेकिन आप निष्पादन में बहुत अधिक बिंदु पर (बशर्ते आपको जो जानकारी चाहिए वह पहले से ही उत्पन्न हो चुकी है - उदाहरण के लिए, $ उपयोगकर्ता परिवर्तक पॉप्युलेट किया गया है), ऐसा करें:

$GLOBALS['users_friends_ids'] = /* your code goes here */ 
अपने खाके में

उसके बाद, आप के द्वारा इस का उपयोग ...

$friendsArray = $GLOBALS['users_friends_ids']; 

या आप बस निर्माण

global $user_friends_ids; 
उपयोग कर सकते हैं

जब आप चर को प्रारंभ करना चाहते हैं, या किसी फ़ंक्शन या क्लास के अंदर पहुंचें (जो आपकी टेम्पलेट फ़ाइलों के मामले में है - उन्हें अंदरूनी फ़ंक्शंस कहा जाता है, इसलिए आपको $GLOBALS सरणी को वैश्वीकरण या उपयोग करने की आवश्यकता है, जो "स्वचालित रूप से" है वैश्विक नामस्थान में सक्रिय सभी चर)।

ऐसा करने के लिए सबसे अधिक "लॉजिकल" जगह मॉड्यूल के अंदर उपलब्ध होगी, जिसमें कई हुक उपलब्ध हैं, इस कोड को केवल एक बार निष्पादित करने के लिए। hook_init() यह आपके लिए कर सकता है, यदि उपयोगकर्ता ऑब्जेक्ट पहले से ही इस बिंदु पर लोड हो चुका है (सुनिश्चित नहीं है, आपको परीक्षण करना होगा)। लेकिन हो सकता है कि आप ड्रूपल मॉड्यूल बनाने के बारे में नहीं जानना चाहते (यह मुश्किल नहीं है)।

यदि आप इसे एक टेम्पलेट के अंदर कर रहे हैं (और हालांकि यह अच्छा अभ्यास नहीं है, तो PHP के शुरुआती ज्ञान वाले कई ड्रूपल साइट मालिक टेम्पलेट्स में सब कुछ डालते हैं), आप जानना चाहेंगे कि कौन सा टेम्पलेट कोड निष्पादित किया जा रहा है। नोड टेम्पलेट कोड पृष्ठ टेम्पलेट कोड से पहले निष्पादित किया जाता है - जो तार्किक है, अन्यथा पृष्ठ टेम्पलेट में नोड सामग्री के चर को पॉप्युलेट नहीं किया जाएगा।

यदि आपके पास नोड्स की सूची है, तो वे इस कोड को कई बार कॉल करेंगे, इसलिए आप कोडर 1 के समान कुछ करने का अंत कर रहे हैं। यदि आप अपना खुद का छोटा मॉड्यूल नहीं बनाना चाहते हैं, तो आप अपनी थीम की template.php फ़ाइल में लिखे गए फ़ंक्शन घोषणा को डाल सकते हैं, क्योंकि इसे केवल एक बार कहा जाता है। आप tpl.php फ़ाइलों में फ़ंक्शन घोषणाएं नहीं रखना चाहते हैं, क्योंकि उन्हें कभी-कभी एक से अधिक बार बुलाया जाता है (और आपको एक से अधिक कार्यों को घोषित करने की अनुमति नहीं है)।

यदि आपके पास फ़ंक्शन और रिटर्न को समझने में कठिनाई होती है, तो आप हमेशा अपने कोड में ऐसा कुछ कर सकते हैं (जो बहुत ही सुरुचिपूर्ण है - लेकिन सुरुचिपूर्ण कोड की तुलना में आप समझने वाले सुरुचिपूर्ण कोड के लिए बेहतर है यह आप नहीं करते हैं)।

if(!isset($GLOBALS['users_friends_ids'])) { 
    $GLOBALS['users_friends_ids'] = /* your code here */ 
} 
+1

नोट: उपर्युक्त अनावश्यक हो सकता है, मैंने देखा कि कोडर 1 का सुरुचिपूर्ण समाधान अंत में एक रिटर्न वैरिएबल खो रहा था - और इसे संपादित किया है - संपादन "सहकर्मी समीक्षा के बाद" दिखाई देना चाहिए – James

+0

चीयर्स। यह आवश्यक नहीं हो सकता है लेकिन मेरे दांतों को पाने के लिए थोड़ा अतिरिक्त ज्ञान होना हमेशा अच्छा होता है। – james6848

संबंधित मुद्दे