我在不同的控制器上有相同的变量,如下所示:

控制器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);

控制器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);

这样,我总是必须将相同的代码复制并粘贴到其他控制器。 我这样做没有问题。 但是,我最大的问题是何时需要修改一个变量。 我必须重新复制-将相同的代码多次粘贴到其他控制器中。 如何解决此问题以最大程度地减少重复?

提前致谢 :)

#1楼 票数:2

我首先将要共享的任何数组放在core目录内的父控制器中:

//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()
        );
    }
}

然后Controller A(在常规controllers目录内)将从父级扩展

//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);
    }

}

并且控制器B(在常规controllers目录内)也将从父级扩展

//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);
    }

}

#2楼 票数:1 已采纳

您可以编写一个lib:

在应用程序/库中创建Tools.php(或任何您想要的文件)

<?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;
    }

}

然后在您的控制器中:

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

#3楼 票数:0

将代码放在扩展MY_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
    }
}

希望您可以将此概念应用于您的系统。

#4楼 票数:0

全部来自同一模型。 因此只需在该模型中创建一个方法,然后调用它即可。 这也将代码保留在同一位置,而不是分散在不同的位置。

控制者

// 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); } 

在m_user_group模型中,您可以执行以下操作:

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 ; 

}

但是这很糟糕,因为无论何时查询数据库,都应该进行错误检查 然后,您有一些选择-例如如果没有返回值则创建默认值

function returnCustomer(){

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

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

// etc etc 

或者如果每个数据库调用都必须工作,则在出现错误时返回false

function returnCustomer(){

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

  return false ; }

// etc etc 

  ask by Sony Elgadri translate from so

未解决问题?本站智能推荐:

1回复

CodeIgniter-是否关闭控制器功能调用?

我只是想加载控制器,而不是基于URI调用函数,因此我可以基于以下段生成页面。 如何更改默认行为来做到这一点? 例如。 example.com/class/function/ID >>> example.com/class/ID/ID 我以为我需要做的就是在confi
2回复

Codeigniter-名为index.php的控制器

一个菜鸟问题! 我正在尝试制作一个index.php控制器来查看我网站的主页。 但是,每当我尝试加载控制器时,都会出现以下错误: 遇到PHP错误 严重程度:注意 消息:未定义的属性:Index :: $ load 文件名:controllers / index.php 行
1回复

Codeigniter-从同一控制器的索引功能加载控制器功能

我想知道是否可以在不将new_admin开始添加到链接的情况下访问“ admin”控制器中的“ new_admin”功能。 我的控制器: 我的观点: 该代码段有效,但是我希望它在不更改url的情况下也能正常工作。 这可能吗? 现在,我首先访问的网址是:“ example.com
1回复

Codeigniter-路由到控制器(如果存在),如果不使用dafault

所以我设置了这样的路线: 例如, www.mysite.com/ something转到主控制器,在此我处理“ something” 。 对于产品,我以类似的方式处理。 但是,正如您之后看到的那样,我必须用我希望代替主控制器使用的方法写下所有其他控制器。 有没有办法让它自动检测控制器
2回复

Codeigniter-与多个控制器一起使用

我有一个关于控制器的问题。 让我们开始吧: 我有一个名为“ admin.php”的主控制器,它有一个用于公司,用户管理等的菜单。菜单上的每个项目都有单独的PHP文件来保存不同种类的数据[我似乎很冗长地将它们全部组合在一起PHP。 因此,对于此示例: 我有3个控制器:admin.p
1回复

codeigniter-在视图中检索控制器变量(使用$this)

在我的控制器中,我有一个我想在我的视图中使用的公共变量。 传统我会将变量作为数组传递给load->view("incl_header",$header)函数,但是我注意到在我的视图中我可以检索我的控制器的变量,如下所示: 在我的视图文件中检索这样的变量有什么问题吗? 我正在使用
1回复

Codeigniter/PHP在控制器中包含可重复使用的功能

我拥有不断在我的控制器中重复使用的此功能。 我决定将其移动到可以一直引用的文件中。 这是我的文件结构 我想引用其中包含的get_all_languages 到目前为止,我已经尝试将其包含在文件的顶部,例如: 但是,当我尝试使用$ this-> get_all_languag
2回复

php/codeigniter-使用while链接两个功能

我的应用程序中有一些关注/取消关注和阻止/取消阻止功能。 它们工作正常,正确的数据正在填充我的数据库。 这是我的逻辑概述: 一个问题:对于这两种情况,我需要链接关注/取消关注和阻止/取消阻止功能: 1-如果用户正在关注某人,然后单击“阻止”按钮,则该用户应被阻止并取消关注(目前,该用