-1

最初のページ ビューでのみヘッダー/フッター/ナビゲーションを読み込むソリューションを探しています。

この背後にある理由は、ナビゲーション パネルが Ajax を使用して、実際にページ自体を読み込むのではなく、メイン コンテンツ div のリンク先リンクのコンテンツをレンダリングするためです。

ただし、最初のビューの場合は、ヘッダー、ナビゲーション、実際のページ、フッターをロードするという行に沿って何かを言うことができる必要があります。ただし、最初のビューではなく、ページがコンテンツ div 領域に読み込まれている場合 (ナビゲーション リンクやフォーム送信など)、ヘッダー、ナビゲーション、フッターは読み込まれず、実際のページのみが読み込まれます。

たとえば、次の 4 つのビューがあります。

header_view navigation_view page_a_view footer_view

そして、このコントローラー:

コントローラ_a

ナビゲーションには、「ページ A」であり、 http://myurl.com/controller_aを指すリンクがあります。そのリンクがクリックされた場合、ナビゲーション リンクがそのページのデータを div にロードするため、controller_a が page_a_view ビューをロードすることだけが必要でした。

ただし、 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 があるかどうかを確認することです。ある場合は、ヘッダー/ナビゲーション/フッターを読み込まないでください。しかし、繰り返しになりますが、リンクが外部の Web サイトから参照された場合はどうなるでしょうか。

必要なものを達成する方法について何か提案はありますか?

4

3 に答える 3

1

これをすべてのビューのビュー ページにします。他のページでは、div のコンテンツ 'page_content' を ajax を介して動的に変更します。

**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);
}
于 2013-04-25T11:28:18.137 に答える
0

ヘッダー/フッターがロードされているかどうかを示すセッション変数を作成し、ロードされている場合はスキップします

if (!$this->session->userdata('nav_loaded')) {
    $this->load->view('header_view');
}

等...

これは、すべての最初の呼び出しが AJAX によって行われている限り、どこから呼び出されたとしても、すべてのページで機能します。

編集

その後、ajax 呼び出しと非 ajax 呼び出しを混在させたい場合は、もちろん、セッション変数は機能しません。おそらく、URL に ajax パラメーターを入れて、それに応じてコントローラーを調整することができます。

public function index($ajax = false) {
...
    if (!ajax) {
        $this->load->view('header_view');
    }
    etc...
}

そのため、すべての AJAX 呼び出しで、url の追加パラメーターが true に設定されます (ゼロ以外のほぼすべて: index/1index/ajaxなど)。

于 2013-04-25T11:54:51.190 に答える