2008-11-04 37 views
26

Nói theo quan điểm 'thực hành tốt nhất', bạn nghĩ cách tốt nhất để chèn HTML bằng cách sử dụng PHP là gì. Hiện tại, tôi sử dụng một trong các phương pháp sau (chủ yếu là sau), nhưng tôi tò mò muốn biết bạn nghĩ gì là tốt nhất.Cách tốt nhất để chèn HTML qua PHP là gì?

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

Trái ngược với:

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

Trả lời

25

Nếu bạn định làm theo cách đó, bạn muốn tách logic và thiết kế của mình thành sự thật.

Nhưng bạn không cần sử dụng Smarty để thực hiện việc này.

Ưu tiên là về tư duy. Tôi đã thấy mọi người làm những điều gây sốc trong Smarty, và cuối cùng biến thành những người đang phát triển các trang web trong Smarty, và sau đó một số tia sáng sẽ quyết định họ cần viết một công cụ mẫu trong Smarty (Không bao giờ đánh giá thấp tiềm năng của ý tưởng ngu ngốc).

Nếu bạn chia mã thành hai phần và bắt buộc phải tuân theo tiêu chuẩn, thì bạn sẽ có hiệu suất tốt hơn nhiều.

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> 

PHP Đã được viết như một công cụ khuôn mẫu, vì vậy bạn nên ít nhất thử sử dụng nó cho công việc thiết kế của nó trước khi đánh giá liệu hay không bạn cần phải nghiên cứu về Smarty.


Hơn nữa, nếu bạn quyết định sử dụng một động cơ templating, cố gắng có được một mà thoát HTML bởi mặc định và bạn "không tham gia" thay vì "từ chối trong." Bạn sẽ tiết kiệm cho mình rất nhiều đau đầu XSS. Smarty là yếu trong khía cạnh này, và vì điều này, có rất nhiều mẫu nội dung ngây thơ được viết trong đó.

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

Thông thường các mẫu Smarty sẽ như thế nào.Vấn đề là $ dangerous_value có thể là HTML tùy ý và điều này chỉ dẫn đến thậm chí nhiều hơn thực hành mã hóa xấu với mã spaghetti không thể tha thứ ở khắp mọi nơi.

Bất kỳ ngôn ngữ mẫu nào bạn xem là nên phục vụ cho mối quan tâm này. ví dụ .:

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

Bằng cách này, cửa ra vào tiềm năng của bạn để khai thác có thể dễ dàng thấy rõ trong các mẫu, như trái ngược với lối ra vào để khai thác là DEFAULT hành vi.

+3

bạn cũng có thể làm $ pageData = new stdClass() ;, tương tự như (object) (array()); –

+0

@tom, vâng, kỳ quặc, ký hiệu (đối tượng) hơi nhanh hơn :). Tại sao đó là tuy nhiên, tôi không biết. –

+0

1060K lần/giây so với 819K lần/giây lẻ. –

7

Việc xem xét quan trọng nhất là giữ logic tách biệt với phần trình bày - ít khớp nối sẽ thực hiện thay đổi trong tương lai cho cả hai đơn giản hơn nhiều.

Bạn thậm chí có thể muốn xem xét sử dụng một số loại hệ thống templating như smarty.

+0

Các liên kết đã bị xóa. –

+0

@MalusJan Cảm ơn, tôi đã xóa các liên kết đến các câu hỏi đã xóa. Nhưng nói chung (giả sử bạn có quyền chỉnh sửa) thì chỉ cần tiếp tục và chỉnh sửa - không ai sẽ nhớ! – Ken

1

Không. Sử dụng Smarty. Bằng cách tách logic nội bộ của bạn khỏi logic hiển thị, bạn sẽ xây dựng mã đơn giản hơn nhiều để duy trì. (Đừng lấy đường dẫn của hệ thống mẫu cũ của PHPLib đã cố gắng tách hoàn toàn PHP và HTML - nó đòi hỏi logic hiển thị phải xen kẽ với logic nghiệp vụ cốt lõi của bạn và rất lộn xộn.) Nếu bạn hoàn toàn phải tạo đoạn mã HTML trong mã PHP của mình , sử dụng phương pháp thứ 2 của bạn, nhưng chuyển biến cho Smarty.

+0

Bạn không cần Smarty để "tách logic nội bộ của bạn khỏi logic hiển thị". PHP là tuyệt vời ở đó nguyên bản. – DisgruntledGoat

