2008-11-04 20 views
26

एक 'सर्वोत्तम अभ्यास' दृष्टिकोण से बात करते हुए, आपको PHP का उपयोग करके HTML डालने का सबसे अच्छा तरीका क्या लगता है। इस पल के लिए मैं निम्नलिखित विधियों में से एक (ज्यादातर बाद वाले) का उपयोग करता हूं, लेकिन मुझे यह जानकर उत्सुकता है कि आप क्या सोचते हैं।PHP के माध्यम से एचटीएमएल डालने का सबसे अच्छा तरीका क्या है?

<?php 
    if($a){ 
?> 
[SOME MARKUP] 
<?php 
    } 
    else{ 
?> 
[SOME OTHER MARKUP] 
<?php 
    } 
?> 

के विरोध:

<?php 
    unset($out); 
    if($a) $out = '[SOME MARKUP]'; 
    else $out = '[OTHER MARKUP]'; 
    print $out; 
?> 

उत्तर

25

यदि आप इस तरह से काम करने जा रहे हैं, तो आप अपने तर्क और डिजाइन को सही, अलग करना चाहते हैं।

लेकिन आपको ऐसा करने के लिए स्मार्टी का उपयोग करने की आवश्यकता नहीं है।

प्राथमिकता मानसिकता के बारे में है। मैंने देखा है कि लोग Smarty में चौंकाने वाली चीजें करते हैं, और अंततः में साइट विकसित करने वाले लोगों में बदल जाता है, और फिर कुछ उज्ज्वल स्पार्क तय करेंगे कि उन्हें Smarty में एक टेम्पलेट इंजन लिखने की आवश्यकता है (कभी गूंगा विचार की संभावना को कम से कम न समझें)।

यदि आप अपना कोड दो भागों में तोड़ते हैं और खुद को मानक मानने के लिए मजबूर करते हैं, तो आपको बेहतर प्रदर्शन मिलेगा।

PageLogic.php

<?php 

    $pageData = (object)(array()); // Handy trick I learnt. 

    /* Logic Goes here */ 


$pageData->foo = SomeValue; 

ob_start(); 
require("layout.php"); 
ob_end_flush(); 

Layout.php

<html> 
    <!-- etc --> 
    <?php for ($i = 1; $i < 10; $i++){ ?> 
    <?php echo $pageData->foo[$i]; ?> 
    <?php } ?> 
    <!-- etc --> 
</html> 

पीएचपी एक templating इंजन के रूप में लिखा गया था, तो आप कम से कम कि क्या आकलन करने से पहले इसके लिए डिज़ाइन किया गया कार्य के लिए इसका इस्तेमाल करने की कोशिश करनी चाहिए या आपको Smarty में जाने की जरूरत नहीं है।


इसके अलावा, यदि आप एक templating इंजन का उपयोग करना चाहते हैं, एक है कि डिफ़ॉल्ट द्वारा एचटीएमएल निकल जाता है पाने के लिए प्रयास करें और आप के बजाय "ऑप्ट आउट कर" "में अनु।" आप अपने आप को बहुत सारे एक्सएसएस सिरदर्द बचाएंगे। इस संबंध में Smarty कमजोर है, और इसके कारण, इसमें बहुत सारी सामग्री-भयानक टेम्पलेट्स लिखे गए हैं।

{if $cond} 
    {$dangerous_value} 
{else} 
    {$equally_dangerous_value} 
{/if} 

कैसे चतुर टेम्पलेट्स जाना आम तौर पर है।समस्या dangerous_value मनमाना एचटीएमएल हो सकता है $ है और यह सिर्फ हर जगह अनुसरणीय स्पेगेटी कोड के साथ करने के लिए भी अधिक बुरा कोडिंग प्रथाओं ले जाता है।

किसी भी टेम्पलेट भाषा को आप पर विचार करते हैं इस चिंता को पूरा करना चाहिए। उदा .:

{$code_gets_escaped} 
{{$code_gets_escaped_as_a_uri}} 
{{{$dangerous_bare_code}}} 

इस तरह, शोषण के लिए अपने संभावित दरवाजे के रूप में शोषण डिफ़ॉल्ट व्यवहार किया जा रहा है द्वार का विरोध किया, टेम्पलेट में आसानी से समझ रहे हैं।

+3

आप $ pageData = new stdClass() ;, जो भी (ऑब्जेक्ट) (सरणी()) के समान हैं; –

+0

@tom, हाँ, विचित्र रूप से, (ऑब्जेक्ट) नोटेशन कुछ हद तक तेज़ है :)। हालांकि यह क्यों है, मुझे नहीं पता। –

+0

1060K बार/सेकंड बनाम 819 के समय/सेकंड विषम। –

