2

私はPHPの経験がありますが、最近Codeigniterを学び始めました。以前はナビゲーション ペインとサイドバーが固定された Web サイトを持っていましたが、サイトのメイン セクションは 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 でこれを行う方法がわかりません。各ページにコントローラーを使用する必要がありますか、それとも各ページに機能を備えた 1 つのコントローラーを使用する必要がありますか? 似たようなことをする良いチュートリアルを知っている人はいますか? 私が見たすべてのチュートリアルは、ページごとにサイト全体をリロードします。

編集:基本的にこれをやりたいのですが、Codeigniterを使用します

4

4 に答える 4

3

比較的静的なコンテンツが必要なように見えますが、動的にロードされるため、1 つのコントローラーと (おそらく) コントローラー内の 1 つのメソッドで実行できます。

1 つのメソッドで行うには、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でaboutページwww.yoursite.com/page/contactが読み込まれ、contactページが読み込まれます

ここで、その部分を取り除きたい場合は/page、URL の再ルーティングを行う必要があります。application/config/routes.php

別の方法として、1 つのコントローラーで複数のメソッドを使用することもできます。

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

これで、URL はルーティングなしで見栄えが良くなりますが、すべてのページのヘッダー/フッターをロードする必要があります。

于 2013-06-21T04:49:31.843 に答える
1

codeIgniter では、このように行うことができます。コントローラーから同時に異なるビューをロードできます。例えば:

たとえば、navbar ビューでは、メニューに次のような連絡先ボタンがあります。

<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 )。

UPDATE$_GET[] :リクエストは必要ありません。<a>アンカー タグにコントローラーのメソッド名を指定するだけです。

于 2013-06-21T04:39:39.770 に答える
1

多くの $this->load->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();
    } 

したがって、他の各コントローラーには、url セグメントに応じてアクションをディスパッチしたり、パラメーターを準備したりできる index() 関数もあります。

例としてのフッターコントローラー (私はテンプレートエンジンとして 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.tpl を表示します

3) 次に、メニューを表示します

4) 次に、URL を解析するコンテンツ コントローラーを呼び出し、ページ コントローラーで _show() 関数を呼び出す必要があるものを見つけ、それに action='contactus' を渡します。_show() 関数には、アクション名 (この場合は contactus.tpl) に依存するテンプレートを表示するいくつかのスイッチ/ケース構成を含めることができます。

5) 最後にフッター テンプレートを表示します

その場合は柔軟な体制をとっております。すべてのコントローラーには index() 関数が必要であり、コンテンツで呼び出すことができるすべてのコントローラーには _show($act) 関数が必要です。それで全部です。

于 2013-06-21T09:21:38.050 に答える
0

テンプレートを使用してコードイグナイターで

最初に、header.php、navbar.php などを含む 1 つのフォルダーにテンプレート ファイルを作成します。

例: 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
?> 

コントローラーの 2 番目

function index(  ){
$data['body'] = 'home'; // cal your content
$this->load->view('template', $data);
}
于 2013-06-22T06:02:56.503 に答える