0

Phil Sturgeon によって作成されたテンプレート ライブラリを使用しようとしています。彼は彼のテンプレート ライブラリに関する優れたドキュメントをいくつか持っていますが、ファイル構造をどのように作成するかについて少し問題が発生しました。

-views
    -layouts
        -default.php
    -partials
        -header_view.php
        -footer_view.php
        -metadata_view.php
    login_view.php

ログイン コントローラーのインデックス関数内に、使用するレイアウトとテンプレートの本文として読み込むビューを設定する次のコードがあります。また、header_view.php ファイル内にあるものを含めましたが、これは正しく動作していないと思われます。header_view 内の部分的なメタデータをターゲットにできることを望んでいました。ドキュメントによると、私は正しくやっていますが、header_view.php ファイルから未定義のインデックス メタデータというエラーが発生しています。この問題に関する任意の光。

github リポジトリからのドキュメント: https://github.com/philsturgeon/codeigniter-template

$this->template
        ->title('Login Form')
        ->set_partial('header', 'partials/header_view')
        ->set_partial('metadata', 'partials/metadata_view')
        ->set_partial('footer', 'partials/footer_view')
        ->set_layout('default')
        ->build('login_form_view');

default.php

<?php echo $template['partials']['header']; ?>

<?php echo $template['body']; ?>

<?php echo $template['partials']['footer']; ?>

header_view.php

<!DOCTYPE html>
<html>
<head>
    <title><?php echo $template['title']; ?></title>
    <?php echo $template['partials']['metadata']; ?>

</head>

    <body
4

1 に答える 1

2

私はコードイグナイターのファンです。正直なところ、CI の真の力は、派手な「TEMPLATING lib」や認証 lib が搭載されていないことだと思います。それでも、迅速かつ非常に迅速に独自のツールを構築するためのすべてのツールが提供されます。

したがって、私の答えはあなたが本当に求めているものではありませんが、10分以内にciで独自のいわゆるtemplaring libを構築し、スムーズに動作する方法の簡単な例です。

  1. applicaiton/core フォルダー内に MY_Controller を作成します。

    class MY_Controller extends CI_Controller {
    
    protected $noEcho=true,$body = 'base/layout', $title = 'YOUR CONTROLLER TITLE',
    $js = array(), //filename
    $inline_js = '', //script
    $css = array(), 
    $inline_css = '', //style
    $content = array(); //html
    

内部には3つの基本機能があります

  1. ページパーツを設定します。
  2. あなたの資産を管理する
  3. 最終結果ページを印刷します。

1

function output($data,$section='content'){

//checking type of data to be pushed its either array or string(html)
//this is a view it should be formated like this array( viewname,$data )
if( is_array($data) ){
  $this->content[ $section ][] = $this->load->view( $data[0], $data[1], TRUE );

  return $this;//to allow chaing

}elseif( is_string($data) ){//this is html

  $this->content[ $section ][] = $data;
  return $this;//to allow chaing
}

}

2つ目は、このページにjs、css、インラインjs&cssを追加できる機能です。

function _asset( $link, $txt = FALSE ) {

if ( $txt !== FALSE ) {
  if ( $txt == 'js' )
    $this->inline_js[] = $txt;
  elseif ( $txt == 'css' )
    $this->inline_css[] = $txt;
}else{
  if ( pathinfo( $link, PATHINFO_EXTENSION ) == 'css' ){
    $this->css[] = link_tag( base_url( 'assets/css/' . trim( $link, "/\\" ) ) );
  }else{
    $this->js[] = '<script src="' . base_url( 'assets/js/' . trim( $link, "/\\" ) ) . '"></script>';
  }   
}
return $this;
}

最後に、すべてのパーツをまとめる関数。

protected function print_page(){

  if ( $this->noEcho ) ob_clean();

  $data=array();

  $data[ 'title' ] = $this->title;
  $data[ 'css' ]        = is_array( $this->css ) ? implode( "\n", $this->css ) : '';
  $data[ 'js' ]         = is_array( $this->js ) ? implode( "\n", $this->js ) : '';
  $data[ 'inline_css' ] = ( $this->inline_css ) ? '<style>' . implode( "\n", $this->inline_css ) . '</style>' : '';
  $data[ 'inline_js' ]  = ( $this->inline_js ) ? implode( "\n", $this->inline_js ) : '';

  foreach ( $this->content as $section => $content ) {
    $data[ $section ] = is_array( $content ) ? implode( "\n\n\n ", $content ) : $content;
  } //$this->content as $section => $content

  return $this->load->view( $this->body, $data );

}

3つすべてをまとめて、コントローラーをこのベースコントローラーに拡張します。

あなたが構築しようとしているサンプルページの場合、私は次のようにします:

コントローラー:

public function __construct() {
  parent::__construct();
  $this->title = 'Controller title';
  $this->body = 'base/default';
  //load all your assets.. if its across all pages then load them in MY_controller construct
  $this->assets('jquery.min.js')
       ->assets('bootstrap.css')
       ->assets('alert("itworks");','js');//will be added to $inline_js
}

function index(){

$var = $This->some_model->get_data();

$this->output( array('some_View',$var) )
     ->output('<hr/>')
     ->output('THIS WILL BE IN $FOOTER','footer')
     ->print_page();

}

さて、それはどれほどきれいですか:) ?;

これで、コントローラーはビューセットをロードしthis->body、すべてのセクションをそれに渡します。したがって、上記の例では、ビューは 2 つの変数を受け取ります。

  1. $content : 内容が悪い some_view view +
  2. $footer : 渡された html が含まれます。
  3. $css、$js、$inline_js、$inline_css 変数にはすべてのアセットが含まれています
  4. $title にはページのタイトルが含まれます。

最後に、この小さなデモが、CI ネイティブ ビュー ローダーのおかげでこれら 3 つの小さな関数が実行できる無限の可能性を理解するのに役立つことを願っています。

于 2014-01-31T16:18:24.643 に答える