2012-08-07 23 views
5

Vì vậy, tôi hỏi một câu hỏi tương tự trước đó và tôi chỉ bối rối hơn bây giờ, vì vậy tôi sẽ hỏi nó theo một cách khác ...Cách tốt nhất để trả về html từ chức năng php?

Những gì tôi đang cố gắng làm là trừu tượng php của tôi và đặt các bit của html, được sử dụng trong trình duyệt tính hợp lệ của tôi dưới dạng thông báo lỗi, thành các hàm trả về html ở vị trí cần thiết trong trang.

Những gì tôi có ngay bây giờ là:

<section> 
<?php 
if($errMsg) 
{ 
    errMsg(); 
} 
?> 
</section> 

<?php 
function errMsg() 
{ 
     ?> 
     <section> 
      <p>O crap! There was an error</p> 
     </section> 
     <?php 
} 
?> 

Nhưng trong câu hỏi đề cập trước đây của tôi, tôi đã nói làm nó theo cách này là một 'bẩn hack' và tốt hơn để sử dụng trở lại của mình trong những tình huống như thế này. Nhưng để sử dụng trở lại tôi cần phải gán tất cả các html trở về một var và để làm điều đó tôi sẽ cần phải đặt html trong một chuỗi. Tôi muốn tránh đặt nhiều hơn hai dòng html trong một chuỗi vì sự đau đớn trong số mông của dấu ngoặc kép cần thiết để làm như vậy.

Vì vậy, tôi đang nghĩ mình sử dụng cú pháp heredoc hoặc hàm ob_start/ob_get_clean. Điều tôi muốn biết là.

1 Tôi thậm chí có cần phải bận tâm với việc trừu tượng mã của mình như thế này không?
2 Nếu có, cách nào là cách thực hành tốt nhất để thực hiện? Và/Hoặc
3 Tôi có nên từ bỏ phát triển web và quay lại giao pizza không? : - \

Trả lời

4

Tôi sẽ không trả lại bất kỳ HTML nào. Chỉ cần trả về thông báo lỗi từ hàm và sau đó xây dựng html ở một nơi thích hợp hơn. Ví dụ bên trong mẫu.

4
  1. Chắc chắn, bạn không có sự linh hoạt với cách bạn đang thực hiện.
  2. Bạn nên tách tất cả HTML của mình khỏi lý tưởng PHP, ít nhất là các chức năng - nơi duy nhất được chấp nhận từ xa là trong chế độ xem sử dụng PHP chỉ để hiển thị đầu ra của các hàm.
  3. Pizza! Chỉ đùa thôi, nhưng không bao giờ có đủ pizza sao !?

Hãy xem khung Zend http://framework.zend.com/manual/en/zend.application.quick-start.html chúng chuyển tiếp các thông báo lỗi không bị xử lý lỗi, sau đó sử dụng chế độ xem riêng để hiển thị lỗi.

Hoặc w/o một khuôn khổ:

try{ 
    //do work here and throw exception on error 
} 
catch (Exception $e) 
{ 
    //do error logging/display error 
    //or preferably load another class which handles your error and produces output 
} 
+0

Xin vui lòng tha thứ cho sự noobness của tôi, nhưng khi bạn nói tách biệt tất cả HTML của tôi khỏi PHP của tôi, bạn có muốn giữ các ngôn ngữ khác nhau trong các tệp khác nhau không? Giống như JavaScript không phô trương? Bởi vì ngay bây giờ, chỉ cần về tất cả các tệp .php của tôi là các trang web với PHP được viết trên doctype. –

+0

Ở trên cùng của tập tin là tốt, nhưng tôi sẽ không kết hợp HTML với PHP trực tiếp, tức là sử dụng <<< EOF hoặc đóng các thẻ php để thêm HTML là yêu cầu rắc rối khi nói đến thiết kế lại. Hãy suy nghĩ cho chính mình khi mã hóa của bạn - điều này sẽ làm cho cuộc sống của tôi khó khăn khi nói đến việc thiết kế lại trang web của tôi? Câu trả lời có khả năng cho ví dụ của bạn là rõ ràng có ;-) – williamvicary

+0

Cảm ơn bạn đã trả lời. Bây giờ nếu trộn PHP vào HTML bằng cách sử dụng thẻ đóng là một ý tưởng tồi. Làm thế nào bạn sẽ xuất ra bất cứ thứ gì từ PHP sang HTML? Ví dụ, nếu một biểu mẫu trở về từ máy chủ với một lỗi, làm thế nào bạn thậm chí sẽ giữ đầu vào của người dùng trong các lĩnh vực đầu vào mà không sử dụng một cái gì đó như value = ""? –

