2

我有一些 php 经验,但我最近才开始学习 Codeigniter。我曾经有一个带有固定导航窗格和侧边栏的网站,但网站的主要部分是根据 Get 变量动态加载的。基本上是

include head.php
include navbar.php
include sidebar.php
include the page requested from the get variable (home, about, contact, etc.)
include footer.php

我喜欢这个,因为当用户从一个页面导航到另一个页面时,整个站点不必重新加载。

我无法弄清楚如何使用 Codeiginiter 做到这一点。我应该为每个页面使用一个控制器还是为每个页面使用一个具有功能的控制器?有谁知道做类似事情的好教程?我见过的所有教程都会为每个页面重新加载整个站点。

编辑:本质上我想这样做但使用 Codeigniter

4

4 回答 4

3

由于看起来您想要相对静态的内容,但动态加载,您可以使用一个控制器和(也许)控制器中的一种方法。

要使用一种方法执行此操作,请在welcome控制器中执行此操作:

public page( $page_id ){
    // views/header.php
    $this->load->view( "header" );


    if( $page_id = "about" ){
      $this->load->view("about");     // views/about.php
    }

    else if( $page_id = "contact" ){
      $this->load->view("contact");  // views/contact.php
    }

    // views/footer.php
    $this->load->view("footer");
}

这需要一个 get 变量,并确定在页眉和页脚之间加载哪个页面。

这种方式www.yoursite.com/page/about将加载关于页面,www.yoursite.com/page/contact将加载contact页面

现在,如果你想摆脱这/page部分,你需要做一些 URL 重新路由application/config/routes.php

或者,您可以在一个控制器中使用多种方法:

public about(  ){
    // views/header.php
    $this->load->view( "header" );

    $this->load->view( "about" );

    // views/footer.php
    $this->load->view("footer");
}


public contact(  ){
    // views/header.php
    $this->load->view( "header" );

    $this->load->view( "contact" );

    // views/footer.php
    $this->load->view("footer");
}

现在您的 URL 在没有路由的情况下看起来更好,但是您必须为每个页面加载页眉/页脚。

于 2013-06-21T04:49:31.843 回答
1

在 codeIgniter 中,您可以这样做,您可以同时从控制器加载不同的视图。例如:

例如,在您的导航栏视图中,您的菜单中有一个联系人按钮,如下所示:

<a href='contacts'>Contacts</a>

在您的控制器中:

public function contacts()
{
    $this->load->view('header');
    $this->load->view('navbar');
    $this->load->view('sidebar');
    $this->load->view('contacts_view');
    $this->load->view('footer');
}

所以我们在这里假设您已经准备好加载以下视图(header.php、navbar.php、sidebar.php、contacts_view.php、footer.php)。

更新:您不需要请求,只需在锚标记$_GET[]中提供控制器中的方法名称<a>

于 2013-06-21T04:39:39.770 回答
1

你真的喜欢将许多 $this->load->view() 复制/粘贴到任何控制器功能吗?这是一个意大利面条代码。您可以尝试下一个:例如,我们将 main.php 控制器作为默认控制器。该主控制器包含主要功能:

public function index()
    {
        ob_start();
        $this->load->model('mainmodel');  
        $data = $this->mainmodel->_build_blocks(); //return array with needed blocks (header, menu, content, footer) in correct order
        foreach ($data->result_array() as $row) {
            $this->load->module($row['block_name']);
            $this->name = new $row['block_name'];
            $this->name->index();
        }            
        ob_end_flush();
    } 

因此,每个其他控制器也具有 index() 函数,可以根据 url 段、准备参数等调度动作。

以页脚控制器为例(我使用 Smarty 作为模板引擎):

public function index()
    { 
               $this->mysmarty->assign('year', date("Y"));
               $this->mysmarty->view('footer');
               return true;
    }

内容控制器将具有:

public function index()
    {
        $name = $this->uri->segment(1, 'index');
        $act = $this->uri->segment(2, 'index');
        $this->load->module($name);
        $this->name = new $name;
        $pageData = $this->name->_show($act);
        if ($pageData)
        {
            $this->mysmarty->assign($name, $pageData);
        }
        $this->mysmarty->view($name);
    }

这意味着如果你想显示http://site.name/page/contactus,我们接下来会做:

1) main.php 按需要的块启动循环

2)首先我们通过标题控制器显示 header.tpl

3)然后我们显示菜单

4)然后我们调用解析url的内容控制器,在页面控制器中找到他应该调用的_show()函数并将action ='contactus'传递给它。_show() 函数可以包含一些 switch/case 构造,这些构造显示模板取决于操作名称(在这种情况下为contactus.tpl)

5)最后我们显示页脚模板

在这种情况下,我们有灵活的结构。所有控制器都应该有 index() 函数,所有可以在内容中调用的控制器都应该有 _show($act) 函数。就这样。

于 2013-06-21T09:21:38.050 回答
0

在codeigniter中我使用模板

首先使用 header.php、navbar.php 等在一个文件夹中制作模板文件。

示例:模板.php

<?php 
 echo $this->load->view('header'); //load header
 echo $this->load->view('navbar');//load navbar
 echo $this->load->view('sidebar');//load sidebar
 echo $this->load->view($body); //load dynamic content
 echo $this->load->view('footer');//load footer
?> 

控制器中的第二个

function index(  ){
$data['body'] = 'home'; // cal your content
$this->load->view('template', $data);
}
于 2013-06-22T06:02:56.503 回答