我有一些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如何做到这一点。我应该为每个页面使用控制器还是每个页面都有一个功能的控制器?有谁知道一个类似的好教程?我见过的所有教程都会为每个页面重新加载整个网站。
编辑:基本上我想做this但是使用Codeigniter
答案 0 :(得分:4)
由于您看起来想要相对静态的内容,但是动态加载,您可以使用一个控制器和(可能)控制器中的一个方法。
要使用一种方法,请在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
部分,则需要在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");
}
现在您的网址看起来更好而无需路由,但您必须为每个网页加载页眉/页脚。
答案 1 :(得分: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>
锚标记中提供控制器中的方法名称
答案 2 :(得分:1)
你真的想将许多$ this-&gt; load-&gt; 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段调度动作,准备params等。
作为示例的页脚控制器(我使用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.tpl3)然后我们显示菜单
4)然后我们调用解析url的内容控制器,找到他应该在Page控制器中调用_show()函数并将action ='contactus'传递给它。 _show()函数可以包含一些开关/案例构造,它们显示模板取决于操作名称(在这种情况下为contactus.tpl)
5)最后我们展示了页脚模板
在这种情况下,我们有灵活的结构。所有控制器都应该有index()函数,所有可以在内容中调用的控制器都应该有_show($ act)函数。多数民众赞成。
答案 3 :(得分:0)
首先使用header.php,navbar.php等在一个文件夹中创建模板文件
示例:template.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);
}