Phalconのビューコンポーネント

データの表示を担当するビューコンポーネントについて調べてみたいと思います。Developer Toolsで自動生成されたviewsフォルダには、indexフォルダ、layoutsフォルダ、とindex.voltファイルがあり、indexフォルダ内には、index.voltが生成されています。

views/index.voltは、下記のようになっています。

<!DOCTYPE html>
<html>
 <head>
 <title>Phalcon PHP Framework</title>
 </head>
 <body>
 {{ content() }}
 </body>
</html>

これが、デフォルトのレイアウトビューだと思います。7行目の{{ content() }}内に、各コントローラのindexAction()からのデータ、つまり「localhot/phalcon」の場合は、app/views/index/index.voltビューが埋め込まれます。試しに、下記のように変更してみます。

<!DOCTYPE html>
<html>
 <head>
 <title>レイアウトビュー</title>
 </head>
 <body>
 <h1>初めてのphalcon</h1>
 {{ content() }}
 </body>
</html>

ブラウザには、下記のように表示されました。

2015-04-03 18-45-55

これがどのように処理されているのかを公式サイトを見ながらで勉強していきたいと思います。

ビューの使用

ビューは、アプリケーションのユーザーインターフェイスを表示します。ビューは、基本的に、データの表示のみに関連するタスクを埋め込まれたPHPコードを含むHTMLファイルです。ビューは、アプリケーションからのリクエストをWebブラウザや他のツールに提供する仕事を処理します。

Phalcon\Mvc\ViewPhalcon\Mv\View\simpleコンポーネントが、MVCアプリケーションのビューレイヤーの管理を担当します。

コントローラとビューの結合

Phalconは、特定のコントローラがそのサイクルを完了すると、ビューコンポーネントに実行を渡します。ビューコンポーネントは、最後に実行されたアクションと同じ名前のファイルをviewsフォルダから探し出します。

ビューコンポーネントは、http://アドレス/phalconフォルダ/コントローラ/アクション/パラメーターというようにURLを解析します。デフォルトのトップページ「localhost/phalcon」の場合は、http://127.0.0.1/phalcon/indexController/indexAction/を探し出しビューコンポーネントに渡しています。

試しに、コントローラーとビューを下記のように修正してみます。

app/controllers/indexController

<?php
class IndexController extends ControllerBase
{
public function indexAction($postId)
 {
 $this->view->setVar("postId", $postId);
 }
}

$this->view->setVar()で、データを渡すことができます。第1引数に、変数名、第2引数にその変数に渡すデータを記述します。

app/views/index/index.volt

<h1>PostIdは<?php echo $postId?>です。</h1>
<p>You're now flying with Phalcon. Great things are about to happen!</p>
<p><a href="signup">サインアップはこちらへ!</a></p>

ブラウザに「http://localhost/phalcon/index/index/100」と入力してみると、下記のように表示されました。

2015-04-03 18-57-01

階層的なレンダリング

phalcon\Mvc\Viewは、ファイルの階層をサポートし、ファルコンレンダリングビューのデフォルトのコンポーネントです。この階層は、一般的なビューと同様に、それぞれのビューテンプレートを定義する名前によってレイアウトビューを自動的に解析します。

下記のように3つの階層に分かれます。

  • Actionビュー
    app/views/コントローラー名/アクション名.volt

これが、アクションに関連するビューです。このビューはアクションが実行されたときにのみ表示されます。

  • Controller レイアウト
    app/views/layouts/コントローラー名.volt

これは、コントローラに関連するビューです。これは、コントローラ内の全てのビューに対して表示されます。レイアウトで実装されている全てのコードはこのコントローラ内の全てのアクションのために再利用されます。

  • Mainレイアウト
    app/views/index.volt

これは、アプリケーション内で実行される全てのコントローラやアクションのために表示されるメインのレイアウトビューです。

上記のビューを全て実装する必要はありません。phalcon\Mvc\Viewコンポーネントは、単純にファイルの階層内の次のビューレベルに移動します。