2

Tốt hơn là hoàn toàn tách biệt logic của bạn (mã PHP) khỏi bản trình bày (HTML), bằng cách sử dụng một công cụ mẫu.

Việc chèn PHP vào HTML nhanh chóng và dễ dàng, nhưng nó rất lộn xộn và rất khó duy trì. Nó là một rất nhanh chóng và cách tiếp cận rất bẩn ...

Khi mà của tất cả các mẫu động cơ có sẵn trong PHP là tốt hơn, xem những câu hỏi ví dụ:

+0

IMHO, đây là câu trả lời hay nhất. Mặc dù vậy đối với tôi, nó phụ thuộc vào tầm quan trọng của dự án. – vivoconunxino

1

Nếu một công cụ mẫu có vẻ phức tạp, bạn có thể làm cho công cụ tạo mẫu của người nghèo của riêng bạn. Ví dụ này chắc chắn nên được cải thiện và không phù hợp với mọi công việc, nhưng đối với các trang web nhỏ hơn thì có thể phù hợp. Chỉ cần để giúp bạn có được một ý tưởng:

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

Không, không, không!Bạn không sử dụng cụm từ thông dụng, tại sao lại sử dụng preg_replace? Sử dụng str_replace thay vào đó, nó nhanh hơn nhiều. – DisgruntledGoat

4

Đối với một trường hợp rất đơn giản như thế này, nó là tốt để sử dụng PHP làm mẫu . Tuy nhiên, nếu bạn đi xa hơn logic đơn giản (và bạn rất có thể sẽ), nó là một ý tưởng tốt để sử dụng các công cụ mẫu.

Trong Zend Framework, trong đó sử dụng xem PHP script theo mặc định, cách khuyến khích để làm được điều này sẽ là như thế này:

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

Cú pháp tiết hơn làm cho nó dễ dàng hơn nhiều để phù hợp với các khối có điều kiện trong nháy mắt hơn là sử dụng niềng răng.

+1

ồ một cách nghiêm túc, phong cách "if: endif" là gì? mã nguồn Joomla 1.5 sử dụng nó ở khắp mọi nơi và nó làm tôi phát điên. Chân đế đơn giản và dễ dàng và mọi IDE dưới ánh mặt trời đều hiểu rồi. – nickf

+2

Joomla không phải là mã đẹp nhất trong vũ trụ nhưng cách thay thế sử dụng điều kiện có thể làm cho mã dễ đọc hơn đôi khi. – Brayn

+0

Nó chỉ tốt cho codeblocks ngắn. Một khi nó được quá lớn, bạn thấy mình quên đóng khối và sau đó IDE của bạn không thể cho bạn thấy nơi bạn đã đi sai. { } mãi mãi! (ruby có này RẤT sai) –

1

Smarty là ok, nếu bạn không sử dụng khung hoặc khi bạn đang sử dụng một khung không có hệ thống tạo khuôn mẫu riêng.

Nếu không, hầu hết các khung công tác PHP và thế hệ trẻ CMS đều có hệ thống tạo khuôn mẫu riêng.

Nói chung ý tưởng về hệ thống tạo khuôn mẫu là có tệp chỉ chứa hầu hết HTML (Xem/Tệp mẫu) và tệp chỉ chứa dữ liệu hoặc logic nghiệp vụ (Mẫu hoặc Tệp điều khiển).

