2011-11-15 20 views
5

Làm thế nào để bạn thiết lập CI2 để cho phép mở rộng nhiều mô hình?Mở rộng Nhiều mô hình trong Codeigniter 2

Tôi chỉ có thể mở rộng một mô hình (đặt trong/ứng dụng/lõi) có tên MY_Model (phân biệt chữ hoa chữ thường).

Để chọn mô hình để mở rộng tôi đang làm; trong mô hình ..

require_once APPPATH.'core/MY_Another_model.php'; 
class Test_model extends MY_Another_model { 
... 
} 

tôi không thể tìm thấy ở đâu trong mã hệ thống cốt lõi mà nó chỉ nói để cho phép mô hình đang được mở rộng để được gọi MY_Model.

Cảm ơn mọi sự giúp đỡ.

Trả lời

4

As I said in this question about the controllers bạn chỉ cần đặt cả hai lớp trong cùng một tệp MY_Model. Tập tin này được sử dụng như một phần của tính năng tự động nạp của codeigniter, có nghĩa là nó sẽ tìm kiếm bất kỳ tập tin nào có tiền tố MY_ (hoặc cấu hình đã xác định).

Bạn thậm chí không cần phải gọi các lớp bên trong MY_Model bạn có khả năng có thể gọi nó MY_Special_Model và có MY_Another_Model trực tiếp bên dưới

+0

Đây chính xác là những gì tôi làm! Nó không đẹp bởi vì tôi thích có từng lớp trong một tập tin riêng biệt ... nhưng đó là cách duy nhất tôi có thể đạt được điều này trong CI. – MikeMurko

+0

@MikeMurko Có cách để có các lớp riêng biệt trong các tệp riêng biệt, nhưng nó liên quan đến việc tạo một lớp trình nạp tùy chỉnh và không đáng để dành thời gian và công sức. –

+0

@CubedEye Cảm ơn đã gợi ý - hoạt động tuyệt vời :) –

9

Tôi đã thử cách Cubed Eye, và nó hoạt động, nhưng đây là một lựa chọn khác:

Thử thêm mô hình vào tệp autoload.php của bạn. Nó có thể kế thừa từ MY_Model (mà thừa hưởng từ CI_Model), và bất kỳ mô hình bổ sung mà bạn tải có thể kế thừa từ nó:

class Extended_model extends MY_Model { 
    public function __construct() 
    { 
     parent::__construct(); 
     $this->load->model('Another_model'); 
    } 
} 

(mô hình/Extended_model.php)

class Another_model extends Extended_model { 
} 

(mô hình/Another_model.php)

EDIT: Tôi vừa nhận ra rằng bạn đang đặt mô hình mở rộng của mình vào thư mục "lõi". Điều này chỉ cần thiết cho các lớp mở rộng các lớp CI_ * cốt lõi (tức là MY_Controller, MY_Model, MY_Input, v.v.). Nếu bạn có một mô hình mở rộng MY_Model, hãy đặt nó trong các mô hình/thư mục của bạn thay vào đó và không đặt tiền tố cho nó bằng "MY_".

+0

Mặc dù tôi đã chấp nhận câu trả lời ở trên, tôi đã bình chọn điều này vì tôi thích có các tệp riêng biệt cho mỗi mô hình, thay vì xếp tất cả chúng vào một tệp. – Rooneyl

1

Cuối cùng bạn có thể thử hack này, sử dụng load_class chức năng:

Đây là phần mở rộng mô hình của bạn:
application/core/Special_model_class.php:

class CI_Special_model_class extends CI_Model {...} 

Tên của file php là không có tiền tố CI_, mặc dù chính lớp đó có tiền tố!

Mô hình này dựa trên lớp này trong các mô hình/thư mục:
application/mô hình/one_model.php:

class One_model extends CI_Special_model_class {...} 

Để thực hiện việc này, bạn nên gọi load_class chức năng từ bộ điều khiển:
ứng dụng/bộ điều khiển/one_ctrl.php

.... 
load_class('Special_model_class', 'core'); 
$this->load->model('Special_model_class'); 
.... 

Cuối cùng, bạn có thể thử gọi load_class trong mô hình, ngay trước khi xác định. application/mô hình/one_model.php:

load_class('Special_model_class', 'core'); 
class One_model extends CI_Special_model_class {...} 
0

Đây là lớp mô hình mẹ:

class MY_Common_Model extends CI_Model { 

    function __construct() { 
     parent::__construct(); 
    } 
     function drop_table($table_name) { 
     $this->connect(); 
     $this->dbforge->drop_table($table_name); 

    } 

} 

Đây là lớp mô hình con:

class MY_Model extends MY_Common_Model { 
    function inset_table($table_name) { 
     $this->connect(); 
     $this->insert_table($table_name); 

    } 
} 

trong mô hình:

$this->drop_table($edge_table); 
Các vấn đề liên quan