app/view/layoutsフォルダ内にコントローラ名と同じビューを配置すると、コントローラごとのレイアウトとして利用することができますし、全てのアプリケーションで使用するテンプレートは、app/views/index.voltを使用します。

テンプレートの使用

テンプレートは、一般的なビューのコードを共有するために使用することが可能である。彼らは、コントローラのレイアウトとして機能し、だから、layoutsディレクトリにそれらを配置する必要があります。

indexControllerと各テンプレートを下記のように作成してみます。

  • app/controllers/indexController.php
<?php
class IndexController extends ControllerBase
 {
 public function initialize()
 {
 $this->view->setTemplateAfter('common');
 }
public function indexAction()
 {
 $this->flash->notice("これらは最新の投稿です");
 }
 public function indexAction()
 {
}
}

4行目:initialize()は、初期化メソッドです。Laravelでは、__construct()でしたね。

6行目:setTemplateAfter()メソッドで、app/views/layouts/common.voltレイアウトの中にをindexビューをセットしています。

10行目は、フラッシュデータを渡します。ビュー内で、$this->flash->output()で表示することができます。

  • app/views/layouts/common.volt
<ul class="menu">
 <li><a href="#">Home</a></li>
 <li><a href="#">Articles</a></li>
 <li><a href="#">Contact us</a></li>
 </ul>
<div class="content"><?php echo $this->getContent() ?></div>

7行目:<?php echo $this->getContent() ?>は、{{ content() }}でもOKです。このコンテンツは、app/veiws/layouts/index.voltです。

  • app/views/layouts/index.volt
<h1>Phalconのビューコンポーネント</h1>
<?php echo $this->getContent()?>

2行目:上記と同様に<?php echo $this->getContent()?>は、{{ content() }}でもOKです。このコンテンツは、app/views/index/index.voltです。

  • app/views/index/index.volt
<h1>Congratulations!</h1>
<p>You're now flying with Phalcon. Great things are about to happen!</p>
<p><a href="signup">サインアップはこちらへ!</a></p>

ブラウザで表示すると、下記のようになります。

2015-04-03 23-07-28

  • 一番大外枠が、メインテンプレート(app/view/index.volt)
  • その内側が、共有テンプレート(app/views/layouts/common.volt)
  • その内側が、コントローラテンプレート(app/views/layout/index.volt)
  • 一番内側が、アクションテンプレート(app/views/index/index.volt)

かなりややこしいので、よく見てください。只、ややこしいということは、かなり複雑なレイアウトも簡単に作成できるということですので、きちんと覚える意義はあると思います。

レンダリングレベルのコントロール

上記からもわかるようにPhalcon\Mvc\Viewコンポーネントは、階層をサポートしています。ビューコンポーネントによって生成されたレンダリングのレベルを制御する必要がある場合は、Phalcon\Mvc\View::setRenderlevel()メソッドを使って制御することができます。

このメソッドは、レンダリングプロセスを制御するために、コントローラやスーパービューレイヤーから呼び出すことができます。

利用可能なレンダリングレベルは次の通りです。

  • LEVEL_NO_RENDER
    コンテンツのあらゆる種類の生成を回避します。
  • LEVEL_ACTION_VIEW
    アクションの関連づけられたビューにコンテンツを生成します。
  • LEVEL_BEFORE_TEMPLATE
    コントローラテンプレートの前にコンテンツを生成します。
  • LEVEL_LAYOUT
    コントローラレイアウトにコンテンツを生成します。
  • LEVEL_AFTER_TEMPLATE
    コントローラテンプレートの後にコンテンツを生成します。
  • LEVEL_MAIN_LAYOUT
    メインレイアウト(app/views/index.vot)のコンテンツを先制します。

レンダリングレベルの無効化

あなたは、レベルをレンダリングする事を恒久的または一時的に無効にすることができます。それはアプリケーション全体では一切使用されていない場合はレベルが恒久的に無効にすることができます。

