我正在寻找仅在初始页面视图中加载页眉/页脚/导航的解决方案。
这背后的原因是我的导航面板使用Ajax在主内容div中呈现目标链接的内容,而不是实际加载页面本身。
然而,我需要能够说出一些内容,如果它是初始视图,加载标题,导航,然后是实际页面,然后是页脚。但如果它不是初始视图并且页面加载在内容div区域中,例如导航链接或表单提交,则它不会加载页眉,导航和页脚,而只加载实际页面。
例如,我有这4个观点:
header_view navigation_view page_a_view footer_view
这个控制器:
controller_a
导航的链接为“Page A”并指向http://myurl.com/controller_a。如果单击该链接,我只希望controller_a加载page_a_view视图,因为导航链接会将该页面的数据加载到div中。
但是,如果我直接转到http://myurl.com/controller_a,它还需要呈现标题/导航/页脚。
我认为我在正确的界限上的解决方案就像一个带有函数load_page()的基本控制器,类似于:
function load_page($page, $data) {
if($this->uri->segment($this->uri->total_segments()) == "initial_page_load") {
$this->load->view('header_view');
$this->load->view('navigation_view');
$this->load->view($page, $data);
$this->load->view('footer_view');
} else {
$this->load->view($page, $data);
}
}
因此,如果我要转到http://myurl.com/controller_a/initial_page_load,它会加载标题/导航/页脚,但如果我转到http://myurl.com/controller_a则不会。
然而,这并未涵盖所有可能性。
我想到的另一种方法是检查是否有引用网址,如果有,请不要加载标题/导航/页脚。但同样,这不包括如果链接被外部网站引用会怎么样?
有没有人对如何实现我的需求有任何建议?
答案 0 :(得分:1)
让它成为所有视图的视图页面。对于其他页面,您将通过ajax动态更改div,'page_content'上的内容。
**application/views/your_template_view.php**
<?php
$this->load->view('header_view');
$this->load->view('navigation_view');
?>
<a href="javascript:void(0)" id='home' class='my_links'>Home</a>
<a href="javascript:void(0)" id='about_us' class='my_links'>About us</a>
<!--
Make sure the id of the page is same as
the file name of view page for respective pages
-->
<div id='page_content'><?php echo $page_content; ?></div>
<?php
$this->load->view('footer_view');
?>
<script lang='javascript'>
$('.my_links').click(function(){
$.post(
'<?php echo site_url('test_controller/get_page_content') ?>',
{'page_content':$(this).attr('id')},
function(response){
if(response != '')
$('#page_content').text(response);
},'json'
);
});
</script>
让这成为你的控制者:
**application/controller/test_controller.php**
function your_page($param1 = '', $param2 ='') {
/*this one is for your initial page*/
if($param1)
// send mail
if($param2)
// send mail
$data['page_content'] = $this->load->view('initial_page_load');
$this->load->view('your_template_view', $data);
}
function get_page_content()
{
/*this one is for other pages, this provides page content
for the request made from ajax*/
$page_title = $this->input->post('page_title');
$page_content = $this->load->view($page_title);
echo json_encode($page_content);
}
答案 1 :(得分:0)
创建会话变量以表示页眉/页脚是否已加载,如果是,则跳过它们
if (!$this->session->userdata('nav_loaded')) {
$this->load->view('header_view');
}
等...
这将适用于您的所有页面,无论它们在何处被调用,只要所有的初始调用都由AJAX完成。
修改
如果你想在那之后混合ajax和非ajax调用,那么会话varable当然不会工作。也许您可以在网址中添加ajax参数并根据该参数调整控制器。
public function index($ajax = false) {
...
if (!ajax) {
$this->load->view('header_view');
}
etc...
}
因此,所有AJAX调用都会将url中的附加参数设置为true(几乎除零之外的任何内容:index/1
,index/ajax
等。)
答案 2 :(得分:0)
虽然我还在测试它,但它似乎完全符合我的期望!这是其中一个很简单但完成工作的人,所以希望没有问题弹出......
在MY_Controller.php中
function load_page($page, $data) {
if(!$this->input->is_ajax_request()) {
$this->load->view('header_view');
$this->load->view('navigation_view');
}
$this->load->view($page, $data);
if(!$this->input->is_ajax_request()) {
$this->load->view('footer_view');
}
}
管理在查看Input类文档时遇到该函数的错误