AndreaNobili
AndreaNobili

Reputation: 42957

How exactly works this CodeIgniter controller class?

I am a Java developer (I often used Spring MVC to develop MVC web app in Java) with a very litle knowledge of PHP and I have to work on a PHP project that use CodeIgniter 2.1.3.

So I have some doubts about how controller works in CodeIgniter.

1) In Spring MVC I have a controller class with some annoted method, each method handle a specific HTTP Request (the annotation defines the URL handled by the method) and return the name of the view that have to be shown.

Reading the official documentation of CodeIgniter it seems me that the logic of this framework is pretty different: https://www.codeigniter.com/userguide3/general/controllers.html#what-is-a-controller

So it seems to understand that in CodeIgniter is a class that handle a single URL of the application having the same name of the class name. Is it correct?

So I have this class:

class garanzieValoreFlex extends CI_Controller {

    ..................................................... 
    ..................................................... 
    ..................................................... 

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

        $this->load->helper(array('form', 'url'));
        $this->load->library(array('form_validation','session'));
    }


    public function reset() {

       $this->session->unset_userdata("datiPreventivo");
       $this->load->view('garanziavalore/garanzie_valore_questionario_bootstrap',array());

   }


   public function index() {

        $this->load->model('Direct');
        $flagDeroga = "true" ;

        $this->session->userdata("flagDeroga");

        $data = $this->session->userdata("datiPreventivo");
        $this->load->model('GaranzieValoreFlexModel');

        $data = $this->session->userdata("datiPreventivo");
        $this->load->model('GaranzieValoreFlexModel');

        $this->load->view('garanziavalore/index_bootstrap',$data);
    }

    public function back() {

        $this->load->model('Direct');
        $flagDeroga = "true" ;

        $this->session->userdata("flagDeroga");
            $data = $this->session->userdata("datiPreventivo");
            $this->load->model('GaranzieValoreFlexModel');
            //$this->load->view('garanziavalore/garanzie_valore_questionario_bootstrap',$data);
            $this->load->view('garanziavalore/index_tornaIndietro_bootstrap',$data);

    }


    ..................................................... 
    ..................................................... 
    ..................................................... 

}

So, from what I have understand, basically this controller handle only the HTTP Request toward the URL: http://MYURL/garanzieValoreFlex.

So from what I have understand the method performed when I access to the previous URL is the index() that by this line:

$this->load->view('garanziavalore/index_bootstrap',$data);

show the garanziavalore/index_bootstrap.php page that I found into the views directory of my prohect (is it a standard that have to be into the views directory?)

Is it my reasoning correct?

If yes I am loading the view passing to id also the $data variable that I think is the model containing the data that can be shown in the page, this variable is retrieved by:

$data = $this->session->userdata("datiPreventivo");

What exactly does this line?

The last doubt is related the other back() method that I have found in the previous controller: is it a method of CodeIgniter CI_Controller class or something totally custom defined by the developer that work on this application before me?

Upvotes: 0

Views: 620

Answers (2)

DFriend
DFriend

Reputation: 8964

A controller can handle more than one URL and the class garanzieValoreFlex is an example of such a class.

The URL http://MYURL/garanzieValoreFlex will call the index method.

The URLs http://MYURL/garanzieValoreFlex/back and http://MYURL/garanzieValoreFlex/reset will call the back() and reset() methods of the class respectively. These two function are custom additions to the extended class CI_Controller.

Codeigniter (CI) URLs follow the pattern example.com/class/function/argument/ The function and argument segments are optional.

When a URL uses only a class name such as example.com/class then CI will look for and call the index() method if it exists. If index() does not exist you will get 404 Page Not Found display.

Your reasoning about $this->load->view('garanziavalore/index_bootstrap',$data); is correct. It is standard to put such files in the views directory. Optionally, subdirectories of views can be used as in /views/garanziavalore/.

CI uses a file structure that associates different classes (libraries) with certain paths. Controllers, Models and View classes are stored in their respective folders. Then the loader class will know exactly where to start looking for any given "type" of class. For instance, the call to $this->load->view('garanziavalore/index_bootstrap',$data); tells the loader class to get the file index_boostrap.php from the /application/views/garanzivalore/ directory. The code $this->load->model('GaranzieValoreFlexModel'); tells the loader to use the file GaranzieValoreFlexModel.php in /application/models/.

Find documentation of the loader class here.

The line of code

$data = $this->session->userdata("datiPreventivo");

is calling the userdata method of the session class (library). Think of session data as an array. If the array was defined this way. (This is only pseudo-code for what is accomplished).

$userdata = array(); //empty array structure

The call $this->session->userdata("datiPreventivo") is in effect returning the value of $userdata["datiPreventivo"].

Upvotes: 1

JobSam
JobSam

Reputation: 317

Your reasoning is wrong. I would really recommend you to read the official codeigniter tutorials so that you may understand how the MVC works: Below are the links

Codeigniter 2: http://www.codeigniter.com/userguide2/

Codeigniter 3: http://www.codeigniter.com/user_guide/

CI controllers handles different urls. If you create a function called index in a controller, it will be loaded automatically when the controller is accessed. For your case, http://MYURL/garanzieValoreFlex should access the function. To access any other function, you will need to http://MYURL/garanzieValoreFlex/**MyFunction** (Read more http://www.codeigniter.com/user_guide/general/urls.html?highlight=url#codeigniter-urls) The back function is a user defined function.

Upvotes: 1

Related Questions