<?php
use Phalcon\Mvc\View;
$di->set('view', function(){
$view = new View();
//Disable several levels
 $view->disableLevel(array(
 View::LEVEL_LAYOUT => true,
 View::LEVEL_MAIN_LAYOUT => true
 ));
return $view;
}, true);

disableLevel()メソッドで、レンダリングレベルを無効にすることができます。無効化するレンダリングレベルを連想配列でture指定します。

ピッキングビュー

Phalcon\Mvc\View::pick()メソッドを使えば、デフォルトのViewコンポーネントを上書きすることができます。

<?php
class ProductsController extends \Phalcon\Mvc\Controller
{
public function listAction()
 {
 // Pick "views-dir/products/search" as view to render
 $this->view->pick("products/search");
// Pick "views-dir/products/list" as view to render
 $this->view->pick(array('products'));
// Pick "views-dir/products/list" as view to render
 $this->view->pick(array(1 => 'search'));
 }
}

Viewの無効化

あなたのコントローラがビュー内の任意の出力を生成しない場合(または、それが一つでもあるとき)は、不必要な処理を避けビューコンポーネントを無効にすることができます。

<?php
class UsersController extends \Phalcon\Mvc\Controller
{
public function closeSessionAction()
 {
 //Close session
 //...
//An HTTP Redirect
 $this->response->redirect('index/index');
//Disable the view to avoid rendering
 $this->view->disable();
 }
}

あなたは、手動でビューを無効にするために、レスポンスオブジェクトを返すことができます。

<?php
class UsersController extends \Phalcon\Mvc\Controller
{
public function closeSessionAction()
 {
 //Close session
 //...
//An HTTP Redirect
 return $this->response->redirect('index/index');
 }
}

シンプルレンダリング

Phalcon\Mvc\View\Simpleコンポーネントは、Phalcon\Mvc\Viewに代わるコンポーネントです。Phalcon\Mvc\View\Simpleコンポーネントは、基本的にPhalcon\Mvc\Viewの性能を保っていますが、ファイルの階層機能がありません。

このコンポーネントは、開発者はビューがレンダリングされるときのコントロールとその場所を持つことができます。また、このコンポーネントは、Voltのようなようなテンプレートエンジンで利用可能なビューの継承を活用できます。

このコンポーネントを使用するには、サービスコンテナでデフォルトのViewコンポーネントと交換する必要があります。

<?php
$di -> set ( 'view' , function () {
$view = new Phalcon\Mvc\View\Simple ();
$view -> setViewsDir ( '../app/views/' );
return $view ;
}, true );

必要なら、下記のように自動レンダリング機能を無効にすることができます。

<?php
try {
$application = new Phalcon\Mvc\Application($di);
$application->useImplicitView(false);
echo $application->handle()->getContent();
} catch (\Exception $e) {
 echo $e->getMessage();
 }

また、このPhalcon\Mvc\View\Simpleコンポーネントをレンダリングするには、明示的に表示したいビューへの相対パスを示すrenderメソッドを呼び出す必要があります。

<?php
class PostsController extends \Phalcon\Mvc\Controller
 {
public function indexAction()
 {
echo $this->view->render('index');
echo $this->view->render('posts/show');
echo $this->view->render('index', array('posts' => Posts::find()));
echo $this->view->render('posts/show', array('posts' => Posts::find()));
 }
}

パーシャルテンプレートの使用

パーシャルテンプレートは、アプリケーションの異なる部分で再利用することができますシンプルな、より管理しやすいチャンクにレンダリングプロセスを破壊する別の方法です。部分的で、あなたは、独自のファイルに応答の特定の部分をレンダリングするためのコードを移動することができます。

コー​​ドをより容易に理解できるように、ビューの外に詳細を移動する方法として:パーシャルを使用する1つの方法は、サブルーチンと同等に扱うことである。たとえば、下記のようなビューがあるとすれば、

