Úprava Latte makra {bytes}

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
James
Člen | 54
+
0
-

Ahoj,

mám číselnou hodnotu, reprezentující velikost a potřeboval bych jí v šabloně naformátovat stejným způsobem jako to děla makro {bytes}, ale nikoliv na jednotky B, kB, MB atd. ale na jednotky KiB, MiB, kde není vyšší řád 1000× ale 1024× větší. Jde někde stávající makro {bytes} takto upravit, nebo vytvořit na základě této funkce makro nové.

Díky za radu.

sKopheK
Člen | 207
+
0
-

Udělej si vlastní makro, příklad:

namespace XYZ;

use Nette\Latte\MacroNode,
    Nette\Latte\PhpWriter;

class CustomMacros extends \Nette\Latte\Macros\MacroSet
{
    public static function install(\Nette\Latte\Compiler $compiler)
    {
        $set = new static($compiler);
        $set->addMacro('kibytes', callback($set, 'macroKibytes'), NULL, NULL);
    }

    public function macroKibytes(MacroNode $node, PhpWriter $writer)
    {
        $cmd = 'echo (%node.word / 1024) . "KiB"';
        return $writer->write($cmd);
    }
}

V config.neon:

common:
	nette:
		latte:
            		macros:
		                - XYZ\CustomFormMacros::install
mkoubik
Člen | 728
+
0
-

Na tohle by se asi víc hodil helper (filter).

James
Člen | 54
+
0
-

Vyřešil jsem to novou funkcí v knihovně Nette\Templating\Helpers.php

	public static function kibytes($kibytes, $precision = 2)
	{
		$kibytes = round($kibytes);
		$units = array('B', 'KiB', 'MiB', 'GiB', 'TiB', 'PiB');
		foreach ($units as $unit) {
			if (abs($kibytes) < 1024 || $unit === end($units)) {
				break;
			}
			$kibytes = $kibytes / 1024;
		}
		return round($kibytes, $precision) . ' ' . $unit;
	}
Oli
Člen | 1215
+
0
-

To ale není zrovna nejlepší řešení. Pokud budeš upgradovat Nette, tak o tuhle svou funkci přijdeš nebo ji budeš muset zase vložit… Lepší je připojit helper např v presenteru. Tady je popsáno jak na to.