2010-09-05 7 views
21

मैं PHP के लिए वाक्यविन्यास सीख रहा हूं और इसका अभ्यास कर रहा हूं। मैं एक .NET पृष्ठभूमि से आया हूं, इसलिए हेडरपेज हमेशा मेरे लिए चीजों को बहुत आसान बनाते हैं जब यह शीर्षलेख और पाद लेख में आता है।PHP में सर्वोत्तम प्रथाओं का प्रश्न शामिल है

अभी तक मेरे पास mainHeader.php और mainFooter.php है जिसमें मेरा मुख्य मेनू और मेरा पाद लेख HTML है। मैं एक mainBody.php बनाया है और शीर्ष पर मैं

<?php include "mainHeader.php" ?> 

रख दिया और पाद लेख के लिए मैं

<?php include "mainFooter.php" ?> 

यह पूरी तरह से काम किया है डाल दिया और क्योंकि मेरे पृष्ठों सब एक साथ अच्छी तरह से आया था मुझे मुस्कान बनाया है। मेनहेडर में मेरा <html> और <body> है और मेरे मेनफूटर के लिए मेरे बंद टैग हैं।

क्या यह अच्छा अभ्यास है?

+0

उद्धरण में संलग्न किया जाना चाहिए, नहीं? – BoltClock

+0

हां, अन्यथा वे समेकित स्ट्रिंग परिभाषा के रूप में मूल्यांकन करेंगे, एक चेतावनी जारी करेंगे, और 'mainHeaderphp' और' mainFooterphp' (कोई बिंदु नहीं) शामिल करेंगे। – aularon

+0

धन्यवाद। हां वे उद्धरण में हैं, बस उन्हें यहां टाइप नहीं किया। – drpcken

उत्तर

47

मैं अपने नियंत्रकों से अपने विचार शामिल करता हूं। मैं रखरखाव को आसान बनाने के लिए फ़ाइल स्थानों को भी परिभाषित करता हूं।

config.php

define('DIR_BASE',  dirname(dirname(__FILE__)) . '/'); 
define('DIR_SYSTEM', DIR_BASE . 'system/'); 
define('DIR_VIEWS',  DIR_SYSTEM . 'views/'); 
define('DIR_CTLS',  DIR_SYSTEM . 'ctls/'); 
define('DIR_MDLS',  DIR_SYSTEM . 'mdls/'); 
define('VIEW_HEADER', DIR_VIEWS . 'header.php'); 
define('VIEW_NAVIGATION', DIR_VIEWS . 'navigation.php'); 
define('VIEW_FOOTER', DIR_VIEWS . 'footer.php'); 

अब मैं सभी जानकारी मैं सिर्फ config.php शामिल करके की जरूरत है।

controller.php

require('../config.php'); 
include(DIR_MDLS . 'model.php'); 

$model = new model(); 
if ($model->getStuff()) { 
    $page_to_load = DIR_VIEWS . 'page.php' 
} 
else { 
    $page_to_load = DIR_VIEWS . 'otherpage.php' 
} 

include(VIEW_HEADER); 
include(VIEW_NAVIGATION); 
include(DIR_VIEWS . $page_to_load); 
include(VIEW_FOOTER); 
+0

धन्यवाद! यह बेहद जानकारीपूर्ण है और मैंने पहले ही कुछ ऐसा ही लागू किया है। – drpcken

+0

त्वरित प्रश्न: क्या आप एक ढांचे का उपयोग कर रहे हैं? मैं codeigniter कोशिश कर रहा हूँ और मैं सोच रहा हूँ कि config.php में इन निर्देशिका जानकारी को परिभाषित करने के लिए मेरे लिए आवश्यक है? – drpcken

+0

कोई भी अपने स्वयं के "ढांचे" का उपयोग नहीं करता है। आपको कोड इग्निटर – Galen

3

आजकल अच्छी प्रैक्टिस एक टेम्पलेटिंग इंजन का उपयोग करना है, जैसे कि smarty। पूरे आवेदन के लिए framework का उपयोग करने पर विचार करें, जैसे codeigniter

+9

smarty – Galen

+0

के बारे में अधिक असहमत नहीं हो सकता हां, मुझे पता है। मुझे अपने साथ बुरा समय हो रहा है :) यह सिर्फ एक templating इंजन का पहला उदाहरण था जो मेरे दिमाग में आया था। और एक ढांचे का उपयोग करने के सुझाव देने के बाद मुझे नहीं लगता था कि templating इंजन उदाहरण इतना मायने रखता है, इसलिए मैंने उस पर बहुत कुछ नहीं सोचा था। वैसे भी प्रतिक्रिया के लिए धन्यवाद:) – aularon

+2

मुझे बहुत ज्यादा पसंद नहीं है, लेकिन एक टेम्पलेटिंग इंजन का उपयोग करने का विचार बहुत अच्छा है। PHP के अलावा ... क्योंकि PHP पहले से ही एक templating इंजन है, यह अजीब तरह का है। फिर भी, एमवीसी प्रकार पैटर्न इतना बेहतर है ... उम ... चलो बस एक ढांचे का उपयोग करें! लेकिन एच 20 टेम्पलेट PHP के लिए बहुत अच्छा है। –

5

