3

私はコハナの初心者で、ドキュメント、チュートリアル、フォーラムの投稿を読んで、その仕組みを理解しています。

このフレームワークをアプリケーションの1つに実装しようとしていますが、複数のテンプレートとそのアセットの管理に行き詰まっています。

基本的に、私のアプリケーションにはtemplate1、template2 ....のようなテンプレートフォルダがあり、特定のテンプレートに関連するすべての画像、css、jsはテンプレートフォルダ内に含まれている必要があります。

それで、そのような実装を持つことは可能ですか?もしそうなら、どうすればテンプレート固有のアセットを親テンプレートファイルにロードできますか?

4

2 に答える 2

4

要するにはい

Kohana 3.0 で作成したサイトで自分でテンプレートを使用しています。その基本的なセットアップを説明しようと思います。テンプレートを使用するには、コントローラーを拡張する必要がController_Templateあり、内部の$template変数は、ビュー フォルダーに読み込むテンプレート ページを指定するため、controller_template クラスを拡張して読み込むテンプレートを管理する独自のマスター コントローラー クラスを作成しました。以下では、デフォルトのテンプレートの名前が単なるテンプレートであることを確認できます。そのためtemplate.php、コントローラーで指定されていない場合はビュー フォルダーから読み込まれます。

(ダムダウン) のクラス定義を持つ master.php マスター コントローラーがあります

abstract class Controller_Master extends Controller_Template
{
    public $template = 'template'; // Default template

    public function before()
    {
        // Set a local template variable to what template the controller wants to use, by default 'template'
        $template = $this->template; 

        // This is important and for abstraction, since we're extending a class and its functions we need to make sure we still execute its before(); function
        // This will load the view you need from /views/template.php or /views/template2.php depending on what your controller specifies into $this->template
        parent::before();

        // Check which template our code/controller needs to use
        if ($template == 'template') 
        {
            $this->template->header = View::factory('template/head');  // Loads default header file from our views folder /views/template/head.php
            $this->template->content = View::factory('template/index');  // Loads default index file from our views folder /views/template/index.php
            $this->template->footer = View::factory('template/footer');  // Loads default footer file from our views folder /views/template/footer.php

            return;
        } elseif ($template == 'template2') 
        {
            $this->template->header = View::factory('template2/head');  // Loads default header file from our views folder /views/template2/head.php
            $this->template->sidebar = View::factory('template2/sidebar');  // Loads default sidebar file from our views folder /views/template2/sidebar.php
            $this->template->content = View::factory('template2/index');  // Loads default index file from our views folder /views/template2/index.php
            $this->template->footer = View::factory('template2/footer');  // Loads default footer file from our views folder /views/template2/footer.php

            return;
        }
    }
}

次のクラス定義を持つuser.phpユーザーコントローラーがあります

// This is important, make sure your controllers extend your master controller class
class Controller_User extends Controller_Master
{
    // In this example this user controller just needs to use the default controller 
    // so nothing needs to be changed on it besides extending our Controller_Master

    // Example action inside the user class on how to load different content into your template instead of the default index page.
    function action_login()
    {
        // Load the login view page from /views/template/forms/login.php
        $this->template->content = View::factory('template/forms/login');
    }
}

ここで、別のテンプレートを使用する必要があるコントローラーがあるとします。たとえば、次のクラス定義を持つphoto.phpフォト コントローラーがあるとします。

// This is important, make sure your controllers extend your master controller class
class Controller_Photo extends Controller_Master
{
    // Since this controller needs to use a different template we extend the before() function
    // to override the $template variable we created in master to use 'template2'
    function before() 
    {
        $this->template = 'template2';
    }
}

/views/template.phpのようなものが含まれています

    <body>
        <div id="header">
            <?= $header; ?>
        </div>
        <div id="content">
            <?= $content; ?>
        </div>
        <div id="footer">
            <?= $footer; ?>
        </div>        
    </body>

/views/templat2e.phpには、次のような異なるレイアウトが含まれています

    <body>
        <div id="header">
            <?= $header; ?>
        </div>
        <div id="sidebar">
            <?= $sidebar; ?>
        </div>
        <div id="content">
            <?= $content; ?>
        </div>
        <div id="footer">
            <?= $footer; ?>
        </div>        
    </body>

$header$sidebar$content、およびは、マスターコントローラー$footerに設定されているか、コントローラーのコードによって上書きされています$this->template->header

これで、Kohana でテンプレートを操作する方法が十分に説明されていることを願っています。

于 2011-11-18T02:20:28.533 に答える
2

意図したとおりにフレームワークを使用できないため、この方法でアセットを構造化しないことをお勧めします。

CSS、JavaScript、および画像は、実際にはメインapplicationディレクトリの外に保存する必要があります

例えば

application/
modules/
system/
assets/
  template1/
    css/
      styles.css
    js/
      script.js
    img/
      thing.jpg
  template2/
    css/
      styles.css
    js/
      script.js
    img/
      another-thing.jpg

そうしないと、すべてのアセット要求がフレームワークを介してルーティングされ、アプリケーションの応答性に影響を与えることになります。

それでもこのパスをたどりたい場合は、action_mediaメソッド/modules/userguide/classes/controller/userguide.phpを見て、CSS、JavaScript、および画像がユーザーガイド モジュールによってどのように読み込まれるかを確認してください。

または、.htaccess ルールを修正して、アプリケーション ディレクトリの下にあるアセット ファイルへのアクセスを許可することもできます。

于 2011-11-23T10:26:18.700 に答える