7

सबसे महत्वपूर्ण विचार तर्क प्रस्तुति से अलग रखते हुए किया जाता है - कम युग्मन दोनों और अधिक स्पष्ट करने के लिए भविष्य में परिवर्तन कर देगा।

आप smarty जैसे किसी प्रकार की टेम्पलेटिंग सिस्टम का उपयोग करने पर भी विचार करना चाहेंगे।

+0

लिंक हटा दिए गए थे। –

+0

@MalusJan धन्यवाद, मैंने हटाए गए प्रश्नों के लिंक हटा दिए हैं। लेकिन सामान्य रूप से (मानते हुए कि आपके पास संपादन अधिकार हैं) तो बस आगे बढ़ें और संपादित करें - कोई भी दिमाग नहीं रखेगा! – Ken

1

न तो। Smarty का प्रयोग करें। प्रदर्शन तर्क से अपने आंतरिक तर्क को अलग करके आप कोड बनाएंगे जो बनाए रखने के लिए बहुत आसान है। (PHP और HTML को पूरी तरह से अलग करने का प्रयास करने वाले PHPLib के पुराने टेम्पलेट सिस्टम का मार्ग न लें - इसे आपके कोर व्यवसाय तर्क के साथ अंतःक्रिया करने के लिए डिस्प्ले तर्क की आवश्यकता होती है और यह बहुत गन्दा है।) यदि आपको बिल्कुल अपने PHP कोड में HTML स्निपेट जेनरेट करना होगा , अपनी दूसरी विधि का उपयोग करें, लेकिन वैरिएबल को Smarty पास करें।

+0

आपको स्मार्टी को "प्रदर्शन तर्क से अपना आंतरिक तर्क अलग करने" की आवश्यकता नहीं है। PHP उस पर उत्कृष्ट है। – DisgruntledGoat

2

टेम्पलेट इंजन का उपयोग करके प्रस्तुति (एचटीएमएल) से अपने तर्क (PHP कोड) को पूरी तरह से अलग करना बेहतर है।

एचटीएमएल में PHP डालने में तेज़ और आसान है, लेकिन यह बहुत तेज हो जाता है, और इसे बनाए रखना बहुत मुश्किल है। यह एक बहुत त्वरित और बहुत गंदा दृष्टिकोण है ...

उपलब्ध है जो PHP में सभी टेम्पलेट इंजन के लिए के रूप में बेहतर है, उदाहरण के लिए इन सवालों देखें:

+0

आईएमएचओ, यह सबसे अच्छा जवाब है। मेरे बावजूद, यह परियोजना की परिमाण पर निर्भर करता है। – vivoconunxino

1

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

template.inc:

<html><head><title>%title%</title></head><body> 
%mainbody% 
Bla bla bla <a href="%linkurl%">%linkname%</a>. 
</body></html> 

index.php:

<?php 
$title = getTitle(); 
$mainbody = getMainBody(); 
$linkurl = getLinkUrl(); 
$linkname = getLinkName(); 
$search = array("/%title%/", "/%mainbody%/", "/%linkurl%/", "/%linkname%/"); 
$replace = array($title, $mainbody, $linkurl, $linkname); 
$template = file_get_contents("template.inc"); 
print preg_replace($search, $replace, $template); 
?> 
+3

नहीं, नहीं, नहीं!आप नियमित अभिव्यक्तियों का उपयोग नहीं कर रहे हैं, preg_replace का उपयोग क्यों करें? इसके बजाय str_replace का उपयोग करें, यह बहुत तेज़ है। – DisgruntledGoat

4

इस तरह एक बहुत ही सरल मामले के लिए, यह एक टेम्पलेट के रूप पीएचपी उपयोग करने के लिए ठीक है । हालांकि, यदि आप सरल तर्क से परे जाते हैं (और आप सबसे अधिक संभावना है), टेम्पलेट इंजन का उपयोग करना एक अच्छा विचार है।

Zend फ्रेमवर्क, जो डिफ़ॉल्ट रूप से पीएचपी दृश्य स्क्रिप्ट का उपयोग करता है, यह करने के लिए सुझाया गया तरीका इस तरह होगा:

<?php if ($a) : ?> 
    [MARKUP HERE] 
<?php else : ?> 
    [SOME MORE MARKUP] 
<?php endif ?> 

अधिक वर्बोज़ वाक्य रचना यह एक नज़र में सशर्त ब्लॉक मैच के लिए एक बहुत आसान बना देता है ब्रेसिज़ का उपयोग करने से।

+1

ओह गंभीरता से, "if: endif" शैली के साथ क्या है? जूमला 1.5 स्रोत कोड हर जगह इसका उपयोग करता है और यह मुझे पागल बनाता है। ब्रैकेट सरल और आसान होते हैं और सूर्य के नीचे हर आईडीई समझता है। – nickf

