Merge branch 'master' into feature/attach-behaviors-with-closure

# Conflicts:
#	framework/base/Component.php
#	tests/framework/base/ComponentTest.php
This commit is contained in:
Tim Kelty
2024-09-23 09:39:26 -04:00
10 changed files with 56 additions and 26 deletions

View File

@ -327,8 +327,8 @@ $user->touch('login_time');
сторонние:
- [[yii\behaviors\BlameableBehavior]] - автоматически заполняет указанные атрибуты ID текущего пользователя.
- [[yii\behaviors\SluggableBehavior]] - автоматически заполняет указанные атрибут пригодным для URL текстом, получаемым
из другого атрибута.
- [[yii\behaviors\SluggableBehavior]] - автоматически заполняет указанный атрибут пригодным для URL текстом, получаемым
из 1 или нескольких других атрибутов.
- [[yii\behaviors\AttributeBehavior]] - автоматически задаёт указанное значение одному или нескольким атрибутам
ActiveRecord при срабатывании определённых событий.
- [yii2tech\ar\softdelete\SoftDeleteBehavior](https://github.com/yii2tech/ar-softdelete) - предоставляет методы для

View File

@ -5,7 +5,7 @@ ArrayHelper
## Получение значений <span id="getting-values"></span>
Извлечение значений из массива, объекта или структуры состоящей из них обоих с помощью стандартных средств PHP является довольно скучным занятием. Сначала вам нужно проверить есть ли соответствующий ключ с помощью `isset`, и если есть получить, если нет подставить значение по умолчанию.
Извлечение значений из массива, объекта или структуры состоящей из них обоих с помощью стандартных средств PHP является довольно скучным занятием. Сначала вам нужно проверить, есть ли соответствующий ключ с помощью `isset`, и если есть получить, если нет подставить значение по умолчанию.
```php
class User
@ -152,9 +152,10 @@ $result = ArrayHelper::getColumn($array, function ($element) {
## Переиндексация массивов <span id="reindexing-arrays"></span>
Чтобы проиндексировать массив в соответствии с определенным ключом, используется метод `index` . Входящий массив должен
Чтобы проиндексировать массив в соответствии с определенным ключом, используется метод `index`. Входящий массив должен
быть многомерным или массивом объектов. Ключом может быть имя ключа вложенного массива, имя свойства объекта или
анонимная функция, которая будет возвращать значение ключа по переданному массиву.
анонимная функция, которая будет возвращать значение ключа по переданному элементу индексируемого массива (то есть по
вложенному массиву или объекту).
Если значение ключа равно `null`, то соответствующий элемент массива будет опущен и не попадет в результат.

View File

@ -3,8 +3,8 @@
> Note: Этот раздел находиться в стадии разработки.
Yii предоставляет много классов, которые помогают упростить общие задачи программирования, такие как манипуляция со строками или массивами, генерация HTML-кода, и так далее. Все helper-классы организованы в рамках пространства имен `yii\helpers` и являются статическими методами
(это означает, что они содержат в себе только статические свойства и методы и объекты статического класса создать нельзя).
Yii предоставляет много классов, которые помогают упростить общие задачи программирования, такие как манипуляция со строками или массивами, генерация HTML-кода, и так далее. Все helper-классы организованы в рамках пространства имен `yii\helpers` и являются статическими классами
(это означает, что они содержат в себе только статические свойства и методы, и объекты статического класса создать нельзя).
Вы можете использовать helper-класс с помощью вызова одного из статических методов, как показано ниже:

View File

@ -74,7 +74,7 @@ use yii\widgets\ActiveForm;
<?php ActiveForm::end() ?>
```
Важно помнить, что для корректной загрузки файла, необходим параметр формы `enctype`. Метод `fileInput()`
Важно помнить, что для корректной загрузки файла необходим параметр формы `enctype`. Метод `fileInput()`
выведет тег `<input type="file">`, позволяющий пользователю выбрать файл для загрузки.
> Tip: начиная с версии 2.0.8, [[yii\widgets\ActiveField::fileInput|fileInput]] автоматически добавляет

View File

@ -506,9 +506,9 @@ class TranslationEventHandler
Откройте созданный файл и настройте параметры в соответствии со своими потребностями. Уделите особое внимание следующим параметрам:
* `languages`: массив, содержащий языки, на которые ваше приложение должно быть переведено;
* `messagePath`: путь для хранений файлов сообщений, который должен соответствовать параметру `basePath`, указанному в конфигурации компонента`i18n`.
* `messagePath`: путь для хранения файлов сообщений, который должен соответствовать параметру `basePath`, указанному в конфигурации компонента `i18n`.
Вы также можете использовать команду './yii message/config', чтобы динамически сгенерировать конфигурационный файл с указанными опциями с помощью командной строки.
Вы также можете использовать команду `./yii message/config`, чтобы динамически сгенерировать конфигурационный файл с указанными опциями с помощью командной строки.
Например, вы можете установить параметры `languages` и `messagePath` следующим образом:
```bash
@ -529,7 +529,7 @@ class TranslationEventHandler
Также вы можете использовать параметры, чтобы динамически менять настройки извлечения.
В результате вы найдете свой файлы (если вы выбрали перевод с помощью файлов) в своей директории `messagePath`.
В результате вы найдете свои файлы (если вы выбрали перевод с помощью файлов) в своей директории `messagePath`.
Представления <span id="view-translation"></span>

View File

@ -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 #20231: Fix regression introduced in #20167 in `yii\validators\FileValidator` (bizley)
- 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
--------------------

View File

@ -192,7 +192,9 @@ class Component extends BaseObject
$this->attachBehavior($name, $value);
} elseif ($value instanceof \Closure) {
$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));
} elseif (is_string($value) && is_subclass_of($value, Behavior::class, true)) {
$this->attachBehavior($name, Yii::createObject($value));

View File

@ -333,6 +333,7 @@ class MigrateController extends BaseMigrateController
$dropViewErrors = [
'DROP VIEW to delete view', // SQLite
'SQLSTATE[42S02]', // MySQL
'is a view. Use DROP VIEW', // Microsoft SQL Server
];
foreach ($dropViewErrors as $dropViewError) {

View File

@ -24,7 +24,7 @@
* NOTE: this file must be saved in UTF-8 encoding.
*/
return [
' and ' => '',
' and ' => '',
'"{attribute}" does not support operator "{operator}".' => '',
'(not set)' => '(未設定)',
'Action not found.' => '',
@ -51,7 +51,7 @@ return [
'Please fix the following errors:' => '請修正以下錯誤:',
'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> 項資料.',
'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 too big. Its size cannot exceed {formattedLimit}.' => '檔案"{file}"太大了。它的大小不可以超過{formattedLimit}。',
'The file "{file}" is too small. Its size cannot be smaller than {formattedLimit}.' => '文件"{file}"太小了。它的大小不可以小於{formattedLimit}。',

View File

@ -10,6 +10,8 @@ namespace yiiunit\framework\base;
use yii\base\Behavior;
use yii\base\Component;
use yii\base\Event;
use yii\base\InvalidConfigException;
use yii\base\UnknownMethodException;
use yiiunit\TestCase;
function globalEventHandler($event)
@ -328,26 +330,48 @@ class ComponentTest extends TestCase
$this->assertTrue($component->hasProperty('p'));
$component->test();
$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->{'as a'} = new NewBehavior();
$component->{'as b'} = ['class' => NewBehavior::class];
$this->assertInstanceOf(NewBehavior::class, $component->getBehavior('b'));
$this->assertTrue($component->hasProperty('p'));
$component->test();
$this->assertTrue($component->behaviorCalled);
$component->{'as b'} = ['class' => NewBehavior::class];
$this->assertNotNull($component->getBehavior('b'));
$component->{'as c'} = ['__class' => NewBehavior::class];
$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();
};
$this->assertNotNull($component->getBehavior('d'));
$this->assertNotNull($component->getBehavior('f'));
}
public function testAttachBehaviors()
@ -380,9 +404,6 @@ class ComponentTest extends TestCase
$detachedBehavior = $component->detachBehavior('z');
$this->assertNull($detachedBehavior);
$this->expectException('yii\base\UnknownMethodException');
$component->test();
}
public function testDetachBehaviors()
@ -553,6 +574,10 @@ class NewBehavior extends Behavior
}
}
class NewBehavior2 extends Behavior
{
}
class NewComponent2 extends Component
{
public $a;