आप इसे दूसरे तरीके से भी कर सकते हैं। शीर्षलेख/पाद लेख वाला मुख्य पृष्ठ है और केवल शरीर शामिल करें।

<!DOCTYPE html> 
<html lang="en"> 
    <head> 
     ... 
    </head> 
    <body> 
     <?php include $page ?> 
    </body> 
</html> 
+2

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

3

तुम क्या कर रहे हैं ठीक है जब तक आप का उपयोग कर "दृश्य" या "टेम्पलेट्स" ऐसी स्थिति में आप नहीं रह "नियंत्रक" या "कार्रवाई" के अंदर अपनी सामग्री एचटीएमएल की व्यवस्था शुरू से चल रहा है।

इसके बजाय आप एक दृश्य लोड करेंगे और इसे मानों के साथ पॉप्युलेट करेंगे जो सभी HTML स्रोत को देखने के लिए ऑर्डर करते हैं, न कि आपकी PHP फ़ाइल।

$view = new View('layout.php'); 
$view->header = $header; 
$view->content = 'This is the main content!'; 
$view->footer = $footer; 
print $view; 

जो तब लेआउट फ़ाइल जो कुछ इस तरह दिखता लोड करता है:

<!DOCTYPE html> 
<html lang="en"> 
    <head> 
     ... 
    </head> 
    <body> 
     <div id="header"><?php print $header; ?></div> 
     <div id="content"><?php print $content; ?></div> 
     <div id="footer"><?php print $footer; ?></div> 
    </body> 
</html> 
+0

यह बहुत अच्छा है। बस यह सोचने के लिए हुआ कि आप दृश्यों और उनके HTML समकक्षों को व्यवस्थित कैसे कर सकते हैं। –

+0

मैंने इस बारे में क्यों नहीं सोचा था! यह भी खूब रही। –

0

यह एक बिल्कुल ठीक विधि, जब तक कि आपकी साइट 20 पृष्ठों सीमा विकसित हो जाना नहीं है। हालांकि मैं फ़ंक्शन शैली में शामिल() को शामिल करने की सलाह देता हूं, निर्माण के रूप में नहीं, और इन टेम्पलेट्स को एक अलग सबफ़ोल्डर में रखें। यदि उनमें कोई PHP कोड नहीं है, तो एक .htm फ़ाइल एक्सटेंशन (एचटीएम आंशिक एचटीएमएल नामित) का भी उपयोग करें।

include("template/main/header.htm"); // would still parse PHP code! 

इस दृष्टिकोण के साथ नुकसान यह है कि आप कभी भी वैश्विक चर के माध्यम से एचटीएमएल इंजेक्शन समाप्त कर देते हैं। $HEAD='<link...>'; include("../header.htm")। जो प्रति बुरा नहीं है, लेकिन जल्दी से क्रूर हो सकता है।

0

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

+0

यह आपका उत्तर है? –

3

उपर्युक्त सभी को सारांशित करने के लिए।
इसका उपयोग करने का अच्छा तरीका शामिल है, लेकिन पृष्ठ सामग्री के लिए टेम्पलेट पेज का उपयोग करना न भूलें।

आंशिक रूप से गैलेन और Balus 'पर आधारित:

page.php

require $_SERVER['DOCUMENT_ROOT'].'/../config.php'; 
$data = get_data(); // assume we get all required data here. 
$pagetitle = "This is a sample page"; 
$template = "page.tpl.php"; 
include "main.tpl.php"; 

main.tpl.php

<!DOCTYPE html> 
<html lang="en"> 
    <head> 
     <title><?php echo $pagetitle?></title> 
    </head> 
    <body> 
     <?php include $template ?> 
    </body> 
</html> 

page.tpl.php कुछ इस तरह:

<h1><?php echo $pagetitle?></h1> 
<?php if (!$data): ?> 
No news yet :-(
<?php else: ?> 
<ul> 
<? foreach ($data as $row): ?> 
<li><a href="news.php?id=<?php echo $row['name']?>"><?php echo $row['name']?></a></li> 
<?php endforeach ?> 
</ul> 
<?php endif ?> 
0

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

0

मुझे पता है कि यह बहुत देर हो चुकी है, बस इस प्रश्न के लिए मेरे "पैनी लायक" जोड़ना चाहता था।

मेरा सुझाव इस के लिए विधियां बनाना होगा, उदाहरण के लिए मेरी जड़ है: var/www/htdocs/और फ़ंक्शंस फ़ाइल में/फ़ंक्शन/टेम्पलेट-parts.php शामिल हैं।
मेरे कार्यों जैसे दिखेगा:

<?php 

define("DOC_ROOT", "/var/www/htdocs/"); # Add a trailing slash to make it a little easier 

function GetHeader() 
{ 
    return include DOC_ROOT . 'includes/parts/header.htm'; # Header found at include/parts/header.htm 
} 

function GetFooter() 
{ 
    return include DOC_ROOT . 'includes/parts/footer.htm'; # Footer found at include/parts/footer.htm 
} 

?> 

और इस्तेमाल किया जैसे:

<?php 

# From the main page (/var/www/htdocs/index.php) 
require_once 'includes/functions/template-parts.php'; 
GetHeader(); 
?> 
<!-- Page content --> 
<?php 

GetFooter(); 

?> 
उन फ़ाइल नामों
संबंधित मुद्दे