如何在COdeigniter中的控制器的每个功能中自动加载一个功能

时间:2013-05-29 08:18:54

标签: codeigniter

我有一个示例脚本

<?php
class level_price extends CI_Controller {
   function __construct() {
        parent::__construct();
        session_start();
        $this->load->library('encrypt');
    }

    function index()
    {
         if(!isset($_SESSION['uname'])){
            redirect(base_url().'admin.php/login');
        }
        $data['users']=$this->db->query("SELECT count(*)AS user FROM user_table")->result_array();
        $data['pro_users']=$this->db->query("SELECT count(*)AS pro_user FROM user_table WHERE membership_type <>0")->result_array();
        $this->load->model('level_model');
        $data['level_list']=$this->level_model->get_all_level();
        $this->load->view('header',$data);
        $this->load->view('level_price');
        $this->load->view('footer');
    }


    function add_level()
      {
          if(!isset($_SESSION['uname']))
              {
                redirect(base_url().'admin.php/login');
              }
         $this->load->model('level_model');
         $data['users']=$this->db->query("SELECT count(*)AS user FROM user_table")->result_array();
         $data['pro_users']=$this->db->query("SELECT count(*)AS pro_user FROM user_table WHERE membership_type <>0")->result_array();
         if(count($_POST))
           {
              $data['msg']=$this->level_model->add_level();
           }
         $this->load->view('header',$data);
         $this->load->view('add_level',$data);
         $this->load->view('footer');
      }

      function edit_level($id){
           if(!isset($_SESSION['uname'])){
            redirect(base_url().'admin.php/login');
        }
            $this->load->model('level_model');
            $data['level_id'] = $id;
            $data['users']=$this->db->query("SELECT count(*)AS user FROM user_table")->result_array();
            $data['pro_users']=$this->db->query("SELECT count(*)AS pro_user FROM user_table WHERE membership_type <>0")->result_array();
            if(count($_POST))
             {
              $data['msg']=$this->level_model->edit_level($id);

             }
            $data['level_info'] = $this->level_model->get_level($id);
            $this->load->view('header',$data);
            $this->load->view('edit_level',$data);
            $this->load->view('footer');

      }
}

?>

你可以看到我总是在每个函数中都有这两行

$data['users']=$this->db->query("SELECT count(*)AS user FROM user_table")->result_array();
$data['pro_users']=$this->db->query("SELECT count(*)AS pro_user FROM user_table WHERE membership_type <>0")->result_array();

现在我想要一个替代品,以便自动将这两个函数称为

说一些我定义了一个返回数组的函数

当我刚写这个剧本时

echo pro_user(),然后显示pro_user数量

在application / admin / config / autoload.php

中说

我添加了这个脚本

$autoload['model'] = array('special_model');

special_model中的函数就像这样

function  pro_user()
        {
            $data['pro_users']=$this->db->query("SELECT count(*)AS pro_user FROM user_table WHERE membership_type <>0")->result_array();
            echo $data['pro_users']['pro_user'];
        }

在视图中,我希望像这样的东西想写这样的东西

<a data-rel="tooltip" title="" class="well span3 top-block" href="#">
                    <span class="icon32 icon-color icon-star-on"></span>
                    <div>Pro Members</div>
                    <div><?php $this->special_model->pro_user();?></div>
                    <span class="notification green">4</span>
                </a>

但是我收到了这样的错误

A PHP Error was encountered

Severity: Notice

Message: Undefined index: pro_user

Filename: models/special_model.php

Line Number: 12

3 个答案:

答案 0 :(得分:1)

你可以在ci_controller中定义它们,每个控制器都会扩展它,所以你也可以在每个控制器函数中使用它们

转到

system/core/codeigniter.php 

cahnge

class CI_Controller {

    private static $instance;

class CI_Controller {

    private static $instance;
        public $pro_users;
        public $any_thing ;

然后在同一页面的__construct()函数末尾

添加

$this->pro_users = $this->db->query("SELECT count(*)AS pro_user FROM user_table WHERE membership_type <>0")->result_array();

现在在每个控制器中都可以通过调用

来实现
$this->pro_users

答案 1 :(得分:0)

我认为最好的方法是编写一个codeigniter钩子并用该函数设置变量的值,然后将该变量传递给视图。在视图中调用模型函数会破坏MVC模式。

您可以使用post_controllerpost_controller_constructor,更多信息:

答案 2 :(得分:0)

我认为最好的解决方案是编写一个帮助程序并将其加载到自动加载中。

e.g

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

function alphabetArray() {
    $alph = array();
    for ($i=65; $i<=90; $i++) {
        array_push($alph, chr($i));
    }
    return $alph;
}

现在我可以调用的代码(来自视图的代码)

<?php
     echo "|";
     foreach (alphabetArray() as $alphabet) {
     echo '<a href="#"> '.$alphabet.' </a> |';
}
?>

正如您所看到的,alphabetArray()函数是“全局”函数,它可以在模型/视图/控制器中使用