Browse Source

Various updates to Russian translation

tags/2.0.7
Alexander Makarov 9 years ago
parent
commit
af577eae98
  1. 19
      docs/guide-ru/caching-data.md
  2. 11
      docs/guide-ru/concept-behaviors.md
  3. 111
      docs/guide-ru/db-dao.md
  4. 265
      docs/guide-ru/db-migrations.md
  5. 19
      docs/guide-ru/db-query-builder.md
  6. 2
      docs/guide-ru/intro-yii.md
  7. 134
      docs/guide-ru/output-formatting.md
  8. 19
      docs/guide-ru/rest-authentication.md
  9. 2
      docs/guide-ru/rest-quick-start.md
  10. 22
      docs/guide-ru/rest-rate-limiting.md
  11. 4
      docs/guide-ru/rest-routing.md
  12. 8
      docs/guide-ru/start-databases.md
  13. 8
      docs/guide-ru/start-installation.md
  14. 7
      docs/guide-ru/start-looking-ahead.md
  15. 16
      docs/guide-ru/start-workflow.md
  16. 10
      docs/guide-ru/structure-filters.md
  17. 118
      docs/guide-ru/structure-modules.md
  18. 9
      docs/guide-ru/structure-widgets.md
  19. 8
      docs/guide-ru/tutorial-console.md

19
docs/guide-ru/caching-data.md

@ -84,19 +84,26 @@ Yii поддерживает множество хранилищ кэша:
У всех компонентов кэша один базовый класс [[yii\caching\Cache]] со следующими методами:
* [[yii\caching\Cache::get()|get()]]: возвращает данные по указанному ключу. Если данные не найдены или устарели, то значение `false` будет возвращено;
* [[yii\caching\Cache::get()|get()]]: возвращает данные по указанному ключу. Если данные не найдены или устарели, то
значение `false` будет возвращено;
* [[yii\caching\Cache::set()|set()]]: сохраняет данные по ключу;
* [[yii\caching\Cache::add()|add()]]: сохраняет данные по ключу если такого ключа ещё нет;
* [[yii\caching\Cache::mget()|mget()]]: извлекает сразу несколько элементов данных из кэша по заданным ключам;
* [[yii\caching\Cache::mset()|mset()]]: сохраняет несколько элементов данных. Каждый элемент идентифицируется ключом;
* [[yii\caching\Cache::madd()|madd()]]: сохраняет несколько элементов данных. Каждый элемент идентифицируется ключом. Если ключ уже существует, то сохранения не происходит;
* [[yii\caching\Cache::multiGet()|multiGet()]]: извлекает сразу несколько элементов данных из кэша по заданным ключам;
* [[yii\caching\Cache::multiSet()|multiSet()]]: сохраняет несколько элементов данных. Каждый элемент идентифицируется ключом;
* [[yii\caching\Cache::multiAdd()|multiAdd()]]: сохраняет несколько элементов данных. Каждый элемент идентифицируется ключом.
Если ключ уже существует, то сохранения не происходит;
* [[yii\caching\Cache::exists()|exists()]]: есть ли указанный ключ в кэше;
* [[yii\caching\Cache::delete()|delete()]]: удаляет указанный ключ;
* [[yii\caching\Cache::flush()|flush()]]: удаляет все данные.
> Примечание: Не кэшируйте непосредственно значение `false`, потому что [[yii\caching\Cache::get()|get()]] использует `false` для случая, когда данные не найдены в кэше. Вы можете обернуть `false` в массив и закэшировать его, чтобы избежать данной проблемы.
> Примечание: Не кэшируйте непосредственно значение `false`, потому что [[yii\caching\Cache::get()|get()]] использует
`false` для случая, когда данные не найдены в кэше. Вы можете обернуть `false` в массив и закэшировать его, чтобы
избежать данной проблемы.
Некоторые кэш-хранилища, например, MemCache или APC, поддерживают получение нескольких значений в пакетном режиме, что может сократить накладные расходы на получение данных. Данную возможность возможно использовать при помощи [[yii\caching\Cache::mget()|mget()]] и [[yii\caching\Cache::madd()|madd()]]. В случае, если хранилище не поддерживает эту функцию, она будет имитироваться.
Некоторые кэш-хранилища, например, MemCache или APC, поддерживают получение нескольких значений в пакетном режиме, что
может сократить накладные расходы на получение данных. Данную возможность возможно использовать при помощи
[[yii\caching\Cache::multiGet()|multiGet()]] и [[yii\caching\Cache::multiAdd()|multiAdd()]]. В случае, если хранилище
не поддерживает эту функцию, она будет имитироваться.
Так как [[yii\caching\Cache]] реализует `ArrayAccess` - следовательно компонент кэша можно использовать как массив:

11
docs/guide-ru/concept-behaviors.md

