2013-03-07 32 views
5

Tôi tự hỏi liệu có cách nào để xây dựng các kích thước tệp có thể đọc được bằng hệ thống khuôn mẫu Twig hay không. Nói rằng tôi có một cái gì đó như thế này trong mẫu của tôi:Kích thước tệp có thể đọc được với hệ thống khuôn mẫu Twig

<p>This limit is currently set to {{ maxBytes }}</p> 

Làm thế nào tôi có thể định dạng maxBytes để hiển thị một cái gì đó giống như 30 GB?

+1

Theo hiểu biết của tôi không có định nghĩa chức năng/bộ lọc để làm điều này. Giải pháp duy nhất của bạn là [mở rộng cành] (http://twig.sensiolabs.org/doc/advanced.html). – cheesemacfly

Trả lời

18

Có một vài cách bạn có thể thực hiện:

1) nhận tiện ích mở rộng Twig sẽ xử lý cho bạn. Một như thế này một: https://github.com/BrazilianFriendsOfSymfony/BFOSTwigExtensionsBundle

Khi được kích hoạt, bạn sẽ chỉ làm:

{{ maxBytes|bfos_format_bytes }} 

Và điều này sẽ cung cấp cho bạn những gì bạn muốn.

2) Bạn có thể tạo macro sẽ thực hiện việc này nếu bạn không muốn thêm toàn bộ tiện ích mở rộng. Điều đó sẽ giống như thế này:

{% macro bytesToSize(bytes) %} 
{% spaceless %} 
    {% set kilobyte = 1024 %} 
    {% set megabyte = kilobyte * 1024 %} 
    {% set gigabyte = megabyte * 1024 %} 
    {% set terabyte = gigabyte * 1024 %} 

    {% if bytes < kilobyte %} 
     {{ bytes ~ ' B' }} 
    {% elseif bytes < megabyte %} 
     {{ (bytes/kilobyte)|number_format(2, '.') ~ ' KB' }} 
    {% elseif bytes < gigabyte %} 
     {{ (bytes/megabyte)|number_format(2, '.') ~ ' MB' }} 
    {% elseif bytes < terabyte %} 
     {{ (bytes/gigabyte)|number_format(2, '.') ~ ' GB' }} 
    {% else %} 
     {{ (bytes/terabyte)|number_format(2, '.') ~ ' TB' }} 
    {% endif %} 
{% endspaceless %} 
{% endmacro %} 

Bạn có thể đọc thêm về nơi để đặt và làm thế nào để sử dụng các macro ở đây: http://twig.sensiolabs.org/doc/tags/macro.html

9

Hoặc, chỉ cần tạo phần mở rộng cành lá:

ByteConversionTwigExtension. php

<?php 
// src/AppBundle/Twig/Extension 

namespace AppBundle\Twig\Extension; 


class ByteConversionTwigExtension extends \Twig_Extension 
{ 


    /** 
    * Gets filters 
    * 
    * @return array 
    */ 
    public function getFilters() 
    { 
     return array(
      new \Twig_SimpleFilter('format_bytes', array($this, 'formatBytes')), 
     ); 
    }  

    public function getName() 
    { 
     return 'format_bytes'; 
    } 

    function formatBytes($bytes, $precision = 2) 
    { 
     $units = array('B', 'KB', 'MB', 'GB', 'TB'); 
     $bytes = max($bytes, 0); 
     $pow = floor(($bytes ? log($bytes) : 0)/log(1024)); 
     $pow = min($pow, count($units) - 1); 

     // Uncomment one of the following alternatives 
     $bytes /= pow(1024, $pow); 

     return round($bytes, $precision) . ' ' . $units[$pow]; 
    } 

} 

services.yml

parameters: 
    app.byte_conversion_twig_extension.twig.extension.class: AppBundle\Twig\Extension\ByteConversionTwigExtension 

services: 
    app.byte_conversion.twig.extension: 
     class: %app.byte_conversion_twig_extension.twig.extension.class% 
     tags: 
      - { name: twig.extension } 

Twigh mẫu:

{{ variable | format_bytes }} 
+0

Để đọc như hệ điều hành không sử dụng 1000 (KiB MiB GiB TiB) thay vì 1024 – Cassiano

+0

Lưu ý rằng KiB đề cập đến KibiByte 1 KiB = 1024 B và KB đề cập đến KiloByte là 1KB = 1000 byte. Kilo luôn là viết tắt của "nghìn lần" trong đơn vị hệ thống quốc tế. Mặt khác, nhiều nhà phát triển phần mềm (ngay cả trong hệ điều hành cũng knonw) trộn tất cả các đơn vị đề tài mà không có bất kỳ liên quan đến định nghĩa được chấp nhận. –

Các vấn đề liên quan