<div class="top"><?php $this->partial("shared/ad_banner") ?></div>
<div class="content">
 <h1>Robots</h1>
<p>Check out our specials for robots:</p>
 ...
</div>
<div class="footer"><?php $this->partial("shared/footer") ?></div>

pertial()メソッドは、部分的な範囲内に存在する変数/パラメータの配列として二番目のパラメータを受け入れません。

<?php $this->partial("shared/ad_banner", array('id' => $site->id, 'size' => 'big')) ?>

パーシャルテンプレートについては少し、詳しく調べてみたいと思います。IndexControllerおよびいくつかのビューを下記のように修正および作成します。

  • app/controllers/IndexController.php
<?php
class IndexController extends ControllerBase{
public function indexAction(){
}
}
  • app/views/index.volt
<!DOCTYPE html>
<html>
 <head>
 <title>WinRoad徒然草</title>
 <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap.min.css">
 <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/js/bootstrap.min.js"></script>
 </head>
 <body>
 {{ content() }}
 </body>
</html>

Twitter Bootstrap3のCDNを使ってスタイルシートを読み込んでいます。

  • app/views/layouts/index.volt
<?php $this->partial("partial/navbar",['brand'=>'Winroad徒然草'])?>
<div class="container">
<h1>IndexControllerのレイアウトビュー</h1>
<?php echo $this->getContent()?>
</div>
<?php $this->partial("partial/footer")?>

IndexControllerのレイアウトビューにナビゲーションバーとフッターのパーシャルビューを読み込んでいます。
1行目:partialメソッドの第2引数に、データを連想配列で渡しています。4行目は、{{ content() }}でもOKです。

  • app/views/partial/navbar.volt
<nav class="navbar navbar-default">
 <div class="container-fluid">
 <!-- Brand and toggle get grouped for better mobile display -->
 <div class="navbar-header">
 <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1">
 <span class="sr-only">Toggle navigation</span>
 <span class="icon-bar"></span>
 <span class="icon-bar"></span>
 <span class="icon-bar"></span>
 </button>
 <a class="navbar-brand" href="#"><?php echo $brand?></a>
 </div>

 <!-- Collect the nav links, forms, and other content for toggling -->
 <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
 <ul class="nav navbar-nav">
 <li class="active"><a href="#">Link <span class="sr-only">(current)</span></a></li>
 <li><a href="#">Link</a></li>
 <li class="dropdown">
 <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-expanded="false">Dropdown <span class="caret"></span></a>
 <ul class="dropdown-menu" role="menu">
 <li><a href="#">Action</a></li>
 <li><a href="#">Another action</a></li>
 <li><a href="#">Something else here</a></li>
 <li class="divider"></li>
 <li><a href="#">Separated link</a></li>
 <li class="divider"></li>
 <li><a href="#">One more separated link</a></li>
 </ul>
 </li>
 </ul>
 <form class="navbar-form navbar-left" role="search">
 <div class="form-group">
 <input type="text" class="form-control" placeholder="Search">
 </div>
 <button type="submit" class="btn btn-default">Submit</button>
 </form>
 <ul class="nav navbar-nav navbar-right">
 <li><a href="#">Link</a></li>
 <li class="dropdown">
 <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-expanded="false">Dropdown <span class="caret"></span></a>
 <ul class="dropdown-menu" role="menu">
 <li><a href="#">Action</a></li>
 <li><a href="#">Another action</a></li>
 <li><a href="#">Something else here</a></li>
 <li class="divider"></li>
 <li><a href="#">Separated link</a></li>
 </ul>
 </li>
 </ul>
 </div><!-- /.navbar-collapse -->
 </div><!-- /.container-fluid -->
</nav>

viewsフォルダにpatrialフォルダを作成し、そこにnavbar.voltファイルを作成しました。中身はTwitter Bootstrap3の公式サイトから拝借してきました。Brand名のみpartialからのデータを表示<?php echo $brand?>しています。

  • app/views/partial/footer.volt
