Commit e55bce18 by Anton A

Merge branch 'master' of git://github.com/yiisoft/yii2 into guide-start-hello

parents e64ecc6b e86a7d7a
......@@ -9,18 +9,18 @@ All Rights Reserved.
Введение
------------
--------
* [О Yii](intro-yii.md)
* [Обновление с версии 1.1](intro-upgrade-from-v1.md)
Getting Started
---------------
Первое знакомство
-----------------
* [Установка Yii](start-installation.md)
* [Запуск приложения](start-workflow.md)
* [Говорим "привет"](start-hello.md)
* [Говорим «привет»](start-hello.md)
* [Работа с формами](start-forms.md)
* [Работа с базами данных](start-databases.md)
* [Генерация кода при помощи Gii](start-gii.md)
......
Что такое Yii?
==============
Yii – это высокопроизводительный компонентный PHP фреймворк, предназначенный для быстрой разработки современных веб
приложений. Слово Yii (произносится как `Йи` `[ji:]`) в китайском языке означает «простой и эволюционирующий». Также Yii
может расшифровываться как акроним **Yes It Is**!
Для каких задач больше всего подходит Yii?
------------------------------------------
Yii – это универсальный фреймворк и может быть задействован во всех типах веб приложений. Благодаря его компонентной
структуре и отличной поддержке кеширования, фреймворк особенно подходит для разработки таких крупных проектов как
порталы, форумы, CMS, магазины или RESTful-приложения.
Сравнение Yii с другими фреймворками
------------------------------------
- Как и многие другие PHP фреймворки, для организации кода Yii использует модель MVC (Model-View-Controller).
- Yii придерживается философии простого и элегантного кода не пытаясь усложнять дизайн только ради следования каким-либо
шаблонам проектирования.
- Yii является full-stack фреймворком и включает в себя проверенные и хорошо зарекомендовавшие себя возможности, такие как
ActiveRecord для реляционных и NoSQL баз данных, поддержку REST API, многоуровневое кеширование и другие.
- Yii отлично расширяем. Вы можете настроить или заменить практически любую часть основного кода. Используя архитектуру
расшрений легко делиться кодом или использовать код сообщества.
- Одна из главных целей Yii – производительность.
Yii — не проект одного человека. Он поддерживается и развивается [сильной командой][] и большим сообществом разработчиков,
которые ей помогают. Разработчики фреймворка следят за тенденциями веб разработки и развитием других проектов. Наиболее
подходящие возможности и лучшие практики регулярно внедряются в фреймворк в виде простых и элегантных интерфейсов.
[сильной командой]: http://www.yiiframework.com/about/
Версии Yii
----------
На данный момент существует две основные ветки Yii: 1.1 и 2.0. Ветка 1.1 является предыдущим поколением и находится
в состоянии поддержки. Версия 2.0 – это полностью переписанный Yii, использующий последние технологии и протоколы, такие
как Composer, PSR, пространства имен, типажи (traits) и многое другое. 2.0 — последнее поколение фреймворка. На этой версии
будут сосредоточены основные усилия несколько следующих лет. Данное руководство именно о версии 2.0.
Требования к ПО и знаниям
-------------------------
Yii 2.0 требует PHP 5.4.0 и выше. Чтобы узнать требования для отдельных возможностей вы можете запустить скрипт проверки
требований, который поставляется с каждым релизом фреймворка.
Для разработки на Yii потребуется общее понимание ООП так как фреймворк полностью следует этой парадигме. Также следует
изучить такие современные возможности PHP как [пространства имён](http://www.php.net/manual/ru/language.namespaces.php)
и [типажи](http://www.php.net/manual/ru/language.oop5.traits.php).
......@@ -95,7 +95,7 @@ the [PDO PHP Extension](http://www.php.net/manual/en/pdo.installation.php) and a
Configuring Web Servers <a name="configuring-web-servers"></a>
-----------------------
> Info: You may skip this sub-section for now if you are just testing driving Yii with no intention
> Info: You may skip this sub-section for now if you are just test driving Yii with no intention
of deploying it to a production server.
The application installed according to the above instructions should work out of box with either
......
......@@ -325,8 +325,8 @@ without touching any dependent code.
#### [[yii\base\Application::sourceLanguage|sourceLanguage]] <a name="sourceLanguage"></a>
This property specifies the language that the application code is written in. The default value is `'en'`,
meaning English. You should configure this property if the text content in your code is not in English.
This property specifies the language that the application code is written in. The default value is `'en-US'`,
meaning English (United States). You should configure this property if the text content in your code is not in English.
Like the [language](#language) property, you should configure this property in terms of
an [IETF language tag](http://en.wikipedia.org/wiki/IETF_language_tag). For example, `en` stands for English,
......
......@@ -23,30 +23,15 @@ Please refer to the relevant documentation for more details about these advanced
## Attributes <a name="attributes"></a>
Attributes are the properties that represent business data. By default, attributes are *non-static public*
member variables if your model class extends directly from [[yii\base\Model]].
Models represent business data in terms of *attributes*. Each attribute is like a publicly accessible property
of a model. The method [[yii\base\Model::attributes()]] specifies what attributes a model class has.
The following code creates a `ContactForm` model class with four attributes: `name`, `email`, `subject` and `body`.
This model represents the input data that is received from an HTML form.
```php
namespace app\models;
use yii\base\Model;
class ContactForm extends Model
{
public $name;
public $email;
public $subject;
public $body;
}
```
Naturally, you can access an attribute like accessing a normal object property:
You can access an attribute like accessing a normal object property:
```php
$model = new \app\models\ContactForm;
// "name" is an attribute of ContactForm
$model->name = 'example';
echo $model->name;
```
......@@ -68,12 +53,33 @@ foreach ($model as $name => $value) {
}
```
### Extending model attributes
The method [[yii\base\Model::attributes()]] defines and returns the names of the attributes in a model.
You may override this method to support different ways of defining attributes. For example, [[yii\db\ActiveRecord]]
does so by returning table column names as attribute names. Note that you may also need to override the magic
methods such as `__get()`, `__set()` so that the attributes can be accessed like normal object properties.
### Defining Attributes <a name="defining-attributes"></a>
By default, if your model class extends directly from [[yii\base\Model]], all its *non-static public* member
variables are attributes. For example, the `ContactForm` model class below has four attributes: `name`, `email`,
`subject` and `body`. The `ContactForm` model is used to represent the input data received from an HTML form.
```php
namespace app\models;
use yii\base\Model;
class ContactForm extends Model
{
public $name;
public $email;
public $subject;
public $body;
}
```
You may override [[yii\base\Model::attributes()]] to define attributes in a different way. The method should
return the names of the attributes in a model. For example, [[yii\db\ActiveRecord]] does so by returning
the column names of the associated database table as its attribute names. Note that you may also need to
override the magic methods such as `__get()`, `__set()` so that the attributes can be accessed like
normal object properties.
## Attribute Labels <a name="attribute-labels"></a>
......@@ -82,6 +88,15 @@ When displaying values or getting input for attributes, you often need to displa
with attributes. For example, given an attribute named `firstName`, you may want to display a label `First Name`
which is more user-friendly when displayed to end users in places such as form inputs and error messages.
You can get the label of an attribute by calling [[yii\base\Model::getAttributeLabel()]]. For example,
```php
$model = new \app\models\ContactForm;
// displays "Label"
echo $model->getAttributeLabel('name');
```
By default, attribute labels are automatically generated from attribute names. The generation is done by
the method [[yii\base\Model::generateAttributeLabel()]]. It will turn camel-case variable names into
multiple words with the first letter in each word in upper case. For example, `username` becomes `Username`,
......@@ -156,7 +171,8 @@ $model->scenario = 'login';
$model = new User(['scenario' => 'login']);
```
To support multiple scenarios by a single model, you may override the [[yii\base\Model::scenarios()]] method,
By default, the scenarios supported by a model are determined by the [validation rules](#validation) declared
in the model. However, you can customize this behavior by overriding the [[yii\base\Model::scenarios()]] method,
like the following:
```php
......@@ -218,10 +234,10 @@ you may want to make sure all attributes are not empty and the `email` attribute
If the values for some attributes do not satisfy the corresponding business rules, appropriate error messages
should be displayed to help the user to fix the errors.
You may call [[yii\base\Model::validate()]] to trigger validation. The method will go through every *active rule*
and make sure it is satisfied. If not, an error message will be generated for each failed rule and attribute.
The method returns a boolean value indicating whether all rules are satisfied. If not, you may retrieve the
error messages through the property [[yii\base\Model::errors]] or [[yii\base\Model::firstErrors]]. For example,
You may call [[yii\base\Model::validate()]] to validate the received data. The method will use
the validation rules declared in [[yii\base\Model::rules()]] to validate every relevant attribute. If no error
is found, it will return true. Otherwise, it will keep the errors in the [[yii\base\Model::errors]] property
and return false. For example,
```php
$model = new \app\models\ContactForm;
......@@ -239,7 +255,7 @@ if ($model->validate()) {
To declare validation rules associated with a model, override the [[yii\base\Model::rules()]] method by returning
the rules that the model data should satisfy. The following example should the validation rules
the rules that the model attributes should satisfy. The following example shows the validation rules declared
for the `ContactForm` model:
```php
......@@ -255,50 +271,31 @@ public function rules()
}
```
The `rules()` method returns an array of rules, each of which is an array in the following format:
```php
[
// required, specifies which attributes should be validated by this rule.
// For single attribute, you can use the attribute name directly
// without having it in an array instead of an array
['attribute1', 'attribute2', ...],
// required, specifies the type of this rule.
// It can be a class name, validator alias, or a validation method name
'validator',
// optional, specifies in which scenario(s) this rule should be applied
// if not given, it means the rule applies to all scenarios
'on' => ['scenario1', 'scenario2', ...],
// optional, specifies additional configurations for the validator object
'property1' => 'value1', 'property2' => 'value2', ...
]
```
A rule may be applied to one or multiple attributes. A rule may be applicable only in certain [scenarios](#scenarios).
When a rule is applicable in a scenario, it is called an *active rule* in that scenario.
A rule can be used to validate one or multiple attributes, and an attribute may be validated by one or multiple rules.
Please refer to the [Validating Input](input-validation.md) section for more details on how to declare
validation rules.
When the `validate()` method is called, it does the following steps to perform validation:
Sometimes, you may want a rule to be applied only in certain [scenarios](#scenarios). To do so, you can
specify the `on` property of a rule, like the following:
1. Determine which attributes should be validated by checking the current [[yii\base\Model::scenario|scenario]]
against the scenarios declared in [[yii\base\Model::scenarios()]]. These attributes are the active attributes.
2. Determine which rules should be applied by checking the current [[yii\base\Model::scenario|scenario]]
against the rules declared in [[yii\base\Model::rules()]]. These rules are the active rules.
3. Use each active rule to validate each active attribute which is associated with the rule.
```php
public function rules()
{
return [
// username, email and password are all required in "register" scenario
[['username', 'email', 'password'], 'required', 'on' => 'register'],
According to the above validation steps, an attribute will be validated if and only if it is
an active attribute declared in `scenarios()` and it is associated with one or multiple active rules
declared in `rules()`.
// username and password are required in "login" scenario
[['username', 'password'], 'required', 'on' => 'login'],
];
}
```
Yii provides a set of built-in validators to support commonly needed data validation tasks. You may also
create your own validators by extending [[yii\validators\Validator]] or writing an inline validation method
within model classes. For more details about the built-in validators and how to create your own validators,
please refer to the [Input Validation](input-validation.md) section.
If you do not specify the `on` property, the rule would be applied in all scenarios. A rule is called
an *active rule* if it can be applied in the current [[yii\base\Model::scenario|scenario]].
> Note: As a rule of thumb, never trust the data coming from end users and always validate them before
putting them to some good use.
An attribute will be validated if and only if it is an active attribute declared in `scenarios()` and
is associated with one or multiple active rules declared in `rules()`.
## Massive Assignment <a name="massive-assignment"></a>
......
......@@ -70,7 +70,7 @@ Yii tries to load appropriate translation from one of the message sources define
'app*' => [
'class' => 'yii\i18n\PhpMessageSource',
//'basePath' => '@app/messages',
//'sourceLanguage' => 'en',
//'sourceLanguage' => 'en-US',
'fileMap' => [
'app' => 'app.php',
'app/error' => 'error.php',
......@@ -323,7 +323,7 @@ class Module extends \yii\base\Module
{
Yii::$app->i18n->translations['modules/users/*'] = [
'class' => 'yii\i18n\PhpMessageSource',
'sourceLanguage' => 'en',
'sourceLanguage' => 'en-US',
'basePath' => '@app/modules/users/messages',
'fileMap' => [
'modules/users/validation' => 'validation.php',
......@@ -370,7 +370,7 @@ class Menu extends Widget
$i18n = Yii::$app->i18n;
$i18n->translations['widgets/menu/*'] = [
'class' => 'yii\i18n\PhpMessageSource',
'sourceLanguage' => 'en',
'sourceLanguage' => 'en-US',
'basePath' => '@app/widgets/menu/messages',
'fileMap' => [
'widgets/menu/messages' => 'messages.php',
......@@ -407,7 +407,7 @@ Sometimes you want to correct default framework message translation for your app
'translations' => [
'yii' => [
'class' => 'yii\i18n\PhpMessageSource',
'sourceLanguage' => 'en',
'sourceLanguage' => 'en-US',
'basePath' => '/path/to/my/message/files'
],
],
......
# Upload File with Yii2
### First you need to create a model that will handle the form of download the file.
```php
namespace app\models;
use yii\base\Model;
use yii\web\UploadedFile;
/**
* UploadForm is the model behind the upload form.
*/
class UploadForm extends Model
{
/**
* @var UploadedFile|Null file attribute
*/
public $file;
/**
* @return array the validation rules.
*/
public function rules()
{
return [
[['file'], 'file'],
];
}
}
```
In this code, we created a model ```UploadForm``` with an attribute ```$file``` that will be is ```<input type="file">``` in upload form and pointed out to him validation rule ```file```. This rule is [[yii\validators\FileValidator|FileValidator]]
### Secondly create a view for our model.
```php
<?php
use yii\widgets\ActiveForm;
$form = ActiveForm::begin(['options' => ['enctype' => 'multipart/form-data']]); ?>
<?= $form->field($model, 'file')->fileInput() ?>
<button>Submit</button>
<?php ActiveForm::end(); ?>
```
It is different attribute ```'enctype' => 'multipart/form-data'``` from the standard form. This value is required when you are using forms that have a file upload control. ```fileInput()``` represents a form input field.
### Thirdly, that create the controller that will connect our form and model.
```php
namespace app\controllers;
use Yii;
use yii\web\Controller;
use app\models\UploadForm;
use yii\web\UploadedFile;
class SiteController extends Controller
{
public function actionUpload()
{
$model = new UploadForm();
if (Yii::$app->request->isPost) {
$model->file = UploadedFile::getInstance($model, 'file');
if ($model->validate()) {
$model->file->saveAs('uploads/' . $model->file->baseName . '.' . $model->file->extension);
}
}
return $this->render('upload', ['model' => $model]);
}
}
```
The difference here from the standard crud action, so use ```UploadedFile::getInstance(...)``` instead ```model->load(...)```. [[\yii\web\UploadedFile|UploadedFile]] does not run the model validation, it only provides information about the uploaded file. Therefore, you need to run validation manually ```$model->validate()```. This triggers the [[yii\validators\FileValidator|FileValidator]] that expects a file
```php
$file instanceof UploadedFile || $file->error == UPLOAD_ERR_NO_FILE //in code framework
```
If validation done without errors, then save the file
```php
$model->file->saveAs('uploads/' . $model->file->baseName . '.' . $model->file->extension);
```
If you use "basic" application then forlder ```uploads``` should be create inside ```web``` folder.
Everything is ready, now run the page and download the file. Check the folder ```basic/web/uploads``` to make sure that you have downloaded.
## Additional information.
***
### Required rule
If you need to check the mandatory download the file, then use ```skipOnEmpty```.
```php
public function rules()
{
return [
[['file'], 'file', 'skipOnEmpty' => false],
];
}
```
***
### Path upload folder
Folder to download the file can be installed using ```Yii::getAlias('@app/uploads')```. This base path of currently running application and folder ```uploads``
***
### MIME type
FileValidator have property ```$types```
```php
public function rules()
{
return [
[['file'], 'file', 'types' => 'gif, jpg',],
];
}
```
it pulls
```php
in_array(strtolower(pathinfo($file->name, PATHINFO_EXTENSION)), $this->types, true))
```
As you can see, the name of the expansion may be one and the file type - other, actually.
``UploadedFile::getInstance()->type``` also do not take this value for granted.
Instead, use [[\yii\helpers\BaseFileHelper|FileHelper]] and his [[FileHelper::getMimeType()]] to determine the exact MIME type.
If allowed to **load only the images**, using [[\yii\validators\ImageValidator|ImageValidator]] instead [[yii\validators\FileValidator|FileValidator]].
```php
public function rules()
{
return [
[['file'], 'image', 'mimeTypes' => 'image/jpeg, image/png',],
];
}
```
```ImageValidator``` use use ```yii\helpers\FileHelper;``` for check mime types.
[List Mime types](http://en.wikipedia.org/wiki/Internet_media_type#List_of_common_media_types)
***
### Multiple files uploader
If you need download multiple files, you will need to alter slightly the controller and view.
At first view:
```php
<?php
use yii\widgets\ActiveForm;
$form = ActiveForm::begin(['options' => ['enctype' => 'multipart/form-data']]);
if ($model->hasErrors()) { //it is necessary to see all the errors for all the files.
echo '<pre>';
print_r($model->getErrors());
echo '</pre>';
}
?>
<?= $form->field($model, 'file[]')->fileInput(['multiple' => '']) ?>
<button>Submit</button>
<?php ActiveForm::end(); ?>
```
In fact the only difference is in the one row.
```php
<?= $form->field($model, 'file[]')->fileInput(['multiple' => '']) ?>
```
instead
```php
<?= $form->field($model, 'file')->fileInput() ?>
```
* ```['multiple' => '']``` - HTML <input> multiple Attribute
* ```file[]``` vs ```file`` - need, otherwise UploadedFile sees only one file
We now turn to the controller
```php
namespace app\controllers;
use Yii;
use yii\web\Controller;
use app\models\UploadForm;
use yii\web\UploadedFile;
class SiteController extends Controller
{
public function actionUpload()
{
$model = new UploadForm();
if (Yii::$app->request->isPost) {
$files = UploadedFile::getInstances($model, 'file');
foreach ($files as $file) {
$_model = new UploadForm();
$_model->file = $file;
if ($_model->validate()) {
$_model->file->saveAs('uploads/' . $_model->file->baseName . '.' . $_model->file->extension);
} else {
foreach ($_model->getErrors('file') as $error) {
$model->addError('file', $error);
}
}
}
if ($model->hasErrors('file')){
$model->addError(
'file',
count($model->getErrors('file')) . ' of ' . count($files) . ' files not uploaded'
);
}
}
return $this->render('upload', ['model' => $model]);
}
}
```
Here the differences in:
* ``` UploadedFile::getInstances($model, 'file');``` instead ``` UploadedFile::getInstance($model, 'file');```. First returns **all** uploaded files for the given model attribute, second - one.
* All other differences follow from the first.
......@@ -33,7 +33,110 @@ Yii переводится на множество языков, в том чи
build translation ../docs/guide" "../docs/guide-ru" --title="Russian guide translation report" > report-guide-ru.html
```
Перед тем, как начать перевод, убедитесь, что никто им ещё не занимается и запишите себя в
[список всех переводимых документов](https://docs.google.com/spreadsheets/d/1uxV0LwmR-8XXqlT8C6VqWllZjuoyIj-UkYpAQPWyUzE/edit?usp=sharing).
Все изменения оформляем в виде [pull request](https://github.com/yiisoft/yii2/blob/master/docs/internals/git-workflow.md).
[Список всех переводимых документов](https://docs.google.com/spreadsheets/d/1uxV0LwmR-8XXqlT8C6VqWllZjuoyIj-UkYpAQPWyUzE/edit?usp=sharing)
доступен для редактирования на Google Docs.
\ No newline at end of file
### Общие правила
- Многие термины не имеют однозначного и широко распространенного перевода на русский язык, поэтому, если в тексте
встречается такой термин, в скобках возле первого упоминания необходимо указать английский вариант; (список используемых
вариантов перевода терминов см. ниже);
- Если кажется, что при переводе какая-то часть текста теряет смысл и вы не уверены в том, как ее правильно перевести,
заключайте эту часть текста в * (внешне шрифт станет наклонным). Это позволит при вычитке/корректуре обратить на эту
часть текста особое внимание;
- При переводе избегайте фактических ошибок!
- В тексте встречаются ссылки на внешние источники, если ссылка ведет на статью, определение термина и т.п., то при
наличии русского варианта на этом же ресурсе или ином авторитетном ресурсе, даем ссылку на русский вариант.
Например `http://en.wikipedia.org/wiki/Captcha``http://ru.wikipedia.org/wiki/Captcha`.
- Комментарии в коде переводятся, если не искажают первоначального смысла; временные комментарии в тексте желательно
использовать только локально! иначе есть вероятность попадания в релиз;
- При переводе названий разделов придерживаемся перевода в `README.md`;
- Добавление собственных комментариев-дополнений возможно, но не приветствуется поскольку во избежание хаоса оригинал
должен быть один. В случае такой необходимости в конце комментария нужно добавить "(прим. пер.)";
- После проведения общей правки документа настоятельно рекомендуется самостоятельно вносить исправления только
грамматических, а также фактических ошибок, имеющих отношение только к данному разделу. В остальных случаях необходимо
вынести предложение по исправлению, улучшению на обсуждение и в случае необходимости централизованно внести коррективы
во все разделы документа.
### Структура документа
При переводе необходимо правильно именовать структурные единицы документы. Следуем структуре, приведенной ниже:
- Глава 1
- Раздел 1
- Раздел 2
- Подраздел 1
- ...
- Раздел N
- Глава 2
- ...
- Глава N
### Перевод специальных сообщений
- Tip → Подсказка
- Note → Примечание
- Info → Информация
### Перевод рисунков
Рисунки к документации содержатся в подпапке `images`. Все они созданы в [yED](http://www.yworks.com/en/products_yed_about.html).
При необходимости перевода исходный файл копируется в директорию `images` перевода, переводится и сохраняется в формате png.
Подписи к рисункам переводятся.
### Грамматика
Обращайте внимание на общую стилистику, орфографию и пунктуацию, перед заливкой конечного варианта перевод можно прогнать
через любую программу с встроенной проверкой, например, Microsoft Word;
### Список терминов
- action — действие.
- active record — без перевода.
- attach handler — «назначить обработчик».
- attribute of the model — атрибут модели.
- camel case — без перевода.
- customization — (тонкая) настройка //Ранее встречался перевод "кастомизация", желательно этот вариант по возможности не использовать.
- column — столбец (если речь про БД).
- content — содержимое.
- controller — контроллер.
- debug (mode) — отладочный (режим) (см. production mode).
- eager loading — метод жадной загрузки/жадная загрузка (см. lazy loading).
- PHP extension — расширение PHP.
- field (of the table) — поле (или атрибут) таблицы.
- framework — фреймворк.
- front-controller — фронт-контроллер.
- getter — геттер.
- (event) handler — обработчик (события).
- hash — хэш.
- helper - помощник.
- id — идентификатор.
- instance — экземпляр.
- lazy loading — отложенная загрузка (загрузим как понадобится и не раньше).
- method — метод (объекта) //Внимание! У объета/класса нет функций, есть только методы.
- model — модель, модель данных.
- model form — модель формы.
- parameter — параметр (у метода или функции, никак не у класса).
- to parse — обрабатывать, если контекст непонятен — парсить.
- placeholder — маркер.
- production (mode) — производственный (режим) (см. debug mode).
- property — свойство (объекта).
- to render — рендерить, формировать.
- related, relation — связанный, связь.
- resolve request — предварительная обработка запроса.
- route — маршрут.
- row (of the table) — строка (таблицы).
- setter — сеттер.
- tabular input — табличный ввод.
- to validate — проверять.
- valid — корректный.
- validator — валидатор.
- validator class — класс валидатора.
- view — представление.
- query builder — конструктор запросов.
\ No newline at end of file
......@@ -206,7 +206,7 @@ class ActiveField extends \yii\widgets\ActiveField
if ($enclosedByLabel) {
if (!isset($options['template'])) {
$this->template = $this->form->layout === 'horizontal' ?
$this->horizontalCheckboxTemplate : $this->checkBoxTemplate;
$this->horizontalCheckboxTemplate : $this->checkboxTemplate;
} else {
$this->template = $options['template'];
unset($options['template']);
......
......@@ -5,6 +5,7 @@ Yii Framework 2 debug extension Change Log
--------------------------
- Bug #1263: Fixed the issue that Gii and Debug modules might be affected by incompatible asset manager configuration (qiangxue)
- Enh #2299: Date and time in request list is now never wrapped (samdark)
- Enh #3088: The debug module will manage their own URL rules now (qiangxue)
- Enh #3103: debugger panel is now not displayed when printing a page (githubjeka)
- Enh #3108: Added `yii\debug\Module::enableDebugLogs` to disable logging debug logs by default (qiangxue)
......
......@@ -93,3 +93,7 @@ a.desc:after {
width: 12%;
font-weight: bold;
}
.nowrap {
white-space: nowrap;
}
\ No newline at end of file
......@@ -61,8 +61,9 @@ if (isset($this->context->module->panels['db']) && isset($this->context->module-
[
'attribute' => 'time',
'value' => function ($data) use ($timeFormatter) {
return $timeFormatter->asDateTime($data['time'], 'short');
return '<span class="nowrap">' . $timeFormatter->asDateTime($data['time'], 'short') . '</span>';
},
'format' => 'html',
],
'ip',
[
......
......@@ -68,8 +68,8 @@ class <?= $controllerClass ?> extends <?= StringHelper::basename($generator->bas
$dataProvider = $searchModel->search(Yii::$app->request->getQueryParams());
return $this->render('index', [
'dataProvider' => $dataProvider,
'searchModel' => $searchModel,
'dataProvider' => $dataProvider,
]);
<?php else: ?>
$dataProvider = new ActiveDataProvider([
......
......@@ -19,8 +19,8 @@ use <?= $generator->indexWidgetType === 'grid' ? "yii\\grid\\GridView" : "yii\\w
/**
* @var yii\web\View $this
* @var yii\data\ActiveDataProvider $dataProvider
<?= !empty($generator->searchModelClass) ? " * @var " . ltrim($generator->searchModelClass, '\\') . " \$searchModel\n" : '' ?>
* @var yii\data\ActiveDataProvider $dataProvider
*/
$this->title = <?= $generator->generateString(Inflector::pluralize(Inflector::camel2words(StringHelper::basename($generator->modelClass)))) ?>;
......
......@@ -79,7 +79,7 @@ class DatePicker extends InputWidget
echo $this->renderWidget() . "\n";
$containerID = $this->inline ? $this->containerOptions['id'] : $this->options['id'];
$language = $this->language ? $this->language : Yii::$app->language;
if ($language != 'en') {
if ($language != 'en-US') {
$view = $this->getView();
DatePickerRegionalAsset::register($view);
......
......@@ -87,6 +87,7 @@ Yii Framework 2 Change Log
- Enh: Added support for using path alias with `FileDependency::fileName` (qiangxue)
- Enh: Added param `hideOnSinglePage` to `yii\widgets\LinkPager` (arturf)
- Enh: Added support for array attributes in `in` validator (creocoder)
- Enh: Improved `yii\helpers\Inflector::slug` to support more cases for Russian, Hebrew and special characters (samdark)
- Chg #2898: `yii\console\controllers\AssetController` is now using hashes instead of timestamps (samdark)
- Chg #2913: RBAC `DbManager` is now initialized via migration (samdark)
- Chg #3036: Upgraded Twitter Bootstrap to 3.1.x (qiangxue)
......@@ -94,6 +95,7 @@ Yii Framework 2 Change Log
- Chg #3383: Added `$type` parameter to `IdentityInterface::findIdentityByAccessToken()` (qiangxue)
- Chg #3531: \yii\grid\GridView now allows any character (except ":") in the attribute part of the shorthand syntax for columns (rawtaz)
- Chg #3544: Added `$key` as a parameter to the callable specified via `yii\grid\DataColumn::value` (mdmunir)
- Chg #3687: Default `sourceLanguage` and `language` are now `en-US` in order for i18n formatter to work correctly (samdark)
- Chg: Replaced `clearAll()` and `clearAllAssignments()` in `yii\rbac\ManagerInterface` with `removeAll()`, `removeAllRoles()`, `removeAllPermissions()`, `removeAllRules()` and `removeAllAssignments()` (qiangxue)
- Chg: Added `$user` as the first parameter of `yii\rbac\Rule::execute()` (qiangxue)
- Chg: `yii\grid\DataColumn::getDataCellValue()` visibility is now `public` to allow accessing the value from a GridView directly (cebe)
......
......@@ -21,7 +21,7 @@ use Yii;
* @property \yii\db\Connection $db The database connection. This property is read-only.
* @property \yii\web\ErrorHandler|\yii\console\ErrorHandler $errorHandler The error handler application
* component. This property is read-only.
* @property \yii\base\Formatter $formatter The formatter application component. This property is read-only.
* @property \yii\base\Formatter|\yii\i18n\Formatter $formatter The formatter application component. This property is read-only.
* @property \yii\i18n\I18N $i18n The internationalization component. This property is read-only.
* @property \yii\log\Dispatcher $log The log dispatcher component. This property is read-only.
* @property \yii\mail\MailerInterface $mail The mailer interface. This property is read-only.
......@@ -106,13 +106,13 @@ abstract class Application extends Module
* for English, while `en-US` stands for English (United States).
* @see sourceLanguage
*/
public $language = 'en';
public $language = 'en-US';
/**
* @var string the language that the application is written in. This mainly refers to
* the language that the messages and view files are written in.
* @see language
*/
public $sourceLanguage = 'en';
public $sourceLanguage = 'en-US';
/**
* @var Controller the currently active controller instance
*/
......
......@@ -467,9 +467,9 @@ class BaseInflector
public static function slug($string, $replacement = '-', $lowercase = true)
{
if (extension_loaded('intl') === true) {
$options = 'Any-Latin; NFD; [:Nonspacing Mark:] Remove; NFC; [:Punctuation:] Remove;';
$options = 'Any-Latin; NFKD; [:Punctuation:] Remove; [^\u0000-\u007E] Remove';
$string = transliterator_transliterate($options, $string);
$string = preg_replace('/[-\s]+/', $replacement, $string);
$string = preg_replace('/[-=\s]+/', $replacement, $string);
} else {
$string = str_replace(array_keys(static::$transliteration), static::$transliteration, $string);
$string = preg_replace('/[^\p{L}\p{Nd}]+/u', $replacement, $string);
......
......@@ -57,7 +57,7 @@ class I18N extends Component
if (!isset($this->translations['yii']) && !isset($this->translations['yii*'])) {
$this->translations['yii'] = [
'class' => 'yii\i18n\PhpMessageSource',
'sourceLanguage' => 'en',
'sourceLanguage' => 'en-US',
'basePath' => '@yii/messages',
];
}
......
......@@ -124,9 +124,21 @@ class InflectorTest extends TestCase
public function testSlug()
{
$this->assertEquals("privet-hello-jii-framework-kak-dela-how-it-goes", Inflector::slug('Привет Hello Йии-- Framework !--- Как дела ? How it goes ?'));
$data = [
'Привет. Hello, Йии-- Framework !--- Как дела ? How it goes ?' => 'privet-hello-jii-framework-kak-dela-how-it-goes',
'this is a title' => 'this-is-a-title',
'недвижимость' => 'nedvizimost',
'áàâéèêíìîóòôúùûã' => 'aaaeeeiiiooouuua',
'Ναδάλης ṃỹṛèşưḿĕ' => 'nadales-myresume',
'E=mc²' => 'e-mc2',
'載å¥' => 'e14a',
];
foreach ($data as $source => $expected) {
$this->assertEquals($expected, Inflector::slug($source));
}
$this->assertEquals("this-is-a-title", Inflector::slug('this is a title'));
//$this->assertEquals('this-is-my-text-', Inflector::slug('! this is my / text $## '));
}
public function testClassify()
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment