2008-09-22 13 views
10

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

ऐसा करने से, मेरा PHP कोड भयभीत दिखता है ... यह वास्तव में कोड के प्रारूपण और "आकार" के साथ गड़बड़ करता है। मुझे इसके आसपास कैसे जाना चाहिए? मेरी स्क्रिप्ट के नीचे कस्टम "एचटीएमएल डंप" फ़ंक्शंस सहित? वही बात है, लेकिन इसमें शामिल है? हेरेडॉक्स (बहुत अच्छा नहीं लग रहा है)?

धन्यवाद!

उत्तर

25

समझाओ, हर ताजा वेब प्रोग्रामर इस समस्या का सामना करते हैं।

आपको अपने प्रोग्राम तर्क को अपने प्रदर्शन से अलग करना है।

  • केवल PHP कोड (HTML) के साथ एक ही है कि चर
  • एचटीएमएल और बहुत कुछ पीएचपी के साथ एक और भरता है:: सबसे पहले, अपने स्वयं के समाधान प्रत्येक वेब पेज के लिए दो फ़ाइलों का उपयोग करने की कोशिश यह आपके पेज डिजाइन है

फिर इसमें कहां/कब इसकी आवश्यकता है। ईजी:

myPageLogic.php

<?php 

// pure PHP code, no HTML 

$name = htmlspecialchars($_GET['name']); 
$age = date('Y') - htmlspecialchars($_GET['age']); 

?> 

myPageView.php

// very few php code 
// just enought to print variables 
// and some if/else, or foreach to manage the data stream 

<h1>Hello, <?php $name ?> !</h1> 

<p>So your are <?php $age?>, hu ?</p> 

(आप इस एक के लिए alternative PHP syntax उपयोग कर सकते हैं लेकिन यह सही बनाने के लिए कड़ी की कोशिश न करें। पहली बार, वास्तव में।)

myPage.php

<?php 

require('myPageLogic.php'); 
require('myPageView.php'); 
?> 

अब के लिए प्रदर्शन समस्याओं के बारे में परेशान न करें। यह नौसिखिया के रूप में आपकी प्राथमिकता नहीं है। यह समाधान अपूर्ण है, लेकिन आपको प्रोग्रामिंग स्तर के साथ समस्या को हल करने में मदद करेगा और आपको मूल बातें सिखाएगा।

फिर, एक बार जब आप इस अवधारणा के साथ सहज हो जाएं, तो एमवीसी पैटर्न के बारे में एक पुस्तक खरीदें (या इसके बारे में स्टैक ओवरफ़्लो प्रविष्टियों को देखें)। आप अगली बार करना चाहते हैं। फिर आप कुछ templating सिस्टम और ढांचे का प्रयास करेंगे, लेकिन LATER। अभी के लिए, बस कोड और शुरुआत से सीखो। आप पूरी तरह से एक परियोजना को कोड कर सकते हैं, एक रूकी के रूप में, यह ठीक है।

+0

आजकल मैं यही करता हूं। एक स्क्रिप्ट में डेटा को संसाधित करें, उचित 'दृश्य' स्क्रिप्ट शामिल करें। दृश्य स्क्रिप्ट में, मैं केवल HTML के अंदर चर को प्रतिबिंबित करता हूं और यदि आवश्यक हो तो लूप करता है। – Imran

+3

बहुत, बहुत अच्छी सलाह। बस "एमवीसी का उपयोग करें" से काफी बेहतर है। – da5id

+3

हाँ, कभी-कभी मुझे खेद है कि किसी ने मुझे अभी नहीं बताया कि मेरे पहले वर्षों के दौरान। लोगों को नोब को नहीं देना चाहिए ताकि वे उन सभी ताजा तकनीकों के लिए एकदम सही शुरुआत करने के लिए कह सकें। –

0

ऐसे मामलों में मैं सब कुछ एक चर या कभी-कभी एक सरणी में लिखता हूं और फिर परिवर्तनीय/सरणी गूंजता हूं। इसमें अतिरिक्त लाभ है कि पेज हमेशा प्रगतिशील के बजाए एक बार में प्रस्तुत करता है।

0

मैं इस स्थिति में क्या कर रहा हूं, मैं उस HTML डेटा के 'टेम्पलेट' फ़ाइलों का निर्माण कर रहा हूं जो मैं शामिल करता हूं, और फिर नियमित अभिव्यक्तियों के साथ पार्स करता हूं। यह कोड को साफ रखता है, और डिज़ाइनर या अन्य HTML व्यक्ति को टुकड़े टुकड़े करना आसान बनाता है।

Wikipedia

7

