praashaad
praashaad

Reputation: 25

Autoload controller in CodeIgniter

I have question to you. I try add to my page calendar and some events in this calendar. I know how I can load calendar in page, but I didn`t now how I can load this calendar on every page automatically.

Controller:

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

class Calendar extends CI_Controller {

    function index()
    {
        $data = array(
                3  => 'Polska - Anglia',
        );

        $this->load->library('calendar');

        $vars['calendar'] = $this->calendar->generate('', '', $data);

        $this->load->view('main/calendar', $vars);
    }
}

and In view I call:

<?php echo $calendar;?>

I use CodeIgniter 2.1.3

Upvotes: 0

Views: 8028

Answers (2)

Maxime Morin
Maxime Morin

Reputation: 2008

You can autoload your library by changing the application/config/autoload.php file.

Find :

$autoload['libraries'] = array();

Replace by :

$autoload['libraries'] = array('calendar');

To load the same calendar on all your pages, I suggest to build a parent controller in the application/core folder.

abstract class BaseController extends CI_Controller
{
    protected $data;

    public function __construct()
    {
        parent::__construct();
        $this->data = array();    

        $calendarData = array(
            3  => 'Polska - Anglia'
        );

        $this->data['calendar'] = $this->calendar->generate('', '', $calendarData);
    }
}

You can then extend that BaseController class on all your controllers.

class Calendar extends BaseController {

    function index()
    {
        $this->load->view('main/calendar', $this->data);
    }
}

Be sure to always use $this->data to build on the protected member of your class.

Lastly, your BaseController will not be autoloaded, you probably don't want to include it everywhere. I suggest you to add the following method at the end of your autoload or config file.

/**
 * Extra autoload function. Loads core classes automatically.
 * @param type $class The class to load.
 */
function __autoload($class)
{
    if (strpos($class, 'CI_') !== 0)
    {
        if (file_exists($file = APPPATH . 'core/' . $class . EXT))
        {
            include $file;
        }
    }
}

This will allow you to autoload any classes you have in your application/core folder. This solution might seems complex, but once it's setup. You can add functionality to your BaseController that is applicable for all pages, for example, header and footer stuff.

Hope this helps!

Upvotes: -1

Abdul Haseeb
Abdul Haseeb

Reputation: 558

Instead of creating controller for calendar, create a library class and then add it to autoload configuration file

class MyCalendar{

public function get()
    {
        $CI =& get_instance(); 
        $data = array(
                3  => 'Polska - Anglia',
        );

        $CI->load->library('calendar');

        return $CI->calendar->generate('', '', $data);
    } 
}

Add this library to autoload file and then you can call it anywhere you want by using this statement.

$data['calendar'] = $this->MyCalendar->get();

Upvotes: 2

Related Questions