Skip to content

Commit

Permalink
Merge branch 'master' into feature/attach-behaviors-with-closure
Browse files Browse the repository at this point in the history
# Conflicts:
#	framework/base/Component.php
#	tests/framework/base/ComponentTest.php
  • Loading branch information
timkelty committed Sep 23, 2024
2 parents 2d38497 + eb304e7 commit d9116d3
Show file tree
Hide file tree
Showing 10 changed files with 56 additions and 26 deletions.
4 changes: 2 additions & 2 deletions docs/guide-ru/concept-behaviors.md
Original file line number Diff line number Diff line change
Expand Up @@ -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) - предоставляет методы для
Expand Down
7 changes: 4 additions & 3 deletions docs/guide-ru/helper-array.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ ArrayHelper

## Получение значений <span id="getting-values"></span>

Извлечение значений из массива, объекта или структуры состоящей из них обоих с помощью стандартных средств PHP является довольно скучным занятием. Сначала вам нужно проверить есть ли соответствующий ключ с помощью `isset`, и если есть – получить, если нет – подставить значение по умолчанию.
Извлечение значений из массива, объекта или структуры состоящей из них обоих с помощью стандартных средств PHP является довольно скучным занятием. Сначала вам нужно проверить, есть ли соответствующий ключ с помощью `isset`, и если есть – получить, если нет – подставить значение по умолчанию.

```php
class User
Expand Down Expand Up @@ -152,9 +152,10 @@ $result = ArrayHelper::getColumn($array, function ($element) {
## Переиндексация массивов <span id="reindexing-arrays"></span>


Чтобы проиндексировать массив в соответствии с определенным ключом, используется метод `index` . Входящий массив должен
Чтобы проиндексировать массив в соответствии с определенным ключом, используется метод `index`. Входящий массив должен
быть многомерным или массивом объектов. Ключом может быть имя ключа вложенного массива, имя свойства объекта или
анонимная функция, которая будет возвращать значение ключа по переданному массиву.
анонимная функция, которая будет возвращать значение ключа по переданному элементу индексируемого массива (то есть по
вложенному массиву или объекту).

Если значение ключа равно `null`, то соответствующий элемент массива будет опущен и не попадет в результат.

Expand Down
4 changes: 2 additions & 2 deletions docs/guide-ru/helper-overview.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@

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

Вы можете использовать helper-класс с помощью вызова одного из статических методов, как показано ниже:

Expand Down
2 changes: 1 addition & 1 deletion docs/guide-ru/input-file-upload.md
Original file line number Diff line number Diff line change
Expand Up @@ -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]] автоматически добавляет
Expand Down
6 changes: 3 additions & 3 deletions docs/guide-ru/tutorial-i18n.md
Original file line number Diff line number Diff line change
Expand Up @@ -506,9 +506,9 @@ class TranslationEventHandler
Откройте созданный файл и настройте параметры в соответствии со своими потребностями. Уделите особое внимание следующим параметрам:

* `languages`: массив, содержащий языки, на которые ваше приложение должно быть переведено;
* `messagePath`: путь для хранений файлов сообщений, который должен соответствовать параметру `basePath`, указанному в конфигурации компонента`i18n`.
* `messagePath`: путь для хранения файлов сообщений, который должен соответствовать параметру `basePath`, указанному в конфигурации компонента `i18n`.

Вы также можете использовать команду './yii message/config', чтобы динамически сгенерировать конфигурационный файл с указанными опциями с помощью командной строки.
Вы также можете использовать команду `./yii message/config`, чтобы динамически сгенерировать конфигурационный файл с указанными опциями с помощью командной строки.
Например, вы можете установить параметры `languages` и `messagePath` следующим образом:

```bash
Expand All @@ -529,7 +529,7 @@ class TranslationEventHandler

Также вы можете использовать параметры, чтобы динамически менять настройки извлечения.

В результате вы найдете свой файлы (если вы выбрали перевод с помощью файлов) в своей директории `messagePath`.
В результате вы найдете свои файлы (если вы выбрали перевод с помощью файлов) в своей директории `messagePath`.


Представления <span id="view-translation"></span>
Expand Down
1 change: 1 addition & 0 deletions framework/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
--------------------
Expand Down
4 changes: 3 additions & 1 deletion framework/base/Component.php
Original file line number Diff line number Diff line change
Expand Up @@ -192,7 +192,9 @@ public function __set($name, $value)
$this->attachBehavior($name, $value);
} elseif ($value instanceof \Closure) {
$this->attachBehavior($name, call_user_func($value));

Check warning on line 194 in framework/base/Component.php

View check run for this annotation

Codecov / codecov/patch

framework/base/Component.php#L193-L194

Added lines #L193 - L194 were not covered by tests
} 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));
Expand Down
1 change: 1 addition & 0 deletions framework/console/controllers/MigrateController.php
Original file line number Diff line number Diff line change
Expand Up @@ -333,6 +333,7 @@ private function isViewRelated($errorMessage)
$dropViewErrors = [
'DROP VIEW to delete view', // SQLite
'SQLSTATE[42S02]', // MySQL
'is a view. Use DROP VIEW', // Microsoft SQL Server
];

foreach ($dropViewErrors as $dropViewError) {
Expand Down
4 changes: 2 additions & 2 deletions framework/messages/zh-TW/yii.php
Original file line number Diff line number Diff line change
Expand Up @@ -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.' => '',
Expand All @@ -51,7 +51,7 @@
'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}。',
Expand Down
49 changes: 37 additions & 12 deletions tests/framework/base/ComponentTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@
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)
Expand Down Expand Up @@ -328,26 +330,48 @@ public function testAttachBehavior()
$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()
Expand Down Expand Up @@ -380,9 +404,6 @@ public function testDetachBehavior()

$detachedBehavior = $component->detachBehavior('z');
$this->assertNull($detachedBehavior);

$this->expectException('yii\base\UnknownMethodException');
$component->test();
}

public function testDetachBehaviors()
Expand Down Expand Up @@ -553,6 +574,10 @@ public function test()
}
}

class NewBehavior2 extends Behavior
{
}

class NewComponent2 extends Component
{
public $a;
Expand Down

0 comments on commit d9116d3

Please sign in to comment.