पर चेक बाहर MVC प्रोग्रामिंग प्रथाओं के पीछे आदर्शों एक MVC दृष्टिकोण का प्रयोग करें।

http://www.phpmvc.net/

यह कुछ है कि आप कुछ घंटों में लेने जाएगा नहीं है। आपको वास्तव में इसका अभ्यास करने की ज़रूरत है। मुख्य बात यह है कि नियंत्रक आपके मॉडल (डीबी परत) तक पहुंच जाएगा, आपके डेटा पर सामान करेगा और फिर इसे प्रतिपादन के लिए दृश्य में भेज देगा। यह अतिसंवेदनशील है लेकिन आपको इसे समझने के लिए इसे पढ़ने और अभ्यास करने की आवश्यकता है।

यह ऐसा कुछ है जिसका उपयोग मैंने इसे सीखने में मदद करने के लिए किया था। http://www.onlamp.com/pub/a/php/2005/09/15/mvc_intro.html

1

आपकी समस्या की आवाज से, ऐसा लगता है कि आपके पास अपने कोड में तर्क और प्रस्तुति के बीच बहुत अलगता नहीं हो सकती है। किसी एप्लिकेशन को डिज़ाइन करते समय यह एक बहुत ही महत्वपूर्ण विचार है, जो वर्तमान में आपके वर्तमान स्थिति का सटीक रूप से प्रदर्शित कारणों से है।

यदि आप पहले से ही कुछ PHP टेम्पलेटिंग इंजन जैसे Smarty पर एक नज़र डालेंगे।

4

जितनी ज्यादा हो सके अपने कोड से अपनी सामग्री और लेआउट को अलग करने का प्रयास करें। जब भी आप किसी .php फ़ाइल में कोई HTML लिखते हैं, तो रुको और सोचें "क्या यह वास्तव में यहां है?"

एक समाधान टेम्पलेट का उपयोग करना है। एक बहुत ही आसान उपयोग में आसान विकल्प के लिए Smarty टेम्पलेटिंग सिस्टम देखें।

+0

कोई भी टेम्पलेट इंजन एमवीसी ढांचे के ऊपरी हिस्से के बिना इसका समाधान होगा। Smarty एक बेहतरीन विकल्प है। – Ian

+1

