1

以下を実行する適切な方法について、私は多少混乱しています。これはクラスですか、関数ですか、それともオブジェクトですか? (よくわかりません) というわけで (親切にお願いします) codeigniter/php を同時に学習しています。

    $is_live = $this->session->userdata('email');
    $is_live = ucwords($is_live);
            if (!$is_live == null)
                   echo 'Hello, '.$is_live.
                   ' <b>(Not you? '.'<a href="' .base_url().
                   'main/logout">Log Out</a>) </b>'; 

セッションが設定されているかどうかを確認し、true の場合は詳細をエコーするこのコードを作成しました。現在、このコードを自分view/mainのページに持っていますが、このコードをすべてのページに表示したいと考えています。

これを行う適切な方法は何ですか?

  1. view/header各ページに自動ロードされる を作成し、そこに挿入しcodeますか?
  2. ファイルに を作成しclass/public functionhelper必要な場所にロードしますか?
  3. ファイルに を作成しclass/public functionlibrary必要な場所にロードしますか?
  4. public functionコントローラーでを作成しますか?

-EXTRA- 私の仮定はオプション1ですが、この情報を特定のページの別の場所に表示したい場合はどうすればよいですか? ずさんなので、コード ブロックをコピーして貼り付ける必要はありません。

必要な場所で呼び出すことができるようにするには、どのように設定すればよいですか? 例えば$this->load->helper('check_for_sess');

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class isLive
{   
    public function is_live() {

        $is_live = $this->session->userdata('email');
        $is_live = ucwords($is_live);
             if (!$is_live == null)
               echo 'Hello, '.$is_live.
               ' <b>(Not you? '.'<a href="' .base_url().'main/logout">Log Out</a>) </b>'; 

    }
}

私はこれviewを試しました:

<?php 
    $isLive = new isLive;
    $isLive->is_live(); 
?>

ただし、これは機能せず、「オブジェクト以外のエラーで関数 userdata() 」が発生します。

誰かが私の希望するソリューションと正しい構文を達成するための適切な方法を説明してもらえますか? 前もって感謝します!

-UPDATE-- ライブラリを作成しようとしましたが、まだエラーが発生しています。

#Created a library 
class CheckSess 
{   
    function IsLive() 
    {   
    $is_live = $this->session->userdata('email');
    $is_live = ucwords($is_live);

            if (!$is_live == null) 
            {
               $check_msg = 'Hello, '.$is_live.
               ' <b>(Not you? '.'<a href="' .base_url().'main/logout">Log Out</a>) </b>';
            }

    return $check_msg;
    }

}


#In the View
<?php echo $this->CheckSess->IsLive();  ?>

#in the controller
$this->load->library('CheckSess');

- アップデート -

class CheckSess {

    function IsLive() 
    {   
    $CI =& get_instance();
    $is_live = $CI->session->userdata('email');
    $is_live = ucwords($is_live);

            if (!$is_live == null) 
            {
               return 'Hello, '.$is_live.
               ' <b>(Not you? '.'<a href="' .base_url().'main/logout">Log Out</a>) </b>';
            }

    }

}

これを設定^はlibrariesフォルダです

viewショー_<?php echo $this->CheckSess->IsLive(); ?>

そしてcontrollerショー$this->load->library('CheckSess');

お知らせ下さい。再度、感謝します!

エラー - -

( ! ) SCREAM: エラー抑制は無視されました ( ! ) 致命的なエラー: 56 行目の C:\wampserver\www\test-app\application\views\homepage.php の非オブジェクトに対するメンバー関数 IsLive() の呼び出しコール スタック

タイムメモリー機能の場所

1 0.0005 151432 {main}( ) ..\index.php:0 2 0.0014 187792 require_once( 'C:\wampserver\www\test-app\system\core\CodeIgniter.php' ) ..\index.php:202 3 0.0277 1537000 call_user_func_array () ..\CodeIgniter.php:359 4 0.0277 1537048 Main->index() ..\CodeIgniter.php:359 5 0.0283 1540200 CI_Loader->view() ..\main.php:8 6 0.0283 1540640 CI_Loader->_ci_load() ..\Loader.php:419 7 0.0287 1566584 include( 'C:\wampserver\www\test-app\application\views\homepage.php' ) ..\Loader.php:833

4

2 に答える 2

4

CodeIgniter でこのような再利用可能なものを作成する最良の方法は、モデルとライブラリです。

使用するコードとロジックは実際には MVC のモデルとは異なるため、ライブラリの方が優れていますが、CodeIgniter を使用すると、特に初心者にとって、このコードを配布または共有する予定がない場合は、これをモデルに記述しても問題ありません。とりあえず。

CodeIgniter で何がどこに行くのかについてもっと読むことをお勧めします。ここ、SO、または公式の CI フォーラムで多くの情報を見つけることができますが、簡単な参照として、何がどこに行くのかのリストを書きます。

ビュー

静的でダムなデータ出力、書式設定、繰り返し (テーブル、リストなどを表示するため)。

ここで使用する必要があるのは、いくつかの基本的な PHP 関数、CodeIgniter ヘルパー、、、forループ、および条件 ( foreach、)だけです。whileifcase

