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;