16

我有一个变量,包含应该存在于整个站点中的数据。我没有将这些数据传递给每个控制器的每个视图,而是想知道是否有一种方法可以使这些数据可用于站点中的每个视图。

钯。将此数据存储为会话变量/ci 会话 cookie 不是一种选择。

非常感谢。

4

8 回答 8

24

创建一个MY_Controller.php文件并将其保存在 application/core 文件夹中。在其中,类似:

class MY_Controller extends CI_Controller {

   public $site_data;

   function __construct() {
       parent::__construct();
       $this->site_data = array('key' => 'value');
   }
}

在整个控制器中,视图$this->site_data现在都可用。请注意,要使其正常工作,所有其他控制器都需要扩展MY_Controller而不是CI_Controller.

于 2013-04-23T14:07:06.747 回答
16

您需要扩展 CI_Controller 以创建基本控制器:

https://www.codeigniter.com/user_guide/general/core_classes.html

核心/MY_Controller.php

<?php

class MY_Controller extend CI_Controller {

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

         //get your data
         $global_data = array('some_var'=>'some_data');

         //Send the data into the current view
         //http://ellislab.com/codeigniter/user-guide/libraries/loader.html
         $this->load->vars($global_data);

     }  
}

控制器/welcome.php

 class Welcome extend MY_Controller {
      public function index() {
          $this->load->view('welcome');
      }
 }

意见/welcome.php

var_dump($some_var);

注意:要在您的函数或控制器中获取此变量,您可以使用$this->load->get_var('some_var')

于 2013-04-23T14:14:08.190 回答
6

application/config/autoload.php中设置

$autoload['libraries'] = array('config_loader');

创建应用程序/库/Config_loader.php

defined('BASEPATH') OR exit('No direct script access allowed.');

class Config_loader
{
    protected $CI;

    public function __construct()
    {
        $this->CI =& get_instance(); //read manual: create libraries

        $dataX = array(); // set here all your vars to views

        $dataX['titlePage'] = 'my app title';
        $dataX['urlAssets'] = base_url().'assets/';
        $dataX['urlBootstrap'] = $dataX['urlAssets'].'bootstrap-3.3.5-dist/';

        $this->CI->load->vars($dataX);
    }
}

对你的看法

<title><?php echo $titlePage; ?></title>
<!-- Bootstrap core CSS -->
<link href="<?php echo $urlBootstrap; ?>css/bootstrap.min.css" rel="stylesheet">
<!-- Bootstrap theme -->
<link href="<?php echo $urlBootstrap; ?>css/bootstrap-theme.min.css" rel="stylesheet">
于 2015-08-20T22:17:59.243 回答
1

如果这不是变量(值不断变化),那么我建议在应用程序目录的 config 目录下的 constant.php 文件中创建一个常量,如果它是一个不断变化的变量,那么我建议在应用程序文件夹下的核心文件夹(如果不存在,请继续创建文件夹“核心”)。需要对此处提到的其他控制器进行一些更改:使用“CI_Controller”类扩展您的新控制器。例子

open-php-tag if ( !defined('BASEPATH')) exit('不允许直接脚本访问'); 类 LD_Controller 扩展 CI_Controller { } close-php-tag

这里LD_是我的自定义关键字,如果要更改,可以在 config.php 文件中的第 112 行下更改它,如下所示: $config['subclass_prefix'] = 'LD_'; 并在所有控制器中将此类扩展为“class Mynewclass extends LD_Controller.. 在 LD_controller 中,您必须编写要定义变量/值数组的方法,并在整个应用程序中调用该数组,如下所示: 定义变量 : var $data = array(); 通过 Model 类从 db 获取值的方法:

function getbooks()
{
   $books =   $this->mybooks_model->getbooks(); //array of records
   $this->data = array('books'=>$books);
}

在视图中调用此变量: print_r($this->data['books']);); 你会得到所有的数组值......在这里我们必须确保至少需要传递一个“$data”参数,如果没有问题,你可以将这个 $data 参数定义到视图中,如下所示:$this->加载->查看('我的书店',$数据);

然后它工作得非常好,,,喜欢分享......有一个有趣的工作朋友

于 2014-08-16T13:28:07.837 回答
0

您可以使用 $this->load->vars('varname', $data);[ or load data at 1st view only] onse 并在此之后的任何加载视图中使用

于 2013-04-23T14:27:14.980 回答
0

在控制器中使用会话

$this->session->set_userdata('data');

然后将它们显示在您的视图中

$this->session->userdata('data');

或者在基本视图文件中包含一个页面,例如 index.php

include "page.php";

然后在 page.php 中,

添加$this->session->userdata('data');到任何元素或 div

然后这将显示在您的所有视图中

于 2015-03-18T18:47:16.073 回答
0

您可以使用 MY_loader 覆盖视图加载器。我在遗留系统上使用它来将 csrf 令牌添加到页面中,其中视图中的某些表单不使用内置表单生成器。这样,您不必追溯更改所有控制器以从 CI_Controller 调用 MY_Controller。

将以下内容另存为 application/core/MY_Loader.php

<?php
class MY_Loader extends CI_Loader {
    /**
     * View Loader
     *
     * Overides the core view function to add csrf token hash into every page.
     *
     * @author   Tony Dunlop
     *
     * @param   string  $view   View name
     * @param   array   $vars   An associative array of data
     *              to be extracted for use in the view
     * @param   bool    $return Whether to return the view output
     *              or leave it to the Output class
     * @return  object|string
     */
    public function view($view, $vars = array(), $return = FALSE)
    {
        $CI =& get_instance();
        $vars['csrf_token'] = $CI->security->get_csrf_hash();
        return $this->_ci_load(array('_ci_view' => $view, '_ci_vars' => $this->_ci_prepare_view_vars($vars), '_ci_return' => $return));
    }
}
于 2018-11-15T16:04:50.010 回答
0

我阅读了所有答案,但恕我直言,最好的方法是通过钩子:

  1. 创建钩子,让我们获取新消息,例如:

    class NewMessages {
        public function contact()
        {
            // Get CI instance CI_Base::get_instance();
            $CI = &get_instance(); // <-- this is contoller in the matter of fact
            $CI->load->database();
    
            // Is there new messages?
            $CI->db->where(array('new' => 1));
            $r = $CI->db->count_all_results('utf_contact_requests');
    
            $CI->load->vars(array('new_message' => $r));
        }
    }
    
  2. 将其附加到某些流点,例如“post_controller_constructor”。这样,每次实例化任何控制器时都会加载它。

    $hook['post_controller_constructor'][] = array(
        'class'    => 'NewMessages',
        'function' => 'contact',
        'filename' => 'NewMessages.php',
        'filepath' => 'hooks',
        'params'   => array(),
    );
    
  3. 现在,我们可以在每个视图或模板中访问我们的变量 $new_message。

就这么简单:)

于 2018-06-23T16:32:09.957 回答