2010-09-12 32 views
13

Tôi có bộ điều khiển/mô hình cho các dự án. do đó, điều khiển mô hình dự án, v.v. Tôi có một trang chủ đang được điều khiển bởi các page_controller. Tôi muốn hiển thị danh sách các dự án trên trang chủ. Là nó dễ dàng như việc thực hiện:CakePHP: sử dụng các mô hình trong các bộ điều khiển khác nhau

function index() { 
    $this->set('projects', $this->Project->find('all'));   
} 

Tôi đoán không phải là tôi nhận được:

Undefined property: PagesController::$Project 

Ai đó có thể chỉ đạo cho tôi đi đúng hướng xin vui lòng,

Jonesy

+0

một câu hỏi tương tự đã được hỏi trước tại địa chỉ: http://stackoverflow.com/questions/2895098/how-to-load-a-model/2895136 – Vicer

Trả lời

55

Bạn phải tải mọi mô hình trong lớp bộ điều khiển theo biến $uses, ví dụ:

var $uses = array('Project'); 

hoặc trong phương pháp sử dụng hành động

$this->loadModel('Project'); 
+0

nếu dường như có làm việc cảm ơn! một câu hỏi nữa mặc dù tôi sẽ sử dụng nó trong quan điểm như vậy: foreach ($ projects as $ project) { \t \t \t echo $ project ['title']; \t \t \t echo '
'; \t \t} vì nó cho tôi biết tiêu đề là không xác định – iamjonesy

+0

Tôi không thể cho bạn biết điều này bây giờ vì tôi không có mã để chạy ngay bây giờ, nhưng vui lòng var_dump() nội dung đang được trả về bởi find() và xem chính xác là 'tiêu đề' nằm trong cây. –

+0

nhận nó foreach ($ dự án là $ dự án) { \t \t \t echo $ project ['Project'] ['title']; \t \t \t echo '

'; \t \t} – iamjonesy

0

Đối với tôi đó là hợp lý hơn để sử dụng requestAction. Bằng cách này, logic được bọc trong bộ điều khiển.

Trong ví dụ:

// trong dự án điều khiển của bạn:

class ProjectsController extends AppController { 
    function dashboard(){ 
    $this->set('projects', $this->Project->find('all')); 
    } 
    $this->render('dashboard'); 
} 

Gấu nhớ rằng bạn cần phải tạo ra dashboard.ctp trong/app/views/dự án của khóa học.

Theo quan điểm của bảng điều khiển của trang (có thể là /app/views/pages/dashboard.ctp) thêm:

echo $this->requestAction(array('controller'=>'projects', 'action'=>'dashboard')); 

Bằng cách này logic sẽ ở lại điều khiển của dự án. Tất nhiên bạn có thể yêu cầu/dự án/chỉ mục, nhưng việc xử lý phân trang sẽ phức tạp hơn.

thêm về requestAction(). nhưng hãy nhớ rằng bạn cần phải sử dụng nó một cách cẩn thận. Nó có thể làm chậm ứng dụng của bạn.

+1

Dường như với tôi rằng việc sử dụng requestAction" ruins "cấu trúc MVC. Lý do duy nhất để sử dụng nó có thể là yếu tố. –

+0

Đồng ý, nhưng cách này bạn đóng gói mô-đun trong plugin riêng biệt, vì vậy nó có thể được tái sử dụng. –

+0

@OfirBaruch Tôi nghĩ rằng nó không làm hỏng cấu trúc MVC ở khắp mọi nơi. Nó phụ thuộc vào nơi bạn sử dụng requestAction(). Nếu bạn sử dụng nó trong View (trang hoặc phần tử) thì OK, nhưng ở nơi khác, có, nó hủy hoại cấu trúc MVC. – ozanmuyes

2

Theo quan điểm của tôi, cách thích hợp để thực hiện việc này là thêm chức năng vào mô hình hiện tại của bạn, mô hình này nhanh hơn và trả về dữ liệu cần thiết.

Dưới đây là một ví dụ mà trả về dữ liệu từ mô hình dự án trong một mô hình gọi là ví dụ và gọi các dữ liệu trong bộ điều khiển Ví dụ:

Sử dụng Dự án mẫu bên Ví dụ mẫu:

<?php 
/* Example Model */ 
App::uses('Project', 'Model'); 
class Example extends AppModel { 

    public function allProjects() { 
     $projectModel = new Project(); 
     $projects = $projectModel->find('all'); 
     return $projects; 
    } 

} 

Trở dữ liệu đó trong Bộ điều khiển mẫu

// once inside your correct view function just do: 
$projects = $this->Example->allProjects(); 
$this->set('projects', $projects); 

Trong giao diện Ví dụ

<?php 
// Now assuming you're in the .ctp template associated with 
// your view function which used: $projects = $this->Example->allProjects(); 
// you should be able to access the var: $projects 
// For example: 
print_r($projects['Project']); 

Tại sao điều này thực hành "tốt hơn" so với tải cả hai mô hình vào bộ điều khiển của bạn? Vâng, mô hình dự án được kế thừa bởi mô hình Ví dụ, vì vậy dữ liệu dự án bây giờ trở thành một phần của phạm vi mô hình Ví dụ.(Điều này có nghĩa là ở phía cơ sở dữ liệu của sự vật là 2 bảng được nối với nhau bằng cách sử dụng mệnh đề SQL JOIN).

Hoặc như hướng dẫn nói:

Một trong những tính năng mạnh mẽ nhất của CakePHP là khả năng liên kết bản đồ quan hệ được cung cấp bởi các mô hình. Trong CakePHP, các liên kết giữa các mô hình được xử lý thông qua các liên kết. Xác định mối quan hệ giữa các đối tượng khác nhau trong ứng dụng của bạn nên là một quá trình tự nhiên. Ví dụ: trong cơ sở dữ liệu công thức, công thức có thể có nhiều đánh giá, bài đánh giá có một tác giả và tác giả có thể có nhiều công thức nấu ăn. Xác định cách thức hoạt động của các mối quan hệ này cho phép bạn truy cập dữ liệu của mình một cách trực quan và mạnh mẽ. (source)

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