Use php built-in functions & user-defined functions in Volt file of phalcon framework

雖說 phalcon 的 mvc 架構已經很方便了,可是有些情況如果可以在 volt (view)處理的話會方便許多,比方要將回傳的資料表格某欄位做處理才顯示,典型的例子是將 integer 資料用 bit string 的方式顯示。

方法有兩種,一個是在 service.php 中直接在 set view di 時加進去,例如下面的例子。

$di->set('view', function() use ($di) {
    $view = new \Phalcon\Mvc\View();
    $view->setViewsDir(__DIR__ . '/views/');
    $view->setLayoutsDir('/_layouts/');
    $view->setLayout('default');

    $view->registerEngines(['.phtml' => function($view, $di) {
        $volt = new \Phalcon\Mvc\View\Engine\Volt($view, $di);
        $options = [
            'compiledPath' => $di->getConfig()->site->path->cache . 'volt/backend/',
            'compiledExtension' => '.php',
            'compileAlways' => $di->getConfig()->debug,
        ];
        $volt->setOptions($options);

        // Extended functions
        $compiler = $volt->getCompiler();
        $compiler->addFunction('in_array', 'in_array');
        $compiler->addFunction('is_dir', 'is_dir');
        $compiler->addFunction('getimagesize', 'getimagesize');
        return $volt;
    }]);

    return $view;
});

這種方式很適合直接用在 php built-in functions 上頭,但是如果是要自己寫的東西,就沒那麼方便,而且會讓整個 service.php 變得很冗長。比較建議的方式是直接 di 一個自訂 class 進去,這樣簡潔許多。

/* service.php */
$di->set('StringFunctions', function() {
    return new \StringFunctions();
});


/* StringFunctions.php */
<?php

class StringFunctions extends \Phalcon\Tag
{
      public static function IntToBitString($a) 
      {
            return sprintf( "%08d", decbin( $a ));	
      }
}

/* in volt file */
{{ StringFunctions.IntToBitString(IntVariable) }}