+2

जूमला ब्रह्मांड में सबसे अच्छा कोड नहीं है लेकिन सशर्त उपयोग करने का वैकल्पिक तरीका कभी-कभी कोड को और अधिक पठनीय बना सकता है। – Brayn

+0

शॉर्ट कोडब्लॉक के लिए यह केवल अच्छा है। एक बार यह बहुत बड़ा हो जाता है, तो आप खुद को ब्लॉक बंद करना भूल जाते हैं और फिर आपका आईडीई आपको दिखाता है कि आप कहां गलत हो गए थे। { } सदैव! (रूबी को यह बहुत गलत मिला) –

1

Smarty ठीक है, अगर आप ढांचे का उपयोग नहीं कर रहे हैं या जब आप एक ढांचे का उपयोग कर रहे हैं जिसमें इसकी अपनी टेम्पलेटिंग प्रणाली नहीं है।

अन्यथा अधिकांश PHP ढांचे और युवा पीढ़ी के सीएमएस की अपनी टेम्पलेटिंग प्रणाली है।

आम तौर पर एक टेम्पलेटिंग सिस्टम के विचार में फाइलें होती हैं जिनमें लगभग केवल HTML (व्यू/टेम्पलेट फ़ाइल) और फ़ाइलें होती हैं जिनमें केवल डेटा या व्यावसायिक तर्क (मॉडल या नियंत्रक फ़ाइलें) होती हैं।

एक टेम्पलेट फ़ाइल कुछ इस तरह (SilverStripe से उदाहरण) देख सकते हैं:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> 
    <head> 
     <% base_tag %> 
     $MetaTags 
     <link rel="stylesheet" type="text/css" href="tutorial/css/layout.css" /> 
    </head> 
    <body> 
     <div id="Main"> 
      <ul id="Menu1"> 
       <% control Menu(1) %> 
       <li class="$LinkingMode"> 
        <a href="$Link" title="Go to the &quot;{$Title}&quot; page">$MenuTitle</a> 
       </li> 
       <% end_control %> 
      </ul> 
      <div id="Header"> 
       <h1>$Title</h1> 
      </div> 
      <div id="ContentContainer"> 
       $Layout 
      </div> 
      <div id="Footer"> 
       <span>Some Text</span> 
      </div> 
     </div> 
    </body> 
</html> 

तुम वहाँ केवल कुछ ही गैर- HTML कोड स्थानों पर जहां डेटा से पहले सम्मिलित किया जाएगा में डाला टुकड़े देख सकते हैं कि पृष्ठ ग्राहक को भेजा जाता है।

आपका कोड तो (सरलीकृत) बल्कि तरह कुछ देख सकते हैं:

<?php 
    unset($out); 
    if($a) $out = '[SOME CONTENT TO INSERT INTO THE TEMPLATE]'; 
    else $out = '[SOME ALTERNATIVE CONTENT]'; 
    templateInsert($out); 
?> 

इसके बारे में महान बात यह है: आपके HTML जैसे देखा जा सकता है और इस तरह के रूप बदल गया है, अपने डिजाइनर इसके बारे में समझ बनाने और नहीं करता है सकते हैं अपने कोड को देखने के लिए बिना किसी मौके के बिट्स और टुकड़ों को अलग-अलग स्थानों से देखने की कोशिश करनी है कि वह क्या कर रही है। दूसरी तरफ आप पेज पर कैसे देखेंगे इस बारे में चिंताओं के बिना तर्क में बदलाव कर सकते हैं। आप शायद कम गलतियां भी करेंगे क्योंकि आपका कोड कॉम्पैक्ट और पठनीय होगा।

0

smarty का उपयोग न करें - PHP स्वयं में एक templating प्रणाली है। इस वाक्यविन्यास का उपयोग करने पर विचार करें:

<?php if($a):?> 
[SOME MARKUP] 
<?php else: ?> 
[SOME OTHER MARKUP] 
<? endif; ?> 
+0

मैं सैद्धांतिक, 'इसे करने का सबसे अच्छा तरीका', दृष्टिकोण के बारे में पूछ रहा था। – Brayn

+0

@tharkun: क्या आप इस उदाहरण के बराबर smarty कोड पोस्ट कर सकते हैं? मुझे यह देखने में दिलचस्पी होगी कि यह कितना अधिक रखरखाव योग्य और स्केलेबल है। –

+0

@ बॉबी जैक: मैं Smarty कोड पोस्ट करने के लिए किसी और से पूछना चाहता हूं क्योंकि मैं Smarty का उपयोग नहीं कर रहा हूं। – markus

