Для форматирования вывода Yii предоставляет класс, преобразующий данные в человекопонятный формат.
Для форматирования вывода Yii предоставляет класс, преобразующий данные в человеко-понятный формат.
[[yii\i18n\Formatter]] это класс-помощник, который зарегистрирован как
[компонент приложения](structure-application-components.md), по умолчанию под именем `formatter`.
@ -9,7 +9,7 @@
локализации форматы.
Formatter может быть использован двумя различными способами.
1. Напрямую используя методы форматирования (все методы форматирования имеют префикс `as`):
1. Напрямую, используя методы форматирования (все методы форматирования имеют префикс `as`):
```php
echo Yii::$app->formatter->asDate('2014-01-01', 'long'); // выведет: January 1, 2014
@ -21,7 +21,7 @@ Formatter может быть использован двумя различны
```
2. Используя метод [[yii\i18n\Formatter::format()|format()]] и имя формата.
Этот метод также используется в виджетах на подобии [[yii\grid\GridView]] и [[yii\widgets\DetailView]], в которых
Этот метод также используется в виджетах наподобие [[yii\grid\GridView]] и [[yii\widgets\DetailView]], в которых
вы можете задать формат отображения данных в колонке через конфигурацию виджета.
```php
@ -36,7 +36,7 @@ Formatter может быть использован двумя различны
[[yii\i18n\Formatter::locale|locale]]. Если оно не было настроено, то в качестве локали будет использован
[[yii\base\Application::language|язык приложения]]. Подробнее смотрите в разделе «[интернационализация](tutorial-i18n.md)».
Компонент форматирования будет выбирать корректный формат для даты и чисел в соответствии с локалью, включая имена
месяцев и дней недели, переведённые на текущий язык.
месяцев и дней недели, переведённые на текущий язык.
Форматирование дат также зависит от [[yii\i18n\Formatter::timeZone|часового пояса]], который будет взят из одноимённого свойства [[yii\base\Application::timeZone|timeZone]] приложения, если не был задан явно. В свою очередь [[yii\base\Application::timeZone|timeZone]] устанавливает / читает временную зону PHP.
Например, форматирование даты, вызванное с разной локалью, отобразит разные результаты::
Этот раздел расскажет о том, как создать новую страницу, отображающую данные по странам, полученные из таблицы `countries` базы данных. Для достижения этой цели вам будет необходимо настроить подключение к базе данных, создать класс [Active Record](db-active-record.md), определить [action](structure-controllers.md), и создать [view](structure-views.md).
Этот раздел расскажет о том, как создать новую страницу, отображающую данные по странам, полученные из таблицы `countries` базы данных. Для достижения этой цели вам будет необходимо настроить подключение к базе данных, создать класс [Active Record](db-active-record.md), определить [action](structure-controllers.md) и создать [view](structure-views.md).
Изучив эту часть, вы научитесь:
* Настраивать подключение к БД
* Определять класс Active Record
* Запрашивать данные, используя класс Active Record
* Отображать данные во view с использованием пагинации
* Настраивать подключение к БД.
* Определять класс Active Record.
* Запрашивать данные, используя класс Active Record.
* Отображать данные во view с использованием пагинации.
Обратите внимание, чтобы усвоить этот раздел, вы должны иметь базовые знания и навыки использования баз данных.
В частности, вы должны знать, как создать базу данных, и как выполнять SQL запросы, используя клиентские инструменты для работы с БД.
В частности, вы должны знать, как создать базу данных и как выполнять SQL запросы, используя клиентские инструменты для работы с БД.
Подготавливаем базу данных <spanid="preparing-database"></span>
Для начала, создайте базу данных под названием `yii2basic`, из которой вы будете получать данные в вашем приложении.
Для начала создайте базу данных под названием `yii2basic`, из которой вы будете получать данные в вашем приложении.
Вы можете создать базу данных SQLite, MySQL, PostgreSQL, MSSQL или Oracle, так как Yii имеет встроенную поддержку для многих баз данных. Для простоты, в дальнейшем описании будет подразумеваться MySQL.
После этого создайте в базе данных таблицу `country`, и добавьте в неё немного демонстрационных данных. Вы можете запустить следующую SQL инструкцию, чтобы сделать это:
После этого создайте в базе данных таблицу `country` и добавьте в неё немного демонстрационных данных. Вы можете запустить следующую SQL инструкцию, чтобы сделать это:
```sql
CREATE TABLE `country` (
@ -40,12 +40,12 @@ INSERT INTO `country` VALUES ('RU','Russia',146519759);
INSERT INTO `country` VALUES ('US','United States',322976000);
```
На данный момент у вас есть база данных под названием `yii2basic`, и внутри неё таблица `country` с тремя столбцами, содержащими десять строк данных.
На данный момент у вас есть база данных под названием `yii2basic` и внутри неё таблица `country` с тремя столбцами, содержащими десять строк данных.
Настраиваем подключение к БД <spanid="configuring-db-connection"></span>
Перед продолжением убедитесь, что у вас установлены PHP-расширение [PDO](http://www.php.net/manual/en/book.pdo.php) и драйвер PDO для используемой вами базы данных (н-р`pdo_mysql` для MySQL). Это базовое требование в случае использования вашим приложением реляционной базы данных.
Перед продолжением убедитесь, что у вас установлены PHP-расширение [PDO](http://php.net/manual/ru/book.pdo.php) и драйвер PDO для используемой вами базы данных (например,`pdo_mysql` для MySQL). Это базовое требование в случае использования вашим приложением реляционной базы данных.
После того, как они установлены, откройте файл `config/db.php` и измените параметры на верные для вашей базы данных. По умолчанию этот файл содержит следующее:
```php
@ -60,7 +60,7 @@ return [
];
```
Файл `config/db.php`- типичный [конфигурационный](concept-configurations.md) инструмент, базирующийся на файлах. Данный конфигурационный файл определяет параметры, необходимые для создания и инициализации экземпляра [[yii\db\Connection]], через который вы можете делать SQL запросы к подразумеваемой базе данных.
Файл `config/db.php`— типичный [конфигурационный](concept-configurations.md) инструмент, базирующийся на файлах. Данный конфигурационный файл определяет параметры, необходимые для создания и инициализации экземпляра [[yii\db\Connection]], через который вы можете делать SQL запросы к подразумеваемой базе данных.
Подключение к БД, настроенное выше, доступно в коде приложения через выражение `Yii::$app->db`.
@ -77,9 +77,9 @@ return [
Создаём потомка Active Record <spanid="creating-active-record"></span>
Чтобы представлять и получать данные из таблицы `country`, создайте класс - потомок [Active Record](db-active-record.md), под названием `Country`, и сохраните его в файле `models/Country.php`.
Чтобы представлять и получать данные из таблицы `country`, создайте класс — потомок [Active Record](db-active-record.md), под названием `Country` и сохраните его в файле `models/Country.php`.
```php
<?php
@ -95,7 +95,7 @@ class Country extends ActiveRecord
Класс `Country` наследуется от [[yii\db\ActiveRecord]]. Вам не нужно писать ни строчки кода внутри него! С кодом, приведённым выше, Yii свяжет имя таблицы с именем класса.
> Info: Если нет возможности задать прямой зависимости между именем таблицы и именем класса, вы можете переопределить
> Info: Если нет возможности задать прямую зависимость между именем таблицы и именем класса, вы можете переопределить
метод [[yii\db\ActiveRecord::tableName()]], чтобы явно задать имя связанной таблицы.
Используя класс `Country`, вы можете легко манипулировать данными в таблице `country`, как показано в этих фрагментах:
@ -117,12 +117,12 @@ $country->name = 'U.S.A.';
$country->save();
```
> Info: Active Record - мощный способ доступа и манипулирования данными БД в объектно-ориентированном стиле.
> Info: Active Record — мощный способ доступа и манипулирования данными БД в объектно-ориентированном стиле.
Вы можете найти подробную информацию в разделе [Active Record](db-active-record.md). В качестве альтернативы, вы также можете взаимодействовать с базой данных, используя более низкоуровневый способ доступа, называемый [Data Access Objects](db-dao.md).
Создаём Action <spanid="creating-action"></span>
------------------
-------------------------------------------------
Для того, чтобы показать данные по странам конечным пользователям, вам надо создать новый action. Вместо размещения нового action'a в контроллере `site`, как вы делали в предыдущих разделах, будет иметь больше смысла создать новый контроллер специально для всех действий, относящихся к данным по странам. Назовите новый контроллер `CountryController`, и создайте action `index` внутри него, как показано ниже.
@ -169,7 +169,7 @@ Action `index` вызывает `Country::find()`. Данный метод Activ
В конце кода action `index` выводит view с именем `index`, и передаёт в него данные по странам вместе c информацией о пагинации.
Создаём View <spanid="creating-view"></span>
---------------
---------------------------------------------
Первым делом создайте поддиректорию с именем `country` внутри директории `views`. Эта папка будет использоваться для хранения всех view, выводимых контроллером `country`. Внутри директории `views/country` создайте файл с именем `index.php`, содержащий следующий код:
За кадром, [[yii\data\Pagination|Pagination]] предоставляет всю необходимую функциональность для постраничной разбивки набора данных:
За кадром [[yii\data\Pagination|Pagination]] предоставляет всю необходимую функциональность для постраничной разбивки набора данных:
* В начале [[yii\data\Pagination|Pagination]] показывает первую страницу, которая отражает SELECT запрос стран с параметрами `LIMIT 5 OFFSET 0`. Как результат, первые пять стран будут получены и отображены.
* Виджет [[yii\widgets\LinkPager|LinkPager]] выводит кнопки страниц используя URL'ы, созданные [[yii\data\Pagination::createUrl()|Pagination]]. Эти URL'ы будут содержать параметр запроса `page`, который представляет различные номера страниц.
* Если вы кликните по кнопке "2", сработает и обработается новый запрос для маршрута `country/index`. Таким образом новый запрос стран будет иметь параметры `LIMIT 5 OFFSET 5` и вернет следующие пять стран для отображения.
Заключение <spanid="summary"></span>
-------
-------------------------------------
В этом разделе вы научились работать с базой данных. Также вы научились получать и отображать данные с постраничной разбивкой с помощью [[yii\data\Pagination]] и [[yii\widgets\LinkPager]].
В следующем разделе вы научитесь использовать мощный инструмент генерации кода, называемый [Gii](start-gii.md), чтобы с его помощью быстро осуществлять некоторые часто используемые функции, такие, как операции Create-Read-Update-Delete (CRUD) для работы с данными в таблице базы данных. На самом деле код, который вы только что написали, в Yii может быть полностью сгенерирован автоматически с использованием Gii.
В следующем разделе вы научитесь использовать мощный инструмент генерации кода, называемый [Gii](start-gii.md), чтобы с его помощью быстро осуществлять некоторые часто используемые функции, такие как операции Create-Read-Update-Delete (CRUD) для работы с данными в таблице базы данных. На самом деле код, который вы только что написали, в Yii может быть полностью сгенерирован автоматически с использованием Gii.
В Yii приложении определены два языка: [[yii\base\Application::$sourceLanguage|исходный язык]] и [[yii\base\
Application::$language|язык перевода]].
В Yii приложении определены два языка: [[yii\base\Application::$sourceLanguage|исходный язык]] и [[yii\base\Application::$language|язык перевода]].
На "исходном языке" написаны сообщения в коде приложения. Если мы определяем исходным языком английский, то
в коде можно использовать конструкцию:
@ -36,7 +35,7 @@ return [
]
```
> Tip: значение по умолчанию для [[yii\base\Application::$sourceLanguage|исходного языка]] - английский.
> Tip: значение по умолчанию для [[yii\base\Application::$sourceLanguage|исходного языка]] — английский.
Вы можете установить значение текущего языка в самом приложении в соответствии с языком, который выбрал пользователь.
Это необходимо сделать до того, как будет сгенерирован какой-либо вывод, чтобы не возникло проблем с его
@ -46,21 +45,21 @@ return [
\Yii::$app->language = 'ru-RU';
```
Формат для установки языка/локали: `ll-CC`, где `ll`- это двух или трёхбуквенный код языка в нижнем регистре в
соответствии со стандартом [ISO-639](http://www.loc.gov/standards/iso639-2/), а `CC`- это код страны в соответствии
со стандартом [ISO-3166](http://www.iso.org/iso/en/prods-services/iso3166ma/02iso-3166-code-lists/list-en1.html).
Формат для установки языка/локали: `ll-CC`, где `ll`— это двух или трёхбуквенный код языка в нижнем регистре в
соответствии со стандартом [ISO-639](http://www.loc.gov/standards/iso639-2/), а `CC`— это код страны в соответствии
со стандартом [ISO-3166](https://ru.wikipedia.org/wiki/ISO_3166-1#Список_кодов_по_ISO_3166).
> Note: больше информации о синтаксисе и концепции локалей можно получить в [документации проекта ICU](http://userguide.icu-project.org/locale#TOC-The-Locale-Concept).
Перевод сообщений
-----------------
Перевод сообщений<spanid="message-translation"></span>
В приведённой конфигурации, `app*`- это шаблон, который определяет, какие категории обрабатываются источником. В нашем
случае, мы обрабатываем все, что начинается с `app`. Файлы с сообщениями находятся в `@app/messages` (папке `messages`
В приведённой конфигурации, `app*`— это шаблон, который определяет, какие категории обрабатываются источником. В нашем
случае мы обрабатываем все, что начинается с `app`. Файлы с сообщениями находятся в `@app/messages` (папке `messages`
в вашем приложении). Массив [[yii\i18n\PhpMessageSource::fileMap|fileMap]] определяет, какой файл будет подключаться для
определённой категории. Если вы не хотите конфигурировать `fileMap`, можно положиться на соглашение, что название
категории является именем файла. Например, категория `app/error` относится к файлу `app/error.php` в рамках [[yii\i18n\PhpMessageSource::basePath|basePath]].
Переводя сообщение `\Yii::t('app', 'This is a string to translate!')` при установленном языке приложения `ru-RU`, Yii
сначала будет искать файл `@app/messages/ru-RU/app.php`, чтобы получить список доступных переводов. Если есть файл
`ru-RU`, Yii также попробует поискать `ru` перед тем, как примет решение, что попытка перевода не удалась.
сначала будет искать файл `@app/messages/ru-RU/app.php`, чтобы получить список доступных переводов. Если такого файла нет в папке
`ru-RU`, Yii также попробует поискать в папке `ru` перед тем, как примет решение, что попытка перевода не удалась.
Кроме хранения в PHP-файлах (используя [[yii\i18n\PhpMessageSource|PhpMessageSource]]), Yii предоставляет ещё два
- В ICU версии 52.1 было испорчено форматирование множественных чисел (`plural`) в русском языке. Проблема решается обновлением ICU до версии 53.1 или старше.
Parametar `-u` će osigurati da će vaša grana moći da šalje pull i push zahteve sa GitHub grane. To znači da ako pozovete `git push` sledeći put će znati gde treba kod da se pošalje. Ovo je korisno ako budete hteli da kasnije dodate više komitova u jednom pull zahtevu.
### 9. Otvorite [pull zahtev](http://help.github.com/send-pull-requests/) na upstream-u.
### 9. Otvorite [pull zahtev](https://help.github.com/articles/creating-a-pull-request-from-a-fork/) na upstream-u.
Posetite vaš repozitorijum na Github-u i kliknite na "Pull Request", izaberite vašu granu na desnoj strani i unesite neki opis u polje za komentar. Kako bi povezali pull zahtev sa temom unesite bilo gde u komentaru `#999` gde 999 je broj teme.
Kako bi rano otkrili regresije u Yii kodu prilikom svake integracije na GitHub-u pokreće se [Travis CI](http://travis-ci.org) kako bi se radilo testiranje. Pošto Yii tim ne želi da preoptereti ovaj servis,
[`[ci skip]`](http://about.travis-ci.org/docs/user/how-to-skip-a-build/) će biti uključen prilikom svake integracije ako pull zahtev:
[`[ci skip]`](https://docs.travis-ci.com/user/customizing-the-build/#Skipping-a-build) će biti uključen prilikom svake integracije ako pull zahtev:
- run `npm install` to install JavaScript testing tools and dependencies (assuming you have [Node.js and NPM installed](https://nodejs.org/en/download/package-manager/)).
> Note: JavaScript tests depend on [jsdom](https://github.com/tmpvar/jsdom) library which requires Node.js 4 or newer.
Using of Node.js 6 or 7 is more preferable.
@ -157,7 +156,7 @@ For very small fixes, e.g. typos and documentation changes, there is no need to
### 6. Commit your changes
add the files/changes you want to commit to the [staging area](http://gitref.org/basic/#add) with
add the files/changes you want to commit to the [staging area](http://git.github.io/git-reference/basic/#add) with
```
git add path/to/my/file.php
@ -192,7 +191,7 @@ The `-u` parameter ensures that your branch will now automatically push and pull
if you type `git push` the next time it will know where to push to. This is useful if you want to later add more commits
to the pull request.
### 9. Open a [pull request](http://help.github.com/send-pull-requests/) against upstream.
### 9. Open a [pull request](https://help.github.com/articles/creating-a-pull-request-from-a-fork/) against upstream.
Go to your repository on GitHub and click "Pull Request", choose your branch on the right and enter some more details
in the comment box. To link the pull request to the issue put anywhere in the pull comment `#999` where 999 is the
- Bug #15817: Fixed support of deprecated array format type casting in `yii\db\Command::bindValues()` (silverfire)
- Bug #15822: Fixed `yii\base\Component::off()` not to throw an exception when handler does not exist (silverfire)
- Bug #15829: Fixed JSONB support in PostgreSQL 9.4 (silverfire)
- Bug #15836: Fixed nesting of `yii\db\ArrayExpresiion`, `yii\db\JsonExpression` (silverfire)
- Bug #15836: Fixed nesting of `yii\db\ArrayExpression`, `yii\db\JsonExpression` (silverfire)
- Bug #15839: Fixed `yii\db\mysql\JsonExpressionBuilder` to cast JSON explicitly (silverfire)
- Bug #15840: Fixed regression on load fixture data file (leandrogehlen)
- Bug #15858: Fixed `Undefined offset` error calling `yii\helpers\Html::errorSummary()` with the same error messages for different model attributes (FabrizioCaldarelli, silverfire)