【问题标题】:Autoload controller in CodeIgniterCodeIgniter 中的自动加载控制器
【发布时间】:2012-11-08 20:05:37
【问题描述】:

我有问题要问你。 我尝试添加到我的页面日历和此日历中的一些事件。我知道如何在页面中加载日历,但我现在不知道如何在每个页面上自动加载此日历。

控制器:

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

class Calendar extends CI_Controller {

    function index()
    {
        $data = array(
                3  => 'Polska - Anglia',
        );

        $this->load->library('calendar');

        $vars['calendar'] = $this->calendar->generate('', '', $data);

        $this->load->view('main/calendar', $vars);
    }
}

我认为:

<?php echo $calendar;?>

我使用 CodeIgniter 2.1.3

【问题讨论】:

    标签: codeigniter autoload


    【解决方案1】:

    不用为日历创建控制器,而是创建一个库类,然后将其添加到自动加载配置文件中

    class MyCalendar{
    
    public function get()
        {
            $CI =& get_instance(); 
            $data = array(
                    3  => 'Polska - Anglia',
            );
    
            $CI->load->library('calendar');
    
            return $CI->calendar->generate('', '', $data);
        } 
    }
    

    将此库添加到自动加载文件中,然后您可以使用此语句在任何您想要的地方调用它。

    $data['calendar'] = $this->MyCalendar->get();
    

    【讨论】:

    • 我添加了这段代码,现在我有错误:Message: Undefined property: CI_Loader::$MyCalendar我打电话给:$data['calendar'] = $this-&gt;MyCalendar-&gt;get(); echo $calendar;
    • @marcin_poland 您必须使用小写版本。 $this-&gt;mycalendar-&gt;get(); 写的是right here under using your own class
    【解决方案2】:

    您可以通过更改 application/config/autoload.php 文件来自动加载您的库。

    查找:

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

    替换为:

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

    要在所有页面上加载相同的日历,我建议在application/core 文件夹中构建一个父控制器。

    abstract class BaseController extends CI_Controller
    {
        protected $data;
    
        public function __construct()
        {
            parent::__construct();
            $this->data = array();    
    
            $calendarData = array(
                3  => 'Polska - Anglia'
            );
    
            $this->data['calendar'] = $this->calendar->generate('', '', $calendarData);
        }
    }
    

    然后,您可以在所有控制器上扩展 BaseController 类。

    class Calendar extends BaseController {
    
        function index()
        {
            $this->load->view('main/calendar', $this->data);
        }
    }
    

    请务必始终使用 $this-&gt;data 来构建类的受保护成员。

    最后,您的BaseController 不会自动加载,您可能不想在任何地方都包含它。我建议您在自动加载或配置文件的末尾添加以下方法。

    /**
     * Extra autoload function. Loads core classes automatically.
     * @param type $class The class to load.
     */
    function __autoload($class)
    {
        if (strpos($class, 'CI_') !== 0)
        {
            if (file_exists($file = APPPATH . 'core/' . $class . EXT))
            {
                include $file;
            }
        }
    }
    

    这将允许您自动加载您在application/core 文件夹中的任何类。此解决方案可能看起来很复杂,但一旦设置完成。您可以向BaseController 添加适用于所有页面的功能,例如页眉和页脚内容。

    希望这会有所帮助!

    【讨论】:

    • 我试过了,但这不起作用。我有错误Message: Undefined variable: calendar
    • 您是否尝试在所有页面上输出日历(始终相同)?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-17
    • 2013-06-15
    • 2011-08-30
    • 1970-01-01
    • 1970-01-01
    • 2017-08-27
    • 1970-01-01
    相关资源
    最近更新 更多