2012-09-25 22 views
7

I tiene un controlador en/aplicación/núcleoCodeIgniter HMVC extiende MX_Controller, no puede utilizar get_instance correctamente

/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"; 
    } 
} 

tengo otro controlador en un módulo (/modules/my_module/controllers/controller.php) que se extendía desde 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'); 
    } 
} 

Y, en view.php (/modules/my_module/views/view.php) hago esto: /modules/my_module/views/view.php

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

Y me sale este error:

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

será funciona si yo no uso MX_Controller y usar en su lugar CI_Controller: /aplicación/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"; 
    } 
} 

Alguien sabe lo que está mal aquí?

Respuesta

3

En application/THIRD_PARTY/MX/controller.php al final del constructor (después de la línea 54) he añadido

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

si nos fijamos en el código $ esto se refiere a la clase actual que es MX_Controller y CI :: $ APP se refiere al CI_controller (mira el archivo MX/Base.php)

así que ahora es simple ... para obtener la referencia a CI_Controller haremos (según lo normal)

$this->CI =& get_instance(); 

y para obtener referencia a MX_Controller haremos

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

para mí que no es necesario para obtener la instancia por lo que mi intento sería la siguiente:

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

echo $this->show_something(); 
?> 

en lugar de

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

de todos modos es una buena práctica para establecer bibliotecas propias y hacer somenthing como:

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

Gracias por su respuesta. La secuencia de comandos está en la vista. No creo que esa visión pueda reconocer $ this. En este momento todavía tengo algo más que hacer. Pero confirmaré el resultado más tarde. – goFrendiAsgard

1

Tuve el mismo problema, encontré esa publicación e hizo que mi sitio web funcionara, ¿podría intentarlo?

"No necesita extender MX_Controller a menos que esté planeando ejecutar un controlador dentro de otro controlador. En muchos casos, el código se colocará en una biblioteca. De lo contrario, su controlador debería simplemente extender MY_Controller".

encontrado aquí: http://ellislab.com/forums/viewthread/179478/

Cuestiones relacionadas