<nav class="navbar navbar-default navbar-fixed-bottom">
 <div class="container" style="text-align:center">
 <small>Copyright (c) 2015 Winroad All Right Reserved.</small>
 </div>
</nav>

こちらもpartialフォルダにfooter.vlotファイルを作成しました。

ブラウザで確認してみます。

2015-04-05 9-27-03

パーシャルはちょこっとしたところに埋め込めますから、用途が多そうですね。

コントローラからViewへの値の受け渡し

Phalcon\Mvc\Viewコンポーネントは、ビュー変数($ this->view)を使用して、各コントローラで利用可能です。あなたはsetVar()メソッドを使用してコントローラのアクションからビューに直接データを受け渡すことができます。

setVar()メソッドは、ひとつの変数や配列を渡し、setVars()メソッドは、配列や多重配列を渡します。

  • $this->view->setVar(“posts”,Post::find());
  • $this->veiw->serVars([‘posts’=>Post::find(),’photos’=>Phtos::find()]);

setVar()メソッド(の最初のパラメータの名前)を持つ変数を使用する準備ができて、ビューに作成されます。変数は、単純な文字列、整数などの変数からそのような配列、コレクションなどのような、より複雑な構造のため、あらゆるタイプの値を使用することができます。

Viewレイヤーでのモデルの使用

アプリケーションモデルは、常にビュー層で利用することができます。Phalcon\Loaderコンポーネントは、実行時 ​​に自動的にそれらをインスタンス化します。

<div class="categories">
 <?php
foreach (Categories::find("status = 1") as $category) {
 echo "<span class='category'>", $category->name, "</span>";
 }
?>
 </div>

あなたはビュー層でinsert()メソッドや、update()メソッドなどのモデル操作を実行することができるが、それはエラーや例外の場合には別のコントローラに実行フローを転送することができないため、勧めできません。

View断片のキャシュ

Phalcon\Mvc\Viewは、ビューの一部またはパフォーマンスを向上させる全体のレンダリングされた出力をキャッシュしています。

Phalcon\Mvc\Viewは、Phalcon\Cacheと統合して、キャッシュをフレームワークに出力する簡単な方法を提供します。あなたは、手動でキャッシュハンドラやグローバルハンドラを設定できます。

<?php
class PostsController extends \Phalcon\Mvc\Controller
{
public function showAction()
 {
 //Cache the view using the default settings
 $this->view->cache(true);
 }
public function showArticleAction()
 {
 // Cache this view for 1 hour
 $this->view->cache(array(
 "lifetime" => 3600
 ));
 }
public function resumeAction()
 {
 //Cache this view for 1 day with the key "resume-cache"
 $this->view->cache(
 array(
 "lifetime" => 86400,
 "key" => "resume-cache",
 )
 );
 }
public function downloadAction()
 {
 //Passing a custom service
 $this->view->cache(
 array(
 "service" => "myCache",
 "lifetime" => 86400,
 "key" => "resume-cache",
 )
 );
 }
}

我々がキャッシュへのキーを定義しない場合には、コンポーネントは自動的に現在レンダリングされているビューの名前をmd5で暗号化して作成します。あなたが簡単に各ビューに関連付けられたキャッシュを識別できるように、各アクションのキーを定義することをお勧めします。

ビューコンポーネントは何かをキャッシュする必要がある場合には、サービスコンテナにキャッシュサービスを要求します。このサービスのサービス名規則は「viewCache」です。

<?php
use Phalcon\Cache\Frontend\Output as OutputFrontend,
 Phalcon\Cache\Backend\Memcache as MemcacheBackend;
//Set the views cache service
$di->set('viewCache', function() {
//Cache data for one day by default
 $frontCache = new OutputFrontend(array(
 "lifetime" => 86400
 ));
//Memcached connection settings
 $cache = new MemcacheBackend($frontCache, array(
 "host" => "localhost",
 "port" => "11211"
 ));
return $cache;
});

