diff --git a/docs/guide-ru/concept-behaviors.md b/docs/guide-ru/concept-behaviors.md
index 966a871a7ca..9922c3e3f5d 100644
--- a/docs/guide-ru/concept-behaviors.md
+++ b/docs/guide-ru/concept-behaviors.md
@@ -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) - предоставляет методы для
diff --git a/docs/guide-ru/helper-array.md b/docs/guide-ru/helper-array.md
index e0219c637a2..92dcdf558b8 100644
--- a/docs/guide-ru/helper-array.md
+++ b/docs/guide-ru/helper-array.md
@@ -5,7 +5,7 @@ ArrayHelper
## Получение значений
-Извлечение значений из массива, объекта или структуры состоящей из них обоих с помощью стандартных средств PHP является довольно скучным занятием. Сначала вам нужно проверить есть ли соответствующий ключ с помощью `isset`, и если есть – получить, если нет – подставить значение по умолчанию.
+Извлечение значений из массива, объекта или структуры состоящей из них обоих с помощью стандартных средств PHP является довольно скучным занятием. Сначала вам нужно проверить, есть ли соответствующий ключ с помощью `isset`, и если есть – получить, если нет – подставить значение по умолчанию.
```php
class User
@@ -152,9 +152,10 @@ $result = ArrayHelper::getColumn($array, function ($element) {
## Переиндексация массивов
-Чтобы проиндексировать массив в соответствии с определенным ключом, используется метод `index` . Входящий массив должен
+Чтобы проиндексировать массив в соответствии с определенным ключом, используется метод `index`. Входящий массив должен
быть многомерным или массивом объектов. Ключом может быть имя ключа вложенного массива, имя свойства объекта или
-анонимная функция, которая будет возвращать значение ключа по переданному массиву.
+анонимная функция, которая будет возвращать значение ключа по переданному элементу индексируемого массива (то есть по
+вложенному массиву или объекту).
Если значение ключа равно `null`, то соответствующий элемент массива будет опущен и не попадет в результат.
diff --git a/docs/guide-ru/helper-overview.md b/docs/guide-ru/helper-overview.md
index bb2a2894b4e..97456eab015 100644
--- a/docs/guide-ru/helper-overview.md
+++ b/docs/guide-ru/helper-overview.md
@@ -3,8 +3,8 @@
> Note: Этот раздел находиться в стадии разработки.
-Yii предоставляет много классов, которые помогают упростить общие задачи программирования, такие как манипуляция со строками или массивами, генерация HTML-кода, и так далее. Все helper-классы организованы в рамках пространства имен `yii\helpers` и являются статическими методами
- (это означает, что они содержат в себе только статические свойства и методы и объекты статического класса создать нельзя).
+Yii предоставляет много классов, которые помогают упростить общие задачи программирования, такие как манипуляция со строками или массивами, генерация HTML-кода, и так далее. Все helper-классы организованы в рамках пространства имен `yii\helpers` и являются статическими классами
+ (это означает, что они содержат в себе только статические свойства и методы, и объекты статического класса создать нельзя).
Вы можете использовать helper-класс с помощью вызова одного из статических методов, как показано ниже:
diff --git a/docs/guide-ru/input-file-upload.md b/docs/guide-ru/input-file-upload.md
index 5dd78ee8aad..194ca6d1be9 100644
--- a/docs/guide-ru/input-file-upload.md
+++ b/docs/guide-ru/input-file-upload.md
@@ -74,7 +74,7 @@ use yii\widgets\ActiveForm;
```
-Важно помнить, что для корректной загрузки файла, необходим параметр формы `enctype`. Метод `fileInput()`
+Важно помнить, что для корректной загрузки файла необходим параметр формы `enctype`. Метод `fileInput()`
выведет тег ``, позволяющий пользователю выбрать файл для загрузки.
> Tip: начиная с версии 2.0.8, [[yii\widgets\ActiveField::fileInput|fileInput]] автоматически добавляет
diff --git a/docs/guide-ru/tutorial-i18n.md b/docs/guide-ru/tutorial-i18n.md
index 44f233ff19d..695a6a5ca44 100644
--- a/docs/guide-ru/tutorial-i18n.md
+++ b/docs/guide-ru/tutorial-i18n.md
@@ -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`.
Представления
diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md
index 55f9605adfc..80a0547e494 100644
--- a/framework/CHANGELOG.md
+++ b/framework/CHANGELOG.md
@@ -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
--------------------
diff --git a/framework/base/Component.php b/framework/base/Component.php
index 9cab8373ae3..937de6b44e7 100644
--- a/framework/base/Component.php
+++ b/framework/base/Component.php
@@ -192,7 +192,9 @@ public function __set($name, $value)
$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));
diff --git a/framework/console/controllers/MigrateController.php b/framework/console/controllers/MigrateController.php
index 315440f3bb5..104c6865749 100644
--- a/framework/console/controllers/MigrateController.php
+++ b/framework/console/controllers/MigrateController.php
@@ -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) {
diff --git a/framework/messages/zh-TW/yii.php b/framework/messages/zh-TW/yii.php
index ff206fe66e9..598b2b9de71 100644
--- a/framework/messages/zh-TW/yii.php
+++ b/framework/messages/zh-TW/yii.php
@@ -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 @@
'Please fix the following errors:' => '請修正以下錯誤:',
'Please upload a file.' => '請上傳一個檔案。',
'Showing {begin, number}-{end, number} of {totalCount, number} {totalCount, plural, one{item} other{items}}.' => '第 {begin, number}-{end, number} 項,共 {totalCount, number} 項資料.',
- '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}。',
diff --git a/tests/framework/base/ComponentTest.php b/tests/framework/base/ComponentTest.php
index 55634b0011a..8f9f3ba5408 100644
--- a/tests/framework/base/ComponentTest.php
+++ b/tests/framework/base/ComponentTest.php
@@ -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)
@@ -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()
@@ -380,9 +404,6 @@ public function testDetachBehavior()
$detachedBehavior = $component->detachBehavior('z');
$this->assertNull($detachedBehavior);
-
- $this->expectException('yii\base\UnknownMethodException');
- $component->test();
}
public function testDetachBehaviors()
@@ -553,6 +574,10 @@ public function test()
}
}
+class NewBehavior2 extends Behavior
+{
+}
+
class NewComponent2 extends Component
{
public $a;