2013-04-25 137 views
-1

我正在尋找一個解決方案,只在初始頁面視圖中加載頁眉/頁腳/導航。CodeIgniter初始頁面加載變量?

背後的原因是我的導航面板使用Ajax在主內容div中呈現目標鏈接的內容,而不是實際加載頁面本身。

但是,我需要能夠說的東西,如果它的初始視圖,加載標題,導航,然後實際頁面,然後頁腳。但是,如果它不是初始視圖並且頁面被加載到內容div區域中,例如導航鏈接或表單提交,它不會加載標題,導航和頁腳,而只會加載實際頁面。

所以,比如我有這4個觀點:

header_view navigation_view page_a_view footer_view

而這個控制器:

controller_a

導航有一個環節是「頁面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它不會。

但是,這並不包括所有的可能性。

我想到的另一種方法是檢查是否存在引用URL,如果有,請不要加載標題/導航/頁腳。但是,這又不包括如果鏈接被外部網站引用會怎樣?

有沒有人有任何建議,我如何能夠實現我所需要的?

+0

對downvote的推理不太確定... – Ryan 2013-05-02 15:33:48

回答

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'); 
    } 
} 

管理的輸入類文檔中觀察時跨功能絆倒

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); 
} 
+0

我明白你的意思,但是我不能只有一個初始頁面,原因是發送的電子郵件包含諸如http: //www.myurl.com/controller_a/method_1/param_a/param_b – Ryan 2013-04-25 12:15:42

+0

這可以在第一種方法完成,看到更新的答案。 .. – hsuk 2013-04-26 04:00:21

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調用將有設置爲true的URL,額外的參數(幾乎任何東西,除了零:index/1index/ajax等)。

+0

你會在哪裏建議刪除會話?就像我最初加載頁面一樣,它創建了會話,所以我通過導航鏈接訪問的內容頁面不會加載導航鏈接 - 如果我直接進入內容頁面,會話將存在,我將留下沒有標題/導航/頁腳的頁面 – Ryan 2013-04-25 12:18:31

+0

永遠不要刪除它 - 缺點是你必須通過ajax加載頁面...如果你想混合使用ajax和不使用ajax,也許你可以把ajax參數放入根據你的網址並調整控制器。 – Shomz 2013-04-25 12:26:21

+0

這是我認爲會解決我的問題的路線,但是它是在URL中擁有該參數的地方。如果我只是將它作爲URL中的最後一個參數,並且我沒有在控制器中指定方法(例如myurl.com/controller1/ajax_true),那麼它會查找ajax_true方法。 – Ryan 2013-04-25 13:05:37