CodeIgniter初始页面加载变量?

时间:2013-04-25 11:05:53

标签: php ajax codeigniter

我正在寻找仅在初始页面视图中加载页眉/页脚/导航的解决方案。

这背后的原因是我的导航面板使用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则不会。

然而,这并未涵盖所有可能性。

我想到的另一种方法是检查是否有引用网址,如果有,请不要加载标题/导航/页脚。但同样,这不包括如果链接被外部网站引用会怎么样?

有没有人对如何实现我的需求有任何建议?

3 个答案:

答案 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/1index/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类文档时遇到该函数的错误