2009-08-21 24 views
11

cần bạn trợ giúp với việc tạo khuôn mẫu PHP. Tôi mới sử dụng PHP (Tôi đến từ Perl + Embperl). Dù sao, vấn đề của tôi rất đơn giản:Làm cách nào để chuyển các tham số tới mẫu PHP được hiển thị bằng 'include'?

  • Tôi có một mẫu nhỏ để hiển thị một số mục, để cho nó trở thành một bài đăng trên blog.
  • Cách duy nhất tôi biết sử dụng mẫu này là sử dụng chỉ thị 'bao gồm'.
  • Tôi muốn gọi mẫu này trong vòng lặp đi qua tất cả các bài đăng trên blog có liên quan.
  • Sự cố: Tôi cần chuyển (các) tham số cho mẫu này; trong trường hợp này tham chiếu đến mảng đại diện cho một bài đăng trên blog.

Mã trông giống như sau:

$rows = execute("select * from blogs where date='$date' order by date DESC"); 
foreach ($rows as $row){ 
    print render("/templates/blog_entry.php", $row); 
} 

function render($template, $param){ 
    ob_start(); 
    include($template);//How to pass $param to it? It needs that $row to render blog entry! 
    $ret = ob_get_contents(); 
    ob_end_clean(); 
    return $ret; 
} 

Bất kỳ ý tưởng làm thế nào để thực hiện điều này? Tôi thực sự stumped :) Có cách nào khác để render một mẫu?

Trả lời

29

Hãy xem xét bao gồm tệp PHP như thể bạn đang sao chép mã từ việc đưa vào vị trí có câu lệnh bao gồm. Điều này có nghĩa là bạn thừa kế phạm vi hiện tại.

Vì vậy, trong trường hợp của bạn, $ param đã có sẵn trong mẫu đã cho.

+0

+1 tương tự sao chép-dán luôn là cách tôi giải thích. –

+1

Để tăng tính khác biệt, hãy thử trả về một giá trị ('return 42;') từ bao gồm của bạn và ghi lại giá trị đó: '$ result = include 'filethatreturns42.php';';) – NSSec

19

$ param phải có sẵn bên trong mẫu. Khi bạn đưa() một tệp, nó phải có cùng phạm vi với vị trí được bao gồm.

từ http://php.net/manual/en/function.include.php

Khi một tập tin được bao gồm, mã nó chứa thừa hưởng biến phạm vi của dòng trên đó bao gồm xảy ra. Bất kỳ biến nào có sẵn tại dòng đó trong tệp gọi sẽ là có sẵn trong tệp được gọi, từ điểm đó chuyển tiếp. Tuy nhiên, tất cả các hàm và lớp học được xác định trong tệp bao gồm có phạm vi toàn cầu.

Bạn cũng có thể làm điều gì đó như:

print render("/templates/blog_entry.php", array('row'=>$row)); 

function render($template, $param){ 
    ob_start(); 
    //extract everything in param into the current scope 
    extract($param, EXTR_SKIP); 
    include($template); 
    //etc. 

Sau đó $ row sẽ có sẵn, nhưng vẫn gọi là $ row.

+0

Rất đẹp, cảm ơn! Có, tôi thích sử dụng băm như thông số để hàm có thể dễ dàng sửa đổi trong tương lai. –

+0

Đây là cách các khung công tác như CodeIgniter hoạt động.Bạn tải một tệp mẫu và chuyển một mảng các giá trị vào nó được trích xuất và sử dụng trong khuôn mẫu. –

1

tôi sử dụng các chức năng helper sau khi tôi làm việc trên các trang web đơn giản:

function function_get_output($fn) 
{ 
    $args = func_get_args();unset($args[0]); 
    ob_start(); 
    call_user_func_array($fn, $args); 
    $output = ob_get_contents(); 
    ob_end_clean(); 
    return $output; 
} 

function display($template, $params = array()) 
{ 
    extract($params); 
    include $template; 
} 

function render($template, $params = array()) 
{ 
    return function_get_output('display', $template, $params); 
} 

hiển thị sẽ ra mẫu vào màn hình trực tiếp. kết xuất sẽ trả về dưới dạng chuỗi. Nó sử dụng ob_get_contents để trả về kết quả in của một hàm.

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