1

我正在使用 CodeIgniter 创建一个网站,并且对最佳实践有疑问。

我通常将我的网页分成模块化的块。页眉,内容,页脚(以及其他一些根据需要洒在中间的东西。

“页眉”和“页脚”块通常是静态的,而中间的内容可能会根据一些变量而改变(例如实际页面 - 主页、关于、联系方式等)

下面是页面的控制器。header_view、navigation_view 和 footer_view(很可能)永远不会改变。home_main_view 将。

public function index()
{
    $this->load->view('header_view');
    $this->load->view('navigation_view');
    $this->load->view('home_main_view');
    $this->load->view('footer_view');

}

例如,如果用户导航到 about 页面,视图可能如下所示:

public function index()
{
    $this->load->view('header_view');
    $this->load->view('navigation_view');
    $this->load->view('about_view');
    $this->load->view('footer_view');

}

我将如何处理 CI 中的这种变化?最好将 home_main_view 设为变量并将其传递给 index() 函数吗?我以前做过这个(用户单击一个链接,该链接触发控制器中的一个函数,该函数设置调用 index($var) 的 $var 调用 view($var)。

4

3 回答 3

2

我最喜欢的方法是使用我用来加载其他组件的布局(它只是一个视图)。显然,您拥有的每种页面类型都需要一个布局,但是使用布局可以使以后的更改变得容易。

我更进一步,在我的自定义控制器MY_Controller中创建了一个用于加载布局的方法:

<?php
class MY_Controller extends CI_Controller{
    /**
     * Global $data variable holder
     * @var stdClass
     */
    protected $data;
    /**
     * The templates path, used by the 'render' method to determine the template to load
     * This is the 'root' of the templates folder for a specific section
     * Must NOT contain a trailing slash!
     * @var string
     */
    protected $templates_path = 'site';
    /**
     * The layout used by the 'render' method to load the specified view
     * @var string
     */
    protected $layout = 'default';
    /**
     * Class initialisation
     */
    function __construct() {
        parent::__construct();
        /*init the $data variable*/
        $this->data = new stdClass();
        /*the base url shortcut - to be used where needed*/
        $this->data->base_url = $this->config->item('base_url');
        /*page encoding header*/
        $this->output->set_header('Content-Type: text/html; charset=utf-8');
    }
    /**
     * Helper method that will load a view using the layout configured
     * @param type $view
     */
    protected function render($view = FALSE){
        $this->data->page_template = $this->templates_path.'/'.$view;
        $this->data->templates_path = $this->templates_path;
        $this->load->view($this->templates_path.'/layouts/'.$this->layout, $this->data);
    }
}

然后,在我的布局中,我将$page_template变量中指示的视图加载到适当的位置

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); ?>
<!DOCTYPE html>
<html>
    <head>
        <?$this->load->view($templates_path.'/sections/head')?>
    </head>
    <body class="<?=$page_class?>">
        <?$this->load->view($templates_path.'/sections/header')?>
        <?if(isset($hpslider) && $hpslider)
            $this->load->view($templates_path.'/sections/hp_slider')?>
        <div class="pcontent">
            <div class="page">
                <?=$this->load->view($page_template);?>
            </div>
        </div>
        <?$this->load->view($templates_path.'/sections/footer')?>
    </body>
</html>

希望这可以帮助你。

于 2012-09-18T11:43:36.390 回答
1

我不使用 CI,但您可以使用 $_post 、 $_get 或段来让操作知道您要加载哪个页面。

段示例:当您转到example.com/index.php/controller/index/home时 ,它​​将加载“home”视图。

public function index(){
$page=$this->uri->segment(3);
$this->load->view('header_view');
$this->load->view('navigation_view');
$this->load->view($page);
$this->load->view('footer_view');
}

http://codeigniter.com/user_guide/libraries/uri.html

于 2012-09-18T11:08:09.783 回答
0

请在题为CodeIgniter 中的页眉和页脚的 SO 线程中查看我的答案。这就是我处理所有观点的方式。这是一种相当模块化的方法 - 希望它有所帮助!

评论后更新

例如,主页可能会像这样加载:

class Home extends CI_Controller{
    function index(){
        $d['v'] = 'home';

        //do database interaction here and 
        //ultimately assign results to some key in $d too.

        $this->load->view('init', $d);
    }
}
于 2012-09-18T15:31:46.577 回答