2009-08-21 5 views
11

PHP templating के साथ आपकी मदद की ज़रूरत है। मैं PHP के लिए नया हूं (मैं पर्ल + एम्परल से आ रहा हूं)। वैसे भी, मेरी समस्या सरल है:'शामिल' के साथ प्रस्तुत PHP टेम्पलेट के पैरामीटर कैसे पास करें?

  • मेरे पास कुछ आइटम प्रस्तुत करने के लिए एक छोटा टेम्पलेट है, इसे ब्लॉग पोस्ट होने दें।
  • इस टेम्पलेट का उपयोग करने के लिए मुझे एकमात्र तरीका है 'शामिल' निर्देश का उपयोग करना।
  • मैं इस टेम्पलेट को सभी प्रासंगिक ब्लॉग पोस्टों के माध्यम से एक लूप के अंदर कॉल करना चाहता हूं।
  • समस्या: मुझे इस टेम्पलेट में पैरामीटर पास करने की आवश्यकता है; इस मामले में एक ब्लॉग पोस्ट का प्रतिनिधित्व करने वाले सरणी के संदर्भ में।

    $rows = execute("select * from blogs where date='$date' order by date DESC"); 
    foreach ($rows as $row){ 
        print render("/templates/blog_entry.php", $row); 
    } 
    
    function render($template, $param){ 
        ob_start(); 
        include($template);//How to pass $param to it? It needs that $row to render blog entry! 
        $ret = ob_get_contents(); 
        ob_end_clean(); 
        return $ret; 
    } 
    

    कोई भी विचार कैसे यह पूरा करने के:

कोड कुछ इस तरह लग रहा है? मैं वास्तव में stumped हूँ :) टेम्पलेट प्रस्तुत करने के लिए कोई और तरीका है?

उत्तर

29

एक PHP फ़ाइल को शामिल करने पर विचार करें जैसे कि आप उस कोड में कॉपी-पेस्ट कर रहे थे जिसमें शामिल-स्टेटमेंट खड़ा है। इसका मतलब है कि आप वर्तमान स्कोप का उत्तराधिकारी हैं।

तो, आपके मामले में, दिए गए टेम्पलेट में $ param पहले ही उपलब्ध है।

+0

+1 कॉपी-पेस्ट समानता हमेशा मैं इसे कैसे समझाता हूं। –

+1

अतिरिक्त भिन्नता के लिए, अपने मूल्य को शामिल करने और उस मूल्य को कैप्चर करने से एक मान ('वापसी 42;') वापस करने का प्रयास करें: '$ result = 'filethatreturns42.php' शामिल करें;';) – NSSec

19

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

http://php.net/manual/en/function.include.php

से

जब एक फ़ाइल शामिल है, कोड यह शामिल लाइन के चर गुंजाइश जो द शामिल होता इनहेरिट करती है। पर उपलब्ध कोई भी वेरिएबल से आगे की ओर जाने वाली फ़ाइल के भीतर उपलब्ध होगा। हालांकि, में परिभाषित कार्यों और वर्गों में फ़ाइल का वैश्विक दायरा है।

तुम भी कुछ ऐसा कर सकता है:

print render("/templates/blog_entry.php", array('row'=>$row)); 

function render($template, $param){ 
    ob_start(); 
    //extract everything in param into the current scope 
    extract($param, EXTR_SKIP); 
    include($template); 
    //etc. 

फिर $ पंक्ति उपलब्ध होगा, लेकिन अभी भी $ पंक्ति कहा जाता है।

+0

बहुत अच्छा, धन्यवाद! हां, मैं हैश का उपयोग पैराम्स के रूप में करना पसंद करता हूं ताकि भविष्य में कार्य आसानी से संशोधित हो सके। –

+0

यह कोडइग्निटर काम जैसे ढांचे हैं।आप एक टेम्पलेट फ़ाइल लोड करते हैं और उसमें मानों की सरणी पास करते हैं जो निकाले जाते हैं और टेम्पलेट में उपयोग किए जाते हैं। –

1

मैं निम्नलिखित सहायक कार्यों का उपयोग जब मैं साधारण वेबसाइटों पर काम करते हैं: सीधे स्क्रीन पर

function function_get_output($fn) 
{ 
    $args = func_get_args();unset($args[0]); 
    ob_start(); 
    call_user_func_array($fn, $args); 
    $output = ob_get_contents(); 
    ob_end_clean(); 
    return $output; 
} 

function display($template, $params = array()) 
{ 
    extract($params); 
    include $template; 
} 

function render($template, $params = array()) 
{ 
    return function_get_output('display', $template, $params); 
} 

प्रदर्शित करेगा उत्पादन टेम्पलेट। रेंडर इसे एक स्ट्रिंग के रूप में वापस कर देगा। यह किसी फ़ंक्शन के मुद्रित आउटपुट को वापस करने के लिए ob_get_contents का उपयोग करता है।

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

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