Чтобы отображать данные в более читаемом формате для пользователей, вы можете отформатировать их с помощью компонента приложения formatter
. По умолчанию форматтер реализуется yii\i18n\Formatter
, который предоставляет набор методов для форматирования данных в виде даты/времени, чисел, валют и других часто используемых форматов. Вы можете использовать форматтер следующим образом:
$formatter = \Yii::$app->formatter;
// output: January 1, 2014
echo $formatter->asDate('2014-01-01', 'long');
// output: 12.50%
echo $formatter->asPercent(0.125, 2);
// output: <a href="mailto:cebe@example.com">cebe@example.com</a>
echo $formatter->asEmail('cebe@example.com');
// output: Yes
echo $formatter->asBoolean(true);
// it also handles display of null values:
// output: (not set)
echo $formatter->asDate(null);
Как вы можете видеть, все эти методы называются asXyz()
, где Xyz означает поддерживаемый формат. Кроме того, вы можете форматировать данные с помощью универсального метода format(), который позволяет вам программно управлять желаемым форматом и обычно используется виджетами, такими как yii\grid\GridView
и yii\widgets\DetailView
. Например:
// output: January 1, 2014
echo Yii::$app->formatter->format('2014-01-01', 'date');
// you can also use an array to specify parameters for the format method:
// `2` is the value for the $decimals parameter of the asPercent()-method.
// output: 12.50%
echo Yii::$app->formatter->format(0.125, ['percent', 2]);
Настройка форматирования
Вы можете настроить правила форматирования, настроив компонент formatter
в конфигурации приложения. Например:
return [
'components' => [
'formatter' => [
'dateFormat' => 'dd.MM.yyyy',
'decimalSeparator' => ',',
'thousandSeparator' => ' ',
'currencyCode' => 'EUR',
],
],
];
Форматирование даты и времени
formatter поддерживает следующие выходные форматы, связанные с датой и временем:
date
: значение отформатировано как дата, например. 01 января 2014 года.time
: значение отформатировано как время, например. 14:23.datetime
:значение отформатировано как дата и время, например. 01 января 2014 г. 14:23.relativeTime
: значение форматируется как временной интервал между датой и теперь в удобочитаемой форме человека, например. 1 час назад.duration
: значение форматируется как продолжительность в удобочитаемом формате. например 1 день, 2 минуты.
Форматы даты и времени по умолчанию, используемые для методов даты, времени и даты и времени, можно настраивать глобально путем настройки
dateFormat
, timeFormat
и datetimeFormat
.
Вы можете указать форматы даты и времени, используя синтаксис ICU. Вы также можете использовать синтаксис PHP date()
с префиксом php: чтобы отличить его от синтаксиса ICU. Например:
// ICU format
echo Yii::$app->formatter->asDate('now', 'yyyy-MM-dd'); // 2014-10-06
// PHP date()-format
echo Yii::$app->formatter->asDate('now', 'php:Y-m-d'); // 2014-10-06
При работе с приложениями, которые должны поддерживать несколько языков, вам часто нужно указывать разные форматы даты и времени для разных языков. Для упрощения этой задачи вы можете использовать сокращенные форматы (например, long, short). formatter преобразует формат быстрого доступа в подходящий формат в соответствии с текущей активной локалью. Поддерживаются следующие сочетания клавиш (в примерах предполагается, что en_GB является активной локалью):
short
: выведет 06/10/2014 for date and 15:58 for time;medium
: выведет 6 Oct 2014 and 15:58:42;long
: выведет 6 October 2014 and 15:58:42 GMT;full
: выведет Monday, 6 October 2014 and 15:58:42 GMT.
Часовые пояса
При форматировании значений даты и времени Yii преобразует их в целевой часовой пояс. Предполагается, что форматируемое значение находится в UTC, если только часовой пояс не задан явно, или вы не настроили yii\i18n\Formatter::$defaultTimeZone
.
В следующих примерах мы предполагаем, что целевой часовой пояс установлен как Europe/Berlin.
// formatting a UNIX timestamp as a time
echo Yii::$app->formatter->asTime(1412599260); // 14:41:00
// formatting a datetime string (in UTC) as a time
echo Yii::$app->formatter->asTime('2014-10-06 12:41:00'); // 14:41:00
// formatting a datetime string (in CEST) as a time
echo Yii::$app->formatter->asTime('2014-10-06 14:41:00 CEST'); // 14:41:00
Форматирование чисел
Форматирование поддерживает следующие выходные форматы, связанные с номерами:
integer
: значение отформатировано как целое число, например. 42.decimal
: значение отформатировано как десятичное число с учетом десятичной и тысячи разделителей, например. 2,542,123 или 2,542,123.percent
: значение отформатировано как процентное число, например. 42%.scientific
: значение отформатировано как число в научном формате, например. 4.2E4.currency
: значение отформатировано как значение валюты, например. 420,00 фунтов стерлингов. Обратите внимание, что для правильной работы этой функции языковой стандарт должен содержать элемент country, например. En_GB или en_US, поскольку в этом случае язык будет только двусмысленным.size
: значение, которое является числом байтов, отформатировано как человеческий считываемый размер, например. 410 килобайт.shortSize
: короткая версия размера, например. 410 KiB.
Формат форматирования чисел можно настроить с помощью decimalSeparator
и thousandSeparator
, каждый из которых принимает значения по умолчанию в соответствии с активной локалью.
Для более сложной конфигурации можно использовать классы yii\i18n\Formatter::$numberFormatterOptions
и yii\i18n\Formatter::$numberFormatterTextOptions
для настройки класса NumberFormatter, используемого внутри для реализации форматирования. Например, чтобы скорректировать максимальное и минимальное значение цифр дроби, вы можете настроить свойство yii\i18n\Formatter::$numberFormatterOptions
следующим образом:
'numberFormatterOptions' => [
NumberFormatter::MIN_FRACTION_DIGITS => 0,
NumberFormatter::MAX_FRACTION_DIGITS => 2,
]
Другие форматы
Помимо формата даты/времени и количества, Yii также поддерживает другие часто используемые форматы, включая:
raw
: значение выводится как есть, это псевдоформат, который не имеет никакого эффекта за исключением того, что значения NULL будут отформатированы с использованием nullDisplay.text
: значение в HTML-кодировке. Это формат по умолчанию, используемый в GridView DataColumn.ntext
: значение форматируется в виде открытого текста в формате HTML с переводом строк в разделители строк.paragraphs
: значение форматируется в виде HTML-кодированных абзацев текста, упакованных в теги <p>.html
: значение очищается с помощью HtmlPurifier, чтобы избежать XSS-атак. Вы можете передать дополнительные параметры, такие как['html', ['Attr.AllowedFrameTargets' => ['_blank']]].
email
: значение форматируется как mailto-link.image
: значение форматируется как тег изображения.url
: значение форматируется как гиперссылка.boolean
: значение форматируется как логическое значение. По умолчанию true передается как Yes, а false - No, переведенный на текущий язык приложения. Это можно настроить, настроив свойствоyii\i18n\Formatter::$booleanFormat
.
Нулевые значения
Нулевые значения специально отформатированы. Вместо того, чтобы отображать пустую строку, форматтер преобразует ее в предустановленную строку, которая по умолчанию (not set) транслируется в текущий язык приложения. Вы можете настроить свойство nullDisplay для настройки этой строки.
Локализация формата данных
Как уже упоминалось, форматтер может использовать активный язык в настоящее время, чтобы определить, как форматировать значение, подходящее для целевой страны/региона. Например, одно и то же числовое значение может быть отформатировано по-разному для разных локалей:
Yii::$app->formatter->locale = 'en-US';
echo Yii::$app->formatter->asDate('2014-01-01'); // output: January 1, 2014
Yii::$app->formatter->locale = 'de-DE';
echo Yii::$app->formatter->asDate('2014-01-01'); // output: 1. Januar 2014
Yii::$app->formatter->locale = 'ru-RU';
echo Yii::$app->formatter->asDate('2014-01-01'); // output: 1 января 2014 г.
По умолчанию активная в данный момент локаль определяется значением yii\base\Application::$language
. Вы можете переопределить его, указав свойство yii\i18n\Formatter::$locale
явно.
0 комментариев