ビューのキャッシュを使用する場合にはまたコントローラがビューに表示するデータを生成する処理を実行することを防止するのに有用である。

これを実現するために、我々は一意キーを持つ各キャッシュを特定する必要があります。まず、キャッシュが存在しないか、またはビュー内のデータを表示するための計算/クエリを作るために有効期限が切れていることを確認します。

<?php
class DownloadController extends \Phalcon\Mvc\Controller
{
public function indexAction()
 {
//Check whether the cache with key "downloads" exists or has expired
 if ($this->view->getCache()->exists('downloads')) {
//Query the latest downloads
 $latest = Downloads::find(array(
 'order' => 'created_at DESC'
 ));
$this->view->latest = $latest;
 }
//Enable the cache with the same key "downloads"
 $this->view->cache(array(
 'key' => 'downloads'
 ));
 }
}

テンプレートエンジン

テンプレートエンジンは、複雑な構文を使用せずにビューを作成するために、設計者を支援します。Phalconには、Voltと呼ばれる強力かつ高速なテンプレートエンジンが含まれています。

さらに、phalcon\Mvc\Viewは、代わりにプレーンなPHPやボルトの他のテンプレートエンジンを使用することができます。

別のテンプレートエンジンを使用して、通常はユーザーのための最終的な出力を生成するために、外部のPHPライブラリーを使用して複雑なテキストの解析を必要とする。これは通常、アプリケーションが使用しているリソースの数が増加します。

外部テンプレートエンジンを使用する場合は、Phalcon\Mvc\Viewは全く同じビュー階層を提供し、それはもう少しの努力でこれらのテンプレートの中にAPIにアクセスすることは可能です。

このコンポーネントは、これらのヘルプファルコンは、統一された方法でそれらの外部のテンプレートエンジンと話すのは、その統合を行う方法を見てみましょうするために、アダプターを使用しています。

独自のテンプレートエンジンアダプタの作成

あなたが統合したり、独自のものを作成したい場合には、多くのテンプレートエンジンがあります。最初のステップは、それ用のアダプタを作成している外部のテンプレートエンジンを使用して開始します。

テンプレートエンジンアダプタはphalcon\Mvc\Viewコンポーネントとテンプレートエンジンの間のブリッジとして動作するクラスです。通常は2つだけの実装されたメソッド(__construct()メソッドとrender()メソッド)を必要とします。最初の受信は、エンジン·アダプタとアプリケーションで使用されるDIコンテナのPhalcon\Mvc\Viewインスタンスを作成します。

render()メソッドは、ビューファイルへの絶対パスを受け取り、そして、ビューパラメータのセットは、$this->view->serVar()を使用します。それは必要だときには、それを読むか、必要とする可能性があります。

<?php
class MyTemplateAdapter extends \Phalcon\Mvc\View\Engine
{
/**
 * Adapter constructor
 *
 * @param \Phalcon\Mvc\View $view
 * @param \Phalcon\DI $di
 */
 public function __construct($view, $di)
 {
 //Initiliaze here the adapter
 parent::__construct($view, $di);
 }
/**
 * Renders a view using the template engine
 *
 * @param string $path
 * @param array $params
 */
 public function render($path, $params)
 {
// Access view
 $view = $this->_view;
// Access options
 $options = $this->_options;
//Render the view
 //...
 }
}

テンプレートエンジンの変更

次のように、コントローラからテンプレートエンジンを交換するか、それ以上を追加することができます。

<?php
class PostsController extends \Phalcon\Mvc\Controller
{
public function indexAction()
 {
 // Set the engine
 $this->view->registerEngines(
 array(
 ".my-html" => "MyTemplateAdapter"
 )
 );
 }
public function showAction()
 {
 // Using more than one template engine
 $this->view->registerEngines(
 array(
 ".my-html" => 'MyTemplateAdapter',
 ".phtml" => 'Phalcon\Mvc\View\Engine\Php'
 )
 );
 }
}

