简体   繁体   中英

How to set up CodeIgniter controllers for similar forms in different directories

I'm using CodeIgniter to access a variety of form types

I have a directory such as this:

-views
--resources
---app1
----form.php
---app2
----form.php
---app3
----form.php
---app4
----form.php

My class is currently very basic, but this

class Resources extends CI_Controller {

        public function app1($page = '')
        {
                $data['title'] = ucfirst($folder); // Capitalize the first letter

                $this->load->view('templates/header', $data);
                $this->load->view('resources/app1/form.php', $data);
                $this->load->view('templates/footer', $data);


        }

        public function app2($page = '')
        {
                $data['title'] = ucfirst($folder); // Capitalize the first letter

                $this->load->view('templates/header', $data);
                $this->load->view('resources/app2/form.php', $data);
                $this->load->view('templates/footer', $data);


        }

}

This seems very verbose and unnecessary to have a method for every form. However I can't find how I can change the directory without creating a new method. I would ideally like a method where I can pass in a new directory as an arg like $page can be. Eg:

class Resources extends CI_Controller {

        public function view($page = '')
        {
                $data['title'] = ucfirst($folder); // Capitalize the first letter

                $this->load->view('templates/header', $data);
                $this->load->view('resources/'. $folder. '/form.php', $data);
                $this->load->view('templates/footer', $data);


        }

}

However, it seems CodeIgniter doesn't allow this. Can anyone suggest a way in which this can work?

Calling your function "view" is almost certainly a bad idea... it's used by CI for the $this->load->view() for starters.

    public function app_form($page = '')
    {
        $data['title'] = ucfirst($folder); // Capitalize the first letter

        $this->load->view('templates/header', $data);
        $this->load->view('resources/'. $page. '/form.php', $data);
        $this->load->view('templates/footer', $data);

    }

That should work but how are you going to call the functions? Via the routes.php file?

Actually you can.

Create a base_controller inside your core folder and call it MY_Controller.php and make it extends CI_Controller and create a method inside MY_Controller and name it render, render_view, view whatever you want and inside that function load you layout partials and template and just pass the view to it: application/core/MY_Controller.php

class MY_Controller extends CI_Controller {

    protected $data = array();

    public function render_view($view = '')
    {
            $this->load->view('templates/header', $this->data);
            $this->load->view('view_path/'. $view, $this->data);
            $this->load->view('templates/footer', $this->data);
    }
}

and for every controller in your application make it extend MY_Controller and whenever you wanna render a view use render_view($view) and you got you header and footer preloaded, and that's the simplest way of making it DRY.

Finally in your controller it should be like this:

class Resources extends CI_Controller {

    public function app1($page = '')
    {
            // $data array in my_controller, it will automatically be passed inside render_view
            $this->data['title'] = ucfirst($folder); // Capitalize the first letter
            $this->render_view('app1/form');
    }

    public function app2($page = '')
    {
            $this->data['title'] = ucfirst($folder); // Capitalize the first letter
            $this->render_view('app2/form');
    }

}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM