2013-03-07 10 views
5

Mi chiedo se ci sia un modo integrato per produrre file di dimensioni leggibili con il sistema di templatura Twig. Dire che ho qualcosa di simile nel mio modello:Dimensioni del file leggibili con il sistema di templatura Twig

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

Come potrei formattare maxBytes per visualizzare qualcosa come 30 GB?

+1

A mia conoscenza non esiste una funzione/filtro definito per fare questo. La tua unica soluzione è [estendi il ramoscello] (http://twig.sensiolabs.org/doc/advanced.html). – cheesemacfly

risposta

18

ci sono un paio di modi si può fare per realizzare che:

1) ottenere un'estensione Twig che gestirà per voi. Uno come questo: https://github.com/BrazilianFriendsOfSymfony/BFOSTwigExtensionsBundle

Una volta abilitato si dovrebbe solo fare:

{{ maxBytes|bfos_format_bytes }} 

E questo vi darà quello che vuoi.

2) È possibile creare una macro che verrà eseguita se non si desidera aggiungere un'intera estensione. Che sarebbe simile a questa:

{% 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 %} 

Si può leggere di più su dove mettere e come utilizzare le macro qui: http://twig.sensiolabs.org/doc/tags/macro.html

9

Oppure, semplicemente creare l'estensione ramoscello:

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 modello:

{{ variable | format_bytes }} 
+0

Da leggere come OS utilizza 1000 (KiB MiB GiB TiB) anziché 1024 – Cassiano

+0

Attenzione che KiB si riferisce a KibiByte 1 KiB = 1024 B e KB si riferisce a KiloByte come 1KB = 1000 byte. Kilo è sempre sinonimo di "tempi mille" nell'unità di sistema internazionale. D'altra parte, molti sviluppatori di software (anche in SO ben conosciuto) mescolano tutte le unità senza alcun riguardo per la definizione accettata. –

Problemi correlati