あなたは完全にテンプレートエンジンを交換するか、同時に複数のテンプレートエンジンを使用することができます。Phalcon\ MVC \View:: registerEngines()メソッドは、テンプレートエンジンを定義するデータを含む配列を受け入れます。各エンジンのキーは、別のものを区別するのに役立つ拡張機能です。特定のエンジンに関連するテンプレートファイルには、これらの拡張子を持っている必要があります。

テンプレートエンジンはPhalcon\ Mvc \View:: registerEngines()メソッドはコンポーネントで定義されている実行順序の関連性を定義します。もしPhalcon\Mvc\Viewコンポーネントは、同じ名前で拡張子の異なる2つのビューを見つけたら、最初のものだけをレンダリングします。

テンプレートエンジンまたはアプリケーション内の各要求のためにそれらのセットを登録したい場合は。ビューのサービスが作成されたときに、登録できます。

<?php
//Setting up the view component
$di->set('view', function() {
$view = new \Phalcon\Mvc\View();
//A trailing directory separator is required
 $view->setViewsDir('../app/views/');
$view->registerEngines(array(
 ".my-html" => 'MyTemplateAdapter'
 ));
return $view;
}, true);

ファルコンインキュベータ上のいくつかのテンプレートエンジンのために利用可能なアダプタがあります。

ビューでサービスを注入する

Phalcon\DI\Injectableインスタンスの内部に含まれているすべてのビューが実行し、アプリケーションのサービスコンテナへの容易なアクセスを提供します。

以下の例では、フレームワーク規則のURLを使用してjQueryのajax requestの記述方法を示しています。サービス”URL”(通常は、Phalcon\Mvc\Url)は、同じ名前のプロパティにアクセスすることによって、ビューに注入されています。

<script type="text/javascript">
$.ajax({
 url: "<?php echo $this->url->get("cities/get") ?>"
})
.done(function() {
 alert("Done!");
});

</script>

スタンドアロンコンポーネント

ファルコンのすべてのコンポーネントは、個別の構成要素として、緩く互いに結合されているので、接着剤コンポーネントとして使用することができます。

 階層的なレンダリング

Phalcon\Mvc\Viewの使用したスタンドアロンモードは、以下に示すことができる

<?php
$view = new \Phalcon\Mvc\View();
//A trailing directory separator is required
$view->setViewsDir("../app/views/");
// Passing variables to the views, these will be created as local variables
$view->setVar("someProducts", $products);
$view->setVar("someFeatureEnabled", true);
//Start the output buffering
$view->start();
//Render all the view hierarchy related to the view products/list.phtml
$view->render("products", "list");
//Finish the output buffering
$view->finish();
echo $view->getContent();

短い構文も利用可能です:

<?php
$view = new \Phalcon\Mvc\View();
echo $view->getRender('products', 'list',
 array(
 "someProducts" => $products,
 "someFeatureEnabled" => true
 ),
 function($view) {
 //Set any extra options here
 $view->setViewsDir("../app/views/");
 $view->setRenderLevel(Phalcon\Mvc\View::LEVEL_LAYOUT);
 }
);

簡単なレンダリング

Phalcon\Mvc\View\Simpleの使用したスタンドアロンモードは、以下に示すことができる

<?php
$view = new \Phalcon\Mvc\View\Simple();
//A trailing directory separator is required
$view->setViewsDir("../app/views/");
// Render a view and return its contents as a string
echo $view->render("templates/welcomeMail");
// Render a view passing parameters
echo $view->render("templates/welcomeMail", array(
 'email' => $email,
 'content' => $content
));

Viewイベント

Phalcon\Mvc\ViewとPhalcon\Mvc\Viewは、EventManagerへそれが存在する場合、イベントを送信することができます、。イベントは、タイプ「ビュー」を使用してトリガされます。真偽値を返す一部のイベントは、アクティブな動作を停止することができます。次のイベントがサポートされています。

  • beforeRender
    レンダリングプロセスを開始する前に発生
  • beforeRenderView
    既存のビューをレンダリングする前に発生
  • afterRenderView
    既存のビューをレンダリングする前に発生
  • afterRender
    レンダリングプロセスが完了した後に発生
  • notFoundView
    ビューが見つからなかった時に発生

次の例では、このコンポーネントにリスナーをアタッチする方法を示しています。

<?php
$di->set('view', function() {
//Create an events manager
 $eventsManager = new Phalcon\Events\Manager();
//Attach a listener for type "view"
 $eventsManager->attach("view", function($event, $view) {
 echo $event->getType(), ' - ', $view->getActiveRenderPath(), PHP_EOL;
 });
$view = new \Phalcon\Mvc\View();
 $view->setViewsDir("../app/views/");
//Bind the eventsManager to the view component
 $view->setEventsManager($eventsManager);
return $view;
}, true);

次の例は、Tidyレンダリングプロセスを使用して製造されたHTMLのクリーニングおよび修理プラグインの作成 ​​方法を示しています。

<?php
class TidyPlugin
{
public function afterRender($event, $view)
 {
$tidyConfig = array(
 'clean' => true,
 'output-xhtml' => true,
 'show-body-only' => true,
 'wrap' => 0,
 );
$tidy = tidy_parse_string($view->getContent(), $tidyConfig, 'UTF8');
 $tidy->cleanRepair();
$view->setContent((string) $tidy);
 }
}
//Attach the plugin as a listener
$eventsManager->attach("view:afterRender", new TidyPlugin());

以上、公式サイトを私なりに訳してみました。だた意味のわからないところはほとんどGoogle先生に頼っていますので、間違っている可能性が多分にありますので、ご了承ください。

本日のまとめ

本日理解できたことを以下にまとめてみました。

  1.  Phalconはデフォルトで、Actionの終了後、ビューを自動的にレンダリングする
  2. よってビューの表示に関する記述は不要
  3. レンダリングするビューの順番は
    1. app/views/index.volt(メインレイアウト)
    2. app/views/layouts/コントローラ名.volt(コントローラレイアウト)
    3. app/views/コントローラ名/アクション名.volt(アクションビュー)
  4. テンプレート(レイアウト)内にビュー(または、次の階層テンプレート)を表示するには、
    • <?php echo $this->getContent()?>を使用する
    • テンプレートエンジンVolt内なら、{{ content() }} で表示できる。
  5. レンダリングレベルはコントロールすることができる
  6. ビューの自動レンダリングを無効にするには
    1. Actionの最後に、$this->view->disable();を記述する
    2. 又は、下記のように直接レスポンスオブジェクトを返す
      return $this->response->redirect(‘index/index’);
  7. デフォルトのViewコンポーネントにかわるSimpleビューコンポーネントがある
  8. パーシャルテンプレートを使うと部分的にビューを埋め込むことができる
    • <?php $this->partial(‘patial/navbar’)?>
    • <?php $this->partial(‘patial/navbar’,[‘brand’=>’Winroad徒然草’])?>
  9. コントローラからビューへ値を引き渡すには、setVar()、setVars()メソッドを使う
    1. $this->view->setVar(‘name’,’中田’);
    2. $this->view->setVar(‘users’,User::find());
    3. $this->view->setVars([‘users’=>User::find(),’posts’=>Post::find()]);
  10. ビューレイヤー内でモデルを使用することができる
  11. Viewはデフォルトでキャッシュされている
  12. Viewキャッシュは手動で、キャッシュハンドラーやグローバルハンドラーを設定できる
  13. PhalconにはデフォルでVoltと呼ばれる強力なテンプレートエンジンが含まれている。
  14. 簡単に独自のテンプレートエンジンに変更することができる
  15. Viewイベントの発生や時期は制御することができる

本日は、以上です。

このエントリーを含むはてなブックマーク Buzzurlにブックマーク livedoorクリップ Yahoo!ブックマークに登録

トラックバック&コメント

この投稿のトラックバックURL:

コメントをどうぞ

このページの先頭へ