14

ठेठ उन्माद के लिए -1 'का उपयोग [मेरी पसंदीदा templating प्रणाली] के बजाय!' पदों। प्रत्येक PHP पोस्ट, भले ही मूल PHP उत्तर एक-लाइनर है, हमेशा इसमें परिवर्तित हो जाता है, जैसे प्रत्येक एक-लाइनर जावास्क्रिप्ट प्रश्न 'इसके [मेरे पसंदीदा ढांचे] के बजाय' समाप्त होता है! संकोचशील।

गंभीरता से, हम व्यवसाय तर्क और प्रस्तुति चिंताओं को अलग करने के बारे में जानते हैं। आप यह कर सकते हैं - या ऐसा करें - किसी भी टेम्पलेटिंग सिस्टम में, चाहे PHP, Smarty या कुछ पूरी तरह से अलग हो। कोई templating प्रणाली जादुई रूप से सोच की एक गुच्छा के बिना अपनी चिंताओं को अलग करता है।

(वास्तव में एक templating प्रणाली है कि बहुत प्रतिबंधात्मक आप सहायक कोड है कि विशुद्ध रूप से प्रस्तुतिकरण है, प्रस्तुतिकरण चिंताओं के साथ अपने व्यापार तर्क को अव्यवस्थित लिखने के लिए होने के साथ खत्म हो सकता है। यह एक जीत नहीं है!)

करने के लिए पूछे गए प्रश्न का उत्तर दें, पहला उदाहरण ठीक है, लेकिन खराब इंडेंटेशन के कारण पढ़ना बहुत मुश्किल है। अधिक पढ़ने योग्य तरीके के लिए मोंज़ी का उदाहरण देखें; आप जो भी चाहें, नोटेशन या {} एस का उपयोग कर सकते हैं, लेकिन पठनीयता के लिए महत्वपूर्ण बात यह है कि अपने एचटीएमएल और PHP को एक एकल, 'अच्छी तरह से गठित' इंडेंटेड पदानुक्रम के रूप में रखना है।

और एक अंतिम दलील: htmlspecialchars याद()। हर बार सादा पाठ एक वेब पेज के लिए जाने की जरूरत है, इस इस्तेमाल किया जाना चाहिए, या यह सब फर्श पर XSS है। मैं जानता हूँ कि इस सवाल का सीधे उस से संबंधित नहीं है, लेकिन हर बार हम पोस्ट < सहित उदाहरण कोड? Php गूंज ($ शीर्षक)?> या एक रूपरेखा बराबर एस्केपिंग के बिना, हम सुरक्षा आपदा क्षेत्र की निरंतरता को उकसा रहे हैं कि अधिकांश PHP ऐप्स बन गए हैं।

+1

मैं काफी सहमत हूं कि आपको एक टेम्पलेटिंग इंजन की आवश्यकता नहीं है, लेकिन सवाल ने सर्वोत्तम प्रथाओं के बारे में पूछा, और सबसे महत्वपूर्ण बात यह है कि व्यापार तर्क और प्रस्तुति को अलग करना है। आप उनके बारे में सब कुछ जान सकते हैं लेकिन इसका मतलब यह नहीं है कि पोस्टर करता है। – Ken

+2

मैं हमेशा अपने उत्तरों को इस तरह से लिखता हूं कि मुझे लगता है कि पोस्टर नहीं जानता और अधिक महत्वपूर्ण बात यह है कि इस WIKI के कई भावी पाठकों को पता नहीं चलेगा! – markus

1

कुछ काश मैं जाना जाता था जब मैं पहली बार पीएचपी करना शुरू कर दिया: अपने भारी उठाने प्रोग्राम कोड के रूप में जहाँ तक संभव हो अपने HTML उत्पादन से दूर रखें। इस तरह वे दोनों बड़े, काफी संगत, पठनीय हिस्सों में रहते हैं।

सबसे अच्छा तरीका है मैं ऐसा करने का मिल गया है हो सकता है कुछ नकली डेटा के साथ एक स्थिर HTML फ़ाइल पहले बनाने के लिए, तो मैं चारों ओर से प्रहार और डिजाइन सही प्राप्त कर सकते हैं, तो गतिशील हिस्से पाने के लिए PHP कोड लिखने है आउटपुट और उन्हें दोनों को एक साथ चिपकाएं (आप यह हिस्सा कैसे करते हैं - आप इसे Smarty के साथ कर सकते हैं जैसे अन्य सुझाव दे रहे हैं)।

1

यदि आप कर सकते हैं तो यह घुंघराले ब्रेसिज़ का उपयोग करें। PHP के साथ एचटीएमएल गूंज मत करो।

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