2012-12-28 37 views
7

Làm cách nào để thiết lập chức năng do người dùng xác định trong Volt? Ví dụ tôi muốn gọi một chức năng mà có thể dịch các chuỗi trong quan điểm của tôi như vậy:Làm cách nào để thiết lập chức năng do người dùng xác định trong Volt (Phalcon)

<div class='page-header'> 
    <h2>{{ tr('session_login_title') }}</h2> 
</div> 

và tôi muốn tr để ánh xạ một hàm \My\Locale::translate($key)

Trả lời

14

chức năng Volt đóng vai trò thay thế chuỗi và không thực sự gọi hàm cơ bản. Volt dịch hàm thành chuỗi có liên quan mà ngược lại được PHP giải thích.

Giả sử bạn có một lớp Locale trong đó có một phương pháp translate như vậy:

public static function translate() 
{ 
    $return = ''; 

    if (isset(self::$_phrases[$key])) 
    { 
     $return = self::$_phrases[$key]; 
    } 

    return $return; 
} 

Phương pháp này sử dụng các mảng nội $_phrases để tìm chìa khóa có liên quan mà bạn vượt qua và trở về nội dung của cụm từ mà bạn muốn. Nếu không tìm thấy nó trả về một chuỗi rỗng.

Bây giờ, chúng ta cần phải đăng ký hàm trong Volt.

$di->set(
     'volt', 
     function($view, $di) use($config) 
     { 
      $volt = new \Phalcon\Mvc\View\Engine\Volt($view, $di); 
      $volt->setOptions(
       array(
        'compiledPath'  => $config->app_volt->path, 
        'compiledExtension' => $config->app_volt->extension, 
        'compiledSeparator' => $config->app_volt->separator, 
        'stat'    => (bool) $config->app_volt->stat, 
       ) 
      ); 
      $volt->getCompiler()->addFunction(
       'tr', 
       function($key) 
       { 
        return "\\My\\Locale::translate({$key})"; 
       } 
      ); 

      return $volt; 
     }, 
     true 
    ); 

Lưu ý cách đăng ký tr. Nó trả về một chuỗi \My\Locale::translate({$key}) với thông số $key đã qua. Cú pháp Volt này sẽ được dịch sang các chỉ thị PHP và được thực hiện bởi PHP. Vì vậy chuỗi xem:

<div class='page-header'> 
    <h2>{{ tr('session_login_title') }}</h2> 
</div> 

sau Volt xử lý nó trở thành:

<div class='page-header'> 
    <h2><?php echo \My\Locale::translate('session_login_title') ?></h2> 
</div> 
Các vấn đề liên quan