コントローラー

フォーム データのキャプチャと検証、モデルからのデータの取得、ビューへのデータの送信、リダイレクト。

モデル

データベース、リモート ソース (API)、ファイルからのデータのクエリ、読み取り、書き込み、および更新。

ヘルパー

ビューで使用されることが期待されるよく使用される関数 - HTML のフォーマット、ツリーの解析とリストとしての表示、次<ul><li></li></ul>のような他の関数の省略形関数

function mydate() {
    return date("d.m.Y");
}

CodeIgniter ライブラリ/モデルのいずれも使用しないもの (技術的には使用できますが、ほとんどの場合は避ける必要があります)。

ライブラリ

カスタム クラスとオブジェクト、データ処理、API インターフェイス、前述の複合体



データを含むビューファイルを表示したい場合は、ライブラリに入れます。モデルに入れることができます。私のプロジェクトでは、いくつかのパーツを使用するときに、ライブラリ/モデルがあり (この場合の違いは最小限です)、それを と呼びましょうpmodel

class Pmodel extends CI_Model() {
    function ShowHeader() {
        $data = array(
            'user' => $this->usermodel->GetCurrentUser()
        }
        $this->load->view('header', $data);
    }

    function ShowMyPart() {
        $is_live = $this->session->userdata('email');
        $is_live = ucwords($is_live);
        if (!$is_live == null)
               echo 'Hello, '.$is_live.
               ' <b>(Not you? '.'<a href="' .base_url().
               'main/logout">Log Out</a>) </b>'; 

    }
}

以前にロードしたことがある場合は、ビュー ファイルのどこでも呼び出すことができます$this->pmodel->ShowMyPart()(このタイプのモデルはとにかく自動ロードする必要があります)。

良い習慣と見なされるので、私が行う小さな変更が 1 つあります。代わりにecho、ビュー ファイル以外のどこからも何も変更しないでください。return

echoキーワードをに変更returnし、ビュー ファイルに単純に書き込みecho $this->pmodel->ShowMyPart()ます。

なぜあなたはそれをしなければならないのですか?ヘッダーとフッターのロードの間にコントローラから何かをエコーするメソッドを呼び出したい場合 (例)、CodeIgniter はロードされたビューをすぐにエコーしないため、CodeIgniter はヘッダーの前にこれをエコーし​​ます。それらを出力に保存します。自身を破壊する直前に最終的な出力を送信します。詳細については、こちらを参照してください。

ビュー ファイルを使用して必要なデータを出力し、コントローラーで行うように、ヘルパーを作成してモデル/ライブラリからロードするだけです。

それが役立つことを願っています!


編集

編集した質問について、ライブラリでエラーが発生する理由は、モデルやコントローラーの場合と同様に、ライブラリからライブラリを拡張していないため、CodeIgniter のインスタンスが存在することさえライブラリが認識していないためです。別のクラスであるライブラリ自体への参照と$this同様に、ライブラリ内の CodeIgniter クラスの参照には使用しません。$thisCodeIgniter クラスを使用するには、CodeIgniter インスタンスを取得する必要があります。

$CI =& get_instance();

そして、次の行を変更することで、CodeIgniter クラスを呼び出す$CI代わりに使用できます。$this

$is_live = $this->session->userdata('email');

$is_live = $CI->session->userdata('email');
于 2012-09-28T00:19:31.083 に答える
0

基本的なhtmlヘルパーを作成し、構成ファイルに自動ロードすることができます。

次に、このための関数を作成できます...

function displayLoginStatus($em)
{ 
    $html = '';
    if($em)
    {
        $html = 'Hello, '.ucwords($em).' <b>(Not you? '.'<a href="' .base_url().'main/logout">Log Out</a>) </b>';
    }

    return $html;
}

次に、それを通常の関数のように呼び出します。

<?php echo displayLoginStatus($this->session->userdata('email')); ?>

ただし、理想的には、このようなものを、標準のページビューをラップするテンプレートまたはヘッダーファイルに配置します。通常、ページの複数の場所にログイン/ログアウトがないため、このような関数を作成する必要はありません。単純に次のように要約できます。

<?php if($this->session->userdata('email')): ?>
Hello, <?php echo ucwords($this->session->userdata('email')); ?> <b>(Not you? <a href="<?php echo base_url(); ?>main/logout">Log Out</a>) </b>
<?php endif; ?>

私はサイトテンプレートを作成し、それでビューをラップすることを好みます。一般的な要素の処理がはるかに簡単になります。一部の人々はそれをこのようにテンプレート化します:http: //codeigniter.com/forums/viewthread/88335/

これを処理する方法はたくさんありますが、一般的な考え方は、最も一般的な要素を1つのテンプレートビューに分離することです。これを行う方法を簡潔に説明する方法がわからないため、テンプレートについてさらに詳しく説明する必要があると感じた場合にのみ、この投稿を更新します。

ヘルパードキュメント: http ://codeigniter.com/user_guide/general/helpers.html

于 2012-09-28T00:34:14.953 に答える