2012-09-25 15 views
7

Tôi có một bộ điều khiển vào/application/lõiCodeIgniter HMVC kéo dài MX_Controller, không thể sử dụng get_instance đúng

/application/core/CMS_Controller.php

<?php if (! defined('BASEPATH')) exit('No direct script access allowed'); 

require APPPATH."third_party/MX/Controller.php"; 

class CMS_Controller extends MX_Controller { 

    public function __construct() { 
     parent::__construct(); 
    } 

    public function show_something() { 
     echo "something shown"; 
    } 
} 

Tôi có một bộ điều khiển trong một module (/modules/my_module/controllers/controller.php) mở rộng từ CMS_Controller

/modules/my_module/controllers/controller.php

<?php if (! defined('BASEPATH')) exit('No direct script access allowed'); 

class Controller extends CMS_Controller { 

    public function index() { 
     $this->load->view('view'); 
    } 
} 

Và, trong view.php (/modules/my_module/views/view.php) Tôi làm điều này: /modules/my_module/views/view.php

<?php if (! defined('BASEPATH')) exit('No direct script access allowed'); 
$ci =& get_instance(); 
echo $ci->show_something(); 
?> 

Và tôi nhận được lỗi này:

Fatal error: Call to undefined method CI::show_something() in /home/gofrendi/public_html/No-CMS/modules/my_module/views/view.php on line 3

Nó sẽ hoạt động nếu tôi không sử dụng MX_Controller và sử dụng CI_Controller thay vì: /application/cor e) CMS_Controller.php

<?php if (! defined('BASEPATH')) exit('No direct script access allowed'); 

//require APPPATH."third_party/MX/Controller.php"; 

class CMS_Controller extends CI_Controller { 

    public function __construct() { 
     parent::__construct(); 
    } 

    public function show_something() { 
     echo "something shown"; 
    } 
} 

Bất kỳ ai biết điều gì sai ở đây?

Trả lời

3

Trong application/THIRD_PARTY/MX/Controller.php ở phần cuối của các nhà xây dựng (sau dòng 54) i thêm

/* allow CI_Controller to reference MX_Controller */ 
CI::$APP->controller = $this; 

nếu bạn nhìn vào mã $ này đề cập đến lớp hiện tại là MX_Controller và CI :: $ APP đề cập đến CI_controller (xem tệp MX/Base.php)

do đó, bây giờ nó đơn giản ... để có được những tài liệu tham khảo để CI_Controller chúng tôi sẽ làm (theo bình thường)

$this->CI =& get_instance(); 

và để có được tham chiếu đến MX_Controller chúng tôi sẽ làm

$this->CI =& get_instance()->controller; 
0

đối với tôi bạn không cần phải nhận được dụ để thử tôi sẽ là:

<?php if (! defined('BASEPATH')) exit('No direct script access allowed'); 

echo $this->show_something(); 
?> 

thay vì

<?php if (! defined('BASEPATH')) exit('No direct script access allowed'); 
$ci =& get_instance(); 
echo $ci->show_something(); 
?> 

anyway nó là thực hành tốt để thiết lập thư viện riêng và làm somenthing như:

$this->load->library('foo_lib'); 
$this->foo_lib->show_somenthing(); 
+0

Cám ơn câu trả lời của bạn. Kịch bản là trên màn hình. Tôi không nghĩ rằng xem có thể nhận ra $ này. Ngay bây giờ tôi vẫn còn một việc khác để làm. Nhưng tôi sẽ comfirm kết quả sau đó. – goFrendiAsgard

1

Tôi gặp vấn đề tương tự, thấy rằng bài đăng và trang web của tôi hoạt động, có thể thử không?

"Bạn không cần phải mở rộng MX_Controller trừ khi bạn đang có kế hoạch chạy bộ điều khiển trong bộ điều khiển khác. Trong nhiều trường hợp, mã được đưa vào thư viện. Nếu không, bộ điều khiển của bạn chỉ nên mở rộng MY_Controller."

Tìm thấy ở đây: http://ellislab.com/forums/viewthread/179478/