View source
<?php
namespace Drupal\formatter_suite\Plugin\Field\FieldFormatter;
use Drupal\Core\Field\FieldItemListInterface;
use Drupal\Core\Field\FormatterBase;
use Drupal\Core\Form\FormStateInterface;
use Drupal\formatter_suite\Branding;
use Drupal\formatter_suite\Utilities;
class NumberWithBytesFormatter extends FormatterBase {
protected static function getKiloUnits() {
return [
1000 => t('Kilobytes, Megabytes, Gigabytes, etc.'),
1024 => t('Kibibytes, Mibibytes, Gibibytes, etc.'),
];
}
public static function defaultSettings() {
return array_merge([
'kunit' => 1000,
'fullWord' => FALSE,
'decimalDigits' => 2,
], parent::defaultSettings());
}
public function settingsSummary() {
$this
->sanitizeSettings();
$summary = [];
$summary[] = $this
->t('Sample: @value', [
'@value' => Utilities::formatBytes(1289748, $this
->getSetting('kunit'), $this
->getSetting('fullWord'), $this
->getSetting('decimalDigits')),
]);
switch ($this
->getSetting('kunit')) {
default:
case 1000:
if ($this
->getSetting('fullWord') === FALSE) {
$summary[] = $this
->t('KB, MB, GB, etc.');
}
else {
$summary[] = $this
->t('Kilobyte, Megabyte, Gigabyte, etc.');
}
break;
case 1024:
if ($this
->getSetting('fullWord') === FALSE) {
$summary[] = $this
->t('KiB, MiB, GiB, etc.');
}
else {
$summary[] = $this
->t('Kibibyte, Mebibyte, Gibibyte, etc.');
}
break;
}
return $summary;
}
protected function getDescription() {
return $this
->t("Formats a number as a quantity of bytes, simplifying the number and appending the appropriate suffix. Quantities can be reported in international standard <em>Kilobytes</em> (1000 bytes = 1 KB) or legacy <em>Kibibytes</em> (1024 bytes = 1 KiB).");
}
public function settingsForm(array $form, FormStateInterface $formState) {
$elements = parent::settingsForm($form, $formState);
$elements = Branding::addFieldFormatterBranding($elements);
$elements['#attached']['library'][] = 'formatter_suite/formatter_suite.fieldformatter';
$elements['description'] = [
'#type' => 'html_tag',
'#tag' => 'div',
'#value' => $this
->getDescription(),
'#weight' => -1000,
'#attributes' => [
'class' => [
'formatter_suite-settings-description',
],
],
];
$weight = 0;
$elements['kunit'] = [
'#title' => $this
->t('Bytes units'),
'#type' => 'select',
'#options' => $this
->getKiloUnits(),
'#default_value' => $this
->getSetting('kunit'),
'#weight' => $weight++,
'#wrapper_attributes' => [
'class' => [
'formatter_suite-number-with-bytes-kunit',
],
],
];
$elements['fullWord'] = [
'#title' => $this
->t('Use full words, not abbreviations (e.g. "Kilobyte" vs. "KB")'),
'#type' => 'checkbox',
'#default_value' => $this
->getSetting('fullWord'),
'#weight' => $weight++,
'#wrapper_attributes' => [
'class' => [
'formatter_suite-number-with-bytes-full-word',
],
],
];
$elements['decimalDigits'] = [
'#title' => $this
->t('Decimal digits'),
'#type' => 'number',
'#min' => 0,
'#max' => 3,
'#default_value' => $this
->getSetting('decimalDigits'),
'#weight' => $weight++,
'#wrapper_attributes' => [
'class' => [
'formatter_suite-number-with-bytes-decimal-digits',
],
],
];
return $elements;
}
protected function sanitizeSettings() {
$kunit = $this
->getSetting('kunit');
$fullWord = $this
->getSetting('fullWord');
$decimalDigits = $this
->getSetting('decimalDigits');
$defaults = $this
->defaultSettings();
$kunits = $this
->getKiloUnits();
if (empty($kunit) === TRUE || isset($kunits[$kunit]) === FALSE) {
$kunit = $defaults['kunit'];
$this
->setSetting('kunit', $kunit);
}
$fullWord = boolval($fullWord);
$this
->setSetting('fullWord', $fullWord);
$decimalDigits = intval($decimalDigits);
if ($decimalDigits < 0) {
$decimalDigits = 0;
}
elseif ($decimalDigits > 3) {
$decimalDigits = 3;
}
$this
->setSetting('decimalDigits', $decimalDigits);
}
public function viewElements(FieldItemListInterface $items, $langcode) {
if ($items
->isEmpty() === TRUE) {
return [];
}
$this
->sanitizeSettings();
$elements = [];
foreach ($items as $delta => $item) {
$elements[$delta] = [
'#markup' => Utilities::formatBytes($item->value, $this
->getSetting('kunit'), $this
->getSetting('fullWord'), $this
->getSetting('decimalDigits')),
];
}
return $elements;
}
}