एक और टेम्पलेटिंग सिस्टम (PHP स्वयं) के शीर्ष पर एक टेम्पलेटिंग सिस्टम (स्मार्ट) सिद्धांत रूप में ओवरहेड है। मैं एक्सएसएल ट्रांसफॉर्मेशन (http://www.w3schools.com/xsl/) ट्वान – Twan

+1

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

0

आपको एक ढांचे की आवश्यकता है। यह न केवल आपके कोड को सुंदर बना देगा (पहले से ही उल्लिखित मॉडल-व्यू-कंट्रोलर पैटर्न, एमवीसी के कारण) - यह आपके लिए पहले से लिखे गए घटकों के कारण आपको समय बचाएगा।

मैं क्यूकोडो की सलाह देता हूं, यह आश्चर्यजनक है; अन्य हैं - केकेपीएचपी, सिम्फनी।

0

यदि यह एक बड़ी परियोजना है तो एक ढांचा क्रम में हो सकता है। यदि नहीं, तो कुछ टेम्पलेट फ़ाइलें बनाएं और पृष्ठ के शीर्ष पर तय करें कि कौन सी टेम्पलेट फ़ाइल शामिल है।

उदाहरण

if ($_SESSION['logged_in']) 
    include(TPL_DIR . 'main_logged_in.tpl'); 
else 
    include(tPL_DIR . 'main.tpl'); 

सिर्फ एक सरल उदाहरण के लिए

0

के रूप में ऊपर .. आप लक्षण फिक्सिंग कर रहे हैं, नहीं समस्या का उल्लेख किया ..

आपको क्या करना होगा तर्क की जुदाई है और प्रदर्शन। कुछ प्रकार के एमवीसी ढांचे के साथ किया जा सकता है। यहां तक ​​कि यदि आप एमवीसी फ्रेमवर्क के साथ सभी तरह से नहीं जाना चाहते हैं .. एक टेम्पलेटिंग इंजन कम से कम एक जरूरी है यदि आपका तर्क इतना जटिल हो कि आपको

0

मैं दृढ़ता से सुझाव चतुर के बजाय savant,

  • आप एक नया templating 'भाषा' आदेश खाका बनाने के लिए में जानने के लिए नहीं है, विद्वान टेम्पलेट्स php में लिखा जाता है
  • अगर आप डॉन ' टी आप एक संकलक के साथ अपने स्वयं टेम्पलेट 'भाषा' को परिभाषित कर सकते php का उपयोग करना चाहते
  • यह presenta से आसानी से अपने खुद php द्वारा बढ़ाई वस्तुओं है

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

0

एक टेम्पलेटिंग सिस्टम (PHP स्वयं) के ऊपर टेम्पलेटिंग सिस्टम को लागू करने के चरण में, डिफ़ॉल्ट रूप से ओवरहेड बनाने के लिए, आप XSL Transformations जैसे अधिक मजबूत समाधान के लिए जा सकते हैं, जो MVC princples का भी अनुपालन करता है (बशर्ते आप अपना डेटा- पुनर्प्राप्ति; प्लस, मैं व्यक्तिगत रूप से तर्क को विभिन्न फ़ाइलों के साथ एक्सएमएल प्रदर्शित करने से विभाजित करता हूं)।

कल्पना करें कि एक सारणी में निम्न जानकारी है, जिसे आप किसी तालिका में प्रदर्शित करना चाहते हैं।

Array 
{ 
    [car] => green 
    [bike] => red 
} 

आप आसानी से एक स्क्रिप्ट है कि XML में यह जानकारी आउटपुट बनाएँ:

echo "<VEHICLES>\n"; 
foreach(array_keys($aVehicles) as $sVehicle) 
    echo "\t<VEHICLE>".$sVehicle."</NAME><COLOR>".$aVehicles[$sVehicle]."</COLOR></VEHICLE>\n"; 
echo "</VEHICLES>\n"; 

निम्न XML में परिणामी:

<VEHICLES> 
    <VEHICLE> 
    <NAME>car</NAME> 
    <COLOR>green</COLOR> 
    </VEHICLE> 
    <VEHICLE> 
    <NAME>bike</NAME> 
    <COLOR>red</COLOR> 
    </VEHICLE> 
</VEHICLES> 

अब यह सब उत्कृष्ट है, लेकिन यह नहीं होगा एक अच्छे प्रारूप में प्रदर्शित करें। यह जहां XSLT में आता है कुछ सरल कोड के साथ, आप एक तालिका में इस बदल सकता है:।

<xsl:template match="VEHICLES"> 
    <TABLE> 
    <xsl:apply-templates select="VEHICLE"> 
    </TABLE> 
</xsl:template> 

<xsl:template match="VEHICLE"> 
    <TR> 
    <TD><xsl:value-of select="NAME"></TD> 
    <TD><xsl:value-of select="COLOR"></TD> 
    </TR> 
</xsl:template> 

एट देखा, तो आप है:

<TABLE> 
    <TR> 
    <TD>car</TD> 
    <TD>green</TD> 
    </TR> 
    <TR> 
    <TD>bike</TD> 
    <TD>red</TD> 
    </TR> 
</TABLE> 

अब इस सरल उदाहरण के लिए, यदि यह कुछ है ओवरकिल का; लेकिन बड़ी परियोजनाओं में जटिल संरचनाओं के लिए, यह आपके स्क्रिप्टिंग तर्क को आपके मार्कअप से दूर रखने का एक पूर्ण तरीका है।

+0

स्ट्रिंग concatenation के साथ xml/html बनाते समय htmlspecialchars का उपयोग करें। – troelskn

+0

आप बिल्कुल सही हैं। और एक सीडीएटीए टैग हमेशा अच्छा होता है। लेकिन मैंने उनको छोड़ दिया, क्योंकि वे केवल इस पोस्ट के लक्ष्य को खराब कर देंगे :) – Twan

0

चेक पीएचपी और एचटीएमएल को अलग करने के बारे में इस question, वहाँ यह करने के लिए विभिन्न तरीकों से, स्वयं लिखा templating प्रणाली, इस तरह के चतुर, अपने आप पर एक templating प्रणाली, आदि आदि आदि ...

रूप पीएचपी के रूप में templating प्रणाली भी शामिल है
0

मुझे लगता है कि आपके पास दो विकल्प हैं, या तो एक एमवीसी फ्रेमवर्क का उपयोग करें या आलसी टेम्पलेटिंग तरीके का उपयोग करें जो आपके कोड पर महत्वपूर्ण ओवरहेड रखेगा। जाहिर है, मैं पूर्व के साथ हूं, मुझे लगता है कि एमवीसी सीखना किताब में सबसे अच्छी वेब विकास चाल है।

2

ऐसा करने से, मेरा PHP कोड भयभीत दिखता है ... यह वास्तव में कोड के स्वरूपण और "आकार" के साथ गड़बड़ करता है। मुझे इसके आसपास कैसे जाना चाहिए?

