2009-04-19 18 views
5

Trong CodeIgniter hoặc lõi PHP; có tương đương với các phần và dạng xem của Rails không?CodeIgniter hoặc PHP tương đương với các phần của Rails và các mẫu

Một phần sẽ cho phép tôi hiển thị một đoạn xem khác trong chế độ xem của tôi. Tôi có thể có chế độ xem phổ biến là navbar.php mà tôi có thể trỏ vào bên trong chế độ xem homepage.php của mình. Các mẫu sẽ xác định vỏ tổng thể của một trang HTML ở một nơi và cho phép mỗi chế độ xem chỉ điền vào nội dung.

Điều gần nhất tôi có thể tìm thấy trong tài liệu CodeIgniter là Loading multiple views, trong đó một số chế độ xem được hiển thị tuần tự trong bộ điều khiển. Có vẻ lạ lùng khi đọc được cái nhìn trực quan của trang của tôi bên trong bộ điều khiển. (ví dụ: để di chuyển thanh điều hướng, nhà thiết kế của tôi sẽ phải chỉnh sửa bộ điều khiển).

Tôi đã tìm kiếm trên ngăn xếp tràn cho một cách PHP để thực hiện việc này. Tôi đã tìm thấy this page, mà nói về mô phỏng partials với ob_start. Đó có phải là cách tiếp cận được đề xuất bên trong CodeIgniter không?

+0

thử mắt: http://codeigniter.com/wiki/Ocular_Layout_Library/ – Geshan

Trả lời

13

Tôi có thể phá vỡ một số quy tắc MVC, nhưng tôi luôn đặt "các mảnh" của mình trong các khung nhìn riêng lẻ và tải chúng, kiểu CodeIgniter, từ trong các khung nhìn khác cần đến chúng. Khá nhiều tất cả các quan điểm của tôi tải một header và footer xem ở phía trên và phía dưới, tương ứng:

<? $this->load->view("header"); ?> 
//Page content... 
<? $this->load->view("footer"); ?> 

Phần header sau đó có thể bao gồm một NavBar trong cùng một thời trang vv

+1

Đây là cách để đi cho partials không yêu cầu dữ liệu riêng của họ. Nhưng trong trường hợp quan điểm một phần yêu cầu dữ liệu ("widget"), một cái gì đó giống như bên thứ ba "Modular Extensions HMVC" là một lựa chọn tốt. – rick

+0

Tôi nghĩ đây là phương pháp kết xuất đơn giản nhất. Hãy chắc chắn rằng bạn đặt hàm '$ this-> load-> view()' trong tệp xem ** ** chứ không phải trong bộ điều khiển (thông qua khóa mảng '$ data') vì nó sẽ chỉ lặp lại nó. – hohner

0

Rất tiếc, không có CodeIgniter cụ thể nào cả, tuy nhiên, tôi khuyên bạn nên xem Savant3 hệ thống mẫu. Nó cho phép bạn kết xuất mẫu thành một chuỗi. Sau đó, bạn có thể chỉ cần gắn nó vào bất cứ nơi nào bạn muốn.

Có thể có điều gì đó tương tự trong CodeIgniter?

Tôi có thể nghĩ ra cách thêm cơ sở khi hiển thị chế độ xem, để hiển thị mẫu và sau đó tất cả mẫu phụ chứa.

3

Trong PHP bạn muốn sử dụng include

+0

Tôi không biết nếu đó là chính xác những gì OP được yêu cầu. Tôi tin rằng chạy tập tin đính kèm tại điểm đánh giá; OP là yêu cầu cho một Rails-phong cách bao gồm (các tập tin bao gồm được đánh giá đầu tiên, IIRC, sau đó tổng hợp sau này). Điều này tạo nên sự khác biệt lớn khi thực hiện những việc như quyết định nội dung trang dựa trên những gì đang diễn ra trên trang/một phần/nội dung xem. –

0

CodeIgniter và Smarty chơi độc đáo với nhau.

5

này về cơ bản là những gì tôi sử dụng:

function render_partial($file, $data = false, $locals = array()) { 
    $contents = ''; 

    foreach($locals AS $key => $value) { 
     ${$key} = $value; 
    } 

    ${$name . '_counter'} = 0; 
    foreach($data AS $object) { 
     ${$name} = $object; 

     ob_start(); 
     include $file; 
     $contents .= ob_get_contents(); 
     ob_end_clean(); 

     ${$name . '_counter'}++; 
    } 

    return $contents; 
} 

này cho phép bạn gọi cái gì đó như:

render_partial('/path/to/person.phtml', array('dennis', 'dee', 'mac', 'charlie'), array('say_hello' => true)); 

và trong /path/to/person.phtml có:

<?= if($say_hello) { "Hello, " } ?><?= $person ?> (<?= $person_counter ?>) 

đây là một số điều kỳ diệu xảy ra mặc dù điều đó có thể giúp bạn có được bức tranh tốt hơn về những gì đang diễn ra. toàn bộ tập tin: view.class.php

+4

trích xuất ($ người dân địa phương); – Mario

+0

jeej i tkRenderPartial() rất nhiều bản thân mình;) +1 – Ropstah

2

tôi thấy mình di chuyển từ Rails để CI quá, và những gì tôi đã làm với partials về cơ bản là làm cho partials trong xem như là một biến và đặt nó từ bộ điều khiển.

Vì vậy, trong chế độ xem, bạn sẽ có một cái gì đó như (_partial.php):

<h2>Here Comes The Partials</h2> 
<?= $some_partials ?> 

Và bạn có thể thiết lập nó từ bộ điều khiển như:

$this->load->view('the_view', 
    array('some_partials', 
     $this->load->view('_partial', array(), TRUE) 
    ) 
); 

Cá nhân, tôi thích sử dụng xem thay vì ob_start CI, nhưng đó là tôi =) PS: Khi tải quan điểm , đối số đầu tiên là tên khung nhìn, thứ hai là các tham số được chuyển tới khung nhìn và thứ ba là cờ "ECHO", về cơ bản cho CI biết có nên hiển thị trực tiếp hay trả về giá trị của khung nhìn, về cơ bản những gì tôi đã làm trong ví dụ.

Tôi không nghĩ rằng đó là một giải pháp tốt mặc dù, nhưng nó làm việc cho tôi. Bất cứ ai có giải pháp tốt hơn?

+0

Tôi không tin rằng bạn có thể sử dụng 'ob_start()' trong bộ điều khiển vì 'CI_Loader' sử dụng nó khi tải chế độ xem. Vì vậy, bạn sẽ nhận được một lỗi. Tốt nhất là sử dụng phương thức '$ this-> load-> view ('view_name', $ data, true);' để trả về dạng xem được hiển thị dưới dạng một chuỗi. – sholsinger

2

Lần phát hành gần đây Template library của tôi hoạt động theo cách này.

Thư viện mẫu đó cũng phát độc đáo với số Dwoo implementation của chúng tôi sẽ mang lại cho bạn nhiều quyền năng hơn.

0

Bạn có thể kiểm tra xem nó, cho partials và mẫu

http://code.google.com/p/ocular/wiki/Introduction 
Các vấn đề liên quan