4

1: Bạn không cần phải, nhưng bạn có thể nếu nó được thực hiện đúng cách.

2: Để làm điều này, tôi khuyên bạn nên sử dụng EOF do lỗi func PHP của bạn, nó trông như thế này:

function errMsg() 
{ 
     $error = <<<EOF 
<section> 
<p>O crap! There was an error</p> 
</section> 
EOF; 
} 
+3

Nó không được gọi là EOF, nó được gọi là [heredoc] (http://www.php.net/heredoc). – vascowhite

+0

Bạn nói đúng, nhưng mọi người đều hiểu với EOF;) – PoulsQ

+5

Đó là một giả định rất lớn. – vascowhite

2

Bạn chỉ có thể làm điều này:

<?php if($errMgs){ ?> 
<section> 
    <p><?php echo errMsg(); ?></p> 
</section> 
<?php } ?> 

Nói chung, Tôi cố gắng hết sức để không lặp lại HTML thông qua PHP. Tại sao? Bởi vì nếu một nhà thiết kế cần phải làm việc trên mã của tôi, tôi không muốn anh ta/cô ấy lo lắng về những gì HTML chức năng của tôi đang nhổ ra.

2

Di chuyển mã html vào một tệp riêng biệt, error.php.Sau đó bạn chỉ cần nắm bắt đầu ra:

function errMsg() 
{ 
    ob_start(); 
    include '/path/to/error.php'; 
    return ob_get_clean(); 
} 

// ... 

echo errMsg(); 
2

Trước hết, tôi đồng ý với các bài viết ở trên. Không định dạng, chỉ cần có chức năng trả về thông báo lỗi trần và nếu bạn cần định dạng nó một cách thích hợp nơi bạn muốn hiển thị nó.

Thứ hai, tôi luôn thấy hữu ích khi có thể bật và tắt thông báo lỗi và kiểm tra nhanh chóng. Như đa số các mã của tôi là đối tượng định hướng và tôi chỉ có thể muốn có tin nhắn popping từ một đối tượng tại một thời điểm, tôi thường có một cái gì đó như thế này trong các lớp học của tôi:

class userObject 
{ 
    public $history;// = historyObject; 
    public $userName; 
    public $userRelation; 
    public $userCode; 
    private $mySQLAccessData; 
    private $isDebug=false; 

    public function makeHistoryObject($KPI, $KPIType) 
    { 
     if($this->isDebug){echo "Having a go at creating ".$this->userName.".<br>";} 
     $this->history = new historyObject($this->userCode, $KPI, $KPIType); 
    } 
} 

tôi trượt một yếu tố private trong đó tôi để mặc định là false. Nếu tôi cần gỡ lỗi hoặc thực hiện thay đổi, tôi đặt nó thành true và tất cả các thông báo lỗi/ghi nhật ký của tôi được hiển thị gọn gàng trên màn hình. Tôi biết rằng điều này không trực tiếp trả lời câu hỏi của bạn, nhưng tôi thấy rằng nó là vì vậy tiện dụng nó có thể là giá trị nó cho bạn khi bạn bắt đầu. Nó chắc chắn đánh bại bình luận ra và sau đó uncommenting hàng chục tin nhắn tiềm năng. Bạn có thể để lại các đầu ra này trong đối tượng mà không cần lo lắng và để chúng hiển thị tất cả các chi tiết bạn cần.

0

Nếu bạn có thể tại một số điểm có số lỗi, sau đó làm như thế này

<?php 
$errors = array(); 

if (!$item = getItem($id)) { 
    addError("No item $id"); 
} 

if (!updateUser($user, $id)) { 
    addError("Can not update user"); 
} 

if (!updateItemPicture($id, $picture)) { 
    addError("Can not add picture to $id"); 
} 

function addError($error) { 
    global $errors; $errors []= $error; 
} 

function hasErrors() { 
    global $errors; return count($errors); 
} 

function printErrors() { 
    if (!hasErrors()) return; 

    print "<ul class='errors'><li>" . join("</li><li>", $errors) . "</li></ul"; 
} 


printErrors(); 
?> 

Đây là trong trường hợp bạn không sử dụng cách hướng đối tượng. Và giả sử rằng tất cả các lỗi không gây tử vong và bị bắt trong các khối try {} catch() {}.

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