एक एकल, लगातार इंडेंटेशन संरचना के साथ, अपने PHP और HTML को एक पदानुक्रम के रूप में देखें।तो एक PHP संलग्नक संरचना जैसे 'if' या 'for' के लिए इंडेंटेशन का एक नया स्तर प्रस्तुत करता है, और इसकी सामग्री हमेशा स्टार्ट और एंड-टैग का संतुलित सेट होता है। अनिवार्य रूप से आप इस शब्द के एक्सएमएल अर्थ में अपना PHP 'अच्छी तरह से गठित' बना रहे हैं, चाहे आप वास्तव में एक्सएचटीएमएल का उपयोग कर रहे हों या नहीं।

उदाहरण:

<div class="prettybox"> 
    Hello <?php echo(htmlspecialchars($name)) ?>! 
    Your food: 
    <?php foreach($foods as $food) { ?> 
     <a href="/food.php?food=<?php echo(urlencode($food)) ?>"> 
      <?php echo(htmlspecialchars($food)) ?> 
     </a> 
    <?php } ?> 
    <?php if (count($foods)==0) { ?> 
     (no food today) 
    <?php } ?> 
</div> 

तर्क और मार्कअप को अलग करने के लिए यहाँ फिर से जवाब में अपना सिर उठा चारों ओर धार्मिक हठधर्मिता से सावधान रहें। जबकि निश्चित रूप से आप अपने पेज आउटपुट कोड से अपने व्यवसाय-तर्क को रखना चाहते हैं, इसका मतलब यह नहीं है कि अलग-अलग फाइलों, कक्षाओं, टेम्पलेट्स और ढांचे का उपयोग करने से ओवरहेड का भार वास्तव में आवश्यक है कि आप क्या कर रहे हैं। एक साधारण अनुप्रयोग के लिए, फ़ाइल के शीर्ष पर कार्रवाई/तर्क सामग्री और नीचे पृष्ठ आउटपुट डालने के लिए पर्याप्त होने की संभावना है।

(ऊपर टिप्पणियों में से एक, htmlspecialchars कर (से उदाहरण) के लिए पृष्ठ-उत्पादन कार्यक्षमता है आप निश्चित रूप से नहीं अपने PHP की कार्रवाई बिट, सभी व्यापार तर्क में मिश्रित में डाल करना चाहते हैं। हमेशा टेक्स्ट को सादे, अनसुलझा तारों के रूप में रखें जहां तक ​​यह आपके एप्लिकेशन तर्क को छोड़ देता है। यदि टाइपिंग 'echo (htmlspecialchars (...))' हर समय बहुत शब्दशः है, तो आप हमेशा एक छोटे नाम के साथ एक फ़ंक्शन बना सकते हैं जैसे 'h 'यह वही करता है।)

+0

यह टेम्पलेट/दृश्य के अंदर 'urlencode' और' htmlspecialchars 'का उपयोग करने का एक दिलचस्प तरीका है। क्या यह वास्तव में वर्णकों से बचने के लिए नियंत्रक/ढांचे दृश्य वस्तु पर भरोसा करने से बेहतर तरीका है और डेटा को प्रतिबिंबित करने के लिए डेटा को पास करता है? मैं व्यक्तिगत रूप से बाद वाले का उपयोग करता हूं। नियंत्रक डेटा प्राप्त करने और छेड़छाड़ करने के लिए ज़िम्मेदार है। यह विचार जिम्मेदारी नहीं है। यह केवल डेटा को छेड़छाड़ नहीं करता है। –

+0

फ्रेमवर्क (कंट्रोलर से बहुत कम) कैसे पता चलता है कि आउटपुट व्यू चरण से बचने की क्या ज़रूरत है? इसमें न केवल एचटीएमएल-एस्केपिंग शामिल हो सकती है, बल्कि यूआरएल में यूआरएल ('urlencode' /' rawurlencode') के आधार पर मूल्यों को टेम्पलेट करना शामिल हो सकता है, या जावास्क्रिप्ट स्ट्रिंग अक्षर ('json_encode'), या एक सीएसएस स्ट्रिंग शाब्दिक, या एक पेस्ट करने योग्य HTML स्निपेट (डबल एचटीएमएल-एन्कोड), या हो सकता है कि यह सामग्री को एक सादे पाठ ई-मेल (कोई एन्कोडिंग) में थका रहा हो। यदि नियंत्रक की पूर्व-एन्कोडेड सब कुछ HTML पर है, तो यह काम नहीं कर सकता है। संदर्भ के लिए भागना पूरी तरह से दृश्य की मुख्य चिंता है। – bobince

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