2010-09-05 38 views
21

Tôi đã học cú pháp cho PHP và thực hành nó. Tôi đến từ một nền .NET để các trang master luôn làm mọi thứ khá dễ dàng đối với tôi khi nó đến phần đầu trang và chân trang.PHP bao gồm các câu hỏi thực hành tốt nhất

Cho đến nay tôi có mainHeader.php và mainFooter.php có trình đơn đầu và html chân trang của tôi. Tôi tạo ra một mainBody.php và ở phía trên tôi đặt

<?php include "mainHeader.php" ?> 

và cho chân tôi đặt

<?php include "mainFooter.php" ?> 

này đã làm việc một cách hoàn hảo và làm cho tôi mỉm cười vì các trang của tôi tất cả đến với nhau độc đáo. mainHeader có số <html><body> của tôi và trình quản lý chính của tôi có thẻ đóng của tôi cho những thẻ đó.

Đây có phải là phương pháp hay không?

+0

Những tên tập tin nên được kèm theo trong dấu ngoặc kép, không có? – BoltClock

+0

Có, nếu không chúng sẽ đánh giá như là định nghĩa chuỗi ghép nối, đưa ra cảnh báo và bao gồm 'mainHeaderphp' và' mainFooterphp' (không có dấu chấm). – aularon

+0

cảm ơn bạn. có họ đang trong dấu ngoặc kép, chỉ cần không loại chúng ra ở đây. – drpcken

Trả lời

47

Tôi bao gồm số lượt xem từ bộ điều khiển của mình. Tôi cũng xác định vị trí tệp để bảo trì dễ dàng hơn.

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'); 

Bây giờ tôi có tất cả các thông tin tôi cần chỉ bằng cách bao gồm 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

Cảm ơn bạn! Điều này là cực kỳ thông tin và tôi đã thực hiện một cái gì đó tương tự. – drpcken

+0

Câu hỏi nhanh: bạn có đang sử dụng khung không? Tôi đang cố gắng codeigniter và tôi tự hỏi nếu nó là cần thiết của tôi để xác định các thông tin thư mục trong config.php? – drpcken

+0

không có điều đó bằng cách sử dụng "khung công tác" của riêng tôi. bạn không phải làm điều đó với mã igniter – Galen

3

Thực hành tốt hiện nay là sử dụng công cụ tạo khuôn mẫu, chẳng hạn như smarty. Đối với toàn bộ ứng dụng, hãy xem xét sử dụng framework, như codeigniter.

+9

không thể không đồng ý hơn về smarty – Galen

+0

Vâng, tôi biết. Tôi đang có thời gian xấu bản thân mình với nó :) nó chỉ là ví dụ đầu tiên của một động cơ templating mà đi qua tâm trí của tôi. Và sau khi đề xuất sử dụng một khung công tác, tôi không nghĩ rằng ví dụ về công cụ tạo khuôn mẫu quan trọng đến mức nào, vì vậy tôi không nghĩ nhiều về điều đó. Cảm ơn bạn đã phản hồi:) – aularon

+2

Tôi không thích nhiều lắm, nhưng ý tưởng sử dụng công cụ tạo khuôn mẫu là rất tốt. Ngoại trừ với PHP ... vì PHP đã là một động cơ templating, nó là loại kỳ lạ. Tuy nhiên, kiểu mẫu MVC tốt hơn rất nhiều ... um ... chúng ta hãy sử dụng một khung công tác! Nhưng các mẫu h20 khá hay cho PHP. –

5

Bạn cũng có thể thực hiện theo cách khác. Có một trang chính với đầu trang/chân trang và chỉ bao gồm nội dung.

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

Ahh tôi có thể thấy điều này sẽ hữu ích như thế nào khi tạo dữ liệu động. Cảm ơn nhiều! – drpcken

3

Điều bạn đang làm là ok cho đến khi bạn bắt đầu sử dụng "Chế độ xem" hoặc "Mẫu" trong trường hợp này bạn không còn sắp xếp HTML nội dung của mình trong "bộ điều khiển" hoặc "hành động". Thay vào đó, bạn sẽ tải một khung nhìn và điền nó với các giá trị để lại tất cả các nguồn HTML đặt hàng cho khung nhìn chứ không phải tệp PHP của bạn.

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

mà load file layout mà trông giống như sau:

<!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

Điều này thật tuyệt. Chỉ cần xảy ra để tự hỏi làm thế nào bạn có thể tổ chức xem và đối tác HTML của họ. –

+0

Tại sao tôi không nghĩ đến điều này! Điều đó thật tuyệt. –

0

Đây là một phương pháp hoàn toàn tốt đẹp, miễn là trang web của bạn không cao hơn ngưỡng 20 trang. Tuy nhiên, tôi khuyên bạn nên sử dụng include() trong kiểu hàm, không phải là xây dựng và đặt các mẫu này trong một thư mục con riêng biệt. Nếu không có mã PHP trong chúng, cũng sử dụng phần mở rộng tập tin .htm (htm chỉ định một phần html).

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

Bất lợi với cách tiếp cận này là bạn kết thúc việc tiêm HTML thông qua các biến toàn cục vào nó. $HEAD='<link...>'; include("../header.htm"). Mà không phải là xấu mỗi se, nhưng có thể nhanh chóng tích lũy cruft.

0

Tôi thích sử dụng các hàm để in đầu và cuối trang thay vì bao gồm.Bạn có thể tinh chỉnh phạm vi biến tốt hơn theo cách đó.

+0

Đó là câu trả lời của bạn? –

3

Để tóm tắt tất cả những điều trên.
Đó là cách tốt để sử dụng bao gồm, nhưng đừng quên sử dụng trang mẫu cho nội dung trang.

Một phần dựa trên của Galen và 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 một cái gì đó như thế này:

<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

Đối với các trang web nhỏ, bao gồm/include_once và require/require_once là tuyệt vời, tôi chưa xây dựng một trang web mà không có chúng trong nhiều năm. Tuy nhiên, tôi khuyên bạn nên đảm bảo mỗi tệp bao gồm của bạn là một khối mã riêng biệt là XML hợp lệ. Những gì tôi có nghĩa là không mở một thẻ trong một bao gồm và đóng nó trong khác, hoặc ngược lại - nó sẽ làm cho những thay đổi phức tạp và dễ bị phá vỡ mọi thứ bởi vì bạn có phụ thuộc giữa các tập tin. Chúc mừng mã hóa!

0

Tôi biết điều này rất muộn, chỉ muốn thêm "giá trị đồng xu" của tôi vào câu hỏi này.

Đề xuất của tôi là tạo các phương pháp cho điều này, ví dụ: gốc của tôi là: var/www/htdocs/và tệp chức năng nằm trong/includes/templates-parts.php.
chức năng của tôi sẽ giống như vậy:

<?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 
} 

?> 

Và sử dụng như ví dụ:

<?php 

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

GetFooter(); 

?> 
Các vấn đề liên quan