một tập tin mẫu có thể giống như thế này (ví dụ từ 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> 

Bạn có thể thấy rằng chỉ có một vài đang mảnh không phải là HTML chèn vào nơi dữ liệu sẽ được chèn vào trước trang được gửi cho khách hàng.

Mã của bạn có thể sau đó (giản thể) chứ không phải giống như thế:

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

Những điều tuyệt vời về nó: HTML của bạn có thể được nhìn thấy như vậy và thay đổi như vậy, nhà thiết kế của bạn có thể có ý nghĩa của nó và doesn không phải nhìn qua mã của bạn cố gắng để có được các bit và miếng với nhau từ những nơi khác nhau mà không có bất kỳ cơ hội để xem những gì cô ấy đang làm. Mặt khác, bạn có thể thực hiện các thay đổi trong logic mà không phải lo lắng về việc nó sẽ trông như thế nào trên trang. Bạn có lẽ cũng sẽ mắc ít sai lầm hơn vì mã của bạn sẽ nhỏ gọn và có thể đọc được.

0

KHÔNG sử dụng thông minh - PHP là một hệ thống tự tạo khuôn mẫu. Xem xét sử dụng cú pháp này:

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

Tôi đã yêu cầu từ một lý thuyết, 'cách tốt nhất để làm điều đó', quan điểm. – Brayn

+0

@tharkun: Bạn có thể đăng mã thông minh tương đương với ví dụ này không? Tôi muốn được quan tâm để xem có thể duy trì và mở rộng được nhiều hơn nữa. –

+0

@Bobby Jack: Tôi muốn nhờ người khác đăng mã Smarty vì tôi không sử dụng Smarty. – markus

14

-1 cho các bài đăng 'sử dụng hệ thống templating yêu thích của tôi' thay thế! Mỗi bài đăng PHP, ngay cả khi câu trả lời gốc của PHP là một lớp lót, luôn luôn biến thành điều này, cũng giống như mọi câu hỏi JavaScript một lớp kết thúc bằng ‘sử dụng [khung yêu thích của tôi] thay thế!’. Thật xấu hổ.

Nghiêm túc, chúng tôi biết về cách tách logic kinh doanh và các mối quan tâm về bản trình bày. Bạn có thể làm điều đó - hoặc không làm điều đó - trong bất kỳ hệ thống tạo khuôn mẫu nào, cho dù PHP, Smarty hay cái gì đó hoàn toàn khác. Không có hệ thống templating kỳ diệu tách mối quan tâm của bạn mà không có một loạt suy nghĩ.

(Trong thực tế, một hệ thống khuôn mẫu đó là quá hạn chế có thể kết thúc với bạn cần phải viết mã phụ trợ đó là thuần túy presentational, cluttering lên logic kinh doanh của bạn với mối quan tâm presentational. Đây không phải là một chiến thắng!)

Để trả lời câu hỏi đã được hỏi, ví dụ đầu tiên là OK, nhưng rất khó đọc do sự thụt lề xấu. Xem ví dụ của monzee cho một cách dễ đọc hơn; bạn có thể sử dụng: ký hiệu hoặc {} s, tùy theo điều bạn thích, nhưng điều quan trọng đối với khả năng đọc là giữ cho HTML và PHP của bạn là một cấu trúc phân cấp thụt lề "được tạo đúng".

Và lời cầu xin cuối cùng: hãy nhớ htmlspecialchars(). Mỗi khi văn bản thuần tuý cần phải truy cập vào một trang web, thì này phải sử dụng hoặc XSS trên tất cả các tầng. Tôi biết câu hỏi này không liên quan trực tiếp đến điều đó, nhưng mỗi lần chúng tôi gửi mã ví dụ bao gồm <? Php echo ($ title)?> Hoặc tương đương khuôn khổ mà không cần thoát, chúng tôi khuyến khích tiếp tục khu vực thảm họa bảo mật hầu hết các ứng dụng PHP đã trở thành.

+1

Tôi hoàn toàn đồng ý rằng bạn không cần một động cơ templating, nhưng câu hỏi được hỏi về thực hành tốt nhất, và một trong những quan trọng nhất là việc tách logic kinh doanh và trình bày. Bạn có thể biết tất cả về họ nhưng điều đó không có nghĩa là người đăng. – Ken

+2

Tôi luôn viết câu trả lời của mình theo cách mà tôi cho rằng áp phích không biết và quan trọng hơn là nhiều độc giả trong tương lai của WIKI này sẽ không biết! – markus

1

Điều tôi muốn tôi biết khi lần đầu tiên tôi bắt đầu làm PHP: Giữ mã chương trình nâng hạng nặng của bạn cách xa đầu ra HTML của bạn càng tốt. Bằng cách đó, cả hai đều ở trong khối lớn, khá tiếp giáp, có thể đọc được. Cách tốt nhất tôi đã tìm thấy để làm điều này là tạo một tệp HTML tĩnh đầu tiên, có thể với một số dữ liệu giả để tôi có thể poke xung quanh và nhận được quyền thiết kế, sau đó viết mã PHP để có được phần năng động của đầu ra và dán chúng lại với nhau (cách bạn làm điều đó một phần là tùy thuộc vào bạn - bạn có thể làm điều đó với Smarty như những người khác đang đề xuất).

1

Nếu bạn phải hãy làm theo cách này bằng cách sử dụng dấu ngoặc móc. Không lặp lại HTML với PHP.

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