Phalcon入門チュートリアルのVoltテンプレートエンジン

6084 ワード

原文は:Phalcon入門教程のVoltテンプレートエンジンvoltはPhalconに統合されたテンプレートエンジンであり、他のテンプレートエンジンに交換したり、複数のテンプレートエンジンを同時に使用したりすることもできます.ここでは、Phalconに付属するvoltテンプレートエンジンについてのみ説明します.

Voltの有効化


他のテンプレートエンジンと同様に、voltテンプレートをviewsコンポーネントに登録し、テンプレートファイルの汎用接尾辞名を設定するか、標準化された接尾辞名.phtmlを直接使用して正常に使用する必要があります.
//    :Marser\App\Frontend\FrontendModule.php
$di->setShared('view', function () use ($config, $di) {
    $view = new \Phalcon\Mvc\View();
    //       
    $view->setViewsDir(ROOT_PATH . '/app/frontend/views/');
    //      
    $view->registerEngines(array(
        //       
        '.phtml' => function ($view, $di) use ($config) {
            $volt = new \Phalcon\Mvc\View\Engine\Volt($view, $di);
            $volt->setOptions(array(
                //        
                'compileAlways' => false,
                //      
                'compiledPath' => ROOT_PATH . '/app/cache/compiled/frontend'
            ));
            return $volt;
        },
    ));
    return $view;
});

使用法

voltテンプレートの基本的な使い方、変数、式、フローコントロールなどの部分の具体的な使い方は、ドキュメントに詳しく説明されています.Phalconドキュメントを直接めくって、多くの使い方や踏んだ穴を共有してください.

コントローラ指定テンプレート

    public function testAction(){
        $this->view->pick('view/test');
    }

へんすうでんち

    //      
    public function test2Action(){
        //setVar:        
        $this->view->setVar('test', 'hello world');

        //setVars:          
        //$this->view->setVars([
        //    'test' => 'hellow world',
        //]);
        $this->view->pick('view/test2');
    }

数値ループ(For)


Phalconドキュメントにはvoltテンプレートにおける のループ方式が記載されているが、数値ループの使い方を説明する明確な例はない.具体的な使い方は、次のサンプルコードを参照してください.
{% for i in 0..100 %}
  
{{i}}
{% endfor %}

コネクタ

voltテンプレートのコネクタは、.ではなく、+ではなく、~です.コードの例は次のとおりです.
  {{ url('user/detail?uid='~user['uid']) }}

テンプレートの継承


Phalconドキュメントには、非常に詳細な の使い方があります.ここでは、テンプレートを使用して継承する過程で踏んだ穴を共有します.

    
        {% block head %}
            
        {% endblock %}
    
    
        
{% block content %}
{% block subContent %}{% endblock %}
{% endblock %}

テンプレートのコンパイル中に、次のエラーメッセージが表示されます.
#      block     
Embedding blocks into other blocks is not supported

現在、公式にはサポートされていないため、テンプレート継承を使用する際には、blockブロックのネストの問題を回避することに特に注意する必要があります.

拡張テンプレート関数

voltテンプレートには、カスタム関数またはPHPに付属する他の関数を使用するには、voltテンプレートに関数を登録する必要がある一般的な基本関数がいくつか用意されています.まず、voltテンプレートベースクラスを定義し、 で関数を追加します.
//    :Marser\App\Core\PhalBaseVolt.php
use \Phalcon\Mvc\View\Engine\Volt;

class PhalBaseVolt extends Volt{

    /**
     *       
     */
    public function initFunction(){
        $compiler = $this->getCompiler();

        //   PHP   explode   
        $compiler -> addFunction('explode', 'explode');

        //       get_userinfo  
        //$resolvedArgs      ,       
        //        ,      return      string  ,        ,           (::)      
        $compiler -> addFunction('get_userinfo', function($resolvedArgs, $exprArgs) use ($compiler){
            return '\Marser\App\Libs\Test::get_userinfo(' . $resolvedArgs . ')';
        });
    }
}

カスタム関数get_userinfo()のコードは次のとおりです.
//    :Marser\App\Libs\Test.php
class Test {

    public function get_userinfo($username, $age, $mobile){
        return "   :{$username},   :{$age},     :{$mobile}";
    }
}

以上のコードにより,PHPが持つexplode()関数とプログラムでカスタマイズしたget_userinfo()関数をテンプレートコンパイラに追加した.
次に、DIに登録されているviewsオブジェクトを変更します.
        //    :Marser\App\Frontend\FrontendModule.php
        $di -> setShared('view', function() use($config) {
            $view = new \Phalcon\Mvc\View();
            #       
            $view -> setViewsDir(ROOT_PATH . '/app/frontend/views/');
            #      
            $view -> registerEngines(array(
                #       
                '.phtml' => function($view, $di) use($config) {
                    #   volt    
                    $volt = new \Marser\App\Core\PhalBaseVolt($view, $di);
                    #       
                    $volt -> setOptions(array(
                        #        
                        'compileAlways' => false,
                        #      
                        'compiledPath'  =>  ROOT_PATH . '/app/cache/compiled/frontend'
                    ));
                    #   !     ---        
                    $volt -> initFunction();
                    return $volt;
                },
            ));
            return $view;
        });

これで、explode()get_userinfo()の2つの関数がテンプレートに登録されました.では、どのように呼び出しますか?explode()テンプレートで呼び出されたサンプルコード:
{% set introArray = explode('-', intro) %}
{% for value in introArray %}
  
{{value}}
{% endfor %}

カスタム関数get_userinfo()がテンプレートで呼び出すコードの例:
  {{get_userinfo('admin', '20', '    ')}}

PHPが関数を持参しても、プログラムでカスタマイズした関数でも、関数定義時のパラメータ順にパラメータを渡すだけです.
上記のコードはgithubに管理されています.https://github.com/KevinJay/m...
最後に、QQグループの交流討論に参加することを歓迎します.
  • 広州PHPハイエンド交流群:158587573
  • Phalconプレイヤーグループ:150237524