I'm using http://github.com/philsturgeon/codeigniter-template/ for the templates and I trying to load other controller view to actual view as a partial. My main problem is that I cant append meta data (javascripts, css) from other controller to the main controller.
application/core/MY_Loader.php
class MY_Loader extends CI_Loader
{
function __construct()
{
parent::__construct();
}
function controller( $sController ) {
global $RTR;
// Parse the sController string ex: demo/index
$aControllerData = explode( '/', $sController );
$sMethod = !empty( $aControllerData[1] )
? $aControllerData[1]
: 'index'
;
$sController = !empty( $aControllerData[0] )
? $aControllerData[0]
: $RTR->default_controller
;
$sClass = ucfirst( $sController );
$sPath = APPPATH . 'controllers/';
if ( !file_exists( $sPath . $sController . '.php' ) || class_exists( $sClass, FALSE ) ) {
set_status_header( 503 );
exit( 'Unable to locate the specified class: '. ucfirst( $sController ).'.php' );
}
$this->file( $sPath . $sController . '.php' );
$sClass = new $sClass;
if ( !method_exists( $sClass, $sMethod ) ) {
set_status_header( 503 );
exit( 'There is no Method: ' . $sMethod . ' in Class: '. ucfirst( $sController ).'.php' );
}
$aArguments = func_get_args();
return call_user_func_array( array( $sClass, $sMethod ), array_slice( $aArguments, 1));
}
}
/* End of file MY_Loader.php */
/* Location: ./controllers/MY_Loader.php */
application/controllers/demo.php
<?php if ( !defined( 'BASEPATH' ) ) {
exit( 'No direct script access allowed' );
}
class Demo extends CI_Controller
{
function index() {
$this->load->controller('welcome');
$this->template->set_partial('footer', 'partials/footer')->build('demo');
}
}
/* End of file welcome.php */
/* Location: ./controllers/demo.php */
application/controllers/welcome.php
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class Welcome extends CI_Controller {
public function index()
{
echo 'Loaded welcome controller';
$this->template->title('Welcome');
$this->template->append_metadata('<script src="/js/jquery.js"></script>');
$this->template->set_partial('footer', 'partials/footer')->build('welcome_message');
}
}
After going to the url localhost/demo i got interface with partials and everything looks good, but I see that there are some libraries loaded too many times in my logs.
DEBUG - 2012-10-24 08:02:16 --> Database Driver Class Initialized
DEBUG - 2012-10-24 08:02:16 --> User Agent Class Initialized
DEBUG - 2012-10-24 08:02:16 --> Template Class Initialized
DEBUG - 2012-10-24 08:02:16 --> Controller Class Initialized
DEBUG - 2012-10-24 08:02:16 --> File loaded: /home/www/application/controllers/welcome.php
DEBUG - 2012-10-24 08:02:16 --> Database Driver Class Initialized
DEBUG - 2012-10-24 08:02:16 --> User Agent Class Initialized
DEBUG - 2012-10-24 08:02:16 --> Template Class Initialized
DEBUG - 2012-10-24 08:02:16 --> Controller Class Initialized
DEBUG - 2012-10-24 08:02:16 --> File loaded: /home/www/application/themes/default/views/partials/footer.php
DEBUG - 2012-10-24 08:02:16 --> File loaded: /home/www/application/views/welcome_message.php
DEBUG - 2012-10-24 08:02:16 --> File loaded: /home/www/application/themes/default/views/layouts/main.php
DEBUG - 2012-10-24 08:02:16 --> Helper loaded: inflector_helper
DEBUG - 2012-10-24 08:02:16 --> File loaded: /home/www/application/themes/default/views/partials/footer.php
DEBUG - 2012-10-24 08:02:16 --> File loaded: /home/www/application/views/demo.php
DEBUG - 2012-10-24 08:02:16 --> File loaded: /home/www/application/themes/default/views/layouts/main.php
DEBUG - 2012-10-24 08:02:16 --> Final output sent to browser
I was trying to use HMVC but there was the same result.
I found a solution at https://github.com/EllisLab/CodeIgniter/pull/1818 There is a real HMVC and it works. I hope that this will be included in upcoming CodeIgniter release.
My test results are shown in the images. controllers/demo.php
Results http://ikelk.lt/i/108035/o_82a933c1f5.png