Для форматирования вывода Yii предоставляет класс, преобразующий данные в человеко-понятный формат.
yii\i18n\Formatter это класс-помощник, который зарегистрирован как
компонент приложения, по умолчанию под именем formatter
.
Он предоставляет набор методов для форматирования таких данных как дата/время, числа и другие часто используемые в целях локализации форматы. Formatter может быть использован двумя различными способами.
Напрямую, используя методы форматирования (все методы форматирования имеют префикс as
):
echo Yii::$app->formatter->asDate('2014-01-01', 'long'); // выведет: January 1, 2014
echo Yii::$app->formatter->asPercent(0.125, 2); // выведет: 12.50%
echo Yii::$app->formatter->asEmail('cebe@example.com'); // выведет: <a href="mailto:cebe@example.com">cebe@example.com</a>
echo Yii::$app->formatter->asBoolean(true); // выведет: Yes
// он также умеет отображать null значения:
echo Yii::$app->formatter->asDate(null); // выведет: (not set)
Используя метод format() и имя формата. Этот метод также используется в виджетах наподобие yii\grid\GridView и yii\widgets\DetailView, в которых вы можете задать формат отображения данных в колонке через конфигурацию виджета.
echo Yii::$app->formatter->format('2014-01-01', 'date'); // выведет: January 1, 2014
// вы также можете использовать массивы для настроек метода форматирования:
// `2` это значение для $decimals параметра метода asPercent().
echo Yii::$app->formatter->format(0.125, ['percent', 2]); // выведет: 12.50%
Все данные, отображаемые через компонент formatter, будут локализованы, если расширение PHP intl было установлено. Для этого вы можете настроить свойство locale. Если оно не было настроено, то в качестве локали будет использован язык приложения. Подробнее смотрите в разделе «интернационализация». Компонент форматирования будет выбирать корректный формат для даты и чисел в соответствии с локалью, включая имена месяцев и дней недели, переведённые на текущий язык. Форматирование дат также зависит от часового пояса, который будет взят из одноимённого свойства timeZone приложения, если не был задан явно. В свою очередь timeZone устанавливает / читает временную зону PHP.
Например, форматирование даты, вызванное с разной локалью, отобразит разные результаты::
Yii::$app->formatter->locale = 'en-US';
echo Yii::$app->formatter->asDate('2014-01-01'); // выведет: January 1, 2014
Yii::$app->formatter->locale = 'de-DE';
echo Yii::$app->formatter->asDate('2014-01-01'); // выведет: 1. January 2014
Yii::$app->formatter->locale = 'ru-RU';
echo Yii::$app->formatter->asDate('2014-01-01'); // выведет: 1 января 2014 г.
Обратите внимание, что форматирование может различаться между различными версиями библиотеки ICU, собранных с PHP, а также на основе того установлено ли расширение PHP intl или нет. Таким образом, чтобы гарантировать, что ваш сайт будет одинаково отображать данные во всех окружениях рекомендуется установить расширение PHP intl во всех окружениях и проверить, что версия библиотеки ICU совпадает. См. также: Настройка PHP окружения для интернационализации.
Отметим также, что даже если установлено расширение PHP intl, форматирование даты и времени для значений года >=2038 или <=1901 на 32-ух разрядных системах будет обращаться к реализации PHP, которая не обеспечивает локализованные имена месяца и дня, потому что в этом случае intl будет использовать 32-ух битный UNIX timestamp. На 64-битной системе intl formatter будет работать во всех случаях, если, конечно, intl был установлен.
Форматы по умолчанию, используемые в методах форматирования, можно настраивать через свойства
класса форматирования. Вы можете задать форматирование по умолчанию для всего приложения, настроив
компонент formatter
в вашей конфигурации приложения. Ниже
приведён пример конфигурации. Чтобы узнать больше о доступных свойствах см. API документацию к классу Formatter
и следующие подсекции.
'components' => [
'formatter' => [
'dateFormat' => 'dd.MM.yyyy',
'decimalSeparator' => ',',
'thousandSeparator' => ' ',
'currencyCode' => 'EUR',
],
],
Класс форматирования предоставляет различные методы для форматирования значений даты и времени. Например:
January 01, 2014
.14:23
.January 01, 2014 14:23
.1412609982
.1 час назад
.1 день, 2 минуты
.Форматирование даты и времени для методов date, time и datetime может быть задано глобально через конфигурацию свойств форматирования $dateFormat, $timeFormat и $datetimeFormat.
По умолчанию, форматирование использует сокращенный формат, который интерпретируется по-разному в зависимости от активной в данный момент локали. Поэтому дата и время будут отформатированы наиболее часто используемым способом в стране и языке пользователя. Доступны 4 разных сокращенных формата:
short
в локали en_GB
отобразит, например, 06/10/2014
для даты и 15:58
для времени, в то время какmedium
будет отображать 6 Oct 2014
и 15:58:42
соответственно,long
будет отображать 6 October 2014
и 15:58:42 GMT
соответственно иfull
будет отображать Monday, 6 October 2014
и 15:58:42 GMT
соответственно.Дополнительно вы можете задать специальный формат, используя синтаксис, заданный ICU Project,
который описан в руководстве ICU по следующему адресу:
https://unicode-org.github.io/icu/userguide/format_parse/datetime/. Также вы можете использовать синтаксис, который распознаётся
PHP-функцией date(), используя строку с префиксом php:
.
// ICU форматирование
echo Yii::$app->formatter->asDate('now', 'yyyy-MM-dd'); // 2014-10-06
// PHP date() форматирование
echo Yii::$app->formatter->asDate('now', 'php:Y-m-d'); // 2014-10-06
Для форматирования значений даты и времени Yii будет преобразовывать их в соответствии с настроенным часовым поясом. Поэтому предполагается, что входные значения будут в UTC, если часовой пояс не был указан явно. По этой причине рекомендуется хранить все значения даты и времени в формате UTC, предпочтительно в виде UNIX timestamp, которая всегда в часовом поясе UTC по определению. Если входное значение находится в часовом поясе, отличном от UTC, часовой пояс должен быть указан явно, как в следующем примере:
// при условии Yii::$app->timeZone = 'Europe/Berlin';
echo Yii::$app->formatter->asTime(1412599260); // 14:41:00
echo Yii::$app->formatter->asTime('2014-10-06 12:41:00'); // 14:41:00
echo Yii::$app->formatter->asTime('2014-10-06 14:41:00 CEST'); // 14:41:00
Если часовой пояс форматтера не задан явно, используется часовой пояс приложения, то есть тот же, что задан в конфигурации PHP.
Примечание: Поскольку правила для часовых поясов принимаются различными правительствами и могут часто меняться, вероятно, информация в базе данных часовых поясов на вашем сервере не самая свежая. Как обновить базу вы можете узнать из руководства ICU. Смотрите также: Настройка вашего PHP окружения для интернационализации.
Для форматирования числовых значений класс форматирования предоставляет следующие методы:
42
.2,542.123
или 2.542,123
.42%
.4.2E4
.£420.00
.
Обратите внимание, чтобы эта функция работала правильно, локаль должна включать в себя часть со страной, например: en_GB
или en_US
(потому что указание только языка будет неоднозначным в этом случае).410 kibibytes
.410 KiB
.Форматирование чисел может быть скорректировано с помощью дробного разделителя и тысячного разделителя, которые были заданы в соответствии с локалью.
Для более сложной конфигурации 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 предоставляет набор других полезных средств форматирования для различных ситуаций:
null
, которые будет отформатированы в соответствии с nullDisplay.<p>
теги.['html', ['Attr.AllowedFrameTargets' => ['_blank']]]
.mailto
.true
будет
отображено как Yes
и false
как No
, переведенное на язык приложения. Вы можете настроить это через свойство
yii\i18n\Formatter::$booleanFormat.null
значения ¶Для значений null
в PHP класс форматирования будет отображать вместо пустой строки маркер, по умолчанию это
(not set)
, переведенный на язык приложения. Вы можете настроить свойство nullDisplay
для установки собственного маркера. Если вы не хотите обрабатывать null
значения, то установите свойство
nullDisplay в null
.
Found a typo or you think this page needs improvement?
Edit it on github !
Signup or Login in order to comment.