@ -259,7 +259,8 @@ $component->detachBehaviors();
--------------------------------------------------------------------------
В заключении, давайте посмотрим на [[yii\behaviors\TimestampBehavior]] — поведение, которое позволяет автоматически
обновлять атрибуты с метками времени при сохранении [[yii\db\ActiveRecord|Active Record]] моделей.
обновлять атрибуты с метками времени при сохранении [[yii\db\ActiveRecord|Active Record]] моделей через `insert()`,
`update()` или `save()`.
Для начала, необходимо прикрепить поведение к классу [[yii\db\ActiveRecord|Active Record]], в котором это необходимо:
@ -282,6 +283,8 @@ class User extends ActiveRecord
ActiveRecord::EVENT_BEFORE_INSERT => ['created_at', 'updated_at'],
ActiveRecord::EVENT_BEFORE_UPDATE => ['updated_at'],
],
// если вместо метки времени UNIX используется datetime:
// 'value' => new Expression('NOW()'),
],
];
}
@ -290,11 +293,11 @@ class User extends ActiveRecord
Конфигурация выше описывает следующее:
* при вставке новой записи поведение должно присвоить текущую метку времени атрибутам `created_at` и `updated_at`;
* при обновлении существующей записи поведение должно присвоить текущую метку времени атрибуту `updated_at`.
* при вставке новой записи поведение должно присвоить текущую метку времени UNIX атрибутам `created_at` и `updated_at`;
* при обновлении существующей записи поведение должно присвоить текущую метку времени UNIX атрибуту `updated_at`.
Теперь, если сохранить объект `User`, то в его атрибуты `created_at` и `updated_at` будут автоматически установлены
значения метки времени на момент сохранения записи:
значения метки времени UNIX на момент сохранения записи:
```php
$user = new User;

111
docs/guide-ru/db-dao.md

@ -91,14 +91,15 @@ return [
при выполнении первого SQL запроса или при явном вызове метода [[yii\db\Connection::open()|open()]].
> Подсказка: Иногда может потребоваться выполнить некоторые запросы сразу после соединения с базой данных, для инициализации
> переменных окружения. Вы можете зарегистрировать обработчик для события [[yii\db\Connection::EVENT_AFTER_OPEN|afterOpen]].
> Вы можете зарегистрировать обработчик прямо в конфигурации приложения:
> переменных окружения. Например, чтобы задать часовой пояс или кодировку. Сделать это можно зарегистрировав обработчик
> для события [[yii\db\Connection::EVENT_AFTER_OPEN|afterOpen]] в конфигурации приложения:
>
> ```php
> 'db' => [
> // ...
> 'on afterOpen' => function($event) {
> $event->sender->createCommand("YOUR SQL HERE")->execute();
> // $event->sender содержит соединение с базой данных
> $event->sender->createCommand("SET time_zone = 'UTC'")->execute();
> }
> ]
> ```
@ -107,68 +108,43 @@ return [
После создания экземпляра соединения, вы можете выполнить SQL запрос, выполнив следующие шаги:
1. Создать [[yii\db\Command]] с текстом SQL;
1. Создать [[yii\db\Command]] из запроса SQL;
2. Привязать параметры (не обязательно);
3. Вызвать один из методов выполнения SQL из [[yii\db\Command]].
Следующий пример показывает различные способы получения данных из базы дынных:
```php
$db = new yii\db\Connection(...);
// возвращает набор строк. каждая строка - это ассоциативный массив с именами столбцов и значений.
// если выборка ничего не вернёт, то будет возвращён пустой массив.
$posts = $db->createCommand('SELECT * FROM post')
// если выборка ничего не вернёт, то будет получен пустой массив.
$posts = Yii::$app->db->createCommand('SELECT * FROM post')
->queryAll();
// вернёт одну строку (первую строку)
// ложь, если ничего не будет выбрано
$post = $db->createCommand('SELECT * FROM post WHERE id=1')
// false, если ничего не будет выбрано
$post = Yii::$app->db->createCommand('SELECT * FROM post WHERE id=1')
->queryOne();
// вернёт один столбец (первый столбец)
// пустой массив, при отсутствии результата
$titles = $db->createCommand('SELECT title FROM post')
$titles = Yii::$app->db->createCommand('SELECT title FROM post')
->queryColumn();
// вернёт значение
// ложь, при отсутствии результата
$count = $db->createCommand('SELECT COUNT(*) FROM post')
// вернёт скалярное значение
// или false, при отсутствии результата
$count = Yii::$app->db->createCommand('SELECT COUNT(*) FROM post')
->queryScalar();
```
> Примечание: Чтобы сохранить точность, данные извлекаются как строки, даже если тип поля в базе данных является числовым.
> Подсказка: Если вам необходимо выполнить SQL запрос сразу после установки соединения (например, для установки
> временной зоны или кодировки), вы можете сделать это в обработчике события [[yii\db\Connection::EVENT_AFTER_OPEN]].
> Например,
```php
return [
// ...
'components' => [
// ...
'db' => [
'class' => 'yii\db\Connection',
// ...
'on afterOpen' => function($event) {
// $event->sender ссылка на соединение с базой данных
$event->sender->createCommand("SET time_zone = 'UTC'")->execute();
}
],
],
// ...
];
```
### Привязка параметров <span id="binding-parameters"></span>
При создании команды из SQL запроса с параметрами, вы почти всегда должны использовать привязку параметров для
предотвращения атак через SQL инъекции. Например,
```php
$post = $db->createCommand('SELECT * FROM post WHERE id=:id AND status=:status')
$post = Yii::$app->db->createCommand('SELECT * FROM post WHERE id=:id AND status=:status')
->bindValue(':id', $_GET['id'])
->bindValue(':status', 1)
->queryOne();
@ -187,11 +163,11 @@ $post = $db->createCommand('SELECT * FROM post WHERE id=:id AND status=:status')
```php
$params = [':id' => $_GET['id'], ':status' => 1];
$post = $db->createCommand('SELECT * FROM post WHERE id=:id AND status=:status')
$post = Yii::$app->db->createCommand('SELECT * FROM post WHERE id=:id AND status=:status')
->bindValues($params)
->queryOne();
$post = $db->createCommand('SELECT * FROM post WHERE id=:id AND status=:status', $params)
$post = Yii::$app->db->createCommand('SELECT * FROM post WHERE id=:id AND status=:status', $params)
->queryOne();
```
@ -200,17 +176,18 @@ $post = $db->createCommand('SELECT * FROM post WHERE id=:id AND status=:status',
один раз, а потом выполняется много раз с разными параметрами. Например,
```php
$command = $db->createCommand('SELECT * FROM post WHERE id=:id');
$command = Yii::$app->db->createCommand('SELECT * FROM post WHERE id=:id');
$post1 = $command->bindValue(':id', 1)->queryOne();
$post2 = $command->bindValue(':id', 2)->queryOne();
// ...
```
Так как [[yii\db\Command::bindParam()|bindParam()]] поддерживает привязку параметров по ссылке, следующий код может
быть написан следующим образом:
```php
$command = $db->createCommand('SELECT * FROM post WHERE id=:id')
$command = Yii::$app->db->createCommand('SELECT * FROM post WHERE id=:id')
->bindParam(':id', $id);
$id = 1;
@ -218,6 +195,7 @@ $post1 = $command->queryOne();
$id = 2;
$post2 = $command->queryOne();
// ...
```
Обратите внимание что вы связываете маркер `$id` с переменной перед выполнением запроса, и затем меняете это значение
@ -230,7 +208,7 @@ $post2 = $command->queryOne();
Для запросов не возвращающих данные, вы должны использовать метод [[yii\db\Command::execute()]]. Например,
```php
$db->createCommand('UPDATE post SET status=1 WHERE id=1')
Yii::$app->db->createCommand('UPDATE post SET status=1 WHERE id=1')
->execute();
```
@ -242,16 +220,16 @@ SQL конструкций. Например,
```php
// INSERT (table name, column values)
$db->createCommand()->insert('user', [
Yii::$app->db->createCommand()->insert('user', [
'name' => 'Sam',
'age' => 30,
])->execute();
// UPDATE (table name, column values, condition)
$db->createCommand()->update('user', ['status' => 1], 'age > 30')->execute();
Yii::$app->db->createCommand()->update('user', ['status' => 1], 'age > 30')->execute();
// DELETE (table name, condition)
$db->createCommand()->delete('user', 'status = 0')->execute();
Yii::$app->db->createCommand()->delete('user', 'status = 0')->execute();
```
Вы можете также вызвать [[yii\db\Command::batchInsert()|batchInsert()]] для вставки множества строк за один вызов.
@ -259,13 +237,16 @@ $db->createCommand()->delete('user', 'status = 0')->execute();
```php
// table name, column names, column values
$db->createCommand()->batchInsert('user', ['name', 'age'], [
Yii::$app->db->createCommand()->batchInsert('user', ['name', 'age'], [
['Tom', 30],
['Jane', 20],
['Linda', 25],
])->execute();
```
Обратите внимание, что перечисленные методы лишь создают запрос. Чтобы его выполнить нужно вызывать
[[yii\db\Command::execute()|execute()]].
## Экранирование имён таблиц и столбцов <span id="quoting-table-and-column-names"></span>
@ -281,7 +262,7 @@ Yii DAO будет автоматический преобразовывать
```php
// executes this SQL for MySQL: SELECT COUNT(`id`) FROM `employee`
$count = $db->createCommand("SELECT COUNT([[id]]) FROM {{employee}}")
$count = Yii::$app->db->createCommand("SELECT COUNT([[id]]) FROM {{employee}}")
->queryScalar();
```
@ -311,7 +292,7 @@ return [
```php
// для MySQL будет выполнен следующий SQL: SELECT COUNT(`id`) FROM `tbl_employee`
$count = $db->createCommand("SELECT COUNT([[id]]) FROM {{%employee}}")
$count = Yii::$app->db->createCommand("SELECT COUNT([[id]]) FROM {{%employee}}")
->queryScalar();
```
@ -325,16 +306,18 @@ $count = $db->createCommand("SELECT COUNT([[id]]) FROM {{%employee}}")
Следующий код показывает типичное использование транзакций:
```php
$db->transaction(function($db) {
Yii::$app->db->transaction(function($db) {
$db->createCommand($sql1)->execute();
$db->createCommand($sql2)->execute();
// ... executing other SQL statements ...
});
```
Код выше эквивалентен следующему:
Код выше эквивалентен приведённму ниже. Разница в том, что в данном случае мы получаем больше контроля над обработкой
ошибок:
```php
$db = Yii::$app->db;
$transaction = $db->beginTransaction();
try {
@ -367,13 +350,13 @@ Yii поддерживает настройку [уровня изоляции]
```php
$isolationLevel = \yii\db\Transaction::REPEATABLE_READ;
$db->transaction(function ($db) {
Yii::$app->db->transaction(function ($db) {
....
}, $isolationLevel);
// or alternatively
$transaction = $db->beginTransaction($isolationLevel);
$transaction = Yii::$app->db->beginTransaction($isolationLevel);
```
Yii предоставляет четыре константы для наиболее распространённых уровней изоляции:
@ -388,8 +371,8 @@ Yii предоставляет четыре константы для наибо
Заметьте что некоторые СУБД допускают настраивать уровень изоляции только для всего соединения. Следующие транзакции
будут получать тот же уровень изоляции, даже если вы его не укажете. При использовании этой функции может потребоваться
установить уровень изоляции для всех транзакции, чтоб избежать явно конфликтующих настроек.
На момент написания этой статьи страдали от этого только MSSQL и SQLite.
установить уровень изоляции для всех транзакций, чтоб избежать явно конфликтующих настроек.
На момент написания этой статьи страдали от этого ограничения только MSSQL и SQLite.
> Примечание: SQLite поддерживает только два уровня изоляции, таким образом вы можете использовать только
`READ UNCOMMITTED` и `SERIALIZABLE`. Использование других уровней изоляции приведёт к генерации исключения.
@ -406,7 +389,7 @@ Yii предоставляет четыре константы для наибо
Если ваша СУБД поддерживает Savepoint, вы можете вкладывать транзакции как показано ниже:
```php
$db->transaction(function ($db) {
Yii::$app->db->transaction(function ($db) {
// outer transaction
$db->transaction(function ($db) {
@ -418,6 +401,7 @@ $db->transaction(function ($db) {
Или так,
```php
$db = Yii::$app->db;
$outerTransaction = $db->beginTransaction();
try {
$db->createCommand($sql1)->execute();
@ -482,13 +466,13 @@ try {
```php
// создание экземпляра соединения, использующего вышеуказанную конфигурацию
$db = Yii::createObject($config);
Yii::$app->db = Yii::createObject($config);
// запрос к одному из подчинённых
$rows = $db->createCommand('SELECT * FROM user LIMIT 10')->queryAll();
$rows = Yii::$app->db->createCommand('SELECT * FROM user LIMIT 10')->queryAll();
// запрос к мастеру
$db->createCommand("UPDATE user SET username='demo' WHERE id=1")->execute();
Yii::$app->db->createCommand("UPDATE user SET username='demo' WHERE id=1")->execute();
```
> Информация: Запросы выполненные через [[yii\db\Command::execute()]] определяются как запросы на запись, а все
@ -560,6 +544,7 @@ $db->createCommand("UPDATE user SET username='demo' WHERE id=1")->execute();
использовать соединение с основным сервером. Например,
```php
$db = Yii::$app->db;
// Транзакция запускается на основном сервере
$transaction = $db->beginTransaction();
@ -578,14 +563,14 @@ try {
Если вы хотите запустить транзакцию на подчинённом сервере, вы должны указать это явно, как показано ниже:
```php
$transaction = $db->slave->beginTransaction();
$transaction = Yii::$app->db->slave->beginTransaction();
```
Иногда может потребоваться выполнить запрос на чтение через подключение к основному серверу. Это может быть достигнуто
с использованием метода `useMaster()`:
```php
$rows = $db->useMaster(function ($db) {
$rows = Yii::$app->db->useMaster(function ($db) {
return $db->createCommand('SELECT * FROM user LIMIT 10')->queryAll();
});
```
@ -617,7 +602,7 @@ Yii DAO предоставляет целый набор методов для
```php
// CREATE TABLE
$db->createCommand()->createTable('post', [
Yii::$app->db->createCommand()->createTable('post', [
'id' => 'pk',
'title' => 'string',
'text' => 'text',
@ -628,7 +613,7 @@ $db->createCommand()->createTable('post', [
Например,
```php
$table = $db->getTableSchema('post');
$table = Yii::$app->db->getTableSchema('post');
```
Метод вернёт объект [[yii\db\TableSchema]], который содержит информацию о столбцах таблицы, первичных ключах, внешних

265
docs/guide-ru/db-migrations.md

@ -1,5 +1,5 @@
Миграции Баз Данных
==================
Миграции баз данных
===================
В ходе разработки и ведения баз данных приложений, которые управляют данными, структуры используемых баз данных развиваются, как и исходный код приложений. Например, при разработке приложения, в будущем может оказаться необходимой новая таблица; уже после того, как приложение будет развернуто в рабочем режиме (продакшене), также может быть обнаружено, что для повышения производительности запросов должен быть создан определённый индекс; и так далее.
В связи с тем, что изменение структуры базы данных часто требует изменение исходного кода, yii поддерживает так
@ -156,6 +156,210 @@ class m150101_185401_create_news_table extends Migration
Весь список методов описания типов столбцов доступен в API документации [[yii\db\SchemaBuilderTrait]].
## Генерация миграций <span id="generating-migrations"></span>
Начиная с версии 2.0.7 появился удобный способ создания миграций из консоли.
В том случае, если миграция названа особым образом, таким как, например, `create_xxx` или `drop_xxx` сгенерированный
файл миграции будет содержать дополнительный код.
### Создание таблицы
```php
yii migrate/create create_post
```
сгенерирует
```php
class m150811_220037_create_post extends Migration
{
public function up()
{
$this->createTable('post', [
'id' => $this->primaryKey()
]);
}
public function down()
{
$this->dropTable('post');
}
}
```
Чтобы сразу создать поля таблицы, укажите их через опцию `--fields`.
```php
yii migrate/create create_post --fields=title:string,body:text
```
сгенерирует
```php
class m150811_220037_create_post extends Migration
{
public function up()
{
$this->createTable('post', [
'id' => $this->primaryKey(),
'title' => $this->string(),
'body' => $this->text()
]);
}
public function down()
{
$this->dropTable('post');
}
}
```
Можно указать дополнительные параметры.
```php
yii migrate/create create_post --fields=title:string(12):notNull:unique,body:text
```
сгенерирует
```php
class m150811_220037_create_post extends Migration
{
public function up()
{
$this->createTable('post', [
'id' => $this->primaryKey(),
'title' => $this->string(12)->notNull()->unique(),
'body' => $this->text()
]);
}
public function down()
{
$this->dropTable('post');
}
}
```
> Примечание: первичный ключ добавляется автоматически и по умолчанию называется `id`. Если вам необходимо другое имя,
> указать его можно через опцию `--fields=name:primaryKey`.
### Удаление таблицы
```php
yii migrate/create drop_post --fields=title:string(12):notNull:unique,body:text
```
сгенерирует
```php
class m150811_220037_drop_post extends Migration
{
public function up()
{
$this->dropTable('post');
}
public function down()
{
$this->createTable('post', [
'id' => $this->primaryKey(),
'title' => $this->string(12)->notNull()->unique(),
'body' => $this->text()
]);
}
}
```
### Добавление столбца
Если имя миграции задано как `add_xxx_to_yyy`, файл будет содержать необходимые методы `addColumn` и `dropColumn`.
Для добавления столбца:
```php
yii migrate/create add_position_to_post --fields=position:integer
```
сгенерирует
```php
class m150811_220037_add_position_to_post extends Migration
{
public function up()
{
$this->addColumn('post', 'position', $this->integer());
}
public function down()
{
$this->dropColumn('post', 'position');
}
}
```
### Удаление столбца
Если имя миграции задано как `drop_xxx_from_yyy`, файл будет содержать необходимые методы `addColumn` и `dropColumn`.
```php
yii migrate/create drop_position_from_post --fields=position:integer
```
сгенерирует
```php
class m150811_220037_drop_position_from_post extends Migration
{
public function up()
{
$this->dropColumn('post', 'position');
}
public function down()
{
$this->addColumn('post', 'position', $this->integer());
}
}
```
### Добавление промежуточной таблицы
Если имя миграции задано как `create_junction_xxx_and_yyy`, файл будет содержать код для создания промежуточной таблцы.
```php
yii create/migration create_junction_post_and_tag
```
сгенерирует
```php
class m150811_220037_create_junction_post_and_tag extends Migration
{
public function up()
{
$this->createTable('post_tag', [
'post_id' => $this->integer(),
'tag_id' => $this->integer(),
'PRIMARY KEY(post_id, tag_id)'
]);
$this->createIndex('idx-post_tag-post_id', 'post_tag', 'post_id');
$this->createIndex('idx-post_tag-tag_id', 'post_tag', 'tag_id');
$this->addForeignKey('fk-post_tag-post_id', 'post_tag', 'post_id', 'post', 'id', 'CASCADE');
$this->addForeignKey('fk-post_tag-tag_id', 'post_tag', 'tag_id', 'tag', 'id', 'CASCADE');
}
public function down()
{
$this->dropTable('post_tag');
}
}
```
### Транзакции Миграций <span id="transactional-migrations"></span>
@ -194,16 +398,22 @@ class m150101_185401_create_news_table extends Migration
}
```
Обратите внимание, что обычно при выполнении нескольких операций в базе данных при помощи метода `safeUp()`, вы должны реализовать обратный порядок исполнения в методе `safeDown()`. В приведенном выше примере мы сначала создали таблицу, а затем вставили строку в `safeUp()`; а в `safeDown()` мы сначала удаляем строку и затем удаляем таблицу.
Обратите внимание, что обычно при выполнении нескольких операций в базе данных при помощи метода `safeUp()`, вы должны
реализовать обратный порядок исполнения в методе `safeDown()`. В приведенном выше примере мы сначала создали таблицу,
а затем вставили строку в `safeUp()`; а в `safeDown()` мы сначала удаляем строку и затем удаляем таблицу.
> Примечание: Не все СУБД поддерживают транзакции. И некоторые запросы к базам данных не могут быть введены в транзакции. Для различных примеров, пожалуйста, обратитесь к [негласным обязательствам](http://dev.mysql.com/doc/refman/5.1/en/implicit-commit.html). В этом случае вместо этих методов вы должны реализовать методы `up()` и `down()`.
> Примечание: Не все СУБД поддерживают транзакции. И некоторые запросы к базам данных не могут быть введены в транзакции.
Для различных примеров, пожалуйста, обратитесь к [негласным обязательствам](http://dev.mysql.com/doc/refman/5.7/en/implicit-commit.html).
В этом случае вместо этих методов вы должны реализовать методы `up()` и `down()`.
### Методы доступа к базе данных <span id="db-accessing-methods"></span>
Базовый класс миграции [[yii\db\Migration]] предоставляет набор методов, которые позволяют Вам получить доступ и управлять базами данных. Вы можете найти эти методы, их названия аналогичны [методам DAO](db-dao.md), предоставленным в классе [[yii\db\Command]].
Базовый класс миграции [[yii\db\Migration]] предоставляет набор методов, которые позволяют Вам получить доступ и управлять
базами данных. Вы можете найти эти методы, их названия аналогичны [методам DAO](db-dao.md), предоставленным в классе [[yii\db\Command]].
Например, метод [[yii\db\Migration::createTable()]] позволяет создать новую таблицу, подобно методу [[yii\db\Command::createTable()]].
Преимущество методов, описанных при помощи [[yii\db\Migration]] заключается в том, что Вам не нужно явно создавать экземпляр/копию [[yii\db\Command]] и исполнение каждого метода будет автоматически отображать полезные сообщения
Преимущество методов, описанных при помощи [[yii\db\Migration]] заключается в том, что Вам не нужно явно создавать
экземпляр/копию [[yii\db\Command]] и исполнение каждого метода будет автоматически отображать полезные сообщения
говорящие вам, что операции с базой данных выполняются и сколько они идут.
Ниже представлен список всех этих методов доступа к базам данных:
@ -319,33 +529,58 @@ yii migrate/mark 1392853618 # используя вре
Есть несколько способов настроить команду миграции.
### Используя Параметры Командной Строки<span id="using-command-line-options"></span>
### Используя параметры командной строки<span id="using-command-line-options"></span>
В команду миграций входит несколько параметров командной строки, которые могут использоваться, для того, чтобы настроить поведение миграции:
В команду миграций входит несколько параметров командной строки, которые могут использоваться, для того, чтобы настроить
поведение миграции:
* `interactive`: логический тип - boolean (по умолчанию true). Указывает, следует ли выполнять миграцию в интерактивном режиме. Если это значение является - true, то пользователю будет выдан запрос, перед выполнением командой определенных действий. Вы можете установить это значение в false если команда используется в фоновом режиме.
* `interactive`: логический тип - boolean (по умолчанию true). Указывает, следует ли выполнять миграцию в интерактивном
режиме. Если это значение является - true, то пользователю будет выдан запрос, перед выполнением командой определенных
действий. Вы можете установить это значение в false если команда используется в фоновом режиме.
* `migrationPath`: строка - string (по умолчанию `@app/migrations`). Указывает каталог для хранения всех файлов классов миграций. Этот параметр может быть определён либо как путь до директории, либо как [псевдоним](concept-aliases.md) пути. Обратите внимание, что данный каталог должен существовать, иначе команда будет выдавать ошибку.
* `migrationPath`: строка - string (по умолчанию `@app/migrations`). Указывает каталог для хранения всех файлов классов
миграций. Этот параметр может быть определён либо как путь до директории, либо как [псевдоним](concept-aliases.md) пути.
Обратите внимание, что данный каталог должен существовать, иначе команда будет выдавать ошибку.
* `migrationTable`: строка - string (по умолчанию `migration`). Определяет имя таблицы в базе данных в которой хранится информация о истории миграций. Эта таблица будет автоматически создана командой миграции, если её не существует. Вы также можете создать её вручную, используя структуру `version varchar(255) primary key, apply_time integer`.
* `migrationTable`: строка - string (по умолчанию `migration`). Определяет имя таблицы в базе данных в которой хранится
информация о истории миграций. Эта таблица будет автоматически создана командой миграции, если её не существует.
Вы также можете создать её вручную, используя структуру `version varchar(255) primary key, apply_time integer`.
* `db`: строка - string (по умолчанию `db`). Определяет ID базы данных [компонента приложения](structure-application-components.md).
Этот параметр представляет собой базу данных, которая подвергается миграциям при помощи команды миграций.
* `templateFile`: строка - string (по умолчанию `@yii/views/migration.php`). Указывает путь до файла шаблона, который используется для формирования скелета класса файлов миграции. Этот параметр может быть определён либо как путь до файла, либо как [псевдоним](concept-aliases.md) пути. Файл шаблона - это PHP скрипт, в котором можно использовать предопределенную переменную с именем `$className` для того, чтобы получить имя класса миграции.
* `templateFile`: строка - string (по умолчанию `@yii/views/migration.php`). Указывает путь до файла шаблона, который
используется для формирования скелета класса файлов миграции. Этот параметр может быть определён либо как путь до файла,
либо как [псевдоним](concept-aliases.md) пути. Файл шаблона - это PHP скрипт, в котором можно использовать
предопределенную переменную с именем `$className` для того, чтобы получить имя класса миграции.
* `generatorTemplateFiles`: массив (по умолчанию `[
'create_table' => '@yii/views/createTableMigration.php',
'drop_table' => '@yii/views/dropTableMigration.php',
'add_column' => '@yii/views/addColumnMigration.php',
'drop_column' => '@yii/views/dropColumnMigration.php',
'create_junction' => '@yii/views/createJunctionMigration.php'
]`), в котором указаны файлы шаблонов для генерации миграций. Подробнее в разделе «[Генерация миграций](#generating-migrations)».
* `fields`: массив конфигураций столбцов, который используется для генерации кода миграции. По умолчанию пуст. Формат
каждой конфигурации `ИМЯ_СТОЛБЦА:ТИП_СТОЛБЦА:ДЕКОРАТОР_СТОЛБЦА`. Например, `--fields=name:string(12):notNull` даст нам
столбец типа строка размера 12 с ограничением not null.
В следующем примере показано, как можно использовать эти параметры.
Например, если мы хотим перенести модуль `forum`, чьи файлы миграций расположены в каталоге `migrations` данного модуля, для этого мы можем использовать следующую команду:
Например, если мы хотим перенести модуль `forum`, чьи файлы миграций расположены в каталоге `migrations` данного модуля,
для этого мы можем использовать следующую команду:
```
# не интерактивная миграция модуля форума
yii migrate --migrationPath=@app/modules/forum/migrations --interactive=0
```
### Глобальная Настройка Команд <span id="configuring-command-globally"></span>
### Глобальная настройка команд <span id="configuring-command-globally"></span>
Вместо того, чтобы каждый раз вводить одинаковые значения параметров миграции, когда вы запускаете команду миграции, можно настроить её раз и навсегда в конфигурации приложения, как показано ниже:
Вместо того, чтобы каждый раз вводить одинаковые значения параметров миграции, когда вы запускаете команду миграции,
можно настроить её раз и навсегда в конфигурации приложения, как показано ниже:
```php
return [

19
docs/guide-ru/db-query-builder.md

@ -39,8 +39,8 @@ LIMIT 10
Создав объект [[yii\db\Query]], вы можете вызвать различные методы для создания различных частей SQL выражения.
Имена методов напоминают ключевые слова SQL, используемые в соответствующих частях SQL запроса. Например,
чтобы указать `FROM` часть запроса, вам нужно вызвать метод `from()`. Все методы построителя запросов возвращают
свой объект, который позволяет объединять несколько вызовов в цепочку.
чтобы указать `FROM` часть запроса, вам нужно вызвать метод [[yii\db\Query::from()|from()]]. Все методы построителя
запросов возвращают свой объект, который позволяет объединять несколько вызовов в цепочку.
Далее будет описание каждого метода построителя запросов.
@ -294,10 +294,10 @@ if (!empty($search)) {
}
```
Если `$search` не пустое, то будет сформировано следующее выражение:
Если `$search` не пустое, то будет сформировано следующее условие WHERE:
```sql
... WHERE (`status` = 10) AND (`title` LIKE '%yii%')
WHERE (`status` = 10) AND (`title` LIKE '%yii%')
```
@ -318,7 +318,7 @@ $query->filterWhere([
Единственное отличие между [[yii\db\Query::filterWhere()|filterWhere()]] и [[yii\db\Query::where()|where()]]
заключается в игнорировании пустых значений, переданных в условие в [форме массива](#hash-format). Таким образом
если `$email` будет пустым, а `$username` нет, то приведённый выше код сформирует `...WHERE username=:username`.
если `$email` будет пустым, а `$username` нет, то приведённый выше код сформирует условие `WHERE username=:username`.
> Информация: значение признаётся пустым, если это null, пустой массив, пустая строка или строка состоящая из одних пробельных символов.
@ -438,7 +438,9 @@ $query->join('LEFT JOIN', 'post', 'post.user_id = user.id');
- `$type`: тип объединения, например, `'INNER JOIN'`, `'LEFT JOIN'`.
- `$table`: имя таблицы, которая должна быть присоединена.
- `$on`: необязательное условие объединения, то есть фрагмент `ON`. Пожалуйста, обратитесь к документации для
[where()](#where) для более подробной информации о определении условий.
[where()](#where) для более подробной информации о определении условий. Отметим, что синтаксис массивов **не работает**
для задания условий для столбцов, то есть `['user.id' => 'comment.userId']` будет означать условие, где ID пользователя
долен быть равен строке `'comment.userId'`. Вместо этого стоит указывать условие в виде строки `'user.id = comment.userId'`.
- `$params`: необязательные параметры присоединяемые к условию объединения.
Вы можете использовать следующие сокращающие методы для указания `INNER JOIN`, `LEFT JOIN` и `RIGHT JOIN`, в указанном порядке.
@ -526,7 +528,7 @@ $row = (new \yii\db\Query())
Все методы выборки могут получать необязательный параметр `$db`, представляющий [[yii\db\Connection|соединение с БД]],
которое должно использоваться, чтобы выполнить запрос к БД. Если вы упускаете этот параметр, будет использоваться
[компонент приложения](structure-application-components.md) `$db`. Ниже приведён ещё один пример использования метода
`count()`:
[[yii\db\Query::count()|count()]]:
```php
// executes SQL: SELECT COUNT(*) FROM `user` WHERE `last_name`=:last_name
@ -540,7 +542,7 @@ $count = (new \yii\db\Query())
* Вызывается [[yii\db\QueryBuilder]] для генерации SQL запроса на основе текущего [[yii\db\Query]];
* Создаёт объект [[yii\db\Command]] с сгенерированным SQL запросом;
* Вызывается выбирающий метод (например `queryAll()`) из [[yii\db\Command]] для выполнения SQL запроса и извлечения данных.
* Вызывается выбирающий метод (например [[yii\db\Command::queryAll()|queryAll()]]) из [[yii\db\Command]] для выполнения SQL запроса и извлечения данных.
Иногда вы можете захотеть увидеть или использовать SQL запрос построенный из объекта [[yii\db\Query]]. Этой цели можно
добиться с помощью следующего кода:
@ -640,5 +642,6 @@ foreach ($query->batch() as $users) {
}
foreach ($query->each() as $username => $user) {
// ...
}
```

2
docs/guide-ru/intro-yii.md

@ -19,7 +19,7 @@ Yii – это универсальный фреймворк и может бы
Если вы уже знакомы с другими фреймворками, вам наверняка будет интересно сравнить их с Yii.
- Как и многие другие PHP фреймворки, для организации кода Yii использует модель MVC (Model-View-Controller).
- Как и многие другие PHP фреймворки, для организации кода Yii использует архитектурный паттерн MVC (Model-View-Controller).
- Yii придерживается философии простого и элегантного кода не пытаясь усложнять дизайн только ради следования каким-либо
шаблонам проектирования.
- Yii является full-stack фреймворком и включает в себя проверенные и хорошо зарекомендовавшие себя возможности, такие как

134
docs/guide-ru/output-formatting.md

@ -2,9 +2,11 @@
==============
Для форматирования вывода Yii предоставляет класс, преобразующий данные в человеко понятный формат.
[[yii\i18n\Formatter]] это класс-помощник, который зарегистрирован как [компонент приложения](structure-application-components.md), по-умолчанию под именем `formatter`.
[[yii\i18n\Formatter]] это класс-помощник, который зарегистрирован как
[компонент приложения](structure-application-components.md), по-умолчанию под именем `formatter`.
Он предоставляет набор методов для форматирования таких данных как дата/время, числа и другие часто используемые в целях локализации форматы.
Он предоставляет набор методов для форматирования таких данных как дата/время, числа и другие часто используемые в целях
локализации форматы.
Formatter может быть использован двумя различными способами.
1. Напрямую используя методы форматирования (все методы форматирования имеют префикс `as`):
@ -19,8 +21,8 @@ Formatter может быть использован двумя различны
```
2. Используя метод [[yii\i18n\Formatter::format()|format()]] и имя формата.
Этот метод также используется в виджетах на подобии [[yii\grid\GridView]] и [[yii\widgets\DetailView]], в которых вы можете
задать формат отображения данных в колонке через конфигурацию виджета.
Этот метод также используется в виджетах на подобии [[yii\grid\GridView]] и [[yii\widgets\DetailView]], в которых
вы можете задать формат отображения данных в колонке через конфигурацию виджета.
```php
echo Yii::$app->formatter->format('2014-01-01', 'date'); // выведет: January 1, 2014
@ -29,11 +31,13 @@ Formatter может быть использован двумя различны
echo Yii::$app->formatter->format(0.125, ['percent', 2]); // выведет: 12.50%
```
Все данные, отображаемые через компонент formatter, будут локализованы, если [расширение PHP intl](http://php.net/manual/ru/book.intl.php) было установлено.
Для этого вы можете настроить свойство [[yii\i18n\Formatter::locale|locale]]. Если оно не было настроено, то
будет использован [[yii\base\Application::language|язык приложения]] в качестве локали. Подробнее см. [раздел интернационализация](tutorial-i18n.md).
Компонент форматирования будет выбирать корректный формат для даты и чисел в соответствии с локалью, включая имена месяца и дней недели,
переведённые на текущий язык. Форматирование дат также зависит от [[yii\i18n\Formatter::timeZone|временной зоны]], которая
Все данные, отображаемые через компонент formatter, будут локализованы, если
[расширение PHP intl](http://php.net/manual/ru/book.intl.php) было установлено. Для этого вы можете настроить свойство
[[yii\i18n\Formatter::locale|locale]]. Если оно не было настроено, то в качестве локали будет использован
[[yii\base\Application::language|язык приложения]]. Подробнее смотрите в разделе «[интернационализация](tutorial-i18n.md)».
Компонент форматирования будет выбирать корректный формат для даты и чисел в соответствии с локалью, включая имена
месяцев и дней недели, переведённые на текущий язык. Форматирование дат также зависит от
[[yii\i18n\Formatter::timeZone|часового пояса]], которая
также будет из свойства [[yii\base\Application::timeZone|timeZone]] приложения, если она не была задана явно.
Например, форматирование даты, вызванное с разной локалью, отобразит разные результаты::
@ -47,23 +51,26 @@ Yii::$app->formatter->locale = 'ru-RU';
echo Yii::$app->formatter->asDate('2014-01-01'); // выведет: 1 января 2014 г.
```
> Обратите внимание, что форматирование может различаться между различными версиями библиотеки ICU, собранных с PHP, а также на основе того установлено ли
> [расширение PHP intl] (http://php.net/manual/ru/book.intl.php) или нет. Таким образом, чтобы гарантировать, что ваш сайт будет одинаково отображать данные
> во всех окружениях рекомендуется установить расширение PHP intl во всех окружениях и проверить, что версия библиотеки ICU совпадает.
> Обратите внимание, что форматирование может различаться между различными версиями библиотеки ICU, собранных с PHP,
> а также на основе того установлено ли [расширение PHP intl] (http://php.net/manual/ru/book.intl.php) или нет.
> Таким образом, чтобы гарантировать, что ваш сайт будет одинаково отображать данные во всех окружениях рекомендуется
> установить расширение PHP intl во всех окружениях и проверить, что версия библиотеки ICU совпадает.
> См. также: [Настройка PHP окружения для интернационализации](tutorial-i18n.md#setup-environment).
>
> Отметим также, что даже если установлено расширение PHP intl, форматирование даты и времени для значений года >=2038 или <=1901
> на 32-ух разрядных системах будет обращаться к реализации PHP, которая не обеспечивает локализованные имена месяца и дня,
> потому что в этом случае intl будет использовать 32-ух битный UNIX timestamp. На 64-битной системе intl formatter будет работать во всех случаях, если, конечно, intl был установлен.
> Отметим также, что даже если установлено расширение PHP intl, форматирование даты и времени для значений года >=2038
> или <=1901 на 32-ух разрядных системах будет обращаться к реализации PHP, которая не обеспечивает локализованные
> имена месяца и дня, потому что в этом случае intl будет использовать 32-ух битный UNIX timestamp. На 64-битной системе
> intl formatter будет работать во всех случаях, если, конечно, intl был установлен.
Настройка форматирования <span id="configuring-format"></span>
-------------------------
Форматы по-умолчанию, используемые в методах форматирования, можно настраивать через свойства [[yii\i18n\Formatter|класса форматирования]].
Вы можете задать форматирование по-умолчанию для всего приложения, настроив компонент `formatter` в вашей [конфигурации приложения](concept-configurations.md#application-configurations).
Ниже приведён пример конфигурации.
Чтобы узнать больше о доступных свойствах см. [[yii\i18n\Formatter|API документацию к классу Formatter]] и следующим подсекциям.
Форматы по-умолчанию, используемые в методах форматирования, можно настраивать через свойства
[[yii\i18n\Formatter|класса форматирования]]. Вы можете задать форматирование по-умолчанию для всего приложения, настроив
компонент `formatter` в вашей [конфигурации приложения](concept-configurations.md#application-configurations). Ниже
приведён пример конфигурации. Чтобы узнать больше о доступных свойствах см. [[yii\i18n\Formatter|API документацию к классу Formatter]]
и следующим подсекциям.
```php
'components' => [
@ -83,19 +90,23 @@ echo Yii::$app->formatter->asDate('2014-01-01'); // выведет: 1 январ
- [[yii\i18n\Formatter::asDate()|date]] - значение будет отформатировано как дата, например `January 01, 2014`.
- [[yii\i18n\Formatter::asTime()|time]] - значение будет отформатировано как время, например `14:23`.
- [[yii\i18n\Formatter::asDatetime()|datetime]] - значение будет отформатировано как дата и время, например `January 01, 2014 14:23`.
- [[yii\i18n\Formatter::asTimestamp()|timestamp]] - значение будет отформатировано как [unix timestamp](http://en.wikipedia.org/wiki/Unix_time), например, `1412609982`.
- [[yii\i18n\Formatter::asRelativeTime()|relativeTime]] - значение будет отформатировано как временной промежуток между заданной датой и
текущий временем в человеко понятном формате, например: `1 час назад`.
- [[yii\i18n\Formatter::asDuration()|duration]]: значение будет отформатировано как продолжительность в человеко понятном формате, например `1 день, 2 минуты`.
- [[yii\i18n\Formatter::asDatetime()|datetime]] - значение будет отформатировано как дата и время, например
`January 01, 2014 14:23`.
- [[yii\i18n\Formatter::asTimestamp()|timestamp]] - значение будет отформатировано как
[unix timestamp](http://en.wikipedia.org/wiki/Unix_time), например, `1412609982`.
- [[yii\i18n\Formatter::asRelativeTime()|relativeTime]] - значение будет отформатировано как временной промежуток между
заданной датой и текущий временем в человеко понятном формате, например: `1 час назад`.
- [[yii\i18n\Formatter::asDuration()|duration]]: значение будет отформатировано как продолжительность в человеко понятном
формате, например `1 день, 2 минуты`.
Форматирование даты и времени для методов [[yii\i18n\Formatter::asDate()|date]], [[yii\i18n\Formatter::asTime()|time]] и
[[yii\i18n\Formatter::asDatetime()|datetime]] может быть задано глобально через конфигурацию свойств форматирования [[yii\i18n\Formatter::$dateFormat|$dateFormat]], [[yii\i18n\Formatter::$timeFormat|$timeFormat]] и
[[yii\i18n\Formatter::asDatetime()|datetime]] может быть задано глобально через конфигурацию свойств форматирования
[[yii\i18n\Formatter::$dateFormat|$dateFormat]], [[yii\i18n\Formatter::$timeFormat|$timeFormat]] и
[[yii\i18n\Formatter::$datetimeFormat|$datetimeFormat]].
По-умолчанию, форматирование использует сокращенный формат, который интерпретируется по-разному в зависимости от активной в данный момент локали.
Поэтому дата и время будут отформатированы наиболее часто используемым способом в стране и языке пользователя.
Доступны 4 разных сокращенных формата:
По-умолчанию, форматирование использует сокращенный формат, который интерпретируется по-разному в зависимости от активной
в данный момент локали. Поэтому дата и время будут отформатированы наиболее часто используемым способом в стране и языке
пользователя. Доступны 4 разных сокращенных формата:
- `short` в локале `en_GB` отобразит, например, `06/10/2014` для даты и `15:58` для времени, в то время как
- `medium` будет отображать `6 Oct 2014` и `15:58:42` соответственно,
@ -104,8 +115,8 @@ echo Yii::$app->formatter->asDate('2014-01-01'); // выведет: 1 январ
Дополнительно вы можете задать специальный формат, используя синтаксис, заданный [ICU Project](http://site.icu-project.org/),
который описан в руководстве ICU по следующему адресу:
<http://userguide.icu-project.org/formatparse/datetime>. Также вы можете использовать синтаксис, который распознаётся PHP-функций
[date()](http://php.net/manual/ru/function.date.php), используя строку с префиксом `php:`.
<http://userguide.icu-project.org/formatparse/datetime>. Также вы можете использовать синтаксис, который распознаётся
PHP-функцией [date()](http://php.net/manual/ru/function.date.php), используя строку с префиксом `php:`.
```php
// ICU форматирование
@ -114,12 +125,13 @@ echo Yii::$app->formatter->asDate('now', 'yyyy-MM-dd'); // 2014-10-06
echo Yii::$app->formatter->asDate('now', 'php:Y-m-d'); // 2014-10-06
```
### Временные зоны <span id="time-zones"></span>
### Часовые пояса <span id="time-zones"></span>
Для форматирования значений даты и времени Yii будет преобразовывать их в соответствии с [[yii\i18n\Formatter::timeZone|настроенной временной зоной]].
Поэтому предполагается, что входные значения будут в UTC, если часовой пояс не был указан явно. По этой причине
рекомендуется хранить все значения даты и времени в формате UTC, предпочтительно в виде UNIX timestamp, которая всегда во временной зоне UTC по определению.
Если входное значение находится в часовом поясе, отличном от UTC, часовой пояс должен быть указан явно, как в следующем примере:
Для форматирования значений даты и времени Yii будет преобразовывать их в соответствии с
[[yii\i18n\Formatter::timeZone|настроенным часовым поясом]]. Поэтому предполагается, что входные значения будут в UTC,
если часовой пояс не был указан явно. По этой причине рекомендуется хранить все значения даты и времени в формате UTC,
предпочтительно в виде UNIX timestamp, которая всегда в часовом поясе UTC по определению. Если входное значение
находится в часовом поясе, отличном от UTC, часовой пояс должен быть указан явно, как в следующем примере:
```php
// при условии Yii::$app->timeZone = 'Europe/Berlin';
@ -128,13 +140,14 @@ 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
```
Начиная с версии 2.0.1 стало возможно настраивать временную зону для предполагаемых timestamp, которые не включают в себя временную зону,
как во втором примере в коде выше. Вы можете задать [[yii\i18n\Formatter::defaultTimeZone]] временной зоной, которую вы используете для хранения данных.
Начиная с версии 2.0.1 стало возможно настраивать часовой пояс для предполагаемых timestamp, которые не включают в себя
часовой пояс, как во втором примере в коде выше. Вы можете задать [[yii\i18n\Formatter::defaultTimeZone]] часовым поясом,
который вы используете для хранения данных.
> Примечание: Поскольку временные зоны являются субъектом ответственности правительств по всему миру и могут часто меняться,
> это значит, что вы, вероятно, не имеете самую свежую информацию в базе данных временных зон, установленной на вашем сервере.
> Примечание: Поскольку часовые пояса являются субъектом ответственности правительств по всему миру и могут часто меняться,
> это значит, что вы, вероятно, не имеете самую свежую информацию в базе данных часовых поясов, установленной на вашем сервере.
> Вы можете обратиться к [ICU руководству](http://userguide.icu-project.org/datetime/timezone#TOC-Updating-the-Time-Zone-Data)
> для получения подробностей об обновлении базы данных временных зон.
> для получения подробностей об обновлении базы данных часовых поясов.
> См. также: [Настройка вашего PHP окружения для интернационализации](tutorial-i18n.md#setup-environment).
@ -144,13 +157,17 @@ echo Yii::$app->formatter->asTime('2014-10-06 14:41:00 CEST'); // 14:41:00
Для форматирования числовых значений класс форматирования предоставляет следующие методы:
- [[yii\i18n\Formatter::asInteger()|integer]] - значение будет отформатировано как целое число, например `42`.
- [[yii\i18n\Formatter::asDecimal()|decimal]] - значение будет отформатировано как дробное число, состоящее из целого и дробной части, например: `2,542.123` или `2.542,123`.
- [[yii\i18n\Formatter::asDecimal()|decimal]] - значение будет отформатировано как дробное число, состоящее из целого и
дробной части, например: `2,542.123` или `2.542,123`.
- [[yii\i18n\Formatter::asPercent()|percent]] - значение будет отформатировано как процентное значение, например `42%`.
- [[yii\i18n\Formatter::asScientific()|scientific]] - значение будет отформатировано в научном формате, например: `4.2E4`.
- [[yii\i18n\Formatter::asCurrency()|currency]] - значение будет отформатировано в денежном формате, например: `£420.00`.
Обратите внимание, чтобы эта функция работала правильно, локаль должна включать в себя часть со страной, например: `en_GB` или` en_US` потому что только язык будет неоднозначным в этом случае.
- [[yii\i18n\Formatter::asSize()|size]] - значение будет отформатировано как количество байт в человеко понятном формате, например: `410 kibibytes`.
- [[yii\i18n\Formatter::asShortSize()|shortSize]] - сокращённая версия [[yii\i18n\Formatter::asSize()|size]], например: `410 KiB`.
Обратите внимание, чтобы эта функция работала правильно, локаль должна включать в себя часть со страной, например: `en_GB`
или` en_US` потому что только язык будет неоднозначным в этом случае.
- [[yii\i18n\Formatter::asSize()|size]] - значение будет отформатировано как количество байт в человеко понятном формате,
например: `410 kibibytes`.
- [[yii\i18n\Formatter::asShortSize()|shortSize]] - сокращённая версия [[yii\i18n\Formatter::asSize()|size]], например:
`410 KiB`.
Форматирование чисел может быть скорректирована с помощью [[yii\i18n\Formatter::decimalSeparator|дробного разделителя]] и
[[yii\i18n\Formatter::thousandSeparator|тысячного разделителя]], которые были заданы в соответствии с локалью.
@ -158,7 +175,8 @@ echo Yii::$app->formatter->asTime('2014-10-06 14:41:00 CEST'); // 14:41:00
Для более сложной конфигурации, [[yii\i18n\Formatter::numberFormatterOptions]] и [[yii\i18n\Formatter::numberFormatterTextOptions]]
могут быть использованы для настройки внутренне используемого [класса NumberFormatter](http://php.net/manual/ru/class.numberformatter.php)
Например, чтобы настроить максимальное и минимальное количество знаков после запятой, вы можете настроить свойство [[yii\i18n\Formatter::numberFormatterOptions]] как в примере ниже:
Например, чтобы настроить максимальное и минимальное количество знаков после запятой, вы можете настроить свойство
[[yii\i18n\Formatter::numberFormatterOptions]] как в примере ниже:
```php
'numberFormatterOptions' => [
@ -170,25 +188,31 @@ echo Yii::$app->formatter->asTime('2014-10-06 14:41:00 CEST'); // 14:41:00
Остальное форматирование <span id="other"></span>
----------------
Кроме форматирование даты, времени и чисел, Yii предоставляет набор других полезных средств форматирования для различных ситуаций:
Кроме форматирование даты, времени и чисел, Yii предоставляет набор других полезных средств форматирования для различных
ситуаций:
- [[yii\i18n\Formatter::asRaw()|raw]] - значением будет отображено как есть, это псевдо-форматирование, которое не имеет никакого эффекта,
- [[yii\i18n\Formatter::asRaw()|raw]] - значением будет отображено как есть, это псевдо-форматирование, которое не даёт
никакого эффекта,
кроме значений `null`, которые будет отформатированы в соответствии с [[nullDisplay]].
- [[yii\i18n\Formatter::asText()|text]] - значением будет экранированный от HTML текст.
Это формат по-умолчанию, используемый в [GridView DataColumn](output-data-widgets.md#data-column).
- [[yii\i18n\Formatter::asNtext()|ntext]] - значением будет экранированный от HTML текст с новыми строками, сконвертированными в разрывы строк.
- [[yii\i18n\Formatter::asParagraphs()|paragraphs]] - значением будет экранированный от HTML текст с параграфами, обрамлёнными в `<p>` теги.
- [[yii\i18n\Formatter::asHtml()|html]] - значение будет очищено, используя [[HtmlPurifier]] с целью предотвратить XSS атаки. Вы можете
задать дополнительные параметры, такие как `['html', ['Attr.AllowedFrameTargets' => ['_blank']]]`.
- [[yii\i18n\Formatter::asNtext()|ntext]] - значением будет экранированный от HTML текст с новыми строками,
сконвертированными в разрывы строк.
- [[yii\i18n\Formatter::asParagraphs()|paragraphs]] - значением будет экранированный от HTML текст с параграфами,
обрамлёнными в `<p>` теги.
- [[yii\i18n\Formatter::asHtml()|html]] - значение будет очищено, используя [[HtmlPurifier]] с целью предотвратить XSS
атаки. Вы можете задать дополнительные параметры, такие как `['html', ['Attr.AllowedFrameTargets' => ['_blank']]]`.
- [[yii\i18n\Formatter::asEmail()|email]] - значение будет отформатировано как ссылка `mailto`.
- [[yii\i18n\Formatter::asImage()|image]] - значение будет отформатировано как тег картинки.
- [[yii\i18n\Formatter::asUrl()|url]] - значение будет отформатировано как ссылка <a>.
- [[yii\i18n\Formatter::asBoolean()|boolean]] - значение форматируется как логическое. По-умолчанию `true` будет отображено как `Yes` и `false` как `No`,
переведенное на язык приложения. Вы можете настроить это через свойство [[yii\i18n\Formatter::booleanFormat]].
- [[yii\i18n\Formatter::asBoolean()|boolean]] - значение форматируется как логическое. По-умолчанию `true` будет
отображено как `Yes` и `false` как `No`, переведенное на язык приложения. Вы можете настроить это через свойство
[[yii\i18n\Formatter::booleanFormat]].
`null` значения <span id="null-values"></span>
-------------
Для значений `null` в PHP, класс форматирования будет отображать вместо пустой строки маркер, по-умолчанию это
`(not set)`, переведенный на язык приложения. Вы можете настроить свойство [[yii\i18n\Formatter::nullDisplay|nullDisplay]] для установки собственного маркера.
Если вы не хотите обрабатывать `null` значения, то установите свойство [[yii\i18n\Formatter::nullDisplay|nullDisplay]] в `null`.
`(not set)`, переведенный на язык приложения. Вы можете настроить свойство [[yii\i18n\Formatter::nullDisplay|nullDisplay]]
для установки собственного маркера. Если вы не хотите обрабатывать `null` значения, то установите свойство
[[yii\i18n\Formatter::nullDisplay|nullDisplay]] в `null`.

19
docs/guide-ru/rest-authentication.md

@ -25,7 +25,8 @@ Yii поддерживает все выше перечисленные мето
Чтобы включить аутентификацию для ваших API, выполните следующие шаги:
1. У компонента приложения `user` установите свойство [[yii\web\User::enableSession|enableSession]] равным false.
1. У [компонента приложения](structure-application-components.md) `user` установите свойство
[[yii\web\User::enableSession|enableSession]] равным false.
2. Укажите, какие методы аутентификации вы планируете использовать, настроив поведение `authenticator`
в ваших классах REST-контроллеров.
3. Реализуйте метод [[yii\web\IdentityInterface::findIdentityByAccessToken()]] в вашем [[yii\web\User::identityClass|классе UserIdentity]].
@ -36,15 +37,15 @@ Yii поддерживает все выше перечисленные мето
будет выполняться для каждого запроса, что достигается шагами 2 и 3.
> Подсказка: если вы разрабатываете RESTful API в пределах приложения, вы можете настроить свойство
[[yii\web\User::enableSession|enableSession]] компонента приложения `user` в конфигурации приложения. Если вы
разрабатываете RESTful API как модуль, можете добавить следующую строчку в метод `init()` модуля:
> [[yii\web\User::enableSession|enableSession]] компонента приложения `user` в конфигурации приложения. Если вы
> разрабатываете RESTful API как модуль, можете добавить следующую строчку в метод `init()` модуля:
> ```php
public function init()
{
parent::init();
\Yii::$app->user->enableSession = false;
}
```
> public function init()
> {
> parent::init();
> \Yii::$app->user->enableSession = false;
> }
> ```
Например, для использования HTTP Basic Auth, вы можете настроить свойство `authenticator` следующим образом:

2
docs/guide-ru/rest-quick-start.md

@ -173,7 +173,7 @@ Content-Type: application/xml
> Информация: Вы наверное заметили, что при обращении к `http://localhost/users` мы получаем информацию с полями,
> которые нежелательно показывать, такими как `password_hash` и `auth_key`. Вы можете и должны отфильтровать их как
> описано в разделе «[Форматирование ответа](rest-response-formatting.md)».
> описано в разделе «[Ресурсы](rest-resources.md)».
## Резюме <span id="summary"></span>

22
docs/guide-ru/rest-rate-limiting.md

@ -20,6 +20,28 @@
с данными текущего аутентифицированного пользователя. Для улучшения производительности можно попробовать хранить эту
информацию в кэше или NoSQL хранилище.
Реализация в модели `User` может быть, например, такой:
```php
public function getRateLimit($request, $action)
{
return [$this->rateLimit, 1]; // $rateLimit запросов в секунду
}
public function loadAllowance($request, $action)
{
return [$this->allowance, $this->allowance_updated_at];
}
public function saveAllowance($request, $action, $allowance, $timestamp)
{
$this->allowance = $allowance;
$this->allowance_updated_at = $timestamp;
$this->save();
}
```
Как только соответствующий интерфейс будет реализован в классе identity, Yii начнёт автоматически проверять ограничения
частоты запросов при помощи [[yii\filters\RateLimiter]], фильтра действий для [[yii\rest\Controller]]. При превышении
ограничений будет выброшено исключение [[yii\web\TooManyRequestsHttpException]].

4
docs/guide-ru/rest-routing.md

@ -6,8 +6,8 @@
На деле вам обычно хочется включить «красивые» URL-адреса и использовать все преимущества HTTP-методов (HTTP-verbs).
Например, чтобы запрос `POST /users` означал обращение к действию `user/create`.
Это может быть легко сделано с помощью настройки компонента приложения `urlManager` в
конфигурации приложения следующим образом:
Это может быть легко сделано с помощью настройки [компонента приложения](structure-application-components.md)
`urlManager` в конфигурации приложения следующим образом:
```php
'urlManager' => [

8
docs/guide-ru/start-databases.md

@ -68,6 +68,14 @@ return [
описывающей то, как экземпляр [приложения](structure-applications.md) должен быть инициализирован.
Для детальной информации, пожалуйста, обратитесь к разделу [Конфигурации](concept-configurations.md).
Если вам необходимо работать с базами данных, поддержка которых не включена непосредственно в фреймворк, стоит обратить
внимание на следующие расширения:
- [Informix](https://github.com/edgardmessias/yii2-informix)
- [IBM DB2](https://github.com/edgardmessias/yii2-ibm-db2)
- [Firebird](https://github.com/edgardmessias/yii2-firebird)
Создаём потомка Active Record <span id="creating-active-record"></span>
-------------------------

8
docs/guide-ru/start-installation.md

@ -15,7 +15,7 @@
[getcomposer.org](https://getcomposer.org/download/), или одним из нижеперечисленных способов. На Linux или Mac
используйте следующую команду:
```
```bash
curl -sS https://getcomposer.org/installer | php
mv composer.phar /usr/local/bin/composer
```
@ -29,8 +29,10 @@
После установки Composer устанавливать Yii можно запустив следующую команду в папке доступной через веб:
```bash
composer global require "fxp/composer-asset-plugin:~1.1.1"
composer create-project --prefer-dist yiisoft/yii2-app-basic basic
```
Первая команда устанавливает [composer asset plugin](https://github.com/francoispluchino/composer-asset-plugin/),
который позволяет управлять зависимостями пакетов bower и npm через Composer. Эту команду достаточно выполнить один раз.
@ -47,7 +49,9 @@ Composer установит Yii (шаблонное приложение basic)
> Подсказка: Если вы хотите установить последнюю нестабильную ревизию Yii, можете использовать следующую команду,
> в которой присутствует [опция stability](https://getcomposer.org/doc/04-schema.md#minimum-stability):
>
> ```bash
> composer create-project --prefer-dist --stability=dev yiisoft/yii2-app-basic basic
> ```
>
> Старайтесь не использовать нестабильную версию Yii на рабочих серверах потому как она может внезапно поломать код.
@ -100,7 +104,7 @@ http://localhost/basic/web/index.php
* Браузером перейдите по адресу `http://localhost/basic/requirements.php`
* Или выполните команду в консоли:
```
```bash
cd basic
php requirements.php
```

7
docs/guide-ru/start-looking-ahead.md

@ -4,10 +4,9 @@
В итоге вы создали полноценное приложение на Yii и узнали, как реализовать некоторые
наиболее часто используемые функции, такие, как получение данных от пользователя
при помощи HTML форм, выборки данных из базы данных и их отображения в разбитом на страницы виде.
Так же вы узнали, как использовать [Gii](tool-gii.md) для автоматической генерации кода, что превращает программирование в настолько простую задачу,
как простое заполнение какой-либо формы.
В этом разделе мы обобщим ресурсы о Yii,
которые помогут вам быть более продуктивным при использовании Yii.
Так же вы узнали, как использовать [Gii](https://github.com/yiisoft/yii2-gii/blob/master/docs/guide/README.md) для
автоматической генерации кода, что превращает программирование в настолько простую задачу, как простое заполнение
какой-либо формы. В этом разделе мы обобщим ресурсы о Yii, которые помогут вам быть более продуктивным при использовании Yii.
* Документация
- Подробное руководство:

16
docs/guide-ru/start-workflow.md

@ -5,6 +5,9 @@
> Информация: далее в данном руководстве предполагается, что Yii установлен в директорию `basic/web`, которая, в свою очередь, установлена как корневой каталог в настройках Web сервера. В результате, обратившись по URL `http://hostname/index.php`, Вы получите доступ к приложению, расположенному в `basic/web`. Детальнее с процессом начальной настройки можно познакомиться в разделе [Установка Yii](start-installation.md).
Отметим, что в отличие от фреймворка как только приложение установлено, оно становится целиком вашим. Вы можете изменять
его код как угодно.
Функциональность <span id="functionality"></span>
---------------
@ -13,11 +16,16 @@
* домашняя страница, отображается при переходе по URL `http://hostname/index.php`
* страница "About" ("О нас")
* на странице "Contact" находится форма обратной связи, на которой пользователь может обратиться к разработчику по e-mail
* на странице "Login" отображается форма авторизации. Попытайтесь авторизоваться с логином/паролем "admin/admin". Обратите внимание на изменение раздела "Login" в главном меню на "Logout".
* на странице "Login" отображается форма авторизации. Попытайтесь авторизоваться с логином/паролем "admin/admin".
Обратите внимание на изменение раздела "Login" в главном меню на "Logout".
Эти страницы используют смежный хедер (шапка сайта) и футер (подвал). В "шапке" находится главное меню, при помощи которого пользователь перемещается по сайту. В "подвале" - копирайт и общая информация.
Эти страницы используют смежный хедер (шапка сайта) и футер (подвал). В "шапке" находится главное меню, при помощи
которого пользователь перемещается по сайту. В "подвале" - копирайт и общая информация.
В самой нижней части окна Вы будете видеть системные сообщения Yii - журнал, отладочную информацию, сообщения об ошибках, запросы к базе данных и т.п. Выводом данной информации руководит [встроенный отладчик](tool-debugger.md), он записывает и отображает информацию о ходе выполнения приложения.
В самой нижней части окна Вы будете видеть системные сообщения Yii - журнал, отладочную информацию, сообщения об ошибках,
запросы к базе данных и т.п. Выводом данной информации руководит
[встроенный отладчик](https://github.com/yiisoft/yii2-debug/blob/master/docs/guide/README.md), он записывает и отображает
информацию о ходе выполнения приложения.
В дополнение к веб приложению имеется консольный скрипт с названием `yii`, который находится в базовой директории приложения.
Этот скрипт может быть использован для выполнения фоновых задач и обслуживания приложения. Всё это описано в разделе
@ -48,7 +56,7 @@ basic/ корневой каталог приложения
В целом, приложение Yii можно разделить на две категории файлов: расположенные в `basic/web` и расположенные в других директориях. Первая категория доступна через Web (например, браузером), вторая не доступна из вне и не должна быть доступной т.к. содержит служебную информацию.
В Yii реализована схема проектирования [модель-вид-контроллер (MVC)](http://ru.wikipedia.org/wiki/Model-View-Controller),
В Yii реализована [архитектурный паттерн MVC](http://ru.wikipedia.org/wiki/Model-View-Controller),
которая соответствует структуре директорий приложения. В директории `models` находятся [Модели](structure-models.md),
в `views` расположены [Виды](structure-views.md), а в каталоге `controllers` все [Контроллеры](structure-controllers.md) приложения.

10
docs/guide-ru/structure-filters.md

@ -317,11 +317,11 @@ public function behaviors()
### [[yii\filters\Cors|Cors]] <span id="cors"></span>
Совместное использование разными источниками [CORS](https://developer.mozilla.org/fr/docs/HTTP/Access_control_CORS) - это
механизм, который позволяет использовать различные ресурсы (шрифты, скрипты, и т.д.) с отличных от основного сайта доменов.
В частности, AJAX вызовы JavaScript могут использовать механизм XMLHttpRequest. В противном случае, такие "междоменные"
запросы были бы запрещены из-за политики безопасности same origin.
CORS задаёт способ взаимодействия сервера и браузера, определяющий возможность делать междоменные запросы.
Совместное использование разными источниками [CORS](https://developer.mozilla.org/ru/docs/Web/HTTP/Access_control_CORS)
- это механизм, который позволяет использовать различные ресурсы (шрифты, скрипты, и т.д.) с отличных от основного сайта
доменов. В частности, AJAX вызовы JavaScript могут использовать механизм XMLHttpRequest. В противном случае, такие
"междоменные" запросы были бы запрещены из-за политики безопасности same origin. CORS задаёт способ взаимодействия
сервера и браузера, определяющий возможность делать междоменные запросы.
Фильтр [[yii\filters\Cors|Cors filter]] следует определять перед фильтрами Аутентификации / Авторизации, для того чтобы
быть уверенными, что заголовки CORS будут всегда посланы.

118
docs/guide-ru/structure-modules.md

@ -6,7 +6,9 @@
## Создание модулей <span id="creating-modules"></span>
Модуль помещается в директорию, которая называется [[yii\base\Module::basePath|базовым путем]] модуля. Так же как и в директории приложения, в этой директории существуют поддиректории `controllers`, `models`, `views` и другие, в которых размещаются контроллеры, модели, представления и другие элементы. В следующем примере показано примерное содержимое модуля:
Модуль помещается в директорию, которая называется [[yii\base\Module::basePath|базовым путем]] модуля. Так же как и в
директории приложения, в этой директории существуют поддиректории `controllers`, `models`, `views` и другие, в которых
размещаются контроллеры, модели, представления и другие элементы. В следующем примере показано примерное содержимое модуля:
```
forum/
@ -23,7 +25,11 @@ forum/
### Классы модулей <span id="module-classes"></span>
Каждый модуль объявляется с помощью уникального класса, который наследуется от [[yii\base\Module]]. Этот класс должен быть помещен в корне [[yii\base\Module::basePath|базового пути]] модуля и поддерживать [автозагрузку](concept-autoloading.md). Во время доступа к модулю будет создан один экземпляр соответствующего класса модуля. Как и [экземпляры приложения](structure-applications.md), экземпляры модулей нужны, чтобы код модулей мог получить общий доступ к данным и компонентам.
Каждый модуль объявляется с помощью уникального класса, который наследуется от [[yii\base\Module]]. Этот класс должен
быть помещен в корне [[yii\base\Module::basePath|базового пути]] модуля и поддерживать [автозагрузку](concept-autoloading.md).
Во время доступа к модулю будет создан один экземпляр соответствующего класса модуля. Как и
[экземпляры приложения](structure-applications.md), экземпляры модулей нужны, чтобы код модулей мог получить общий
доступ к данным и компонентам.
Приведем пример того, как может выглядеть класс модуля:
@ -42,7 +48,8 @@ class Module extends \yii\base\Module
}
```
Если метод `init()` стал слишком громоздким из-за кода, который задает свойства модуля, эти свойства можно сохранить в виде [конфигурации](concept-configurations.md), а затем загрузить в методе `init()` следующим образом:
Если метод `init()` стал слишком громоздким из-за кода, который задает свойства модуля, эти свойства можно сохранить
в виде [конфигурации](concept-configurations.md), а затем загрузить в методе `init()` следующим образом:
```php
public function init()
@ -53,7 +60,8 @@ public function init()
}
```
При этом в конфигурационном файле `config.php` может быть код следующего вида, аналогичный [конфигурации приложения](structure-applications.md#application-configurations):
При этом в конфигурационном файле `config.php` может быть код следующего вида, аналогичный
[конфигурации приложения](structure-applications.md#application-configurations):
```php
<?php
@ -70,7 +78,10 @@ return [
### Контроллеры в модулях <span id="controllers-in-modules"></span>
При создании контроллеров модуля принято помещать классы контроллеров в подпространство `controllers` пространства имен класса модуля. Это также подразумевает, что файлы классов контроллеров должны располагаться в директории `controllers` [[yii\base\Module::basePath|базового пути]] модуля. Например, чтобы описать контроллер `post` в модуле `forum` из предыдущего примера, класс контроллера объявляется следующим образом:
При создании контроллеров модуля принято помещать классы контроллеров в подпространство `controllers` пространства
имён класса модуля. Это также подразумевает, что файлы классов контроллеров должны располагаться в директории `controllers`
[[yii\base\Module::basePath|базового пути]] модуля. Например, чтобы описать контроллер `post` в модуле `forum` из
предыдущего примера, класс контроллера объявляется следующим образом:
```php
namespace app\modules\forum\controllers;
@ -83,19 +94,56 @@ class PostController extends Controller
}
```
Изменить пространство имен классов контроллеров можно задав свойство [[yii\base\Module::controllerNamespace]]. Если какие-либо контроллеры выпадают из этого пространства имен, доступ к ним можно осуществить, настроив свойство [[yii\base\Module::controllerMap]], аналогично тому, [как это делается в приложении](structure-applications.md#controller-map).
Изменить пространство имен классов контроллеров можно задав свойство [[yii\base\Module::controllerNamespace]]. Если
какие-либо контроллеры выпадают из этого пространства имен, доступ к ним можно осуществить, настроив свойство
[[yii\base\Module::controllerMap]], аналогично тому, [как это делается в приложении](structure-applications.md#controller-map).
### Представления в модулях <span id="views-in-modules"></span>
Представления модуля также следует поместить в в поддиректорию `views` [[yii\base\Module::basePath|базового пути]] модуля. Виды, которые рендерит контроллер модуля, должны располагаться в директории `views/ControllerID`, где `ControllerID` соответствует [идентификатору контроллера](structure-controllers.md#routes). Например, если контроллер реализуется классом `PostController`, представления следует разместить в поддиректории `views/post` [[yii\base\Module::basePath|базового пути]] модуля.
Представления модуля также следует поместить в в поддиректорию `views` [[yii\base\Module::basePath|базового пути]]
модуля. Виды, которые рендерит контроллер модуля, должны располагаться в директории `views/ControllerID`, где `ControllerID`
соответствует [идентификатору контроллера](structure-controllers.md#routes). Например, если контроллер реализуется
классом `PostController`, представления следует разместить в поддиректории `views/post`
[[yii\base\Module::basePath|базового пути]] модуля.
В модуле можно задать [шаблон](structure-views.md#layouts), который будет использоваться для рендеринга всех представлений
контроллерами модуля. По умолчанию шаблон помещается в директорию `views/layouts`, а свойство [[yii\base\Module::layout]]
должно указывать на имя этого шаблона. Если не задать свойство `layout`, модуль будет использовать шаблон, заданный
в приложении.
### Консольные команды в модулях <span id="console-commands-in-modules"></span>
Ваш модуль также может объявлять команды, которые будут доступны через [консоль](tutorial-console.md).
Для того, чтобы команда стала доступна, надо изменить свойство [[yii\base\Module::controllerNamespace]] для консольного
режима так, чтобы оно содержало пространство имён ваших команд.
Этого можно добиться проверяя класс экземпляра приложения Yii в методе `init` модуля:
```php
public function init()
{
parent::init();
if (Yii::$app instanceof \yii\console\Application) {
$this->controllerNamespace = 'app\modules\forum\commands';
}
}
```
Ваши команды будут доступны из командной строки как:
```
yii <module_id>/<command>/<sub_command>
```
В модуле можно задать [шаблон](structure-views.md#layouts), который будет использоваться для рендеринга всех представлений контроллерами модуля. По умолчанию шаблон помещается в директорию `views/layouts`, а свойство [[yii\base\Module::layout]] должно указывать на имя этого шаблона. Если не задать свойство `layout`, модуль будет использовать шаблон, заданный в приложении.
## Использование модулей <span id="using-modules"></span>
Чтобы задействовать модуль в приложении, достаточно включить его в свойство [[yii\base\Application::modules|modules]] в конфигурации приложения. Следующий код в [конфигурации приложения](structure-applications.md#application-configurations) задействует модуль `forum`:
Чтобы задействовать модуль в приложении, достаточно включить его в свойство [[yii\base\Application::modules|modules]]
в конфигурации приложения. Следующий код в [конфигурации приложения](structure-applications.md#application-configurations)
задействует модуль `forum`:
```php
[
@ -108,25 +156,40 @@ class PostController extends Controller
]
```
Свойству [[yii\base\Application::modules|modules]] присваивается массив, содержащий конфигурацию модуля. Каждый ключ массива представляет собой *идентификатор модуля*, который однозначно определяет модуль среди других модулей приложения, а соответствующий массив - это [конфигурация](concept-configurations.md) для создания модуля.
Свойству [[yii\base\Application::modules|modules]] присваивается массив, содержащий конфигурацию модуля. Каждый ключ массива
представляет собой *идентификатор модуля*, который однозначно определяет модуль среди других модулей приложения,
а соответствующий массив - это [конфигурация](concept-configurations.md) для создания модуля.
### Маршруты <span id="routes"></span>
Как маршруты приложения используются для обращения к контроллерам приложения, [маршруты](structure-controllers.md#routes) модуля используются, чтобы обращаться к контроллерам этого модуля. Маршрут контроллера в модуле должен начинаться с идентификатора модуля, за которым следуют идентификатор контроллера и идентификатор действия. Например, если в приложении задействован модуль `forum`, то маршрут `forum/post/index` соответствует действию `index` контроллера `post` этого модуля. Если маршрут состоит только из идентификатора модуля, то контроллер и действие определяются исходя из свойства [[yii\base\Module::defaultRoute]], которое по умолчанию равно `default`. Таким образом, маршрут `forum` соответствует контроллеру `default` модуля `forum`.
Как маршруты приложения используются для обращения к контроллерам приложения, [маршруты](structure-controllers.md#routes)
модуля используются, чтобы обращаться к контроллерам этого модуля. Маршрут контроллера в модуле должен начинаться с
идентификатора модуля, за которым следуют [идентификатор контроллера](structure-controllers.md#controller-ids) и
[идентификатор действия](structure-controllers.md#action-ids). Например, если в приложении задействован модуль `forum`,
то маршрут `forum/post/index` соответствует действию `index` контроллера `post` этого модуля. Если маршрут состоит только
из идентификатора модуля, то контроллер и действие определяются исходя из свойства [[yii\base\Module::defaultRoute]],
которое по умолчанию равно `default`. Таким образом, маршрут `forum` соответствует контроллеру `default` модуля `forum`.
### Получение доступа к модулям <span id="accessing-modules"></span>
Зачастую внутри модуля может потребоваться доступ к экземпляру [класса модуля](#module-classes), через который получаются идентификатор модуля, его параметры, компоненты, и т. п. Это можно сделать с помощью следующей конструкции:
Зачастую внутри модуля может потребоваться доступ к экземпляру [класса модуля](#module-classes), через который получаются
идентификатор модуля, его параметры, компоненты, и т. п. Это можно сделать с помощью следующей конструкции:
```php
$module = MyModuleClass::getInstance();
```
где `MyModuleClass` соответствует имени класса модуля, доступ к которому нужно получить. Метод `getInstance()` возвращает запрошенный в данный момент экземпляр класса модуля. Если модуль не запрошен, метод вернет null. Учтите, что обычно экземпляры класса модуля вручную не создаются, так как созданный вручную экземпляр будет отличаться от экземпляра, созданного Yii в качестве ответа на запрос.
где `MyModuleClass` соответствует имени класса модуля, доступ к которому нужно получить. Метод `getInstance()` возвращает
запрошенный в данный момент экземпляр класса модуля. Если модуль не запрошен, метод вернет null. Учтите, что обычно
экземпляры класса модуля вручную не создаются, так как созданный вручную экземпляр будет отличаться от экземпляра,
созданного Yii в качестве ответа на запрос.
> Информация: При разработке модуля нельзя исходить из предположения, что модулю будет назначен конкретный идентификатор. Это связано с тем, что идентификатор, назначаемый модулю при использовании в приложении или в другом модуле, может быть выбран совершенно произвольно. Чтобы получить идентификатор модуля, нужно вначале выбрать экземпляр модуля, как это описано выше, а затем получить доступ к идентификатору через свойство `$module->id`.
> Информация: При разработке модуля нельзя исходить из предположения, что модулю будет назначен конкретный идентификатор.
Это связано с тем, что идентификатор, назначаемый модулю при использовании в приложении или в другом модуле, может быть
выбран совершенно произвольно. Чтобы получить идентификатор модуля, нужно вначале выбрать экземпляр модуля, как это
описано выше, а затем получить доступ к идентификатору через свойство `$module->id`.
Доступ к экземпляру модуля можно получить следующими способами:
@ -138,7 +201,8 @@ $module = \Yii::$app->getModule('forum');
$module = \Yii::$app->controller->module;
```
Первый подход годится только если известен идентификатор модуля, а второй подход наиболее полезен, если известно, какой контроллер запрошен.
Первый подход годится только если известен идентификатор модуля, а второй подход наиболее полезен, если известно,
какой контроллер запрошен.
Имея экземпляр модуля можно получить доступ к параметрам и компонентам, зарегистрированным в модуле. Например,
@ -149,7 +213,9 @@ $maxPostCount = $module->params['maxPostCount'];
### Предзагрузка модулей <span id="bootstrapping-modules"></span>
Может потребоваться запускать некоторые модули при каждом запросе. Модуль [[yii\debug\Module|debug]] - один из таких модулей. Для этого список идентификаторов таких модулей необходимо указать в свойстве [[yii\base\Application::bootstrap|bootstrap]] приложения.
Может потребоваться запускать некоторые модули при каждом запросе. Модуль [[yii\debug\Module|debug]] - один из таких
модулей. Для этого список идентификаторов таких модулей необходимо указать в свойстве
[[yii\base\Application::bootstrap|bootstrap]] приложения.
Например, следующая конфигурация приложения обеспечивает загрузку модуля `debug` при каждом запросе:
@ -168,7 +234,9 @@ $maxPostCount = $module->params['maxPostCount'];
## Вложенные модули <span id="nested-modules"></span>
Модули могут вкладываться друг в друга без ограничений по глубине. Иными словами, в модуле содержится модуль, в который входит еще один модуль, и т. д. Первый модуль называется *родительским*, остальные - *дочерними*. Дочерние модули объявляются в свойстве [[yii\base\Module::modules|modules]] родительских модулей. Например,
Модули могут вкладываться друг в друга без ограничений по глубине. Иными словами, в модуле содержится модуль, в который
входит еще один модуль, и т. д. Первый модуль называется *родительским*, остальные - *дочерними*. Дочерние модули
объявляются в свойстве [[yii\base\Module::modules|modules]] родительских модулей. Например,
```php
namespace app\modules\forum;
@ -189,13 +257,21 @@ class Module extends \yii\base\Module
}
```
Маршрут к контроллеру вложенного модуля должен содержать идентификаторы всех его предков. Например, маршрут `forum/admin/dashboard/index` соответствует действию `index` контроллера `dashboard` модуля `admin`, который в свою очередь является дочерним модулем модуля `forum`.
Маршрут к контроллеру вложенного модуля должен содержать идентификаторы всех его предков. Например, маршрут
`forum/admin/dashboard/index` соответствует действию `index` контроллера `dashboard` модуля `admin`, который в свою
очередь является дочерним модулем модуля `forum`.
> Информация: Метод [[yii\base\Module::getModule()|getModule()]] возвращает только те дочерние модули, которые принадлежат родительскому модулю непосредственно. В свойстве [[yii\base\Application::loadedModules]] содержится список загруженных модулей, в том числе прямых и косвенных потомков, с индексированием по имени класса.
> Информация: Метод [[yii\base\Module::getModule()|getModule()]] возвращает только те дочерние модули, которые
принадлежат родительскому модулю непосредственно. В свойстве [[yii\base\Application::loadedModules]] содержится
список загруженных модулей, в том числе прямых и косвенных потомков, с индексированием по имени класса.
## Лучшие практики<span id="best-practices"></span>
Модули лучше всего подходят для крупных приложений, функционал которых можно разделить на несколько групп, в каждой из которых функции тесно связаны между собой. Каждая группа функций может разрабатываться в виде модуля, над которым работает один разработчик или одна команда.
Модули лучше всего подходят для крупных приложений, функционал которых можно разделить на несколько групп, в каждой из
которых функции тесно связаны между собой. Каждая группа функций может разрабатываться в виде модуля, над которым работает
один разработчик или одна команда.
Модули - это хороший способ повторно использовать код на уровне групп функций. В виде модулей можно реализовать такой функционал как управление пользователями или управление комментариями, а затем использовать эти модули в будущих разработках.
Модули - это хороший способ повторно использовать код на уровне групп функций. В виде модулей можно реализовать такая
функциональность как управление пользователями или управление комментариями, а затем использовать эти модули в будущих
разработках.

9
docs/guide-ru/structure-widgets.md

@ -71,6 +71,15 @@ use yii\helpers\Html;
рендеринга, метод [[yii\base\Widget::begin()]] возвращает экземпляр виджета, который может быть
использован в дальнейшем для формирования его внутреннего содержимого.
### Задание глобальных умолчаний
Глобальные умолчания для определённого типа виджета могут быть заданы через DI контейнер:
```php
\Yii::$container->set('yii\widgets\LinkPager', ['maxButtonCount' => 5]);
```
Подробнее это описано в [подразделе «Практическое использование» раздела «Контейнер внедрения зависимостей»](concept-di-container.md#practical-usage).
## Создание Виджетов <span id="creating-widgets"></span>

8
docs/guide-ru/tutorial-console.md

@ -27,6 +27,7 @@
Больше об этой команде вы можете узнать в [I18N Section](tutorial-i18n.md#message-command).
- [[yii\console\controllers\MigrateController|MigrateController]] - Управление миграциями приложения.
Миграции базы данных более детально описаны в [Database Migration Section](db-migrations.md).
- [[yii\console\controllers\ServeController|ServeController]] - позволяет запускать встроенный вебсервер PHP.
Использование <span id="usage"></span>
@ -184,8 +185,8 @@ public function actionIndex()
Есть несколько предопределённых констант, которые вы можете использовать:
- `Controller::EXIT_CODE_NORMAL` со значением `0`;
- `Controller::EXIT_CODE_ERROR` со значением `1`.
- [[yii\console\Controller::EXIT_CODE_NORMAL|Controller::EXIT_CODE_NORMAL]] со значением `0`;
- [[yii\console\Controller::EXIT_CODE_ERROR|Controller::EXIT_CODE_ERROR]] со значением `1`.
Хорошая практика, определять значимые для вашего контроллера константы в случае, если вы используете больше типов ошибок.
@ -200,7 +201,8 @@ public function actionIndex()
$this->stdout("Hello?\n", Console::BOLD);
```
Если вам нужно собрать строку динамически объединяя несколько стилей, лучше использовать `ansiFormat`:
Если вам нужно собрать строку динамически объединяя несколько стилей, лучше использовать
[[yii\helpers\Console::ansiFormat()|ansiFormat()]]:
```php
$name = $this->ansiFormat('Alex', Console::FG_YELLOW);

Loading…
Cancel
Save