mirror of
https://github.com/yiisoft/yii2.git
synced 2025-11-01 11:39:41 +08:00
Merge branch 'master' into feature/attach-behaviors-with-closure
# Conflicts: # framework/base/Component.php # tests/framework/base/ComponentTest.php
This commit is contained in:
@ -327,8 +327,8 @@ $user->touch('login_time');
|
|||||||
сторонние:
|
сторонние:
|
||||||
|
|
||||||
- [[yii\behaviors\BlameableBehavior]] - автоматически заполняет указанные атрибуты ID текущего пользователя.
|
- [[yii\behaviors\BlameableBehavior]] - автоматически заполняет указанные атрибуты ID текущего пользователя.
|
||||||
- [[yii\behaviors\SluggableBehavior]] - автоматически заполняет указанные атрибут пригодным для URL текстом, получаемым
|
- [[yii\behaviors\SluggableBehavior]] - автоматически заполняет указанный атрибут пригодным для URL текстом, получаемым
|
||||||
из другого атрибута.
|
из 1 или нескольких других атрибутов.
|
||||||
- [[yii\behaviors\AttributeBehavior]] - автоматически задаёт указанное значение одному или нескольким атрибутам
|
- [[yii\behaviors\AttributeBehavior]] - автоматически задаёт указанное значение одному или нескольким атрибутам
|
||||||
ActiveRecord при срабатывании определённых событий.
|
ActiveRecord при срабатывании определённых событий.
|
||||||
- [yii2tech\ar\softdelete\SoftDeleteBehavior](https://github.com/yii2tech/ar-softdelete) - предоставляет методы для
|
- [yii2tech\ar\softdelete\SoftDeleteBehavior](https://github.com/yii2tech/ar-softdelete) - предоставляет методы для
|
||||||
|
|||||||
@ -5,7 +5,7 @@ ArrayHelper
|
|||||||
|
|
||||||
## Получение значений <span id="getting-values"></span>
|
## Получение значений <span id="getting-values"></span>
|
||||||
|
|
||||||
Извлечение значений из массива, объекта или структуры состоящей из них обоих с помощью стандартных средств PHP является довольно скучным занятием. Сначала вам нужно проверить есть ли соответствующий ключ с помощью `isset`, и если есть – получить, если нет – подставить значение по умолчанию.
|
Извлечение значений из массива, объекта или структуры состоящей из них обоих с помощью стандартных средств PHP является довольно скучным занятием. Сначала вам нужно проверить, есть ли соответствующий ключ с помощью `isset`, и если есть – получить, если нет – подставить значение по умолчанию.
|
||||||
|
|
||||||
```php
|
```php
|
||||||
class User
|
class User
|
||||||
@ -152,9 +152,10 @@ $result = ArrayHelper::getColumn($array, function ($element) {
|
|||||||
## Переиндексация массивов <span id="reindexing-arrays"></span>
|
## Переиндексация массивов <span id="reindexing-arrays"></span>
|
||||||
|
|
||||||
|
|
||||||
Чтобы проиндексировать массив в соответствии с определенным ключом, используется метод `index` . Входящий массив должен
|
Чтобы проиндексировать массив в соответствии с определенным ключом, используется метод `index`. Входящий массив должен
|
||||||
быть многомерным или массивом объектов. Ключом может быть имя ключа вложенного массива, имя свойства объекта или
|
быть многомерным или массивом объектов. Ключом может быть имя ключа вложенного массива, имя свойства объекта или
|
||||||
анонимная функция, которая будет возвращать значение ключа по переданному массиву.
|
анонимная функция, которая будет возвращать значение ключа по переданному элементу индексируемого массива (то есть по
|
||||||
|
вложенному массиву или объекту).
|
||||||
|
|
||||||
Если значение ключа равно `null`, то соответствующий элемент массива будет опущен и не попадет в результат.
|
Если значение ключа равно `null`, то соответствующий элемент массива будет опущен и не попадет в результат.
|
||||||
|
|
||||||
|
|||||||
@ -3,8 +3,8 @@
|
|||||||
|
|
||||||
> Note: Этот раздел находиться в стадии разработки.
|
> Note: Этот раздел находиться в стадии разработки.
|
||||||
|
|
||||||
Yii предоставляет много классов, которые помогают упростить общие задачи программирования, такие как манипуляция со строками или массивами, генерация HTML-кода, и так далее. Все helper-классы организованы в рамках пространства имен `yii\helpers` и являются статическими методами
|
Yii предоставляет много классов, которые помогают упростить общие задачи программирования, такие как манипуляция со строками или массивами, генерация HTML-кода, и так далее. Все helper-классы организованы в рамках пространства имен `yii\helpers` и являются статическими классами
|
||||||
(это означает, что они содержат в себе только статические свойства и методы и объекты статического класса создать нельзя).
|
(это означает, что они содержат в себе только статические свойства и методы, и объекты статического класса создать нельзя).
|
||||||
|
|
||||||
Вы можете использовать helper-класс с помощью вызова одного из статических методов, как показано ниже:
|
Вы можете использовать helper-класс с помощью вызова одного из статических методов, как показано ниже:
|
||||||
|
|
||||||
|
|||||||
@ -74,7 +74,7 @@ use yii\widgets\ActiveForm;
|
|||||||
<?php ActiveForm::end() ?>
|
<?php ActiveForm::end() ?>
|
||||||
```
|
```
|
||||||
|
|
||||||
Важно помнить, что для корректной загрузки файла, необходим параметр формы `enctype`. Метод `fileInput()`
|
Важно помнить, что для корректной загрузки файла необходим параметр формы `enctype`. Метод `fileInput()`
|
||||||
выведет тег `<input type="file">`, позволяющий пользователю выбрать файл для загрузки.
|
выведет тег `<input type="file">`, позволяющий пользователю выбрать файл для загрузки.
|
||||||
|
|
||||||
> Tip: начиная с версии 2.0.8, [[yii\widgets\ActiveField::fileInput|fileInput]] автоматически добавляет
|
> Tip: начиная с версии 2.0.8, [[yii\widgets\ActiveField::fileInput|fileInput]] автоматически добавляет
|
||||||
|
|||||||
@ -506,9 +506,9 @@ class TranslationEventHandler
|
|||||||
Откройте созданный файл и настройте параметры в соответствии со своими потребностями. Уделите особое внимание следующим параметрам:
|
Откройте созданный файл и настройте параметры в соответствии со своими потребностями. Уделите особое внимание следующим параметрам:
|
||||||
|
|
||||||
* `languages`: массив, содержащий языки, на которые ваше приложение должно быть переведено;
|
* `languages`: массив, содержащий языки, на которые ваше приложение должно быть переведено;
|
||||||
* `messagePath`: путь для хранений файлов сообщений, который должен соответствовать параметру `basePath`, указанному в конфигурации компонента`i18n`.
|
* `messagePath`: путь для хранения файлов сообщений, который должен соответствовать параметру `basePath`, указанному в конфигурации компонента `i18n`.
|
||||||
|
|
||||||
Вы также можете использовать команду './yii message/config', чтобы динамически сгенерировать конфигурационный файл с указанными опциями с помощью командной строки.
|
Вы также можете использовать команду `./yii message/config`, чтобы динамически сгенерировать конфигурационный файл с указанными опциями с помощью командной строки.
|
||||||
Например, вы можете установить параметры `languages` и `messagePath` следующим образом:
|
Например, вы можете установить параметры `languages` и `messagePath` следующим образом:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
@ -529,7 +529,7 @@ class TranslationEventHandler
|
|||||||
|
|
||||||
Также вы можете использовать параметры, чтобы динамически менять настройки извлечения.
|
Также вы можете использовать параметры, чтобы динамически менять настройки извлечения.
|
||||||
|
|
||||||
В результате вы найдете свой файлы (если вы выбрали перевод с помощью файлов) в своей директории `messagePath`.
|
В результате вы найдете свои файлы (если вы выбрали перевод с помощью файлов) в своей директории `messagePath`.
|
||||||
|
|
||||||
|
|
||||||
Представления <span id="view-translation"></span>
|
Представления <span id="view-translation"></span>
|
||||||
|
|||||||
@ -7,6 +7,7 @@ Yii Framework 2 Change Log
|
|||||||
- Bug #20232: Fix regression introduced in `GHSA-cjcc-p67m-7qxm` while attaching behavior defined by `__class` array key (erickskrauch)
|
- Bug #20232: Fix regression introduced in `GHSA-cjcc-p67m-7qxm` while attaching behavior defined by `__class` array key (erickskrauch)
|
||||||
- Bug #20231: Fix regression introduced in #20167 in `yii\validators\FileValidator` (bizley)
|
- Bug #20231: Fix regression introduced in #20167 in `yii\validators\FileValidator` (bizley)
|
||||||
- Enh #20247: Support for variadic console controller action methods (brandonkelly)
|
- Enh #20247: Support for variadic console controller action methods (brandonkelly)
|
||||||
|
- Bug #20256: Add support for dropping views in MSSQL server when running migrate/fresh (ambrozt)
|
||||||
|
|
||||||
2.0.51 July 18, 2024
|
2.0.51 July 18, 2024
|
||||||
--------------------
|
--------------------
|
||||||
|
|||||||
@ -192,7 +192,9 @@ class Component extends BaseObject
|
|||||||
$this->attachBehavior($name, $value);
|
$this->attachBehavior($name, $value);
|
||||||
} elseif ($value instanceof \Closure) {
|
} elseif ($value instanceof \Closure) {
|
||||||
$this->attachBehavior($name, call_user_func($value));
|
$this->attachBehavior($name, call_user_func($value));
|
||||||
} elseif ((isset($value['class']) && is_subclass_of($value['class'], Behavior::class)) || (isset($value['__class']) && is_subclass_of($value['__class'], Behavior::class))) {
|
} elseif (isset($value['__class']) && is_subclass_of($value['__class'], Behavior::class)) {
|
||||||
|
$this->attachBehavior($name, Yii::createObject($value));
|
||||||
|
} elseif (!isset($value['__class']) && isset($value['class']) && is_subclass_of($value['class'], Behavior::class)) {
|
||||||
$this->attachBehavior($name, Yii::createObject($value));
|
$this->attachBehavior($name, Yii::createObject($value));
|
||||||
} elseif (is_string($value) && is_subclass_of($value, Behavior::class, true)) {
|
} elseif (is_string($value) && is_subclass_of($value, Behavior::class, true)) {
|
||||||
$this->attachBehavior($name, Yii::createObject($value));
|
$this->attachBehavior($name, Yii::createObject($value));
|
||||||
|
|||||||
@ -333,6 +333,7 @@ class MigrateController extends BaseMigrateController
|
|||||||
$dropViewErrors = [
|
$dropViewErrors = [
|
||||||
'DROP VIEW to delete view', // SQLite
|
'DROP VIEW to delete view', // SQLite
|
||||||
'SQLSTATE[42S02]', // MySQL
|
'SQLSTATE[42S02]', // MySQL
|
||||||
|
'is a view. Use DROP VIEW', // Microsoft SQL Server
|
||||||
];
|
];
|
||||||
|
|
||||||
foreach ($dropViewErrors as $dropViewError) {
|
foreach ($dropViewErrors as $dropViewError) {
|
||||||
|
|||||||
@ -24,7 +24,7 @@
|
|||||||
* NOTE: this file must be saved in UTF-8 encoding.
|
* NOTE: this file must be saved in UTF-8 encoding.
|
||||||
*/
|
*/
|
||||||
return [
|
return [
|
||||||
' and ' => '',
|
' and ' => ' 與 ',
|
||||||
'"{attribute}" does not support operator "{operator}".' => '',
|
'"{attribute}" does not support operator "{operator}".' => '',
|
||||||
'(not set)' => '(未設定)',
|
'(not set)' => '(未設定)',
|
||||||
'Action not found.' => '',
|
'Action not found.' => '',
|
||||||
@ -51,7 +51,7 @@ return [
|
|||||||
'Please fix the following errors:' => '請修正以下錯誤:',
|
'Please fix the following errors:' => '請修正以下錯誤:',
|
||||||
'Please upload a file.' => '請上傳一個檔案。',
|
'Please upload a file.' => '請上傳一個檔案。',
|
||||||
'Showing <b>{begin, number}-{end, number}</b> of <b>{totalCount, number}</b> {totalCount, plural, one{item} other{items}}.' => '第 <b>{begin, number}-{end, number}</b> 項,共 <b>{totalCount, number}</b> 項資料.',
|
'Showing <b>{begin, number}-{end, number}</b> of <b>{totalCount, number}</b> {totalCount, plural, one{item} other{items}}.' => '第 <b>{begin, number}-{end, number}</b> 項,共 <b>{totalCount, number}</b> 項資料.',
|
||||||
'The combination {values} of {attributes} has already been taken.' => '',
|
'The combination {values} of {attributes} has already been taken.' => '{attribute} 的值 "{value}" 已經被佔用了。',
|
||||||
'The file "{file}" is not an image.' => '檔案 "{file}" 不是一個圖片檔案。',
|
'The file "{file}" is not an image.' => '檔案 "{file}" 不是一個圖片檔案。',
|
||||||
'The file "{file}" is too big. Its size cannot exceed {formattedLimit}.' => '檔案"{file}"太大了。它的大小不可以超過{formattedLimit}。',
|
'The file "{file}" is too big. Its size cannot exceed {formattedLimit}.' => '檔案"{file}"太大了。它的大小不可以超過{formattedLimit}。',
|
||||||
'The file "{file}" is too small. Its size cannot be smaller than {formattedLimit}.' => '文件"{file}"太小了。它的大小不可以小於{formattedLimit}。',
|
'The file "{file}" is too small. Its size cannot be smaller than {formattedLimit}.' => '文件"{file}"太小了。它的大小不可以小於{formattedLimit}。',
|
||||||
|
|||||||
@ -10,6 +10,8 @@ namespace yiiunit\framework\base;
|
|||||||
use yii\base\Behavior;
|
use yii\base\Behavior;
|
||||||
use yii\base\Component;
|
use yii\base\Component;
|
||||||
use yii\base\Event;
|
use yii\base\Event;
|
||||||
|
use yii\base\InvalidConfigException;
|
||||||
|
use yii\base\UnknownMethodException;
|
||||||
use yiiunit\TestCase;
|
use yiiunit\TestCase;
|
||||||
|
|
||||||
function globalEventHandler($event)
|
function globalEventHandler($event)
|
||||||
@ -328,26 +330,48 @@ class ComponentTest extends TestCase
|
|||||||
$this->assertTrue($component->hasProperty('p'));
|
$this->assertTrue($component->hasProperty('p'));
|
||||||
$component->test();
|
$component->test();
|
||||||
$this->assertTrue($component->behaviorCalled);
|
$this->assertTrue($component->behaviorCalled);
|
||||||
}
|
|
||||||
|
|
||||||
public function testAs()
|
$this->assertSame($behavior, $component->detachBehavior('a'));
|
||||||
{
|
$this->assertFalse($component->hasProperty('p'));
|
||||||
|
try {
|
||||||
|
$component->test();
|
||||||
|
$this->fail('Expected exception ' . UnknownMethodException::class . " wasn't thrown");
|
||||||
|
} catch (UnknownMethodException $e) {
|
||||||
|
// Expected
|
||||||
|
}
|
||||||
|
|
||||||
$component = new NewComponent();
|
$component = new NewComponent();
|
||||||
$component->{'as a'} = new NewBehavior();
|
$component->{'as b'} = ['class' => NewBehavior::class];
|
||||||
|
$this->assertInstanceOf(NewBehavior::class, $component->getBehavior('b'));
|
||||||
$this->assertTrue($component->hasProperty('p'));
|
$this->assertTrue($component->hasProperty('p'));
|
||||||
$component->test();
|
$component->test();
|
||||||
$this->assertTrue($component->behaviorCalled);
|
$this->assertTrue($component->behaviorCalled);
|
||||||
|
|
||||||
$component->{'as b'} = ['class' => NewBehavior::class];
|
|
||||||
$this->assertNotNull($component->getBehavior('b'));
|
|
||||||
|
|
||||||
$component->{'as c'} = ['__class' => NewBehavior::class];
|
$component->{'as c'} = ['__class' => NewBehavior::class];
|
||||||
$this->assertNotNull($component->getBehavior('c'));
|
$this->assertNotNull($component->getBehavior('c'));
|
||||||
|
|
||||||
$component->{'as d'} = function () {
|
$component->{'as d'} = [
|
||||||
|
'__class' => NewBehavior2::class,
|
||||||
|
'class' => NewBehavior::class,
|
||||||
|
];
|
||||||
|
$this->assertInstanceOf(NewBehavior2::class, $component->getBehavior('d'));
|
||||||
|
|
||||||
|
// CVE-2024-4990
|
||||||
|
try {
|
||||||
|
$component->{'as e'} = [
|
||||||
|
'__class' => 'NotExistsBehavior',
|
||||||
|
'class' => NewBehavior::class,
|
||||||
|
];
|
||||||
|
$this->fail('Expected exception ' . InvalidConfigException::class . " wasn't thrown");
|
||||||
|
} catch (InvalidConfigException $e) {
|
||||||
|
$this->assertSame('Class is not of type yii\base\Behavior or its subclasses', $e->getMessage());
|
||||||
|
}
|
||||||
|
|
||||||
|
$component = new NewComponent();
|
||||||
|
$component->{'as f'} = function () {
|
||||||
return new NewBehavior();
|
return new NewBehavior();
|
||||||
};
|
};
|
||||||
$this->assertNotNull($component->getBehavior('d'));
|
$this->assertNotNull($component->getBehavior('f'));
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testAttachBehaviors()
|
public function testAttachBehaviors()
|
||||||
@ -380,9 +404,6 @@ class ComponentTest extends TestCase
|
|||||||
|
|
||||||
$detachedBehavior = $component->detachBehavior('z');
|
$detachedBehavior = $component->detachBehavior('z');
|
||||||
$this->assertNull($detachedBehavior);
|
$this->assertNull($detachedBehavior);
|
||||||
|
|
||||||
$this->expectException('yii\base\UnknownMethodException');
|
|
||||||
$component->test();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testDetachBehaviors()
|
public function testDetachBehaviors()
|
||||||
@ -553,6 +574,10 @@ class NewBehavior extends Behavior
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class NewBehavior2 extends Behavior
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
class NewComponent2 extends Component
|
class NewComponent2 extends Component
|
||||||
{
|
{
|
||||||
public $a;
|
public $a;
|
||||||
|
|||||||
Reference in New Issue
Block a user