0

I have the same variables on different controllers that are sent to my view like this:

Controller A

$data['priv_information'] = $this->m_user_group->get_priv_information();
$data['priv_customer'] = $this->m_user_group->get_priv_customer();
$data['priv_new_model'] = $this->m_user_group->get_priv_new_model();
$data['priv_price'] = $this->m_user_group->get_priv_price();
$data['priv_masspro'] = $this->m_user_group->get_priv_masspro();
$data['priv_product'] = $this->m_user_group->get_priv_product();
$data['priv_calendar'] = $this->m_user_group->get_priv_calendar();
$data['priv_maintenance'] = $this->m_user_group->get_priv_maintenance();
$this->load->view($this->template, $data);

Controller B

$data['priv_information'] = $this->m_user_group->get_priv_information();
$data['priv_customer'] = $this->m_user_group->get_priv_customer();
$data['priv_new_model'] = $this->m_user_group->get_priv_new_model();
$data['priv_price'] = $this->m_user_group->get_priv_price();
$data['priv_masspro'] = $this->m_user_group->get_priv_masspro();
$data['priv_product'] = $this->m_user_group->get_priv_product();
$data['priv_calendar'] = $this->m_user_group->get_priv_calendar();
$data['priv_maintenance'] = $this->m_user_group->get_priv_maintenance();
$this->load->view($this->template, $data);

Doing it this way, I always have to copy and paste the same code to other controllers. I have no problem doing this. However, my big problem is when I need to modify one variable. I have to re-copy - and paste the same code in others controller multiple times. How do I solve this problem to minimize repetition?.

thanks in advance :)

2
  • Create a function that will take two arguments - reference to $data array(it must be reference!) and the second one that will be object which "$this->m_user_group" returns. Place this function in some helper class. It may be static. Commented Mar 31, 2015 at 13:04
  • make a parent class controller, have a common setup method for your data and have both A and B extend that parent? Commented Mar 31, 2015 at 13:06

4 Answers 4

2

I would first place whatever array you want to share in a parent controller inside your core directory:

//located in application/core/MY_Parent_Controller.php

class MY_Parent_Controller extends CI_Controller {

    public $shared_data;

    function __construct() {
        parent::__construct();
        $this->shared_data = array(
            'priv_information' => $this->m_user_group->get_priv_information(),
            'priv_customer' => $this->m_user_group->get_priv_customer(),
            'priv_new_model' => $this->m_user_group->get_priv_new_model(),
            'priv_price' => $this->m_user_group->get_priv_price(),
            'priv_masspro' => $this->m_user_group->get_priv_masspro(),
            'priv_product' => $this->m_user_group->get_priv_product(),
            'priv_calendar' => $this->m_user_group->get_priv_calendar(),
            'priv_maintenance' => $this->m_user_group->get_priv_maintenance()
        );
    }
}

Then Controller A (inside your regular controllers directory) would extend from the parent

//located in application/controllers/ContollerA.php

class ContollerA extends MY_Parent_Controller{

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

    function other(){
        $this->shared_data['priv_information'] = 'other info here';
        $this->load->view($this->template, $this->shared_data);
    }

    function another(){
        $this->shared_data['priv_new_model'] = 'other info here';
        $this->load->view($this->template, $this->shared_data);
    }

}

And Controller B (inside your regular controllers directory) would extend from the parent as well

//located in application/controllers/ContollerB.php

class ContollerB extends MY_Parent_Controller{

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

    function other(){
        $this->shared_data['priv_information'] = 'other info here';
        $this->load->view($this->template, $this->shared_data);
    }

    function another(){
        $this->shared_data['priv_new_model'] = 'other info here';
        $this->load->view($this->template, $this->shared_data);
    }

}
Sign up to request clarification or add additional context in comments.

Comments

1

You can write a lib :

In application/libraries create Tools.php (or whatever you want)

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

class Tools
{
  protected $ci;

    public function __construct()
    {
        $this->ci =& get_instance(); 
    }

    public function buildData()
    {
       $this->ci->load->model('m_user');
       $data['priv_information'] = $this->ci->m_user_group->get_priv_information(); 
       $data['priv_customer'] = $this->ci->m_user_group->get_priv_customer();   
       $data['priv_new_model'] = $this->ci->m_user_group->get_priv_new_model();  
       $data['priv_price'] = $this->ci->m_user_group->get_priv_price();    
       $data['priv_masspro'] = $this->ci->m_user_group->get_priv_masspro();    
       $data['priv_product'] = $this->ci->m_user_group->get_priv_product();
       $data['priv_calendar'] = $this->ci->m_user_group->get_priv_calendar();
       $data['priv_maintenance'] = $this->ci->m_user_group->get_priv_maintenance();

       return $data;
    }

}

And then in your controllers :

 $this->load->library("tools");
 $data = $this->tools->buildData();
 $this->load->view($this->template, $data);

Comments

0

Place the code in a class that extends MY_Controller and overloads the methods that you need. Be sure to call the parent's function in your controller.

application/core/MY_Child_class.php

class MY_Child_class extends MY_Controller {

    public function index() {
        // your code here
    }
}

application/controllers/your_controller.php

class Your_controller extends MY_Child_class {
    public function index() {
        parent::index();
        // controller specific code here
    }
}

Hopefully you can apply this concept to you system.

Comments

0

its all from the same model. so just make a method in that model and then call it. this also keeps the code in the same place instead of spread out in different places.

controller

// get the data, if there is an error show appropriate view
if( ! $data = $this->m_user_group->returnCustomer() ){

    $this->showError() ; }

else { $this->load->view($this->template, $data); } 

in m_user_group model you could just do this:

function returnCustomer(){

$data['priv_information'] = $this->get_priv_information();
$data['priv_customer'] = $this->get_priv_customer();
$data['priv_new_model'] = $this->get_priv_new_model();
$data['priv_price'] = $this->get_priv_price();
$data['priv_masspro'] = $this->get_priv_masspro();
$data['priv_product'] = $this->get_priv_product();
$data['priv_calendar'] = $this->get_priv_calendar();
$data['priv_maintenance'] = $this->get_priv_maintenance();

return $data ; 

}

however that is bad because whenever you are querying a database there should be error checking. you then have a few choices - like create a default if no value comes back

function returnCustomer(){

if( ! $data['priv_information'] = $this->get_priv_information() ){

$data['priv_information'] = 'some default value' ; }

// etc etc 

or if every db call has to work then return false if there is an error

function returnCustomer(){

if( ! $data['priv_information'] = $this->get_priv_information() ){

  return false ; }

// etc etc 

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.