From 251812f4265588a91a07370920c06ac885ba5ada Mon Sep 17 00:00:00 2001 From: Oleg Poludnenko Date: Tue, 7 Jun 2016 13:17:53 +0300 Subject: [PATCH 001/163] Pass $form to the attribute --- framework/assets/yii.activeForm.js | 1 + 1 file changed, 1 insertion(+) diff --git a/framework/assets/yii.activeForm.js b/framework/assets/yii.activeForm.js index 4ce37e7..38f54d1 100644 --- a/framework/assets/yii.activeForm.js +++ b/framework/assets/yii.activeForm.js @@ -302,6 +302,7 @@ // client-side validation $.each(data.attributes, function () { + this.$form = $form; if (!$(this.input).is(":disabled")) { this.cancelled = false; // perform validation only if the form is being submitted or if an attribute is pending validation From b9eb09b8b5fa93c8bfd6a740931fbe4ca7d00367 Mon Sep 17 00:00:00 2001 From: Oleg Poludnenko Date: Tue, 7 Jun 2016 13:22:55 +0300 Subject: [PATCH 002/163] Set attribute $form as a scope for selector --- framework/assets/yii.validation.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/assets/yii.validation.js b/framework/assets/yii.validation.js index c2df26f..06a006c 100644 --- a/framework/assets/yii.validation.js +++ b/framework/assets/yii.validation.js @@ -383,7 +383,7 @@ yii.validation = (function ($) { return []; } - var files = $(attribute.input).get(0).files; + var files = $(attribute.input, attribute.$form).get(0).files; if (!files) { messages.push(options.message); return []; From 1dc688e35f4b918a44e2159bb4fe6e41017aea28 Mon Sep 17 00:00:00 2001 From: Bob van Leeuwen Date: Wed, 29 Jun 2016 18:47:17 +0200 Subject: [PATCH 003/163] Fixes #11850: Introduced `yii\widgets\Pjax::$submitEvent` to be able to customize event triggering PJAX form submit --- framework/CHANGELOG.md | 1 + framework/widgets/Pjax.php | 8 +++++++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index efb780c..41c118e 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -42,6 +42,7 @@ Yii Framework 2 Change Log - Bug #11561: Fixed DI container throwing exceptions for optional dependencies (SamMousa) - Enh #11168: `yii\helpers\BaseHtml` now uses abstracted `booleanInput()` and `activeBooleanInput()` methods to render `radio()`, `checkbox()`, `activeRadio()` and `activeCheckbox()` (cesarnicola) - Bug #11822: Fixed exception on non-string value provided as CSRF token (cebe) +- Enh #11850: Introduced `yii\widgets\Pjax::$submitEvent` to be able to customize event triggering PJAX form submit (Bvanleeuwen) 2.0.8 April 28, 2016 -------------------- diff --git a/framework/widgets/Pjax.php b/framework/widgets/Pjax.php index 4c6f3a6..53a541c 100644 --- a/framework/widgets/Pjax.php +++ b/framework/widgets/Pjax.php @@ -68,6 +68,11 @@ class Pjax extends Widget */ public $formSelector; /** + * @var string The jQuery event that will trigger form handler. Defaults to "submit". + * @since 2.0.9 + */ + public $submitEvent = 'submit'; + /** * @var boolean whether to enable push state. */ public $enablePushState = true; @@ -189,7 +194,8 @@ class Pjax extends Widget } if ($this->formSelector !== false) { $formSelector = Json::htmlEncode($this->formSelector !== null ? $this->formSelector : '#' . $id . ' form[data-pjax]'); - $js .= "\njQuery(document).on('submit', $formSelector, function (event) {jQuery.pjax.submit(event, '#$id', $options);});"; + $submitEvent = Json::htmlEncode($this->submitEvent); + $js .= "\njQuery(document).on('$submitEvent', $formSelector, function (event) {jQuery.pjax.submit(event, '#$id', $options);});"; } $view = $this->getView(); PjaxAsset::register($view); From debb467f424f9fd0d4d77f00e81c3c0a14d02807 Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Thu, 30 Jun 2016 11:47:21 +0300 Subject: [PATCH 004/163] Fixes #11847: Fixed `yii\widgets\Pjax` to properly respond with partials when custom selector is used for container --- framework/CHANGELOG.md | 1 + framework/widgets/Pjax.php | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index 41c118e..b81fd4c 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -43,6 +43,7 @@ Yii Framework 2 Change Log - Enh #11168: `yii\helpers\BaseHtml` now uses abstracted `booleanInput()` and `activeBooleanInput()` methods to render `radio()`, `checkbox()`, `activeRadio()` and `activeCheckbox()` (cesarnicola) - Bug #11822: Fixed exception on non-string value provided as CSRF token (cebe) - Enh #11850: Introduced `yii\widgets\Pjax::$submitEvent` to be able to customize event triggering PJAX form submit (Bvanleeuwen) +- Bug #11847: Fixed `yii\widgets\Pjax` to properly respond with partials when custom selector is used for container (pigochu, samdark) 2.0.8 April 28, 2016 -------------------- diff --git a/framework/widgets/Pjax.php b/framework/widgets/Pjax.php index 53a541c..e9bb64f 100644 --- a/framework/widgets/Pjax.php +++ b/framework/widgets/Pjax.php @@ -173,7 +173,7 @@ class Pjax extends Widget { $headers = Yii::$app->getRequest()->getHeaders(); - return $headers->get('X-Pjax') && $headers->get('X-Pjax-Container') === '#' . $this->options['id']; + return $headers->get('X-Pjax') && explode(' ', $headers->get('X-Pjax-Container'))[0] === '#' . $this->options['id']; } /** From d9f1987d0fdb3c3729346b34e3464af12699aece Mon Sep 17 00:00:00 2001 From: Thiago Date: Fri, 1 Jul 2016 05:16:01 -0300 Subject: [PATCH 005/163] Fix for #11850 --- framework/widgets/Pjax.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/widgets/Pjax.php b/framework/widgets/Pjax.php index e9bb64f..7dd3491 100644 --- a/framework/widgets/Pjax.php +++ b/framework/widgets/Pjax.php @@ -195,7 +195,7 @@ class Pjax extends Widget if ($this->formSelector !== false) { $formSelector = Json::htmlEncode($this->formSelector !== null ? $this->formSelector : '#' . $id . ' form[data-pjax]'); $submitEvent = Json::htmlEncode($this->submitEvent); - $js .= "\njQuery(document).on('$submitEvent', $formSelector, function (event) {jQuery.pjax.submit(event, '#$id', $options);});"; + $js .= "\njQuery(document).on($submitEvent, $formSelector, function (event) {jQuery.pjax.submit(event, '#$id', $options);});"; } $view = $this->getView(); PjaxAsset::register($view); From 7e96db253df279a1b1304856e275224ea307603c Mon Sep 17 00:00:00 2001 From: Nikola Kovacs Date: Fri, 1 Jul 2016 17:25:31 +0200 Subject: [PATCH 006/163] Add missing documentation for getSort (#11862) [skip ci] --- framework/data/BaseDataProvider.php | 1 + 1 file changed, 1 insertion(+) diff --git a/framework/data/BaseDataProvider.php b/framework/data/BaseDataProvider.php index 01ea42b..b5961d9 100644 --- a/framework/data/BaseDataProvider.php +++ b/framework/data/BaseDataProvider.php @@ -203,6 +203,7 @@ abstract class BaseDataProvider extends Component implements DataProviderInterfa } /** + * Returns the sorting object used by this data provider. * @return Sort|boolean the sorting object. If this is false, it means the sorting is disabled. */ public function getSort() From 4d93d68af964e7b868e86115b61cb8c7d7370c57 Mon Sep 17 00:00:00 2001 From: Nikola Kovacs Date: Fri, 1 Jul 2016 18:15:36 +0200 Subject: [PATCH 007/163] Fix incorrect formatting in documentation (#11864) [skip ci] The asterisks and underscores were interpreted as markdown formatting, which wasn't intended. Also fix invalid link to FG_COLOR. --- framework/helpers/BaseConsole.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/framework/helpers/BaseConsole.php b/framework/helpers/BaseConsole.php index 9ed980e..b49ad73 100644 --- a/framework/helpers/BaseConsole.php +++ b/framework/helpers/BaseConsole.php @@ -238,7 +238,7 @@ class BaseConsole * Returns the ANSI format code. * * @param array $format An array containing formatting values. - * You can pass any of the FG_*, BG_* and TEXT_* constants + * You can pass any of the `FG_*`, `BG_*` and `TEXT_*` constants * and also [[xtermFgColor]] and [[xtermBgColor]] to specify a format. * @return string The ANSI format code according to the given formatting constants. */ @@ -251,7 +251,7 @@ class BaseConsole * Echoes an ANSI format code that affects the formatting of any text that is printed afterwards. * * @param array $format An array containing formatting values. - * You can pass any of the FG_*, BG_* and TEXT_* constants + * You can pass any of the `FG_*`, `BG_*` and `TEXT_*` constants * and also [[xtermFgColor]] and [[xtermBgColor]] to specify a format. * @see ansiFormatCode() * @see endAnsiFormat() @@ -280,7 +280,7 @@ class BaseConsole * * @param string $string the string to be formatted * @param array $format An array containing formatting values. - * You can pass any of the FG_*, BG_* and TEXT_* constants + * You can pass any of the `FG_*`, `BG_*` and `TEXT_*` constants * and also [[xtermFgColor]] and [[xtermBgColor]] to specify a format. * @return string */ @@ -347,7 +347,7 @@ class BaseConsole * * @param string $string the string to convert. * @param array $styleMap an optional mapping of ANSI control codes such as - * [[FG_COLOR]] or [[BOLD]] to a set of css style definitions. + * FG\_*COLOR* or [[BOLD]] to a set of css style definitions. * The CSS style definitions are represented as an array where the array keys correspond * to the css style attribute names and the values are the css values. * values may be arrays that will be merged and imploded with `' '` when rendered. From 2a05754edee553066cb274e73ae960c09ce910dd Mon Sep 17 00:00:00 2001 From: Nikola Kovacs Date: Sat, 2 Jul 2016 00:42:08 +0200 Subject: [PATCH 008/163] Fix link in documentation (#11861) [skip ci] --- framework/data/ArrayDataProvider.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/data/ArrayDataProvider.php b/framework/data/ArrayDataProvider.php index 4e3a333..367d3a4 100644 --- a/framework/data/ArrayDataProvider.php +++ b/framework/data/ArrayDataProvider.php @@ -64,7 +64,7 @@ class ArrayDataProvider extends BaseDataProvider */ public $allModels; /** - * @var string the name of the [[yii\base\Model|Model]] class that will be represented. + * @var string the name of the [[\yii\base\Model|Model]] class that will be represented. * This property is used to get columns' names. * @since 2.0.9 */ From e8bcb93507a7859f2a5115ec2179182353e9cc04 Mon Sep 17 00:00:00 2001 From: lynicidn Date: Fri, 10 Jun 2016 18:53:31 +0300 Subject: [PATCH 009/163] Fixes #10681: Fixed active form `beforeValidate` wasn't triggered in some cases --- framework/CHANGELOG.md | 3 ++- framework/assets/yii.activeForm.js | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index b81fd4c..1625c09 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -43,7 +43,8 @@ Yii Framework 2 Change Log - Enh #11168: `yii\helpers\BaseHtml` now uses abstracted `booleanInput()` and `activeBooleanInput()` methods to render `radio()`, `checkbox()`, `activeRadio()` and `activeCheckbox()` (cesarnicola) - Bug #11822: Fixed exception on non-string value provided as CSRF token (cebe) - Enh #11850: Introduced `yii\widgets\Pjax::$submitEvent` to be able to customize event triggering PJAX form submit (Bvanleeuwen) -- Bug #11847: Fixed `yii\widgets\Pjax` to properly respond with partials when custom selector is used for container (pigochu, samdark) +- Bug #11847: Fixed `yii\widgets\Pjax` to properly respond with partials when custom selector is used for container (pigochu, samdark) +- Bug #10681: Fixed active form `beforeValidate` wasn't triggered in some cases (lynicidn) 2.0.8 April 28, 2016 -------------------- diff --git a/framework/assets/yii.activeForm.js b/framework/assets/yii.activeForm.js index 4ce37e7..86a4632 100644 --- a/framework/assets/yii.activeForm.js +++ b/framework/assets/yii.activeForm.js @@ -290,9 +290,9 @@ deferreds = deferredArray(), submitting = data.submitting; + var event = $.Event(events.beforeValidate); + $form.trigger(event, [messages, deferreds]); if (submitting) { - var event = $.Event(events.beforeValidate); - $form.trigger(event, [messages, deferreds]); if (event.result === false) { data.submitting = false; submitFinalize($form); From 894f832dca6b2a652917e3826a4791e148430c94 Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Sat, 2 Jul 2016 20:42:14 +0300 Subject: [PATCH 010/163] #11857: Added test for AccessRule matching by verb --- tests/framework/filters/AccessRuleTest.php | 71 ++++++++++++++++++++++-------- 1 file changed, 52 insertions(+), 19 deletions(-) diff --git a/tests/framework/filters/AccessRuleTest.php b/tests/framework/filters/AccessRuleTest.php index f67a6eb..21e67a1 100644 --- a/tests/framework/filters/AccessRuleTest.php +++ b/tests/framework/filters/AccessRuleTest.php @@ -26,26 +26,43 @@ class AccessRuleTest extends \yiiunit\TestCase $this->mockWebApplication(); } - protected function mockObjects() + /** + * @param string $method + * @return Request + */ + protected function mockRequest($method = 'GET') { - $controller = new Controller('site', Yii::$app); - $action = new Action('test', $controller); + /** @var Request $request */ + $request = $this->getMockBuilder('\yii\web\Request')->setMethods(['getMethod'])->getMock(); + $request->method('getMethod')->willReturn($method); + return $request; + } - $user = new User([ + /** + * @return User + */ + protected function mockUser() + { + return new User([ 'identityClass' => UserIdentity::className(), 'enableAutoLogin' => false, ]); + } - return [$action, $user, Yii::$app->request]; + /** + * @return Action + */ + protected function mockAction() + { + $controller = new Controller('site', Yii::$app); + return new Action('test', $controller); } public function testMatchAction() { - /** @var $action Action */ - /** @var $user User */ - /** @var $request Request */ - list($action, $user, $request) = $this->mockObjects(); - + $action = $this->mockAction(); + $user = $this->mockUser(); + $request = $this->mockRequest(); $rule = new AccessRule([ 'allow' => true, @@ -73,16 +90,33 @@ class AccessRuleTest extends \yiiunit\TestCase // TODO test match roles - // TODO test match verb + public function testMatchVerb() + { + $action = $this->mockAction(); + $user = $this->mockUser(); + + $rule = new AccessRule([ + 'allow' => true, + 'verbs' => ['POST', 'get'], + ]); + + $request = $this->mockRequest('GET'); + $this->assertTrue($rule->allows($action, $user, $request)); + + $request = $this->mockRequest('POST'); + $this->assertTrue($rule->allows($action, $user, $request)); + + $request = $this->mockRequest('HEAD'); + $this->assertNull($rule->allows($action, $user, $request)); + } // TODO test match custom callback public function testMatchIP() { - /** @var $action Action */ - /** @var $user User */ - /** @var $request Request */ - list($action, $user, $request) = $this->mockObjects(); + $action = $this->mockAction(); + $user = $this->mockUser(); + $request = $this->mockRequest(); $rule = new AccessRule(); @@ -162,10 +196,9 @@ class AccessRuleTest extends \yiiunit\TestCase public function testMatchIPWildcard() { - /** @var $action Action */ - /** @var $user User */ - /** @var $request Request */ - list($action, $user, $request) = $this->mockObjects(); + $action = $this->mockAction(); + $user = $this->mockUser(); + $request = $this->mockRequest(); $rule = new AccessRule(); From 779c8e0a012e3b302ef0c3c68bb0a3b7e4b279ca Mon Sep 17 00:00:00 2001 From: DrDeath72 Date: Fri, 1 Jul 2016 11:55:38 +0500 Subject: [PATCH 011/163] Fixes #11857: `yii\filters\AccessRule::$verbs` could not be configured with any case of request method names --- framework/CHANGELOG.md | 1 + framework/filters/AccessRule.php | 3 +-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index 1625c09..4e2209d 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -45,6 +45,7 @@ Yii Framework 2 Change Log - Enh #11850: Introduced `yii\widgets\Pjax::$submitEvent` to be able to customize event triggering PJAX form submit (Bvanleeuwen) - Bug #11847: Fixed `yii\widgets\Pjax` to properly respond with partials when custom selector is used for container (pigochu, samdark) - Bug #10681: Fixed active form `beforeValidate` wasn't triggered in some cases (lynicidn) +- Enh #11857: `yii\filters\AccessRule::$verbs` could not be configured with any case of request method names (DrDeath72, samdark) 2.0.8 April 28, 2016 -------------------- diff --git a/framework/filters/AccessRule.php b/framework/filters/AccessRule.php index e60f95a..f611204 100644 --- a/framework/filters/AccessRule.php +++ b/framework/filters/AccessRule.php @@ -58,7 +58,6 @@ class AccessRule extends Component public $ips; /** * @var array list of request methods (e.g. `GET`, `POST`) that this rule applies to. - * The request methods must be specified in uppercase. * If not set or empty, it means this rule applies to all request methods. * @see \yii\web\Request::method */ @@ -181,7 +180,7 @@ class AccessRule extends Component */ protected function matchVerb($verb) { - return empty($this->verbs) || in_array($verb, $this->verbs, true); + return empty($this->verbs) || in_array($verb, array_map('strtoupper', $this->verbs), true); } /** From 3b5634bf8bc0b17dcb2e97d252511154cd4e0706 Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Sat, 2 Jul 2016 21:06:39 +0300 Subject: [PATCH 012/163] Fixes #11863: Fixed usage of `mb_substr` with PHP < 5.4.8 where length of NULL was treated the same as 0 --- framework/CHANGELOG.md | 1 + framework/helpers/BaseStringHelper.php | 2 +- framework/i18n/MessageFormatter.php | 4 ++-- framework/web/UploadedFile.php | 3 ++- 4 files changed, 6 insertions(+), 4 deletions(-) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index 4e2209d..25a78eb 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -46,6 +46,7 @@ Yii Framework 2 Change Log - Bug #11847: Fixed `yii\widgets\Pjax` to properly respond with partials when custom selector is used for container (pigochu, samdark) - Bug #10681: Fixed active form `beforeValidate` wasn't triggered in some cases (lynicidn) - Enh #11857: `yii\filters\AccessRule::$verbs` could not be configured with any case of request method names (DrDeath72, samdark) +- Bug #11863: Fixed usage of `mb_substr` with PHP < 5.4.8 where length of NULL was treated the same as 0 (samdark) 2.0.8 April 28, 2016 -------------------- diff --git a/framework/helpers/BaseStringHelper.php b/framework/helpers/BaseStringHelper.php index 864210e..d5aaf37 100644 --- a/framework/helpers/BaseStringHelper.php +++ b/framework/helpers/BaseStringHelper.php @@ -232,7 +232,7 @@ class BaseStringHelper } return substr_compare($string, $with, -$bytes, $bytes) === 0; } else { - return mb_strtolower(mb_substr($string, -$bytes, null, '8bit'), Yii::$app->charset) === mb_strtolower($with, Yii::$app->charset); + return mb_strtolower(mb_substr($string, -$bytes, mb_strlen($string, '8bit'), '8bit'), Yii::$app->charset) === mb_strtolower($with, Yii::$app->charset); } } diff --git a/framework/i18n/MessageFormatter.php b/framework/i18n/MessageFormatter.php index 2d68a39..0f9255c 100644 --- a/framework/i18n/MessageFormatter.php +++ b/framework/i18n/MessageFormatter.php @@ -401,10 +401,10 @@ class MessageFormatter extends Component if ($i == 1 && strncmp($selector, 'offset:', 7) === 0) { $offset = (int) trim(mb_substr($selector, 7, ($pos = mb_strpos(str_replace(["\n", "\r", "\t"], ' ', $selector), ' ', 7, $charset)) - 7, $charset)); - $selector = trim(mb_substr($selector, $pos + 1, null, $charset)); + $selector = trim(mb_substr($selector, $pos + 1, mb_strlen($selector, $charset), $charset)); } if ($message === false && $selector === 'other' || - $selector[0] === '=' && (int) mb_substr($selector, 1, null, $charset) === $arg || + $selector[0] === '=' && (int) mb_substr($selector, 1, mb_strlen($selector, $charset), $charset) === $arg || $selector === 'one' && $arg - $offset == 1 ) { $message = implode(',', str_replace('#', $arg - $offset, $plural[$i])); diff --git a/framework/web/UploadedFile.php b/framework/web/UploadedFile.php index dc3035a..cca7951 100644 --- a/framework/web/UploadedFile.php +++ b/framework/web/UploadedFile.php @@ -172,7 +172,8 @@ class UploadedFile extends Object public function getBaseName() { // https://github.com/yiisoft/yii2/issues/11012 - return mb_substr(pathinfo('_' . $this->name, PATHINFO_FILENAME), 1, null, '8bit'); + $pathInfo = pathinfo('_' . $this->name, PATHINFO_FILENAME); + return mb_substr($pathInfo, 1, mb_strlen($pathInfo, '8bit'), '8bit'); } /** From 6baf8dba4d610f0a905f15df4e896e6c2dcd69fc Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Sat, 2 Jul 2016 21:10:00 +0300 Subject: [PATCH 013/163] Fixes #11870: Fixed reliablity of example code in "Getting Data for Multiple Models" --- docs/guide/input-multiple-models.md | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/docs/guide/input-multiple-models.md b/docs/guide/input-multiple-models.md index 4810c33..509abac 100644 --- a/docs/guide/input-multiple-models.md +++ b/docs/guide/input-multiple-models.md @@ -27,12 +27,16 @@ class UserController extends Controller public function actionUpdate($id) { $user = User::findOne($id); - $profile = Profile::findOne($id); - - if (!isset($user, $profile)) { + if (!$user) { throw new NotFoundHttpException("The user was not found."); } + $profile = Profile::findOne($user->profile_id); + + if (!$profile) { + throw new NotFoundHttpException("The user has no profile."); + } + $user->scenario = 'update'; $profile->scenario = 'update'; From 2c021f5ab8e312f080ee6445398bcb7491177d04 Mon Sep 17 00:00:00 2001 From: DrDeath72 Date: Sat, 2 Jul 2016 23:32:31 +0500 Subject: [PATCH 014/163] Update CHANGELOG.md (#11871) [skip ci] --- framework/CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index 25a78eb..52c7f52 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -19,7 +19,7 @@ Yii Framework 2 Change Log - Enh #11414: Files specified as `null` in `yii\web\AssetBundle` won't be registered (Razzwan) - Enh #11432: Added HTTP status 421 "Misdirected Request" to list of statuses in `yii\web\Response` (dasmfm) - Enh #11438: Configurable `yii\helpers\Markdown` default flavor (mdmunir) -- Enh #11729: Added `yii\grid\CheckboxColumn::$cssClas` property to specify a class added to checkbox input (thiagotalma) +- Enh #11729: Added `yii\grid\CheckboxColumn::$cssClass` property to specify a class added to checkbox input (thiagotalma) - Bug #11459: Fixed flash messages not destroyed when `session.auto_start = 1` set in php.ini (cartmanchen) - Bug #11498: Fixed inability to save serialized object into PostgreSQL binary column (klimov-paul) - Bug #11507: Fixed `yii\validators\EachValidator::validateAttribute()` does not respect `skipOnEmpty` rule parameter (webdevsega) From 16e4cab8f1d047e7669d76fdcca0fb690272edd8 Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Sun, 3 Jul 2016 01:43:32 +0300 Subject: [PATCH 015/163] Fixes #11865: Fixed setting `selected` for dropdown list using options --- framework/CHANGELOG.md | 1 + framework/helpers/BaseHtml.php | 4 +++- tests/framework/helpers/HtmlTest.php | 12 ++++++++++++ 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index 52c7f52..feeab8d 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -47,6 +47,7 @@ Yii Framework 2 Change Log - Bug #10681: Fixed active form `beforeValidate` wasn't triggered in some cases (lynicidn) - Enh #11857: `yii\filters\AccessRule::$verbs` could not be configured with any case of request method names (DrDeath72, samdark) - Bug #11863: Fixed usage of `mb_substr` with PHP < 5.4.8 where length of NULL was treated the same as 0 (samdark) +- Bug #11865: Fixed setting `selected` for dropdown list using options (samdark) 2.0.8 April 28, 2016 -------------------- diff --git a/framework/helpers/BaseHtml.php b/framework/helpers/BaseHtml.php index c9975c4..914a0fb 100644 --- a/framework/helpers/BaseHtml.php +++ b/framework/helpers/BaseHtml.php @@ -1702,9 +1702,11 @@ class BaseHtml } else { $attrs = isset($options[$key]) ? $options[$key] : []; $attrs['value'] = (string) $key; - $attrs['selected'] = $selection !== null && + if (!array_key_exists('selected', $attrs)) { + $attrs['selected'] = $selection !== null && (!ArrayHelper::isTraversable($selection) && !strcmp($key, $selection) || ArrayHelper::isTraversable($selection) && ArrayHelper::isIn($key, $selection)); + } $text = $encode ? static::encode($value) : $value; if ($encodeSpaces) { $text = str_replace(' ', ' ', $text); diff --git a/tests/framework/helpers/HtmlTest.php b/tests/framework/helpers/HtmlTest.php index 3303295..edf6a53 100644 --- a/tests/framework/helpers/HtmlTest.php +++ b/tests/framework/helpers/HtmlTest.php @@ -280,6 +280,18 @@ EOD; EOD; $this->assertEqualsWithoutLE($expected, Html::dropDownList('test', 'value2', $this->getDataItems())); + + $expected = << + + + +EOD; + $this->assertEqualsWithoutLE($expected, Html::dropDownList('test', null, $this->getDataItems(), [ + 'options' => [ + 'value2' => ['selected' => true] + ], + ])); } public function testListBox() From 30bb9bd7c8b8e1716eba0c308cc74d1045207a8f Mon Sep 17 00:00:00 2001 From: Viktor Pikaev Date: Sun, 3 Jul 2016 02:56:05 +0400 Subject: [PATCH 016/163] Fixes #11462: Added support of filtering rules to `yii\log\Target::$logVar`, added `\yii\helpers\BaseArrayHelper::filter()` method --- framework/CHANGELOG.md | 2 + framework/helpers/BaseArrayHelper.php | 89 +++++++++++++++++++++++++++++ framework/log/Target.php | 18 +++--- tests/framework/helpers/ArrayHelperTest.php | 41 ++++++++++++- tests/framework/log/TargetTest.php | 56 ++++++++++++++++++ 5 files changed, 198 insertions(+), 8 deletions(-) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index feeab8d..1cdcd41 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -21,6 +21,8 @@ Yii Framework 2 Change Log - Enh #11438: Configurable `yii\helpers\Markdown` default flavor (mdmunir) - Enh #11729: Added `yii\grid\CheckboxColumn::$cssClass` property to specify a class added to checkbox input (thiagotalma) - Bug #11459: Fixed flash messages not destroyed when `session.auto_start = 1` set in php.ini (cartmanchen) +- Enh: Added support of filtering rules to `yii\log\Target::$logVar`. (Viktor Pikaev) +- Enh: Added `\yii\helpers\BaseArrayHelper::filter()` method. (Viktor Pikaev) - Bug #11498: Fixed inability to save serialized object into PostgreSQL binary column (klimov-paul) - Bug #11507: Fixed `yii\validators\EachValidator::validateAttribute()` does not respect `skipOnEmpty` rule parameter (webdevsega) - Bug #11523: Fixed `yii\web\User::checkRedirectAcceptable()` to treat acceptable content type `*/*` as `*` (silverfire) diff --git a/framework/helpers/BaseArrayHelper.php b/framework/helpers/BaseArrayHelper.php index ea0fb62..8ebcc80 100644 --- a/framework/helpers/BaseArrayHelper.php +++ b/framework/helpers/BaseArrayHelper.php @@ -755,4 +755,93 @@ class BaseArrayHelper throw new InvalidParamException('Argument $needles must be an array or implement Traversable'); } } + + /** + * Filters array by specified rules. + * + * For example: + * ```php + * $array = [ + * 'A' => [1, 2], + * 'B' => [ + * 'C' => 1, + * 'D' => 2, + * ], + * 'E' => 1, + * ]; + * + * $result = \yii\helpers\ArrayHelper::filter($array, ['A']); + * // $result will be: + * // [ + * // 'A' => [1, 2], + * // ] + * + * $result = \yii\helpers\ArrayHelper::filter($array, ['A', 'B.C']); + * // $result will be: + * // [ + * // 'A' => [1, 2], + * // 'B' => ['C' => 1], + * // ] + * ``` + * + * $result = \yii\helpers\ArrayHelper::filter($array, ['B', '!B.C']); + * // $result will be: + * // [ + * // 'B' => ['D' => 2], + * // ] + * ``` + * + * @param array $array Source array. + * @param array $filters List of array keys which should be passed or removed from results. + * Each item should contains one of the next rules: + * - `var` - `$array['var']` will be passed to result. + * - `var.key` = only `$array['var']['key'] will be passed to result. + * - `!var.key` = `$array['var']['key'] will be removed from result. + * @return array Filtering array + */ + public static function filter($array, $filters) + { + $result = []; + $forbiddenVars = []; + + foreach ($filters as $var) { + $keys = explode('.', $var); + $globalKey = $keys[0]; + $localKey = isset($keys[1]) ? $keys[1] : null; + + if ($globalKey[0] === '!') { + $forbiddenVars[] = [ + substr($globalKey, 1), + $localKey, + ]; + continue; + } + + if (empty($array[$globalKey])) { + continue; + } + if ($localKey === null) { + $result[$globalKey] = $array[$globalKey]; + continue; + } + if (!isset($array[$globalKey][$localKey])) { + continue; + } + if (!isset($result[$globalKey])) { + $result[$globalKey] = []; + } + $result[$globalKey][$localKey] = $array[$globalKey][$localKey]; + } + + foreach ($forbiddenVars as $var) { + $globalKey=$var[0]; + $localKey=$var[1]; + if (isset($result[$globalKey])) { + unset($result[$globalKey][$localKey]); + } + + } + + return $result; + } } diff --git a/framework/log/Target.php b/framework/log/Target.php index afb5153..6250a45 100644 --- a/framework/log/Target.php +++ b/framework/log/Target.php @@ -10,6 +10,7 @@ namespace yii\log; use Yii; use yii\base\Component; use yii\base\InvalidConfigException; +use yii\helpers\ArrayHelper; use yii\helpers\VarDumper; use yii\web\Request; @@ -57,6 +58,11 @@ abstract class Target extends Component * @var array list of the PHP predefined variables that should be logged in a message. * Note that a variable must be accessible via `$GLOBALS`. Otherwise it won't be logged. * Defaults to `['_GET', '_POST', '_FILES', '_COOKIE', '_SESSION', '_SERVER']`. + * Each element should be in one of next forms: + * - `var` - `var` will be logged. + * - `var.key` - only `var[key]` key will be logged. + * - `!var.key` - `var[key]` key will be excluded. + * */ public $logVars = ['_GET', '_POST', '_FILES', '_COOKIE', '_SESSION', '_SERVER']; /** @@ -122,14 +128,12 @@ abstract class Target extends Component */ protected function getContextMessage() { - $context = []; - foreach ($this->logVars as $name) { - if (!empty($GLOBALS[$name])) { - $context[] = "\${$name} = " . VarDumper::dumpAsString($GLOBALS[$name]); - } + $context = ArrayHelper::filter($GLOBALS,$this->logVars); + $result = []; + foreach ($context as $key => $value) { + $result[] = "\${$key} = " . VarDumper::dumpAsString($value); } - - return implode("\n\n", $context); + return implode("\n\n", $result); } /** diff --git a/tests/framework/helpers/ArrayHelperTest.php b/tests/framework/helpers/ArrayHelperTest.php index 3bc4abd..c8a89c3 100644 --- a/tests/framework/helpers/ArrayHelperTest.php +++ b/tests/framework/helpers/ArrayHelperTest.php @@ -778,5 +778,44 @@ class ArrayHelperTest extends TestCase $this->assertFalse(ArrayHelper::isTraversable(null)); } - + public function testFilter() + { + $array = [ + 'A' => [ + 'B' => 1, + 'C' => 2, + ], + 'G' => 1, + ]; + $this->assertEquals(ArrayHelper::filter($array, ['A']), [ + 'A' => [ + 'B' => 1, + 'C' => 2, + ], + ]); + $this->assertEquals(ArrayHelper::filter($array, ['A.B']), [ + 'A' => [ + 'B' => 1, + ], + ]); + $this->assertEquals(ArrayHelper::filter($array, ['A', '!A.B']), [ + 'A' => [ + 'C' => 2, + ], + ]); + $this->assertEquals(ArrayHelper::filter($array, ['!A.B', 'A']), [ + 'A' => [ + 'C' => 2, + ], + ]); + $this->assertEquals(ArrayHelper::filter($array, ['A', 'G']), [ + 'A' => [ + 'B' => 1, + 'C' => 2, + ], + 'G' => 1, + ]); + $this->assertEquals(ArrayHelper::filter($array, ['X']), []); + $this->assertEquals(ArrayHelper::filter($array, ['X.Y']), []); + } } diff --git a/tests/framework/log/TargetTest.php b/tests/framework/log/TargetTest.php index c546822..af64d41 100644 --- a/tests/framework/log/TargetTest.php +++ b/tests/framework/log/TargetTest.php @@ -75,6 +75,54 @@ class TargetTest extends TestCase $this->assertEquals('test' . $e, static::$messages[$i++][0]); } } + + public function testGetContextMessage() + { + $target = new TestTarget([ + 'logVars' => [ + 'A', '!A.A_b', 'A.A_d', + 'B.B_a', + 'C', 'C.C_a', + 'D', + ], + ]); + $GLOBALS['A'] = [ + 'A_a' => 1, + 'A_b' => 1, + 'A_c' => 1, + ]; + $GLOBALS['B'] = [ + 'B_a' => 1, + 'B_b' => 1, + 'B_c' => 1, + ]; + $GLOBALS['C'] = [ + 'C_a' => 1, + 'C_b' => 1, + 'C_c' => 1, + ]; + $GLOBALS['E'] = [ + 'C_a' => 1, + 'C_b' => 1, + 'C_c' => 1, + ]; + $context = $target->getContextMessage(); + $this->assertContains('A_a', $context); + $this->assertNotContains('A_b', $context); + $this->assertContains('A_c', $context); + $this->assertContains('B_a', $context); + $this->assertNotContains('B_b', $context); + $this->assertNotContains('B_c', $context); + $this->assertContains('C_a', $context); + $this->assertContains('C_b', $context); + $this->assertContains('C_c', $context); + $this->assertNotContains('D_a', $context); + $this->assertNotContains('D_b', $context); + $this->assertNotContains('D_c', $context); + $this->assertNotContains('E_a', $context); + $this->assertNotContains('E_b', $context); + $this->assertNotContains('E_c', $context); + } } class TestTarget extends Target @@ -90,4 +138,12 @@ class TestTarget extends Target TargetTest::$messages = array_merge(TargetTest::$messages, $this->messages); $this->messages = []; } + + /** + * @inheritdoc + */ + public function getContextMessage() + { + return parent::getContextMessage(); + } } From 4fd4ac04b1e3c367e585eedd373b7e4938fe9297 Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Sun, 3 Jul 2016 02:05:13 +0300 Subject: [PATCH 017/163] Minor adjustments for #11462 --- framework/CHANGELOG.md | 4 ++-- framework/helpers/BaseArrayHelper.php | 23 +++++++++++------------ framework/log/Target.php | 4 ++-- 3 files changed, 15 insertions(+), 16 deletions(-) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index 1cdcd41..61fd005 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -21,8 +21,8 @@ Yii Framework 2 Change Log - Enh #11438: Configurable `yii\helpers\Markdown` default flavor (mdmunir) - Enh #11729: Added `yii\grid\CheckboxColumn::$cssClass` property to specify a class added to checkbox input (thiagotalma) - Bug #11459: Fixed flash messages not destroyed when `session.auto_start = 1` set in php.ini (cartmanchen) -- Enh: Added support of filtering rules to `yii\log\Target::$logVar`. (Viktor Pikaev) -- Enh: Added `\yii\helpers\BaseArrayHelper::filter()` method. (Viktor Pikaev) +- Enh #11462: Added support of filtering rules to `yii\log\Target::$logVar` (HaruAtari) +- Enh #11462: Added `\yii\helpers\BaseArrayHelper::filter()` method (HaruAtari) - Bug #11498: Fixed inability to save serialized object into PostgreSQL binary column (klimov-paul) - Bug #11507: Fixed `yii\validators\EachValidator::validateAttribute()` does not respect `skipOnEmpty` rule parameter (webdevsega) - Bug #11523: Fixed `yii\web\User::checkRedirectAcceptable()` to treat acceptable content type `*/*` as `*` (silverfire) diff --git a/framework/helpers/BaseArrayHelper.php b/framework/helpers/BaseArrayHelper.php index 8ebcc80..2445d25 100644 --- a/framework/helpers/BaseArrayHelper.php +++ b/framework/helpers/BaseArrayHelper.php @@ -757,7 +757,7 @@ class BaseArrayHelper } /** - * Filters array by specified rules. + * Filters array according to rules specified. * * For example: * ```php @@ -791,13 +791,14 @@ class BaseArrayHelper * // ] * ``` * - * @param array $array Source array. - * @param array $filters List of array keys which should be passed or removed from results. - * Each item should contains one of the next rules: - * - `var` - `$array['var']` will be passed to result. - * - `var.key` = only `$array['var']['key'] will be passed to result. + * @param array $array Source array + * @param array $filters Rules that define array keys which should be left or removed from results. + * Each rule is: + * - `var` - `$array['var']` will be left in result. + * - `var.key` = only `$array['var']['key'] will be left in result. * - `!var.key` = `$array['var']['key'] will be removed from result. - * @return array Filtering array + * @return array Filtered array + * @since 2.0.9 */ public static function filter($array, $filters) { @@ -827,19 +828,17 @@ class BaseArrayHelper if (!isset($array[$globalKey][$localKey])) { continue; } - if (!isset($result[$globalKey])) { + if (!array_key_exists($globalKey, $result)) { $result[$globalKey] = []; } $result[$globalKey][$localKey] = $array[$globalKey][$localKey]; } foreach ($forbiddenVars as $var) { - $globalKey=$var[0]; - $localKey=$var[1]; - if (isset($result[$globalKey])) { + list($globalKey, $localKey) = $var; + if (array_key_exists($globalKey, $result)) { unset($result[$globalKey][$localKey]); } - } return $result; diff --git a/framework/log/Target.php b/framework/log/Target.php index 6250a45..49c7a7b 100644 --- a/framework/log/Target.php +++ b/framework/log/Target.php @@ -58,7 +58,7 @@ abstract class Target extends Component * @var array list of the PHP predefined variables that should be logged in a message. * Note that a variable must be accessible via `$GLOBALS`. Otherwise it won't be logged. * Defaults to `['_GET', '_POST', '_FILES', '_COOKIE', '_SESSION', '_SERVER']`. - * Each element should be in one of next forms: + * Each element could be specified as one of the following: * - `var` - `var` will be logged. * - `var.key` - only `var[key]` key will be logged. * - `!var.key` - `var[key]` key will be excluded. @@ -128,7 +128,7 @@ abstract class Target extends Component */ protected function getContextMessage() { - $context = ArrayHelper::filter($GLOBALS,$this->logVars); + $context = ArrayHelper::filter($GLOBALS, $this->logVars); $result = []; foreach ($context as $key => $value) { $result[] = "\${$key} = " . VarDumper::dumpAsString($value); From d8ba5eb4587e05c4ae9afd98ef557eea5c521cec Mon Sep 17 00:00:00 2001 From: Nobuo Kihara Date: Sun, 3 Jul 2016 10:42:04 +0900 Subject: [PATCH 018/163] docs/internals/release.md typo fixed [ci skip] --- docs/internals/release.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/internals/release.md b/docs/internals/release.md index b163a07..b75431b 100644 --- a/docs/internals/release.md +++ b/docs/internals/release.md @@ -51,7 +51,7 @@ Making an extension release includes only one command (e.g. for redis): ./build release redis The default release command will release a new minor version from the currently checked out branch. -To release another version thatn the default, you have to specify it using the `--version` option, e.g. +To release another version than the default, you have to specify it using the `--version` option, e.g. `--version=2.1.0`, or `--version=2.1.0-beta`. From 6abd19f72f1766d7d9203d8e8ba538ae90e282ca Mon Sep 17 00:00:00 2001 From: Nobuo Kihara Date: Sun, 3 Jul 2016 10:42:54 +0900 Subject: [PATCH 019/163] docs/internals-ja updated [ci skip] --- docs/internals-ja/README.md | 43 +++++++++++++ docs/internals-ja/automation.md | 5 ++ docs/internals-ja/core-code-style.md | 4 +- docs/internals-ja/exception_hierarchy.png | Bin 0 -> 64306 bytes docs/internals-ja/exception_hierarchy.vsd | Bin 0 -> 151040 bytes docs/internals-ja/git-workflow.md | 2 +- docs/internals-ja/project-organization.md | 33 ++++++++++ docs/internals-ja/pull-request-qa.md | 6 +- docs/internals-ja/release.md | 69 +++++++++++++++++++++ docs/internals-ja/schema-builder-patterns.xlsx | Bin 0 -> 31048 bytes docs/internals-ja/translation-status.md | 4 ++ docs/internals-ja/translation-teams.md | 65 ++++++++++++++++++++ docs/internals-ja/versions-branches.png | Bin 0 -> 832799 bytes docs/internals-ja/versions.md | 82 ++++++++++++++++++------- docs/internals-ja/view-code-style.md | 4 +- 15 files changed, 286 insertions(+), 31 deletions(-) create mode 100644 docs/internals-ja/README.md create mode 100644 docs/internals-ja/exception_hierarchy.png create mode 100644 docs/internals-ja/exception_hierarchy.vsd create mode 100644 docs/internals-ja/project-organization.md create mode 100644 docs/internals-ja/release.md create mode 100644 docs/internals-ja/schema-builder-patterns.xlsx create mode 100644 docs/internals-ja/translation-status.md create mode 100644 docs/internals-ja/translation-teams.md create mode 100644 docs/internals-ja/versions-branches.png diff --git a/docs/internals-ja/README.md b/docs/internals-ja/README.md new file mode 100644 index 0000000..766bcba --- /dev/null +++ b/docs/internals-ja/README.md @@ -0,0 +1,43 @@ +Yii 開発者ドキュメント +====================== + +このディレクトリは、Yii フレームワークの開発とリリースプロセスに関するドキュメントを含んでいます。 + +寄稿者のためのガイドライン +-------------------------- + +- [課題を報告する仕方](report-an-issue.md) +- [始めよう](getting-started.md) +- [Yii 2 寄稿者のための Git ワークフロー](git-workflow.md) - 開発環境をセットアップして Yii に対する寄稿を始めるためのステップバイステップのガイド。 +- [Yii2 コアフレームワークコードスタイル](core-code-style.md) +- [Yii2 ビューコードスタイル](view-code-style.md) + + +ドキュメント +------------ + +- [翻訳ステータス](translation-status.md) - どのドキュメントが翻訳できる状態か。 +- [翻訳チーム](translation-teams.md) +- [翻訳ワークフロー](translation-workflow.md) + + +フレームワーク開発 +------------------ + +- [プルリクエストの品質保証](pull-request-qa.md) +- [自動化されるタスク](automation.md) コードスタイルの修正、ドキュメントやファイルの自動生成など。 +- [設計上の決定](design-decisions.md) - よく議論される事柄についての FAQ 形式の声明リスト。 + +バージョニングとリリース +------------------------ + +- [プロジェクトの編成](project-organization.md) +- [Yii のバージョニング](versions.md) +- [新しいバージョンのリリース](release.md) + +その他 +------ + +### 例外の階層 + +![Yii フレームワークの例外階層](exception_hierarchy.png) diff --git a/docs/internals-ja/automation.md b/docs/internals-ja/automation.md index 1c79145..3c5c9db 100644 --- a/docs/internals-ja/automation.md +++ b/docs/internals-ja/automation.md @@ -13,3 +13,8 @@ Yii の開発に取り組む際に、自動化できるタスクがいくつか `./build/build php-doc/fix` を実行して修正してください。 このコマンドは完璧なものではないため、望ましくない変更があるかもしれませんので、コミットする前に変更点をチェックしてください。 `git add -p` を使って変更をレビューすることが出来ます。 + +- Mime 型マジックファイル (`framework/helpers/mimeTypes.php`) の Apache HTTPd レポジトリによる更新。 + `./build/build mime-type` を実行してファイルを更新して下さい。 + +上記のコマンドの全てが [release process]() に含まれています。これらをリリースの間に実行しても構いませんが、必要ではありません。 diff --git a/docs/internals-ja/core-code-style.md b/docs/internals-ja/core-code-style.md index e956878..70ffe74 100644 --- a/docs/internals-ja/core-code-style.md +++ b/docs/internals-ja/core-code-style.md @@ -1,5 +1,5 @@ -Yii2 コアフレームワークのコードスタイル -======================================= +Yii2 コアフレームワークコードスタイル +===================================== 下記のコードスタイルが Yii 2.x コアと公式エクステンションの開発に用いられています。 コアに対してコードをプルリクエストをしたいときは、これを使用することを考慮してください。 diff --git a/docs/internals-ja/exception_hierarchy.png b/docs/internals-ja/exception_hierarchy.png new file mode 100644 index 0000000000000000000000000000000000000000..2c43e03793b16102385a46f1d00d84ab67da9f2a GIT binary patch literal 64306 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
-Ddu)d)iG-k-_Sh~}AqlIq10092mPhzU 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 C1i6*~ literal 0 HcmV?d00001 diff --git a/docs/internals-ja/git-workflow.md b/docs/internals-ja/git-workflow.md index 3df9f1e..910b60d 100644 --- a/docs/internals-ja/git-workflow.md +++ b/docs/internals-ja/git-workflow.md @@ -27,7 +27,7 @@ Yii をクローンしたディレクトリ、通常は "yii2" に入って、 git remote add upstream git://github.com/yiisoft/yii2.git ``` -### 3. テスト環境を準備する +### 3. テスト環境を準備する Info: コマンドを `--dryRun` オプションを付けて実行すると、どのようになるかを見ることが出来ます。 +> このオプションを使うと、変更は何もなされず、どんなコミットやタグも生成されたり、プッシュされたりしません。 + +### 必要条件 + +リリースコマンドは、[Git ワークフローのドキュメント](git-workflow.md#extensions) で紹介されている開発環境に依存しています。 +すなわち、アプリケーションテンプレートは `/apps/` の下に配置されていなければならず、 +エクステンションは `/extensions/` の下に配置されていなければなりません。 +`dev/app` コマンドを使うと、この構成がデフォルトで作成されます。 + +### バージョンの概要 + +フレームワークとエクステンションのバージョンについて概要を把握したいときは、以下を実行することが出来ます。 + + ./build/build release/info + +全てのレポジトリのタグを取得するために `--update` を指定して実行し、最新の情報を取得することも出来ます。 + +### リリースを作成する + +フレームワークのリリースの作成では、下記のコマンドの実行します (アプリケーションは常にフレームワークと一緒にリリースされます)。 + + ./build release framework + ./build release app-basic + ./build release app-advanced + +エクステンションのリリースの作成では、実行するコマンドは一つだけです (例えば、redis なら) + + ./build release redis + +リリースコマンドは、デフォルトでは、現在チェックアウトされているブランチを元に新しいマイナーバージョンをリリースします。 +デフォルトと異なるバージョンをリリースするためには、`--version` オプションを使ってバージョンを指定する必要があります。例えば、 +`--version=2.1.0`, or `--version=2.1.0-beta`. + + +#### 新しいメジャーバージョン、例えば 2.1.0 をリリースする + +新しいメジャーバージョンのリリースは、[バージョン規約](versions.md) で説明されているように、ブランチの変更を伴います。 +以下は、`master` から派生した `2.1` ブランチ上で開発されている `2.1.0` バージョンをリリースする例を示すものです。 +リリース前においては `master` は `2.0.x` の諸バージョンを含んでいます。 + +- `master` から新しいブランチ `2.0` を作成する +- composer.json がこのブランチに対するブランチエイリアスを含まないようにする +- 必要な変更を `master` から `2.1` にマージする +- `master` が `2.1` の最新のコミットを指すようにする +- composer.json のマスターに対するブランチエイリアスを `2.1.x-dev` とする +- `2.1` ブランチを削除する + +`master` をチェックアウトし、`--version=2.1.0` オプションを付けて、リリースコマンドを実行する。 diff --git a/docs/internals-ja/schema-builder-patterns.xlsx b/docs/internals-ja/schema-builder-patterns.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..32bf142e594f9cb225112317bd0af7ef7d09331d GIT binary patch literal 31048 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

2P>6EKB4xWI=C0a1)&zb;<4?~5S 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 {Y|7*=TF5mdZ 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�N_W-HjTuw^hN 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%0A{)P8s0C z!^3YMKRmv9)Ye#5`g*;&p$JDJ;B#dq%zJGDh@|-p$sz&ttqniFoWDjXRF})ndzFY# z2}Zrdh>;;!H*TepDLgZ?NgVnC0Sh!U1Nzn(P6Wd}?|(>@8%TSv%mM*v+(gO5oD zqUYyN{a~$|c8DfV!4Or4f^hi;%+$bIKtCOrFur=wL>KRkFJE8ga8ZMWD(TwjSa=f^ z=~j9Z$$4F?0W4xh|K|HY{2?MDs;RGh1q6TvaU@pbq9#=A2DSaRSwU*?0J=*4?)^7k zzC62!R?x4Pa)XpByiv(;fY=V3pw_j=&J3hA8y;ggjmNw0+-1TUGb(2w<(*V@GuJ?a z+U}lSE|cU4xiEya<`Jj+`}f~{pNi%y^(6y~-$kR}5kWc3L0pMvt7}r3+u<-7|Ia`F z%j@OrK=@Qb$ZUjFH4@XSMLNNEtT&Y=Z|S@;w$c!MdHy=)I3B7xu%cgr9*I_C&cQ0I zBa^>O`AE*`)3Z=UKq~NGfB9vZjVWv<%--NGT%nWJqf^r_C{Is8JpyJy^N82;`7eL@ z4@P2!iiZezZf%Y#WRav#N5H3$N5Qdj)X3Z?HSr$t^z?R4A0tvBmM>5rCad?n79}Z|Of3H%;WN8DL45c9_irDc z=4Gt5AWiYA%3dN(5dW=hw=+GcZYH#1sxi(FO`048)Ap+)|)E9ZVpiHO~3^=H1hb z8HUJSTdYc{Dji~a^=-3N8u?oFX@W!gcw;E9bN9pXc=i9w3Cn^iCS*WGDp1nnD8bMc z@QUa9?aTSR_15|ZAgPMPA$8p{=gePoI$4xzdF^C1lB5^PLij#4$ORS4^MO6XS0txd z^=y!ot|=oeJR?ldtc^KId;9ji<@;(1 zu%Cdm?Jqll%j?;4S^|6~#G7eD95c*X3Dul8Bht!?lj^v?dL^=!BmK~(7qS{s@uvTZiJ}oD9glE?ff;xe~^x6<#BiO>zisS;C$;ef9Ob7P( z^r$l=*$h6Wh`Xgc2`MA54o!F~5aDykr$~+s1Q^!Z`8?jffA{p}F?pt$T(WC^m7#_p zNX{!96U%{Wlz|sVSg|-(F4kuG@{I8)nkSNUN=ty^lZG%8WE@WR zU;oell-}gZ{gfV2WqK|m204kUbr2Ph{{O$o>EC?&cH2_0E1N8+4AUzqNp69M#N;x> z)02pJuzPw0PHC;8mOl3sh1_yBW|8Zw`G>PHR8K@>G4RIn0ddQD66pb% zzSTJeWJd~d}zQiHsdT6jtS5h$Dn=;Z=8kTlkr%P`%o^)WqwF5p-4YDA;7HGO9?+yigHBHKwM=%Vol&Dd6d>uJsuh>2o%t#2EU~$y(P@M9^BVZ;`&<-P_jh z?(XCk3P;uVqJVpX)deIX_4GN{G^$ZEvNs@n`orDB&p-XVNZSA+TdSGOLW-l({F+&$ zy6Vd2Sfg@3(nR*dFvexuT6)~|!~v2j$B~?wuZvc$iB*-YG)>eZB3#WcKK<+0FZoBm ze*L(=p2xUYy^M9WWJ7^a<5QLUtM;8qo)-v&5NkxtIk&AHwnj{l)+|CJJ`kS$4c$yw zKaDOg1T?#9j@=jt@6AYz7Z6(8O^>Qt9G*-D@gHP4fU!I*>w^sPS87;mJ_2 z=yo$B&3$%L*PpzPTatX0Hi@D(D2K}q-C(nZP_vr;mT4Hs<+4w=m**FvCM)F)EWBGc zR^8$z#Yi|~UQ038${GQBqFR_K5Qv?3x`RlL0ee_xR*22P}4^)nn ze)C|xZoFpxXeRYuiKFu8Ta25hmhdK|aD@fCggU}jp{hxR2Qle5+$_ij!#?}v-PE+3^|CD4M38qQGeI{X( zACu~E8Geyr9~?$RJd(K0TeK{O?+pskFxv12gdFKmPIM>vJPua3Zo3D!JcC79!O(FqJKr4d{#m zfRS^IEa5w!o}RXC^C}!8^Ee=ZW~h<5RW6G4y>0!k>?V&KtIz2%c7M2k=&eonIU`^& ziz}}dkhIc_a@E52icp#)3A4x#EXo$zhjr*%Pw^hYha$*I7(6^JP*q}Gxl+JlqC8dJ zmi(rU;oi6HGJQD^DX);>AYE_9Y05VCF`>HXObRq|zd?P~w89(;l4yV#nhhnF zSK@AT#NFu>kYhwT(sGb2&8hg*N_$s|vd*@GiKi4NJbcD4KmVM`Kq$>f&$C228AGZs zKTk9Byp+SGwL}q8fKUJSyYI-#{;t1Dx3XTUo^YKF5YiyirnI=>aHaNikH^Qy)|#6B z7(giXlGBR7n%Xt%k#4|wseh3WP6-Rf*biI(@yDO{;bY2Iqx{c}$B?ktH11i+Kn*&T zW})mZJamlKY#$c@udnCKu;SVurvDfcUY4*z7aWDq@>x@h=nA!-$^T>F?CS3Tr;9|+ z6BUf~Igzw=-TieA?nncOt=r+)wJ*;=#K8Hy8>(j%fHj5tNL?urSjV9s%!MwMi;-rl zEg@8)JD%>x2qI&QHr2_XuAEI-rPT)t0s<7bIz8ra!Xmu4?jG;ne{=u%c-b$#wUsAj z3ho(AYN%&j@qE3}s=izQQiZCJW(ElN`TYD+Oj3fq$~Dty%$TfhOoS72>0!idMF@>K z!Wj`B=hx@M@i?Z}y{#B5zo5vG!<&FW?`=_K?(Wlhbz3aQ7cVa_Z=RlRd|;wLX<#G- zWKCaD&TS%`+%+15Spy!NEoEBw#t zmeS>f4Regv?RY%M9zz^w1%@P(!sTLoP78;ZZdhN>Q^&<*=B$|kp}FsJYAUklDG@Y` zedw4Yk)#Nls2U3jg+*$^K%b*^o6}EscYWJjq`xw&9Fc~SvIu(xNohSRlEliabNE|z zGLUH2nl)?8=>p3QAqSF_Rb#rt6P|~U6u2(d2p}pmB&K7A-#Z}0Q zaY(dXShqY|oq-nuP1r=zfVjIqJv`j|OclOvN=*&Yw^+qxowg{4K>2Az7((r*`3a;0 zAAbIITqZPzb)vcY9B;bou81PDmk4oM2~Z;USfRBxrxP604~JuK?I6B6pHiPkT0<=K z6YDuq+z^WPs+S_cLo_m`pTAt@2oq}~O z<@~yj!JHUj3Twc1tUT&_WS7xO=iJc)nGV&(546^4@%8K1!?rb6tDC08=8<|P8z9`< z5|-utbae^nN2vHL|F6RDoLvx$lHfwBAfykBhz1=9)9J!Pvzjb34t z;IAT`#>+NsS}+5!kG-|t`?e-n0@=${fUm4CuR@G5xsWG80og>s2^9<&bAI{!Ma5yC zdt{lnloiX2S%^_r7gSTVHF_*vA5i&^ku)5ShdG197?TMku3oOpEuX4D|H>%x)h#6y zgtLKv{pWv{&OYXq7}oRV9a%}j)%BsUTgDAk>lvY;(fIoOJoa71y*fzDF|%-sh)9>E z-;yjRU8&et#KI~nhMO6T-+%vyIcH|m0VL0xfj}$Il=ey4&r-%-_s3K`5*^CMa6cXI zzWwIAmNVAYH@7I?(t4L7H?K2qUS^$+oU6eIOS`0@Vlhd!IRSj_I`{my;!H7T(O} zWtVW(Mafi-6=3Tvp%yHH(|zA}AnqUT#G)+apTk>gu$KMxd2I`yMfKpa)Ml(ASpvAy%(9b4SefGZ zb8vVL5PbLkyWX~aA6@OsTCvtzFwATYFHKSaYl{k${RbJ;7&w+ulQm3zzwG+P)2ED9 zlf@a1&~j7mm-FJeqojMX7Un!(gIR0l;TlpgeePMSXUTwpBgbHmrg(VP}ft$rQ#UhJZ@<7DtaJ;;ptx6!*mXAsq zBC6yGq$edkX4Z>5g2-vUddo%x{{HX(KK6avw(`OtVhp#!T$Q3~3J`tV42Q152!IkX z#8k&T`0(aU-}*jWWk*Ibr%@&05*Pds9}PjB6r8OrLJB5UHoRW=O( z=shP1-b5?La;KS!a|RsIwrx$&Lmj1DoGr|=4nHStR2r77P{lE`l>P?BK70;MLtF4E z(?F)ntyfvc!fOP{fM{T~t$R#`$n)iLcXvOu9!mo5`XvCOa3sDDnyZLF;*6ZKJac$C z1j6R@Ib%B>pWeJFgV%p0ua-|-2AY!)G|xYul{BImkW*h;vw&-d;MbRzIj1fb>KP-; zxeVnbDWYPfeuV+BlCwNMpOZ%RcD%bcbX7vgibNToGH~jfGz~>nh@o3+&?FhAbXeU) z0uZgYZQEMaQc&GrGWfi#S1_Z|V|iXe@HcNV?<$+Q$M@fT_x0;ntHxF?AYHL0{eX#j z3yo~LTCE;QO$!Q4rK>b+epSVZw!4AUSu8~5s;ss}q9S;dN2%8z+o4bQckkcJzk1T5 zY|SKzM5T#Jh}L&mLfHi6nm?Q}gRGOkdGqG}?!NF2B7&_&dciz_?A%Li9@!$t%7Jx; z;ms_SoWS&WJ-;~S6;Y}>ZA9U!y6b7T5j zABOK4;L4BHg)OVAAXpdX>VxtnS_FaypP|O6-n(`j-2z^1=0ad~_^(?+t2hN9BoSkZ zeQ%z`J+_WHF51cHh(bLPbJWeQbT6(oy{H6&OED9bv;by&d4B!!=_>-7Zmd+FmE-Bt zvMQ2*^Xl`~Ngy4pbcngF`R{-Karc?NG$JBbJO!=Ep7Z0iIE4(P3MPE%Cvo#dbcXN0 z`3FnEN#j1U|0b?*FlpV$a6{L$p>QyJy4|C-9*EQNR8<42X4zUBhSRBUy=6aIttV8| z70i$#yfD*(%p`}*vihui)Tie<3^U8lS{}DUvu0$Y$!*LrjBL&3n21n6eFV_B?svXH zGNH34XUhl%thKLSpR+Wx5+Ve==G{ilOeJ#YXOv&_3^?$b3}f1EO^)eo_TBg2O6xc- zyUZezvSI`!$^{V~)><-ViWXQ;Zx!Q#&;%>|`r$+CePzxopOl@on}Nqy3jhO{5mWS3 zdH<3oh4uDwKL7g5uQOZ+g+McFw8%Q)Ip3J^}6fc)KhzY%Q}a8S-~c}QmA_3uCaxE&9nnOni@W5Ti%fiNh z4?IH24jM%ny}UecTi0VIxUV!R@j6n1lI07KwZBG$nI2lSuE5sV?AH&!u1RfK_AkZJ zElG15IieCa z$zw9d!!i_1P&*!cQnW*dz$!ag;osyVBaO)HEgxyO; zBFJkXhx_a0yhj$4s+C0+wX)J6J*TN6Df0r)TIwvuhO-K%Brf}I*7nsex%%d>FKL-d z@`!0x8KG0MCyFXr5fbE&KmORZEwwZ^UsX+2HKKRD(|WDN_5qkv;sf5?Xf)XW{Fi^- z&%3Anr986S%kR?%UoyP}w!aIK%UP&2!FYP}X3iON8e#7GZjBbDsmr<O5?V!-R?mlOnwz~tjIcB6VwbBE{xCqt95~5t~B>*&Q`7>^e z6F_)0+Pin}NA20HXgJB5W+wgKVzujS7ThmT0i|lxf9lCq&dEMBF++>n&9uvq&Z+W~ zh$~4U1eyU9W;yp}j!WyE`RdC*=w4``bg@pJ_%dxZTYf7K46JaLdsyWw_L19I^#zk8 zy$NDQjyW?{A%UA{5$VU7DR72^FVA0&$L^7u(99-uw{B%=H~0JYLM%U!_d~(F*$DsB zpZ?Tp%#qjq)wh>3@}WgfYRs#Hy%rPJ57&FqH{$e*vM) zZqbZBryv&z&qYp}XW$8NNDysAKWt{SwgxMuHdpbExH@QY{~}I2)SqrjgRH>joW2hy z+w04VnV*iwIi1GgGqSNS=JaioAcv`b1RXKm1%;7#+I8ofroa%baeCaH?p|MCeTdpCdCA&t-=QTq!*0r(#t=T@t=g(hXU(VF*3tEsf-(>*awBk)uQ`{}F zyQ;VPaQxf9{recwbu6+BujlialYt1AV8hHDmGr}lOAZm&y5|Vb5w?-OHE(AX2O9au zKm9O#B9-mltTCchn}IVIErk|3rZiulm;!MUrd@^}0J@pa=w_|icIa7xWs`MgO(+5y zLfRXNIR_APSC5wGCS$;hP$EdnU%(%M&GD{&-DKWqLqLI6<@h1z>I+m5T-#8l{K5ibe05CpQj5C zfH`wFVUv3be!^pVT-|eiH1F>3TkBM3b3R7!rjUtB?UIN}6j;|@H!+rH%INs?_TA}p zDr}=v{K|jll_+sV1Tw`)u1x{%9% ziYAc#b>)V7m&+6;4?8h8hRS%VkfDsP7ul zTC>)+o~n&-pELK`svc!lJhzLB)}r+IdU`*DQ5LIkB|HL ztUs!m0rF%TDYRBK$q~tv%?v5HlWkD9Rc&tSW;<+$^W}0p9>jlD3cFrn9z*4IEX!Gb zA+wRF1_@nE1|IJpqQvwIJcCr@SwV@!gas_GEC5%*8Mysw!MJ<8znKSMN_!+nk@sK~ z!SoZZxktUXxMD*fa^ViimzS5;b0W2Z5oyk_#s%ur2zUd1YAX5FrIiEIxjnu8W@%PyKPvIqzN&&j=nyYYXU1_=3 z-ASjYwa&qqF;Bg(odA8iPTxxOErUItPRL=$`OvMmfagVy z>ZGVN0~$TY5V^CYo_Y&4AR-VrzrF-Yjt>A9!D#QfE;p);6ss$z6`J?pEbD`53S zAPdxsxf7ZW=0ZLF&@wjpG-#J?0AIg;wANZ6dOMEGZr8J}V4;w^7LpN230kAsR4%Bz zJZ1j6Fr+M={L5ed(hi&2XRjYC`yzw3&xvLep=?+gQli*WAe!h>Lu>glwt{Kijz}njMm94k#RXb*SKZxxB3~9d?RY$#j>p!TXB(KUEYe80oY_i@z`j*D zN{jRenz_#i7x*J6@o4YebH$bCI7k$3V!AB~XhP%9uKHa9TVH*dQH~XF-n=1eU|Ah~ z8FGT@w109;wnu7)7?z^?^<@}m65W}hYzs)pm43eUXy3s<5%=d&W3_xqOT_Gv7An^9_ z&GYN)7(+2_%v|T@6#^3#SdQn*pqUY8)}@q8A}pK9aejSm?B~m#_ETuILZSR{np@1e zIBO7LHiuyhjdfC-c0-u;-nKbc!-^Q5SsGNL|&oB zM538BqtCrJGJBeVz#2YHNwAy?$47x0CC-Ii5?E+}#+(Cy*>-<-C!47q*jA1{s@Rio zBz<4jjuL|>ixbKgEnwEniO2glm-EcISdn9hDgj`XVlr=C30_jLo{oD+o1~ud2tRMl)DWhjaOuwWchTJ3Gz5V|38nxfO?rBj8 zsDPKk{ScKzcQ;T&<;o>WKc3`KGrL^QW}0r!Yvz)!s}`I^@|UWpM8LCxMF{H`1R>eG zDQh|%4pk*?EBe$4R16nG1dzFDNT(wPN)wilISl3qkTcv`b?^rZdNHyDl;^B`J~>%{ zDWzNVgx-ox52zgieEa^JySuyT^O|X=8Ec|lsZ8r2ueyWucwSB-^{z|FRCu0G?wdmQ^LA@dx@khDoIsx zV(BEWMa%S+sDy)*yT9^Z%T*Kg=Mt9#P_{hXpWZ#SZj~Zsd7;=39SBkN3LUwMK`gN! z0E8Y)_f@KyW@D-)*|*~XmWmqvU!)Pp1!($E=1JLpdcC@VoAwU<2=^Fce);m{`RjA6 zX%V`m1OT6tkrUHpt#hRFNm45~_PO}T#27KV@yq8==hs)Gg(If-Z38iKd6kKmP_mmq zPIahK5Gn0LL~ote7D`Z$LT{Q}2@)k&h`346SG3Mut)!NPvLNdyr_rp>ead-7coj^<7Y- zMbkrvDskc9Weg8&hr?xzIg-}Xw1LWNi)GRXbNN0q_Zn{yo(+sS5h%cnJzt-{-rwK# zLsvX*dF{z07Inij#v|c@hey;h=d4t^7oH=G*8B1F=z(P_m6{V^)YMdzY_xnwqGSdc z284BOPOB8(`S$JG-uv;;=hPN3WEWQ!Iineu{byN1e_gI$nNk3(!bP^)%%`WPk#pPx z`D+-I{zt{st1tjHj3UZ~R1aR+UjUe68V@70kf2#l@zM;CYFw^5MyBJSMzbSBPT``m z99^Z>o7S1-ms;^DX1aYVcgk4llKqbIj64~HBB-L&^ViqN2#X?2gL0Q@D=zjW^QIeK zLm-7&WYOrlTw{56>b{@Vp%ofDO6Hhwy$4dmf1`q5X_uIauVkdMBA0%u+39#3W32d4 z9t;rLFnZDop;AezuOQyh-Ry;cp*sFPPjt^lgz)^Opdq?(1Z zxQbl~x!igS#Pjp>WgnX+aF^nI8D8f2m5q3;i=1PBic9hv#1rcK`t6rr;yQF5m54J- z%JtP&fRh$ixn_dAb+(Bs0N~v>Z}$Bh`5{6qiQhy`ML_KYD!(IX9Y(pz9KZk)^cnj; zBlvp0wARl11-hT9iLL2*tbDVgYScO8t*q#;KDQcxiy$8#-}K(|XOqHS?pHQBs*>VS zV|MkZMyxf!brgB)o00hK*N@FwWKL*{)=s9wu$b=*la-lemPP=a8ph&I?NKp1@0YuW z$MfsCx+C>-^JCQF?BR1v-oRS1AsJRzjW63pFx(w{IX?#{s48SS#&qkE*Wa22H1m<3 z-51vZ+;fbmoR-M#<_x@jbKi5?pJ_$~+f7iA#YW26tC+c*+N|h=)vu+i|K-aUND5we zJjsZazSceTt9-72V$$~M2E(rxskipGzy2*EL8;b_`xOL|wTq_IXh~QogEkVLlY`SW zyA#oj=a(1DDd3#$JM&r*2={3)_wX@$@4`B2T+E3fO2tGJ6-<%%TOG#M%o;!c_A%U# z+tKGt?lZHR+|{D76G}rggD;21tV=_w9>ZG83r`%6$IIn%x$Nm;00O7udgrrzH2%!r4~j&d*`jG>sdHBXG_%-0-s{MbDjbs*i3Dd!KiuElt=W0h16*gJWPs1SFZThloTy@O^9n2ZlDL2UsVlFfMN z-7lAB^Xc(XXvWoSq+HOwu=M&%Qk%tE!En7upljhkXjvLwUtZ3a%W@}Rj?#)kQ47ML zkQWeU*G}jPJDCcK?W3`6mUEv;QY|dkYn&e`ja{Ox6tb6}3$H;cy!o$)FygY0#a9)L zl#l5uW#(AJDD+W)rWj>qLVD=wVZ99>$E~C^ORE#*lmuX}2T3dxQ2*|Rg;^I7uP-l$ zemcLrT0!6}b6dZD-jzDnfk*4NAC>vaGIEl+F$6`D5MC*wRQM9yRtlNCR#axI3Tz&k zS9$gmmHs)ng zhVOoO|M>2~R1G1NE_#u=?q0oFbtY;HlLyY~M->eNIasKm7z? zAAWNU7*Kn>wwQ;p*tIO!I2jg@0*qXv>+^@tz&@vkZ@ni8SdR(hx~0mGlMYzYP`zd& zBYaLbQvo>;VZ8zI>ElPe;4$Z_U`vO6g&W!mWsN1XWPa_)(<&c@h&j9&!{VnO|2FoE z0$K6@0wqq@oQ}wQ$Wkki(2Vl{ruaAJ^#WK$>4%5M{q@|8snkiI8i6ot@^eUvM9?JE zB&I{kiLMboz4bP;d4|9K`m2zGBFprdLwq7Ae!wikuk|ae5kN4bPp>*mCIVSkoTt+%wOQi$<_rYI zxDn>zO=97Y8rJ5-l3+rnmM#DhljIy;Ej$V79-bZ}VvNyRXEiRYl-&a{Bc^9I7s&lP z0gssz`G+IC^(K5ESaUd>o}S+5G4%f6?v9vBVsaeeEemyXSmCI@6?(PPXdXVN|NP4@ zu&z<%npB$I>pFhkvTj*^ErFUclbS+$GnWtyv;IH-`t#Cb)YLq2OLBS%F(U~9dbzzw zkCZkw_T3m}m}3AKb8N?>mm*%cGYb(b2nM=}l7LUGT0l4J&9-Kn(dVr1#>-_o(9Ax6 z{P^YbXAMSGv#DUNg3{D0Ea@IRb8eyc$i7VJ|DfO{Y4z*n@_IS9`i%vkSalDdBjzN0 zX?pb&GNvfER$fV)b9zK;-3dwST6Hyv>PRvmo3Sc+i8`re7`$H8LVt>j0gn$q{xmMT zyloU^!5ihnqBHckwg_*e6KF-J719V2zkT}k_55-T77@aIsPW%LS?T-Rx;e<^OPSdc zpG3ges;EUm>m(Irlgp~=b78M+zRbID8~0-c@iKk1-e_?+9^oab&74jl=gP|IY1Zs} z(Ynb)WIhbiJTN^*;B-1&E*CSwZJ62Z4f-o1VQ{{6TNr2NC{Ca0k?l^a5?K+s(~ z8DgbXt#^3N?FInY82?fR#$)T=o1aEQxInqKsb_#j65Fw$vl$)K7aXamKaEP zH!q70trA)fL^fuD4KN@gYb41C3WtFJ9d!Kg{SW&~ZH5X4IG5ZF>lS20T(2^fLY^7q z^$H*%-Sqk0ci&iLMPL*ySi!aao=!nOQ+-f|)j5?wQa?I?*4sDVeSf}O(yJ!53!aWA)O3q$N~TG#r7c3i3Tv$t;mp0B z8X6v;)|66J2v}=0Yui?BlnY^7)PhNC7Swnp&%PGTmZgD9Rd1+3tasmdxLhXSCMGCC z)mEd;rDS7`Y|2@~@_ZuPSSOUc2qVJd{PObf@NhV6i<3>pJqt6LiMdDB88SFY!sJCA zuD7H1Eh3uP7$c7;A_&vJS$CoI*3|0Rib~9+RT#sf62$<*V~79p_g{Yd^hKH!B6{!n zacU{vM>!3<@f$49fr`rkgeCv!h-kqtpT7wISmt4wVB|ALnl)B%zzQKzh={RBs5+=- z{prm+WLj9sNMd$}x(JG~st-@`mF3VMDF8U#t<>6P_VxL*H49+Ok;T%Av<1XLv=t*POldG$aFacx&zM{?vP`EFvSu)hGY16p1R|$gK3uWVb7BC%|~PyYuPcm|C=q zu>3>$r!xnpUE2$)0$_IY6EmL#1I-$unZW4t^Yi(<>#JVd!q#`lq3=#gilY@3Db9(c zWX)3=2#}Y3m+$!Xr(e?jC=m&*$kG5~gu6sbUrI|ak1cq&hEC;u%QQTR4W;sW zDK7SuDXp8qAnqSd=luesOGlVw%FKfXHF;|75z_diK=C8V|Dr|#p!ddz%j;|7nw*dn z;QI6Hfit`qNlxkD(@33$W`s`-r`I07IW(_hZtXh21%#Q+F+C^5B|3Hln@ThQq8U}? zK={}%R|5q|UiPuS!bgGQinnpoUc;1D=fOsxwN@7{%%HAtQY=f3?SKExH?Oa+8R+B{ zqUy2wDAP(*Pirg;1j$n6XvjIW=Gad=y?v-%8@M#Og%^5EKQl)I?vA+ zvXkZ60?lmS_k4$XPbuF9Xw(ovk4uK3F0{`U93|Mv0u{QBCOMT&YW2`g*~zyqyq zK6Btry#{Dem!7p-Fm-RAT;{KJP|9_~-Qt<~UG32YSpt3g$| z(NO<>uRO_dS1$U)phlHYmKZ38vy2T zmOL|gc)k8886neHJ?d1I$F9>3-(Sb$4`~~>sI_vDn);bXGaX4^4e-+|}qxYsX1?s-dY0hAV zzi7SHYr7GQ0mYSK`TCEaKGyH3&oUCJBS=o4sHqjV@S3gV`KPcdk1-_LCP6lpZqmpI zu(iHUZ>FjzT|sr5V2zo-@fZQ-7>o`4;~)Q+F{7R}b5mFZwr#6|sTR+9&I-$tY|3WK zs<{w5jmL*OwK8Y!o>7Rm$X*brN{_2{I;+_h6#J`#1&~rOO`p@}>F&O_Hm7TId0p!qe5r%+M8nxFBjXeSKTC9%=SXOOni)TS z{Iu^`NKH_oC#Yn#{$F!-)AJ|U6s~osvEC$!2s8Wk`|q{0x!%PJYKsYzzfk9NxI^7s z3Z60L;NTI9#}6RrHuf1FKm6%W-@JW)zU%?4Xstt`X~JMB=TM|g$+?WsE0>z zoWGPv*fpF!2?h`zsnAHoN><`nM+8(!cO`r0^FAXS;qHBFV34L}1CpxHDsRu}Vp?at zSTX2=N+6!KJ-Knon(vRNZU-OdJgtmyp`BmL@n;>E%T)o_-z#>i+KNbqBQOyooxCVO zqHldkLP10-#uNJS`muV6`iXgXLO5@p-dxU~pC0blG^9FTCHCn%vqh{`f`sc&xV9-v zDMc6W6<0UmvwuLK`Po7NS!rLqzcn&>xNvY55i;{6p#X95`%;3cu)mOWzsNODDxx zmobRs@&!Y({};;ARqIcm|Mc{zU7UB)x0n4Tn$k^+Ag=2^G8)CoHdcO^AV_>l zpw78|3ju6ffBWv+)(*?P%6VpLL0g~5UKbqMqje32RfQuVrTEr6BD6&gNE;=YL)HBE zhoA&Z9!FiLk&2Y`$(r;fvj-x0clVGpDPsYm{U`gdn> zbJSdc#JxrT11)8}awzlu?vQvn$C%{Wf$POhfV!GWOTa6W2CsBsiI6?w>*p^k)TN1{ zm`z~afi#1~>5yh^O;>BJAsPJuas>s=_Wi;X|3^C1gf}4FR$;3OCK79hA+VwrZH+M^ z_vrvGm%SNNzO_d7)Ln?YmCG%KHR{=B1TD))k-87WoMzVhb~+tFlsdmUrv5*!-mJ;8 zbP1poYEKlzamutL7Oy1?ya!~P#vd9fiI`1$5oNhIN0(*pn!LTa@W6hX=(F#%!KgkERV zrvsj{l?c%<&J@9~t#5+B9D;sr(4;k{0ZcEa99Hw9?*^D@+4?g~Fb1D9uF1nGwn<-; zP5t^V+GHJk$e=bIpH$RU!W=^3>^M!XEUYsKqBK4|5qd&3Bdd+!%-U?4^x%a#sh1*J z=aT6|EXo=|j!)0e&zF7}5YrIGL^F69^Qq?-5lzlpX>^-Ta}w$SPRhO_gk%hU`tlKg zlP%2p6vU zDb6lX)I|wcYms2P+mS(=`N29aYLoQpzntdISa#0qt~0#JVVBNKj9y zXqYc2=<2Cdi-ysOV=CXQeLiHmiv)i0h)@*OvUp<)b)1sIiqr$41!cYLiiVOqz!&9m zc=?k782|`O%Uo1N$S5kUl?DN+8UT=52_+wI1tKZQoXw!b7$_%W>ZWct4H?RSUh?)} zh&q@IbVddtz#7-A%lZvE)^%ZE)lR*;-}hsmF{|X8CHZHQp0s4EpVvcK9FSa0wx8(? z5i;=pW>1L+2b`Zkk`5!RP9>eEgt{_nRzdw#QouEWMS=6_5Eq%J*%?f;pVQ&eYQ7R6 zCHDiYBdg(M@v||?{tW>kL>c>ml4uocnoz%+CDXd{v*=f?VKuIWiq)okQ`cVRc^F2m zs!4JjDiE2^QFfx3-aRM6K_HEHV0_6o3Z|Y^d3t(G>R7z)mx57RZ7Aj;>&jd}K+zG! zphhztm5_xg)ZQJBCugmC>ZCnDYu4bKTb0k5;u6eXs^JSWQ|2UyDol|r3TLcgkr1Q) z&5NRF&QEEWowLJfRRB?eV)T(fN9Uyc0uo;O(`MJ;3hy*6WKxKTn9&eumMYggP$bQg zO5z~N0TZc;1AvgBvMkpmodye(WdL-|@&^NEdXHvsbd^Q4Fbari03{)|?Z%K1oi&CT z#c~AHG(>XCT7b&sh4le)gqTbn#u)XeNAI7$KI#CTe78hJ*Cg376wav+J*^6-G78kU z*Ux>yxCmuc6=f+2iDSA=khGOS#Haz%PPP=tWiX@dUTaVyDIO4EA^7FjUsYmYMGLa7 zTQUvl>gh2^;8h(=>h@N@kf0%C;l-w^6|4M>3nS3nM}kh8g9OZqCOTCKRJMdj68m|T zry#J_HBDo|NO&QMgRJfbU?nNwH`}H-Fr=;w$b<+1U`eq|X`L~YHdNIOK~;&8;O5$f zE~)03%SR|$i3QFbS&(uu2oPgv+BSxeDUPexN`^80icmtr>9C|QW`#@N{1OPFF=WYz zfHfqm2!ujWeWe^=Kw4*sA*N1@{GD2J;ut|d^Q}m@c%P0Sn!?r<=gJ=_%T1J|nP5g% zeqEz8NDfRFmnHXRCHsih1Z0Fb&69p|I`Nvt$zem}$P8qONS{x`16jehW+D|hvL0bV z5jmbt%nS%o7z7h+2gJlU&!YNC2S&7>K)JbIO{`WlAibafaMN^%)DL6!MrlQWMO$%n zUomIhGCd|G7BnbQe15w zbJw+$&N^U5WqPETQ-k!nX?ntp(b4mo5*5w75#k(z2o%QZ!yuyfQIDi5S4v_qXL-~0 zVx}A)Sd-x!t4c>+c5OKqtg5QnmAlcsLt${W#Xn1Qo$i>*_B1771cEC6SJ}NK4_`h`=xNrr;nf4xLKPAUh+*D z(Pf+PH`#|Z3#%px^;AY3!lD6Us%VgT*&s>2O7h-ew$8X-b;Sb;^pXz_bi0i?@l!@118**|GdEHQv{8OUlPUo5-naE!Ce-doWEodT=NWl89F^jNZK8=_o zlhrKcS7YJVZ(e6ajO*dgcWssI$Q>6sQA~M&bH=@(o>c{`G@TZFJRDD$6Vi~us8vY; z;k=+pm^}NzbSyQHO~JNElEP$|rg^j7=J`SjOIP*MWFyz)!s@K@Gp;{_!a~OA8C82S z^n-qV_R1*~)ZVys>#`ZlA&sE^6SD}bmrZ?^pvhVohaoI+oF?YX?-l?Qm7QKGF)Q9o z^>IKEBtnTykjgUoZvX_)!u2xxfYzpJY6|^TIUsFJ{<<|lQ~JMtezJFZ){_4Kk)r6F zYhwOugtZ9-;N@3@Fq2pzQ7^RNZ*AsF8!jl!1R^XC_pdmrL&LR|aE;z_1!WB+fWp98Pcx&*B#$dBaSab%%z3^Pn8JPpOlB6LEUOqK`iNPT zpVq)=S|!5|P3g47y;>zp3|G6^PYaEKrVlCrt8#tKtkGxC`bxEIgQm!AzOl8FUIMc z`z^VMCISLCw>K*JKxoz&7t*u=dAYhG8l)vof0X=6Y0*?3+E{}isYlj_2m<4L4bxyK zvF$JipDfJ4fN9oo68TK!f|MT>wF0Q>?+RKpl}Yn3cin#FY$$$ZKp@fqrHS87NjE@a z#HfR501$yW>d6P;WgS~eU!N~- zhC%t$S2T)wEQ=&~UAoGkY6!kSK)rO3^lfseo$M6FMVN* zE>FrxBXLT`kqQT~qyg!ip+6D%7?DhNm+I$}#dps6iHBjd)+A_>956(YbzXX2+iXalu_U1687(2E)!WVC~1Y-BJ-)5#kC z=aLE%uL*$!cZ5JzUR;dQc3bNTW$lPCS%YLCb03q9K}k^`sm&Ey4|5*5r3Wx2qyXEl ztGh1703tSZj38i^lXs;Z;Fx^9pUYR+T*t<8l@7KfKoICDy;0YHrG3j68f z$9bH+4@$>{gsk&dq(dv;2qUMnM!9brVGT(HQa+iTGl%QBDhm+-HBiYQq-20HVpG;2 z@j*c`6(+}@cR`;lRbXVd+gGLAZZ?9MlK>*D8Bip$vStDhIHnCvDSt^MA4mx+)U>4t zTfjGO-YoO<0?F5V@l7HN(zQTcD6O`omXq8M18J$#E1xdUWnJoT3al6yQmPfx>!!>x z3r8kne27RY$(5=)F{$?`ltMu1`-^6aa&z^%U@xXTry^fascuDN&iDHpM1p7x`H+MI zSUZ=D8eZLnMD10ht=x=^yO6Vlo&W%lh!(>oYkWvqRwCkDv09#QCu_zH*k!oMAOc4EF9_5}EL_ip0h#+7Lg0?mZ6h*NDi+pD>Z8}1jmjC>_-)VHE zh8@YQ!%Q^YqhDlQp;B^M-v4G%*%(3;B#I0yY1Wu?hCqT&BF_h2fwGbn6MoITDi`#ED+cEh4OP$hj98Qk;l6(Eyw< zjB>QoE~|^z<4D9&3R`f>pkYi%DZTItPV%EF=uCLuUF`w8FC=v3U~C%XsTlk zg|))4o(z5Vq-B?#Y}>S%Lk_DfiJq0zU8IY;MzNCfhq@gphb$lh%p9VU5v?`DFl2H% zWPe1ErMt5}gVK$X3)BYXgok+*fCgiYCUUHyX`0Kj^vuQ>@4YjYFinEsRR7Mf3{m%# z(>U}sK_{FC0A;I)t|+R?YA=~)gEFyRk3Xa~uT)T)*3ziN#p?l1ep_a zDIrX)@Jb>GuR|FXESZ$|MF80DcKTAOMJGQkB)5udRU*}VS9*gWKyE=<<33$RK@ge7 zah_*MI153C2d5_bY)NyN0WU+^_3`D!A}b6^JRY)}=+2qDYbt-;d zPS?{Ce0n2}DP$A5P} ztwVAl2(v_v*@UQpK^Dk$HN6V?)iVOoQPz^f8jYON*P-dhB?=>H=niQa^Czv>ZOv-u zC0R$IK@!2BTo@Msfn}M5qqZ<*{6LWG=NdjCWN;KPOq@CEKs?}>8K>kil|NDSwBTzLy{w4zXXnfa*7ZUNm^wUt%881VYBd$eP+#^TIKfRjuMP-&hIE98CZLL&!RqMXM+|3jlyB+)0Ec zq5Nc~5V2`G=PG!45)?%1j3%l`a_5Ff%H|+33!#Z=y2pAI)#WN*6`H1gdVIp1Kb4fa zN+B7d(tAYG0e5*^+WJqK;+I zRC~4n>aTT9Eg%64p3XgyiIQ~ieDJFf8xiJP2O2o(P-RsVlH5O(tUQu&hB+bt1OMyq z|Fx(p0Wro13lUmNB5WWm2G{}L|kPbr6aa>p=Mkd6t1nta7 zkvgXAA?5&RmCRr7r5?a^Fer^(6akLQcDrHkopA(dx>L5c2_mb@rzEAP7}2bNdQBUw z%vYVI)wInxPU-?UdTpyvDjEVO8VCU*3aa2vCYfj)MF|aPm7H?3(dl%~EmO&1FJ1+*fZ5Q6uFfwzD zd7dAVidY#d88BLFzkGT8CaIJL3uYs(5w6le1Q39kvdWM~VYC+DQrj6a0z_FR?|lp* zDDGL?b<{^#YY~&slQl+fzqKaej8(OjIf>d*N$oxj{)MMn{nF!j2~$!@3&NsJsqu+{(o zk|v%p+i!?5tUyyw73D|Ot1!5J7`9~mG+IOHTIy)smC#0@x4q3L#2QyVfI z8I%~4qa;`Z$dsW}Y^{6-{fTdmq4pkR9<_-4)BpNA6py%0Jp{?KN?u}4MMn6ttr<8c zAfU!A+d2Y3zbsW#Zn`dK{qhk9Q2eLwZVausnM23~1O2#ko+;^;iqaSW$(4oTLiuL< zHJ7Anl4|0D_iI?BZ;|>TG^%FMN~M5!9~i>JtJ_4me~E4sd2sd`DInAQTW-(6#9s#h zPRf`st3+@(JZt9_3uuQDrYsL;aYn6_GGGF8-_ooB*TK4Jss`qItoI@KVC~DwqteG= zrH$plG<7tk6duQrY)Eo1iFct?Pm5TT#r1kw%|SW|xj-!|c2O&mV))!mtMQd8TZE7V zK0%n}eCg}9(S9v~M8i{76@tzdfD8iw)3m|l1_*MgP_)-PiOV4&N3m$;X*Py(bg5=s zD7g|$CKoV~a0Q7Bh{O;G1tbc`99IBHY7*UaUF5h9r<2@egjstk^&?R(fUoWW5fK6h zOjXlF@X>*hARK}Znu*M(I8{P&+?O1F#ti8IuQzc0f61r`5CKeKcKcn7(Hcdmnw!jz zE9=l}hBSH%zR5D=v(KsFTM!^!P`F(CWu7p_=eoQEFML~$*&n%Xf1)5P~E7yWjmUB04io zRYw#V>(r#EyRW0~Qt65lYBXAj1H^o9Da&6Y$S@4f70a@aLCNClEQ|z@I^RYA ze14G=Oo_id$s(mqkYJqVdGUq}2rvVY(Z0$|wZ02LN*@4NXXf!NEW(gfWq<`KrgVk+KL7w0)y)NUdpWbC z25U8ZFRJ$aFbRNmiZdpkk${U{m2ZT40Ki%sV@$p({>^my$Q&XQk&3-uuUABRX)Rdo zEr(|eR!*fcItv`V;|D24sB#KC`7XzdcqMe5tV_g7=fPmRY6!7=f$?QN$RNn1NdPAq0E@^y!lzmH9z=V)^E?aEO9P ziN7IO7xmNUN7b-O4mYOum|QT9kjHK6RaFzDLeCt;q#4+0!mg;2H^B4La|m8?=`$CS zwLLazzkX}Xa*h?(@LTEK>-qs8kkZ^^+qNPgX^K;7AX-;|Qa_6(;8V|xX7UurC^dpP zv1Ad%8ay7pa9mj9mYB~KBp0a~{6r*x-bYAZ$x+Kwt71!f5I}&KL^NR;$II!&2|r1) z#d(o2fgFHuGV}n#kulA3&X|%gCg~>vfN2`nMb)N3jc+88ZFJo=b(N@DF@p#IAhNP1 z(ljtKWSk*OV1$twF=jh#Xyt$CFDctH8D3p0NpTJ`Yq?zy5XKPow>ZQPA3gv;4z?hN z)GzlJbquh;|I}8OmnW)?7v+6%8W&hqW!rW^J9tnr8>p;yjEshW$VXnop^O+I-;7n= zGJPMjkfkWHzq_@CTU1$b^*Cy@*H%3c0b*AA973wt;IepqJf%tMUaMFiBD{L@nmHc> zNqLz>U}0tU>T>J&TVOp**_7xO>L*AdUIMe+-QQ_ciXvLSN)^~O>{mOe?pQQZ7UATl zD05!YBz1+?09qcgfN*&J8m3tj;h1tuqNh_!MydNP^{u8LUcWCyb)lN91!E|9Po#n< z`1IvV48c_eGYhKjB>E5oGm%xhCM=W>ARs6gDrV=Qa|8u22;P&5dm>l@5U{ZXz?cfA7+I1XPu+2vHPoe+HDJ&qZH!T?m)Y2eq&^-2 zmckW_*T4~jcI{xAU4)55v|@)eK2uSK<_aQ9E@tT{TmYgd(so^4*QB!fNKu4{LJS#Z zDJ_yQV<`b(1Xnl_$rT<0ATb0zISMs=@XV161!iT_#2900SQFuO-V$cNjLDS(h@|Os z>C)<#ra~o7!yp{jy%U}7mE{z*b_5~@bVy;s*fFyA(OHx2SH6mzFmF+o-L|W$QnXNr zgh(-X$^&8m1=IW!A)=T|Y?zRRe*cU07C=Rzk%JElC(4>6&cHV?57!{$<-bv)(q&ea ze!OaX0Rj?|!4Q0sa$3^~8U}!7wIF6f-kJ;Xfyo%o6_fOtsW&v8QtRyb5{I!jHZRl5 z;ZJ@7v-1F1gFVIBsmhu}-~hAA1p3HT)zobx2`Q-iH$*0Nwq=W{iFPE?-t@?#iTe;V zCZkJ8t^fca07*naR6=1eXh7+@DAPQT!#vNkfu!CFNj+2m07ZpR05cO$KZMo4>cf-C zy8g*AXjjaC{OLc2zAv2B>}g~{V>HL>W6*ufWijB)%ZkaaQlda4{%GP+sL>A`891f~ z&ZrNP5_YmDNGp{N5 D)EJX;7lE$LNL~>)! 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

-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

tQ*2Rswc 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�C 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�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 z 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

- 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 literal 0 HcmV?d00001 diff --git a/docs/internals-ja/versions.md b/docs/internals-ja/versions.md index e10345a..90237c9 100644 --- a/docs/internals-ja/versions.md +++ b/docs/internals-ja/versions.md @@ -10,41 +10,77 @@ Yii バージョン規約 しかし、これは理想としての計画です。 ferver の記事は、Semantic Versioning を使おうが使うまいが、これが現実には達成が困難な計画であることを示す現実世界の実例を示しています。 -要約すれば、私たちのバージョン付与ポリシーは次のようになります。 +要約すれば、Yii 2 に対する私たちのバージョン付与ポリシーは次のようになります。 +## バージョン番号 -## パッチリリース `2.x.Y` - -パッチリリースは、100% 後方互換であるべきです。 -理想的には、互換性が損なわれる可能性を減らすために、バグ修正のみを含ませたいと私たちは望んでいます。 -実際には、2.0.x はより頻繁にリリースされており、また、小さな機能改良をも追加して、ユーザが新機能をより早く享受できるようにしています。 -* `2.x` という名前のブランチ上で保守される。 -* 主としてバグ修正と小さな機能強化を含む。 -* 大きな機能拡張はしない。 -* 不安無しのアップグレードを保証するために、100% 後方互換でなければならない。唯一の例外はセキュリティ問題で、その場合は後方互換性が破られることもある。 -* リリースのサイクルは1~2ヶ月程度。 -* プレリリース (alpha, beta, RC) は不要。 -* 定期的に (少なくとも週に一回は手作業で) マスターブランチにマージバックされるべき。 +バージョン番号は `2.x.y.z` のフォーマットとします。ここで `z` が `0` であるリリースについては、`z` は省略可能です。 +将来出るであろう Yii バージョン 3 については、1.0 に対する 2.0 のようなものになると予想されるので、ここでは言及しません。 +このようなことは、外的な技術進歩 (たとえば PHP の 5.0 から 5.4 へのアップグレード) によって、3年から5年に一度しか生じないものと予期しています。 -## マイナーリリース `2.X.0` +## `2.X.0`: メジャーリリース -後方互換性を損ないうる大きな機能と変更を含む非後方互換なリリース。 -以前のバージョンからのアップグレードは簡単ではないかもしれないが、完全なアップグレードのガイド、または可能であればスクリプトが提供される。 +後方互換性を損ないうる大きな機能追加と変更を含む、非後方互換なリリースです。 +以前のバージョンからのアップグレードは簡単ではないかも知れませんが、完全なアップグレードのガイドが提供されます。 -* マスターブランチ上で開発。 * 主として新機能とバグ修正を含む。 * パッチリリースからマージされた小さな機能強化とバグ修正を含む。 * `UPGRADE-2.X.md` ファイルに記録される非後方互換な変更を含みうる。 -* リリースのサイクルは6~8ヶ月程度。 +* リリースのサイクルはだいたい12ヶ月またはそれ以上。 * プレリリースが必要: `2.X.0-alpha`, `2.X.0-beta`, `2.X.0-rc` * 大きなニュースリリースとマーケティング努力を必要とする。 +## `2.x.Y`: マイナーリリース + +100% 後方互換であるべき、パッチリリースです。 +理想的には、後方互換性を損なわない変更だけを含ませたいと私たちは望んでいます。 +しかし、100% の後方互換性を常に保つことは不可能ですので、アップグレードに関するノートが `UPGRADE.md` に記録されます。 +実際には、2.0.x はより頻繁にリリースされており、また、小さな機能改良をも追加して、ユーザが新機能をより早く享受できるようにしています。 + +* 主としてバグ修正と小さな機能強化を含む。 +* 大きな機能拡張や修正はしない。 +* 不安無しのアップグレードを保証するために、100% 後方互換でなければならない。ごく少数の例外は許容されるが、その場合は `UPGRADE.md` に記録される。 +* リリースのサイクルは1~2ヶ月程度。 +* プレリリース (alpha, beta, RC) は不要。 +* 継続的に (少なくとも週に一回は手作業で) マスターブランチにマージバックされるべき。 +* ニュースによる広報を伴う。プロジェクトサイトがアップデートされる。 + +### `2.x.y.Z`: パッチリリース + +バグ修正のみを含む、100% 後方互換であるべき、パッチリリースです。 +ニュースによる広報やプロジェクトサイトのアップデートはしません (ただし、重大な/セキュリティの問題についての修正を含む場合は、別です)。 +このリリースのプロセスはほぼ自動的に実行されます。 + +* バグ修正のみを含む。機能追加はしない。 +* 不安無しのアップグレードを保証するために、100% 後方互換でなければならない。唯一の例外はセキュリティ問題で、その場合は後方互換性が破られることもある。 +* リリースのサイクルは1~2週間程度。 +* プレリリース (alpha, beta, RC) は不要。 +* リリース時にマスターブランチにマージバックされなければならない。 + + +## ブランチ規約 + +* `master` ブランチは、現在の安定版メジャーリリースの開発ブランチで、現在は `2.0.x` バージョンです。 +* 各メジャーリリースは、そのバージョン番号の名前を持つブランチ上で開発されます。例えば、`2.1`。 +* メジャーリリース `2.n` の準備が出来たら、`master` から `2.(n-1).x` と名付けられた保守ブランチを作成します。 +例えば、バージョン `2.1.0` が安定版としてリリースされ、`master` 上で開発されるようになると、`2.0` ブランチが作成されます。 + ([composer branch naming schema](https://getcomposer.org/doc/02-libraries.md#branches) を参照). +* パッチリリースをマークするために `2.x.y.z` というタグと `2.x.y` ブランチを作成します。`0` は省略されます。 +* `2.n.x` 保守ブランチ上の変更は、継続的に `master` ブランチにマージバックされます。 + +次の図は、各ブランチ上でのコミット履歴の経時的な変化を説明したものです。 + +![ブランチ規約](versions-branches.png) + -## メジャーリリース `X.0.0` +## リリース -1.0 に対する 2.0 など。 -これは外部的な技術の進歩 (例えば、PHP が 5.0 から 5.4 へアップグレードされた、など) に依存して、3年から5年の間に一度だけ生じるものであると私たちは予想しています。 +Yii 2 フレームワークと公式エクステンションのプロジェクトは、ともに、上述のバージョン規約およびブランチ規約に従います。 +ただし、フレームワークと公式エクステンションのプロジェクトは、お互いに独立にリリースされます。 +すなわち、すなわち、フレームワークとエクステンションの間で、バージョン番号が異なることが予想されます。 +アプリケーションテンプレートは、常に、フレームワークと同時にリリースされます。 -> Note: 公式エクステンションも同じバージョン付与ポリシーに従っていますが、フレームワークとは独立にリリースされることがあります。 - すなわち、フレームワークとエクステンションの間で、バージョン番号が異なることが予想されます。 +上記で説明されたリリースサイクルは、コアフレームワークにのみ適用されます。 +エクステンションは必要に応じてリリースされます。 +エクステンションは、何らバグ修正や機能拡張を受けずに、長期間にわたって新しいリリースを持たないことがあり得ます。 diff --git a/docs/internals-ja/view-code-style.md b/docs/internals-ja/view-code-style.md index 26e149f..1d1fb76 100644 --- a/docs/internals-ja/view-code-style.md +++ b/docs/internals-ja/view-code-style.md @@ -1,5 +1,5 @@ -Yii2 ビューのコードスタイル -=========================== +Yii2 ビューコードスタイル +========================= 下記のコードスタイルが Yii 2.x コアと公式エクステンションのビューファイルに用いられています。 私たちは、あなたが自分のアプリケーションにこのコードスタイルを使うことを強制するものではありません。 From 0895f212c674c38cc4df45621f809c53005249dc Mon Sep 17 00:00:00 2001 From: Carsten Brandt Date: Sun, 3 Jul 2016 10:56:58 +0200 Subject: [PATCH 020/163] improved docs about `tag` option in HTML options --- framework/helpers/BaseHtml.php | 11 ++++++++--- framework/widgets/ActiveField.php | 13 +++++++++---- framework/widgets/Menu.php | 5 ++++- framework/widgets/Pjax.php | 1 + 4 files changed, 22 insertions(+), 8 deletions(-) diff --git a/framework/helpers/BaseHtml.php b/framework/helpers/BaseHtml.php index 914a0fb..553aee8 100644 --- a/framework/helpers/BaseHtml.php +++ b/framework/helpers/BaseHtml.php @@ -864,7 +864,8 @@ class BaseHtml * @param array $options options (name => config) for the checkbox list container tag. * The following options are specially handled: * - * - tag: string|false, the tag name of the container element. False to render radio buttons without container. + * - tag: string|false, the tag name of the container element. False to render checkbox without container. + * See also [[tag()]]. * - unselect: string, the value that should be submitted when none of the checkboxes is selected. * By setting this option, a hidden input will be generated. * - encode: boolean, whether to HTML-encode the checkbox labels. Defaults to true. @@ -944,6 +945,7 @@ class BaseHtml * The following options are specially handled: * * - tag: string|false, the tag name of the container element. False to render radio buttons without container. + * See also [[tag()]]. * - unselect: string, the value that should be submitted when none of the radio buttons is selected. * By setting this option, a hidden input will be generated. * - encode: boolean, whether to HTML-encode the checkbox labels. Defaults to true. @@ -1197,6 +1199,7 @@ class BaseHtml * The following options are specially handled: * * - tag: this specifies the tag name. If not set, "div" will be used. + * See also [[tag()]]. * - encode: boolean, if set to false then the error message won't be encoded. * * See [[renderTagAttributes()]] for details on how attributes are being rendered. @@ -1557,7 +1560,8 @@ class BaseHtml * @param array $options options (name => config) for the checkbox list container tag. * The following options are specially handled: * - * - tag: string, the tag name of the container element. + * - tag: string|false, the tag name of the container element. False to render checkbox without container. + * See also [[tag()]]. * - unselect: string, the value that should be submitted when none of the checkboxes is selected. * You may set this option to be null to prevent default value submission. * If this option is not set, an empty string will be submitted. @@ -1598,7 +1602,8 @@ class BaseHtml * @param array $options options (name => config) for the radio button list container tag. * The following options are specially handled: * - * - tag: string, the tag name of the container element. + * - tag: string|false, the tag name of the container element. False to render radio button without container. + * See also [[tag()]]. * - unselect: string, the value that should be submitted when none of the radio buttons is selected. * You may set this option to be null to prevent default value submission. * If this option is not set, an empty string will be submitted. diff --git a/framework/widgets/ActiveField.php b/framework/widgets/ActiveField.php index 6a67bab..45d1df4 100644 --- a/framework/widgets/ActiveField.php +++ b/framework/widgets/ActiveField.php @@ -41,7 +41,8 @@ class ActiveField extends Component * If a value is null, the corresponding attribute will not be rendered. * The following special options are recognized: * - * - tag: the tag name of the container element. Defaults to "div". + * - tag: the tag name of the container element. Defaults to "div". Setting it to `false` will not render a container tag. + * See also [[\yii\helpers\Html::tag()]]. * * If you set a custom `id` for the container element, you may need to adjust the [[$selectors]] accordingly. * @@ -67,8 +68,9 @@ class ActiveField extends Component * merged with this property when rendering the error tag. * The following special options are recognized: * - * - tag: the tag name of the container element. Defaults to "div". - * - encode: whether to encode the error output. Defaults to true. + * - tag: the tag name of the container element. Defaults to "div". Setting it to `false` will not render a container tag. + * See also [[\yii\helpers\Html::tag()]]. + * - encode: whether to encode the error output. Defaults to `true`. * * If you set a custom `id` for the error element, you may need to adjust the [[$selectors]] accordingly. * @@ -86,7 +88,8 @@ class ActiveField extends Component * merged with this property when rendering the hint tag. * The following special options are recognized: * - * - tag: the tag name of the container element. Defaults to "div". + * - tag: the tag name of the container element. Defaults to "div". Setting it to `false` will not render a container tag. + * See also [[\yii\helpers\Html::tag()]]. * * @see \yii\helpers\Html::renderTagAttributes() for details on how attributes are being rendered. */ @@ -281,6 +284,7 @@ class ActiveField extends Component * The following options are specially handled: * * - tag: this specifies the tag name. If not set, "div" will be used. + * See also [[\yii\helpers\Html::tag()]]. * * If you set a custom `id` for the error element, you may need to adjust the [[$selectors]] accordingly. * @see $errorOptions @@ -307,6 +311,7 @@ class ActiveField extends Component * The following options are specially handled: * * - tag: this specifies the tag name. If not set, "div" will be used. + * See also [[\yii\helpers\Html::tag()]]. * * @return $this the field object itself */ diff --git a/framework/widgets/Menu.php b/framework/widgets/Menu.php index 3c2e0ad..b6142d3 100644 --- a/framework/widgets/Menu.php +++ b/framework/widgets/Menu.php @@ -79,7 +79,9 @@ class Menu extends Widget * specifies its `options`, it will be merged with this property before being used to generate the HTML * attributes for the menu item tag. The following special options are recognized: * - * - tag: string, defaults to "li", the tag name of the item container tags. Set to false to disable container tag. + * - tag: string, defaults to "li", the tag name of the item container tags. + * Set to false to disable container tag. + * See also [[\yii\helpers\Html::tag()]]. * * @see \yii\helpers\Html::renderTagAttributes() for details on how attributes are being rendered. */ @@ -130,6 +132,7 @@ class Menu extends Widget * @var array the HTML attributes for the menu's container tag. The following special options are recognized: * * - tag: string, defaults to "ul", the tag name of the item container tags. Set to false to disable container tag. + * See also [[\yii\helpers\Html::tag()]]. * * @see \yii\helpers\Html::renderTagAttributes() for details on how attributes are being rendered. */ diff --git a/framework/widgets/Pjax.php b/framework/widgets/Pjax.php index 7dd3491..4d0e39b 100644 --- a/framework/widgets/Pjax.php +++ b/framework/widgets/Pjax.php @@ -49,6 +49,7 @@ class Pjax extends Widget * * - `tag`: string, the tag name for the container. Defaults to `div` * This option is available since version 2.0.7. + * See also [[\yii\helpers\Html::tag()]]. * * @see \yii\helpers\Html::renderTagAttributes() for details on how attributes are being rendered. */ From d9122a74a946efb912443136ec6784664c6f4220 Mon Sep 17 00:00:00 2001 From: Carsten Brandt Date: Sun, 3 Jul 2016 11:02:25 +0200 Subject: [PATCH 021/163] improved tests and docs for #11857 --- framework/CHANGELOG.md | 2 +- framework/filters/AccessRule.php | 2 +- tests/framework/filters/AccessRuleTest.php | 9 +++++++++ 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index 61fd005..233c34c 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -47,7 +47,7 @@ Yii Framework 2 Change Log - Enh #11850: Introduced `yii\widgets\Pjax::$submitEvent` to be able to customize event triggering PJAX form submit (Bvanleeuwen) - Bug #11847: Fixed `yii\widgets\Pjax` to properly respond with partials when custom selector is used for container (pigochu, samdark) - Bug #10681: Fixed active form `beforeValidate` wasn't triggered in some cases (lynicidn) -- Enh #11857: `yii\filters\AccessRule::$verbs` could not be configured with any case of request method names (DrDeath72, samdark) +- Enh #11857: `yii\filters\AccessRule::$verbs` can now be configured in upper and lowercase (DrDeath72, samdark) - Bug #11863: Fixed usage of `mb_substr` with PHP < 5.4.8 where length of NULL was treated the same as 0 (samdark) - Bug #11865: Fixed setting `selected` for dropdown list using options (samdark) diff --git a/framework/filters/AccessRule.php b/framework/filters/AccessRule.php index f611204..10bb3ef 100644 --- a/framework/filters/AccessRule.php +++ b/framework/filters/AccessRule.php @@ -175,7 +175,7 @@ class AccessRule extends Component } /** - * @param string $verb the request method + * @param string $verb the request method in upper case. * @return boolean whether the rule applies to the request */ protected function matchVerb($verb) diff --git a/tests/framework/filters/AccessRuleTest.php b/tests/framework/filters/AccessRuleTest.php index 21e67a1..337013b 100644 --- a/tests/framework/filters/AccessRuleTest.php +++ b/tests/framework/filters/AccessRuleTest.php @@ -108,6 +108,15 @@ class AccessRuleTest extends \yiiunit\TestCase $request = $this->mockRequest('HEAD'); $this->assertNull($rule->allows($action, $user, $request)); + + $request = $this->mockRequest('get'); + $this->assertTrue($rule->allows($action, $user, $request)); + + $request = $this->mockRequest('post'); + $this->assertTrue($rule->allows($action, $user, $request)); + + $request = $this->mockRequest('head'); + $this->assertNull($rule->allows($action, $user, $request)); } // TODO test match custom callback From c66121d2b6322a368b6aff4774dcc3228f51b25c Mon Sep 17 00:00:00 2001 From: Kanin Peanviriyakulkit Date: Sun, 3 Jul 2016 17:05:42 +0700 Subject: [PATCH 022/163] update documentation fxp/composer-asset-plugin to version ^1.2.0 (#11876) --- .travis.yml | 2 +- docs/guide-es/start-installation.md | 2 +- docs/guide-es/tutorial-start-from-scratch.md | 2 +- docs/guide-es/tutorial-yii-integration.md | 2 +- docs/guide-id/start-installation.md | 4 ++-- docs/guide-it/start-installation.md | 2 +- docs/guide-ja/tutorial-start-from-scratch.md | 2 +- docs/guide-pl/start-installation.md | 4 ++-- docs/guide-pl/tutorial-start-from-scratch.md | 2 +- docs/guide-pt-BR/start-installation.md | 2 +- docs/guide-pt-BR/tutorial-yii-integration.md | 2 +- docs/guide-ru/tutorial-start-from-scratch.md | 2 +- docs/guide-ru/tutorial-yii-integration.md | 2 +- docs/guide-uk/tutorial-start-from-scratch.md | 4 ++-- docs/guide-uk/tutorial-yii-integration.md | 2 +- docs/guide-vi/start-installation.md | 2 +- docs/guide-zh-CN/start-installation.md | 2 +- docs/guide/start-installation.md | 2 +- docs/guide/tutorial-start-from-scratch.md | 2 +- docs/guide/tutorial-yii-integration.md | 2 +- docs/internals-ja/git-workflow.md | 2 +- docs/internals-ru/git-workflow.md | 2 +- docs/internals/git-workflow.md | 2 +- framework/README.md | 2 +- framework/UPGRADE.md | 2 +- 25 files changed, 28 insertions(+), 28 deletions(-) diff --git a/.travis.yml b/.travis.yml index 4bfe834..e728fed 100644 --- a/.travis.yml +++ b/.travis.yml @@ -34,7 +34,7 @@ addons: install: - travis_retry composer self-update && composer --version - - travis_retry composer global require "fxp/composer-asset-plugin:~1.1.1" + - travis_retry composer global require "fxp/composer-asset-plugin:^1.2.0" - export PATH="$HOME/.composer/vendor/bin:$PATH" # core framework: - travis_retry composer install --prefer-dist --no-interaction diff --git a/docs/guide-es/start-installation.md b/docs/guide-es/start-installation.md index 00799b0..48b4741 100644 --- a/docs/guide-es/start-installation.md +++ b/docs/guide-es/start-installation.md @@ -40,7 +40,7 @@ ejecutando el comando `composer self-update` Teniendo Composer instalado, puedes instalar Yii ejecutando los siguientes comandos en un directorio accesible vía Web: ```bash -composer global require "fxp/composer-asset-plugin:~1.1.1" +composer global require "fxp/composer-asset-plugin:^1.2.0" composer create-project --prefer-dist yiisoft/yii2-app-basic basic ``` diff --git a/docs/guide-es/tutorial-start-from-scratch.md b/docs/guide-es/tutorial-start-from-scratch.md index cd810ff..616d755 100644 --- a/docs/guide-es/tutorial-start-from-scratch.md +++ b/docs/guide-es/tutorial-start-from-scratch.md @@ -50,6 +50,6 @@ Utilizar el Template Eso es todo lo que se necesita para crear un nuevo template de proyecto Yii. Ahora puedes crear tus propios proyectos a partir de este template: ``` -composer global require "fxp/composer-asset-plugin:~1.1.1" +composer global require "fxp/composer-asset-plugin:^1.2.0" composer create-project --prefer-dist --stability=dev mysoft/yii2-app-coolone new-project ``` diff --git a/docs/guide-es/tutorial-yii-integration.md b/docs/guide-es/tutorial-yii-integration.md index 20739f1..f7787ba 100644 --- a/docs/guide-es/tutorial-yii-integration.md +++ b/docs/guide-es/tutorial-yii-integration.md @@ -82,7 +82,7 @@ instalar Yii , e iniciar Yii. Si el sistema de terceros usa Composer para manejar sus dependencias, simplemente ejecuta estos comandos para instalar Yii: - composer global require "fxp/composer-asset-plugin:~1.1.1" + composer global require "fxp/composer-asset-plugin:^1.2.0" composer require yiisoft/yii2 composer install diff --git a/docs/guide-id/start-installation.md b/docs/guide-id/start-installation.md index d79556a..dc3d770 100644 --- a/docs/guide-id/start-installation.md +++ b/docs/guide-id/start-installation.md @@ -40,7 +40,7 @@ dengan menjalankan `composer self-update`. Dengan Komposer diinstal, Anda dapat menginstal Yii dengan menjalankan perintah berikut di bawah folder yang terakses web: ```bash -composer global require "fxp/composer-asset-plugin:~1.1.1" +composer global require "fxp/composer-asset-plugin:^1.2.0" composer create-project --prefer-dist yiisoft/yii2-app-basic basic ``` @@ -235,4 +235,4 @@ Bila menggunakan konfigurasi ini, Anda juga harus menetapkan `cgi.fix_pathinfo=0 untuk menghindari banyak panggilan `stat()` sistem yang tidak perlu. Sekalian catat bahwa ketika menjalankan server HTTPS, Anda perlu menambahkan `fastcgi_param HTTPS on;` sehingga Yii -benar dapat mendeteksi jika sambungan aman. \ No newline at end of file +benar dapat mendeteksi jika sambungan aman. diff --git a/docs/guide-it/start-installation.md b/docs/guide-it/start-installation.md index 009cdce..755ac34 100644 --- a/docs/guide-it/start-installation.md +++ b/docs/guide-it/start-installation.md @@ -27,7 +27,7 @@ Se hai già Composer installato assicurati di avere una versione aggiornata. Puo Una volta installato Composer, puoi installare Yii eseguendo questo comando in una directory accessbile via web: - composer global require "fxp/composer-asset-plugin:~1.1.1" + composer global require "fxp/composer-asset-plugin:^1.2.0" composer create-project --prefer-dist yiisoft/yii2-app-basic basic Il primo comando installa il [plugin composer asset](https://github.com/francoispluchino/composer-asset-plugin/) diff --git a/docs/guide-ja/tutorial-start-from-scratch.md b/docs/guide-ja/tutorial-start-from-scratch.md index bda4ea0..2dd342c 100644 --- a/docs/guide-ja/tutorial-start-from-scratch.md +++ b/docs/guide-ja/tutorial-start-from-scratch.md @@ -54,6 +54,6 @@ Yii の新しいプロジェクトテンプレートを作成するのに必要 これで、あなたのテンプレートを使ってプロジェクトを作成することが出来ます。 ``` -composer global require "fxp/composer-asset-plugin:~1.1.1" +composer global require "fxp/composer-asset-plugin:^1.2.0" composer create-project --prefer-dist --stability=dev mysoft/yii2-app-coolone new-project ``` diff --git a/docs/guide-pl/start-installation.md b/docs/guide-pl/start-installation.md index ab4fb44..420bd01 100644 --- a/docs/guide-pl/start-installation.md +++ b/docs/guide-pl/start-installation.md @@ -36,7 +36,7 @@ Jeśli posiadałeś już wcześniej zainstalowanego Composera, upewnij się, że Z zainstalowanym Composerem możesz przejść do instalacji Yii wywołując poniższe komendy w katalogu dostępnym z poziomu sieci web: ```bash -composer global require "fxp/composer-asset-plugin:~1.1.1" +composer global require "fxp/composer-asset-plugin:^1.2.0" composer create-project --prefer-dist yiisoft/yii2-app-basic basic ``` @@ -221,4 +221,4 @@ server { W przypadku użycia tej konfiguracji, powinienieś ustawić również `cgi.fix_pathinfo=0` w pliku `php.ini`, aby zapobiec wielu zbędnym wywołaniom 'stat()'. -Należy również pamiętać, że podczas pracy na serwerze HTTPS musisz dodać `fastcgi_param HTTPS on;`, aby Yii prawidłowo wykrywało, że połączenie jest bezpieczne. \ No newline at end of file +Należy również pamiętać, że podczas pracy na serwerze HTTPS musisz dodać `fastcgi_param HTTPS on;`, aby Yii prawidłowo wykrywało, że połączenie jest bezpieczne. diff --git a/docs/guide-pl/tutorial-start-from-scratch.md b/docs/guide-pl/tutorial-start-from-scratch.md index 948575c..baab856 100644 --- a/docs/guide-pl/tutorial-start-from-scratch.md +++ b/docs/guide-pl/tutorial-start-from-scratch.md @@ -52,6 +52,6 @@ Użycie szablonu Tylko tyle jest wymagane, aby stworzyć nowy szablon projektu Yii. Teraz już możesz rozpocząć pracę nad świeżym projektem, używając swojego szablonu, za pomocą komend: ``` -composer global require "fxp/composer-asset-plugin:~1.1.1" +composer global require "fxp/composer-asset-plugin:^1.2.0" composer create-project --prefer-dist --stability=dev mojafirma/yii2-app-fajna nowy-projekt ``` diff --git a/docs/guide-pt-BR/start-installation.md b/docs/guide-pt-BR/start-installation.md index fce4fa2..8bd2307 100644 --- a/docs/guide-pt-BR/start-installation.md +++ b/docs/guide-pt-BR/start-installation.md @@ -46,7 +46,7 @@ Você pode atualizar o Composer executando o comando `composer self-update`. Com o Composer instalado, você pode instalar o Yii executando o seguinte comando em um diretório acessível pela Web: - composer global require "fxp/composer-asset-plugin:~1.1.1" + composer global require "fxp/composer-asset-plugin:^1.2.0" composer create-project --prefer-dist yiisoft/yii2-app-basic basic O primeiro comando instala o [composer asset plugin](https://github.com/francoispluchino/composer-asset-plugin/) diff --git a/docs/guide-pt-BR/tutorial-yii-integration.md b/docs/guide-pt-BR/tutorial-yii-integration.md index 14f118e..28faef1 100644 --- a/docs/guide-pt-BR/tutorial-yii-integration.md +++ b/docs/guide-pt-BR/tutorial-yii-integration.md @@ -66,7 +66,7 @@ Como o Yii fornece muitas características excelentes, algumas vezes você pode Se o sistema em questão utilizar o Composer para gerenciar suas dependências, você pode simplesmente executar o seguinte comando para instalar o Yii: - composer global require "fxp/composer-asset-plugin:~1.1.1" + composer global require "fxp/composer-asset-plugin:^1.2.0" composer require yiisoft/yii2 composer install diff --git a/docs/guide-ru/tutorial-start-from-scratch.md b/docs/guide-ru/tutorial-start-from-scratch.md index 8d89e80..a12fd7c 100644 --- a/docs/guide-ru/tutorial-start-from-scratch.md +++ b/docs/guide-ru/tutorial-start-from-scratch.md @@ -46,6 +46,6 @@ git clone git@github.com:yiisoft/yii2-app-basic.git Это все, что требуется для создания нового шаблона проекта в Yii. Сейчас вы можете создавать проекты, использующие ваш шаблон: ``` -composer global require "fxp/composer-asset-plugin:~1.1.1" +composer global require "fxp/composer-asset-plugin:^1.2.0" composer create-project --prefer-dist --stability=dev mysoft/yii2-app-coolone new-project ``` diff --git a/docs/guide-ru/tutorial-yii-integration.md b/docs/guide-ru/tutorial-yii-integration.md index 023dde6..cc96e6f 100644 --- a/docs/guide-ru/tutorial-yii-integration.md +++ b/docs/guide-ru/tutorial-yii-integration.md @@ -63,7 +63,7 @@ Yii::$classMap['Class2'] = 'path/to/Class2.php'; Если сторонняя система использует для управления зависимостями Composer, Yii можно просто установить с помощью следующих команд: - composer global require "fxp/composer-asset-plugin:~1.1.1" + composer global require "fxp/composer-asset-plugin:^1.2.0" composer require "yiisoft/yii2:*" composer install diff --git a/docs/guide-uk/tutorial-start-from-scratch.md b/docs/guide-uk/tutorial-start-from-scratch.md index 58dd426..d63c2ee 100644 --- a/docs/guide-uk/tutorial-start-from-scratch.md +++ b/docs/guide-uk/tutorial-start-from-scratch.md @@ -57,6 +57,6 @@ git clone git@github.com:yiisoft/yii2-app-basic.git Тепер ви можете створювати проекти, використовуючи свій шаблон: ``` -composer global require "fxp/composer-asset-plugin:~1.1.1" +composer global require "fxp/composer-asset-plugin:^1.2.0" composer create-project --prefer-dist --stability=dev mysoft/yii2-app-coolone new-project -``` \ No newline at end of file +``` diff --git a/docs/guide-uk/tutorial-yii-integration.md b/docs/guide-uk/tutorial-yii-integration.md index 6a687cf..fec1768 100644 --- a/docs/guide-uk/tutorial-yii-integration.md +++ b/docs/guide-uk/tutorial-yii-integration.md @@ -84,7 +84,7 @@ Yii::$classMap['Class2'] = 'path/to/Class2.php'; Якщо стороння система використовує управління залежностями Composer, ви можете встановити Yii за допомогою наступних команд: ```bash - composer global require "fxp/composer-asset-plugin:~1.1.1" + composer global require "fxp/composer-asset-plugin:^1.2.0" composer require yiisoft/yii2 composer install ``` diff --git a/docs/guide-vi/start-installation.md b/docs/guide-vi/start-installation.md index a641fc0..0adf2a5 100644 --- a/docs/guide-vi/start-installation.md +++ b/docs/guide-vi/start-installation.md @@ -36,7 +36,7 @@ Nếu bạn đã cài Composer rồi, hãy chắc chắn rằng bạn đang sử Sau khi cài đặt Composer, bạn có thể cài đặt Yii bằng cách chạy lệnh sau ở thư mục Web mà ứng dụng cần chạy: - composer global require "fxp/composer-asset-plugin:~1.1.1" + composer global require "fxp/composer-asset-plugin:^1.2.0" composer create-project --prefer-dist yiisoft/yii2-app-basic basic Câu lệnh đầu tiên sẽ cài đặt [composer asset plugin](https://github.com/francoispluchino/composer-asset-plugin/) diff --git a/docs/guide-zh-CN/start-installation.md b/docs/guide-zh-CN/start-installation.md index a0af2ad..14b6eb8 100644 --- a/docs/guide-zh-CN/start-installation.md +++ b/docs/guide-zh-CN/start-installation.md @@ -22,7 +22,7 @@ Composer 安装后,切换到一个可通过 Web 访问的目录,执行如下命令即可安装 Yii : - composer global require "fxp/composer-asset-plugin:~1.1.1" + composer global require "fxp/composer-asset-plugin:^1.2.0" composer create-project --prefer-dist yiisoft/yii2-app-basic basic 第一条命令安装 [Composer asset plugin](https://github.com/francoispluchino/composer-asset-plugin/),它是通过 Composer 管理 bower 和 npm 包所必须的,此命令全局生效,一劳永逸。 diff --git a/docs/guide/start-installation.md b/docs/guide/start-installation.md index 461670f..84e9655 100644 --- a/docs/guide/start-installation.md +++ b/docs/guide/start-installation.md @@ -40,7 +40,7 @@ by running `composer self-update`. With Composer installed, you can install Yii by running the following commands under a Web-accessible folder: ```bash -composer global require "fxp/composer-asset-plugin:~1.1.1" +composer global require "fxp/composer-asset-plugin:^1.2.0" composer create-project --prefer-dist yiisoft/yii2-app-basic basic ``` diff --git a/docs/guide/tutorial-start-from-scratch.md b/docs/guide/tutorial-start-from-scratch.md index ee1ab50..da37e9d 100644 --- a/docs/guide/tutorial-start-from-scratch.md +++ b/docs/guide/tutorial-start-from-scratch.md @@ -50,6 +50,6 @@ Use the Template That's all that's required to create a new Yii project template. Now you can create projects using your template: ``` -composer global require "fxp/composer-asset-plugin:~1.1.1" +composer global require "fxp/composer-asset-plugin:^1.2.0" composer create-project --prefer-dist --stability=dev mysoft/yii2-app-coolone new-project ``` diff --git a/docs/guide/tutorial-yii-integration.md b/docs/guide/tutorial-yii-integration.md index 367961a..ee25d83 100644 --- a/docs/guide/tutorial-yii-integration.md +++ b/docs/guide/tutorial-yii-integration.md @@ -82,7 +82,7 @@ take two steps: install Yii, and bootstrap Yii. If the third-party system uses Composer to manage its dependencies, you can simply run the following commands to install Yii: - composer global require "fxp/composer-asset-plugin:~1.1.1" + composer global require "fxp/composer-asset-plugin:^1.2.0" composer require yiisoft/yii2 composer install diff --git a/docs/internals-ja/git-workflow.md b/docs/internals-ja/git-workflow.md index 910b60d..695bf53 100644 --- a/docs/internals-ja/git-workflow.md +++ b/docs/internals-ja/git-workflow.md @@ -33,7 +33,7 @@ git remote add upstream git://github.com/yiisoft/yii2.git - `composer update` を実行して、依存パッケージをインストールします ([composer をグローバルにインストール](https://getcomposer.org/doc/00-intro.md#globally) したものと仮定しています)。 -> Note: `Problem 1 The requested package bower-asset/jquery could not be found in any version, there may be a typo in the package name.` というようなエラーが生ずる場合は、`composer global require "fxp/composer-asset-plugin:~1.1.1"` を実行する必要があります。 +> Note: `Problem 1 The requested package bower-asset/jquery could not be found in any version, there may be a typo in the package name.` というようなエラーが生ずる場合は、`composer global require "fxp/composer-asset-plugin:^1.2.0"` を実行する必要があります。 - `php build/build dev/app basic` を実行して、ベーシックアプリケーションをクローンし、その依存パッケージをインストールします。 このコマンドは外部 composer パッケージは通常どおりインストールしますが、yii2 レポジトリは現在チェックアウトされているものをリンクします。 diff --git a/docs/internals-ru/git-workflow.md b/docs/internals-ru/git-workflow.md index 5c8f914..741abbc 100644 --- a/docs/internals-ru/git-workflow.md +++ b/docs/internals-ru/git-workflow.md @@ -36,7 +36,7 @@ git remote add upstream git://github.com/yiisoft/yii2.git - выполните `composer update` для установки зависимостей (если [composer у вас установлен глобально](https://getcomposer.org/doc/00-intro.md#globally)). > Note: Если вы видите такие ошибки, как `Problem 1 The requested package bower-asset/jquery could not be found in -> any version, there may be a typo in the package name.`, необходимо запустить `composer global require "fxp/composer-asset-plugin:~1.1.1"` +> any version, there may be a typo in the package name.`, необходимо запустить `composer global require "fxp/composer-asset-plugin:^1.2.0"` - выполните `php build/build dev/app basic` для клонирования базового приложения и установки его зависимостей. Эта команда установит сторонние пакеты composer обычным образом, но создаст ссылку с репозитория yii2 на только diff --git a/docs/internals/git-workflow.md b/docs/internals/git-workflow.md index 20eb216..5d12023 100644 --- a/docs/internals/git-workflow.md +++ b/docs/internals/git-workflow.md @@ -35,7 +35,7 @@ The following steps are not necessary if you want to work only on translations o - run `composer update` to install dependencies (assuming you have [composer installed globally](https://getcomposer.org/doc/00-intro.md#globally)). -> Note: If you see errors like `Problem 1 The requested package bower-asset/jquery could not be found in any version, there may be a typo in the package name.`, you will need to run `composer global require "fxp/composer-asset-plugin:~1.1.1"` +> Note: If you see errors like `Problem 1 The requested package bower-asset/jquery could not be found in any version, there may be a typo in the package name.`, you will need to run `composer global require "fxp/composer-asset-plugin:^1.2.0"` - run `php build/build dev/app basic` to clone the basic app and install composer dependencies for the basic app. This command will install foreign composer packages as normal but will link the yii2 repo to diff --git a/framework/README.md b/framework/README.md index 8a17cf4..9d5e849 100644 --- a/framework/README.md +++ b/framework/README.md @@ -15,7 +15,7 @@ The preferred way to install the Yii framework is through [composer](http://getc Either run ``` -composer global require "fxp/composer-asset-plugin:~1.1.1" +composer global require "fxp/composer-asset-plugin:^1.2.0" composer require yiisoft/yii2 ``` diff --git a/framework/UPGRADE.md b/framework/UPGRADE.md index d28ae89..516531c 100644 --- a/framework/UPGRADE.md +++ b/framework/UPGRADE.md @@ -12,7 +12,7 @@ Make sure you have global install of latest version of composer asset plugin as ``` php composer.phar self-update -php composer.phar global require "fxp/composer-asset-plugin:~1.1.1" +php composer.phar global require "fxp/composer-asset-plugin:^1.2.0" ``` Upgrade from Yii 2.0.8 From 712620903788d95065e128dee977a1cdc4a0d680 Mon Sep 17 00:00:00 2001 From: Carsten Brandt Date: Sun, 3 Jul 2016 12:47:56 +0200 Subject: [PATCH 023/163] make AccessRule::matchVerb() more reliable related to #11857 --- framework/filters/AccessRule.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/framework/filters/AccessRule.php b/framework/filters/AccessRule.php index 10bb3ef..6cbf485 100644 --- a/framework/filters/AccessRule.php +++ b/framework/filters/AccessRule.php @@ -175,12 +175,12 @@ class AccessRule extends Component } /** - * @param string $verb the request method in upper case. + * @param string $verb the request method. * @return boolean whether the rule applies to the request */ protected function matchVerb($verb) { - return empty($this->verbs) || in_array($verb, array_map('strtoupper', $this->verbs), true); + return empty($this->verbs) || in_array(strtoupper($verb), array_map('strtoupper', $this->verbs), true); } /** From fa64ba29e1ddfeb7c6834b86b252c5cf9df6bd56 Mon Sep 17 00:00:00 2001 From: Nobuo Kihara Date: Mon, 4 Jul 2016 16:27:45 +0900 Subject: [PATCH 024/163] Japanese Documentation updated [ci skip] (#11881) * Japanese Documentation updated [ci skip] * docs/guide-ja/input-multiple-models.md [ci skip] --- docs/guide-ja/input-multiple-models.md | 8 ++++++-- docs/guide-ja/start-installation.md | 2 +- docs/guide-ja/tutorial-yii-integration.md | 2 +- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/docs/guide-ja/input-multiple-models.md b/docs/guide-ja/input-multiple-models.md index 68ef5ee..bcf2798 100644 --- a/docs/guide-ja/input-multiple-models.md +++ b/docs/guide-ja/input-multiple-models.md @@ -24,10 +24,14 @@ class UserController extends Controller public function actionUpdate($id) { $user = User::findOne($id); + if (!$user) { + throw new NotFoundHttpException("ユーザが見つかりませんでした。"); + } + $profile = Profile::findOne($id); - if (!isset($user, $profile)) { - throw new NotFoundHttpException("ユーザが見つかりませんでした。"); + if (!$profile) { + throw new NotFoundHttpException("ユーザのプロファイルがありません。"); } $user->scenario = 'update'; diff --git a/docs/guide-ja/start-installation.md b/docs/guide-ja/start-installation.md index e1589c0..0439ac1 100644 --- a/docs/guide-ja/start-installation.md +++ b/docs/guide-ja/start-installation.md @@ -39,7 +39,7 @@ Composer は `composer self-update` コマンドを実行してアップデー Composer がインストールされたら、ウェブからアクセスできるフォルダで下記のコマンドを実行することによって Yii をインストールすることが出来ます。 ```bash -composer global require "fxp/composer-asset-plugin:~1.1.1" +composer global require "fxp/composer-asset-plugin:~1.2.0" composer create-project --prefer-dist yiisoft/yii2-app-basic basic ``` diff --git a/docs/guide-ja/tutorial-yii-integration.md b/docs/guide-ja/tutorial-yii-integration.md index 4bfd46a..cea1c1a 100644 --- a/docs/guide-ja/tutorial-yii-integration.md +++ b/docs/guide-ja/tutorial-yii-integration.md @@ -77,7 +77,7 @@ Yii は数多くの優れた機能を提供していますので、サードパ サードパーティのシステムが Composer を使って依存を管理している場合は、単に下記のコマンドを実行すれば Yii をインストールすることが出来ます。 - composer global require "fxp/composer-asset-plugin:~1.1.1" + composer global require "fxp/composer-asset-plugin:~1.2.0" composer require yiisoft/yii2 composer install From d219b17e65e3ffea74a00076a48262f7903403e0 Mon Sep 17 00:00:00 2001 From: Kostas Thermos Date: Fri, 27 May 2016 11:05:42 +0200 Subject: [PATCH 025/163] Test for MessageFormatter with broken pattern close #11644 --- framework/CHANGELOG.md | 2 ++ tests/framework/i18n/MessageFormatterTest.php | 8 ++++++++ 2 files changed, 10 insertions(+) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index 233c34c..1e29545 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -50,6 +50,8 @@ Yii Framework 2 Change Log - Enh #11857: `yii\filters\AccessRule::$verbs` can now be configured in upper and lowercase (DrDeath72, samdark) - Bug #11863: Fixed usage of `mb_substr` with PHP < 5.4.8 where length of NULL was treated the same as 0 (samdark) - Bug #11865: Fixed setting `selected` for dropdown list using options (samdark) +- Bug #11528: Fixed MessageFormatter construction exception caught for PHP 7 compatibility (subdee) + 2.0.8 April 28, 2016 -------------------- diff --git a/tests/framework/i18n/MessageFormatterTest.php b/tests/framework/i18n/MessageFormatterTest.php index e2b684a..e675aca 100644 --- a/tests/framework/i18n/MessageFormatterTest.php +++ b/tests/framework/i18n/MessageFormatterTest.php @@ -381,4 +381,12 @@ _MSG_ $result = $formatter->format($pattern, [], 'en-US'); $this->assertEquals($pattern, $result, $formatter->getErrorMessage()); } + + public function testMalformedFormatter() + { + $formatter = new MessageFormatter(); + $result = $formatter->format(null, ['word' => 'test'], 'en-US'); + $this->assertFalse($result); + $this->assertNotEmpty($formatter->getErrorMessage()); + } } From 91f1ac1d9960688c01c6a479995f0a36308e6c9a Mon Sep 17 00:00:00 2001 From: Carsten Brandt Date: Mon, 4 Jul 2016 10:41:10 +0200 Subject: [PATCH 026/163] fixed exception on malformed message in Messageformatter this exception is thrown since PHP7 fix is compatible with older versions. close #11644 fixes #11528 --- framework/CHANGELOG.md | 3 ++- framework/i18n/MessageFormatter.php | 21 +++++++++++++++------ tests/framework/i18n/MessageFormatterTest.php | 1 + 3 files changed, 18 insertions(+), 7 deletions(-) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index 1e29545..b265fbe 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -4,6 +4,7 @@ Yii Framework 2 Change Log 2.0.9 under development ----------------------- + - Enh #11725: Added indexes on message tables (OndrejVasicek) - Enh #10422: Added `null` method on `yii\db\ColumnSchemaBuilder` to explicitly set column nullability (nevermnd) - Enh #9574: Implicit run `ColumnSchemaBuilder::null()` when default value is set to `null`. (rob006) @@ -50,7 +51,7 @@ Yii Framework 2 Change Log - Enh #11857: `yii\filters\AccessRule::$verbs` can now be configured in upper and lowercase (DrDeath72, samdark) - Bug #11863: Fixed usage of `mb_substr` with PHP < 5.4.8 where length of NULL was treated the same as 0 (samdark) - Bug #11865: Fixed setting `selected` for dropdown list using options (samdark) -- Bug #11528: Fixed MessageFormatter construction exception caught for PHP 7 compatibility (subdee) +- Bug #11528: Fixed MessageFormatter construction exception caught for PHP 7 compatibility (subdee, cebe) 2.0.8 April 28, 2016 diff --git a/framework/i18n/MessageFormatter.php b/framework/i18n/MessageFormatter.php index 0f9255c..3af087d 100644 --- a/framework/i18n/MessageFormatter.php +++ b/framework/i18n/MessageFormatter.php @@ -99,18 +99,27 @@ class MessageFormatter extends Component $pattern = $this->replaceNamedArguments($pattern, $params, $newParams); $params = $newParams; - $formatter = new \MessageFormatter($language, $pattern); - if ($formatter === null) { - $this->_errorCode = intl_get_error_code(); - $this->_errorMessage = 'Message pattern is invalid: ' . intl_get_error_message(); - + try { + $formatter = new \MessageFormatter($language, $pattern); + + if ($formatter === null) { + // formatter may be null in PHP 5.x + $this->_errorCode = intl_get_error_code(); + $this->_errorMessage = 'Message pattern is invalid: ' . intl_get_error_message(); + return false; + } + } catch (\IntlException $e) { + // IntlException is thrown since PHP 7 + $this->_errorCode = $e->getCode(); + $this->_errorMessage = 'Message pattern is invalid: ' . $e->getMessage(); return false; } + $result = $formatter->format($params); + if ($result === false) { $this->_errorCode = $formatter->getErrorCode(); $this->_errorMessage = $formatter->getErrorMessage(); - return false; } else { return $result; diff --git a/tests/framework/i18n/MessageFormatterTest.php b/tests/framework/i18n/MessageFormatterTest.php index e675aca..735746e 100644 --- a/tests/framework/i18n/MessageFormatterTest.php +++ b/tests/framework/i18n/MessageFormatterTest.php @@ -388,5 +388,6 @@ _MSG_ $result = $formatter->format(null, ['word' => 'test'], 'en-US'); $this->assertFalse($result); $this->assertNotEmpty($formatter->getErrorMessage()); + $this->assertGreaterThan(0, $formatter->getErrorCode()); } } From b0bb8649a3702de784a6310a23577b15508a21c6 Mon Sep 17 00:00:00 2001 From: Carsten Brandt Date: Mon, 4 Jul 2016 11:01:24 +0200 Subject: [PATCH 027/163] HHVM compatible fix for messageformatter error fixes #11528 --- framework/i18n/MessageFormatter.php | 5 +++++ tests/framework/i18n/MessageFormatterTest.php | 8 ++++++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/framework/i18n/MessageFormatter.php b/framework/i18n/MessageFormatter.php index 3af087d..5476a82 100644 --- a/framework/i18n/MessageFormatter.php +++ b/framework/i18n/MessageFormatter.php @@ -113,6 +113,11 @@ class MessageFormatter extends Component $this->_errorCode = $e->getCode(); $this->_errorMessage = 'Message pattern is invalid: ' . $e->getMessage(); return false; + } catch (\Exception $e) { + // Exception is thrown by HHVM + $this->_errorCode = $e->getCode(); + $this->_errorMessage = 'Message pattern is invalid: ' . $e->getMessage(); + return false; } $result = $formatter->format($params); diff --git a/tests/framework/i18n/MessageFormatterTest.php b/tests/framework/i18n/MessageFormatterTest.php index 735746e..5437567 100644 --- a/tests/framework/i18n/MessageFormatterTest.php +++ b/tests/framework/i18n/MessageFormatterTest.php @@ -385,9 +385,13 @@ _MSG_ public function testMalformedFormatter() { $formatter = new MessageFormatter(); - $result = $formatter->format(null, ['word' => 'test'], 'en-US'); + $result = $formatter->format('{word,umber}', ['word' => 'test'], 'en-US'); // typo is intentional, message pattern should be invalid $this->assertFalse($result); $this->assertNotEmpty($formatter->getErrorMessage()); - $this->assertGreaterThan(0, $formatter->getErrorCode()); + if (PHP_MAJOR_VERSION < 7) { + $this->assertContains('message formatter creation failed', $formatter->getErrorMessage()); + } else { + $this->assertContains('Constructor failed', $formatter->getErrorMessage()); + } } } From 5992eea5715d6e12f4af547cb594ace5488f687f Mon Sep 17 00:00:00 2001 From: Robert Korulczyk Date: Mon, 4 Jul 2016 11:50:37 +0200 Subject: [PATCH 028/163] Fixes #11808: `_table` and `_column` suffixes are now required when generating migration --- docs/guide-es/db-migrations.md | 40 ++--- docs/guide-ja/db-migrations.md | 40 ++--- docs/guide-ru/db-migrations.md | 34 ++-- docs/guide/db-migrations.md | 46 +++--- framework/CHANGELOG.md | 1 + .../console/controllers/MigrateController.php | 10 +- framework/views/addColumnMigration.php | 2 +- framework/views/dropColumnMigration.php | 2 +- .../create_products_from_store_table.php | 32 ++++ .../drop_products_from_store_table.php | 32 ++++ .../controllers/MigrateControllerTestTrait.php | 172 ++++++++++++--------- 11 files changed, 253 insertions(+), 158 deletions(-) create mode 100644 tests/data/console/migrate_create/create_products_from_store_table.php create mode 100644 tests/data/console/migrate_create/drop_products_from_store_table.php diff --git a/docs/guide-es/db-migrations.md b/docs/guide-es/db-migrations.md index 8387efa..b585c16 100644 --- a/docs/guide-es/db-migrations.md +++ b/docs/guide-es/db-migrations.md @@ -185,14 +185,14 @@ Existe una lista de todos los métodos disponibles para la definición de tipos Desde la versión 2.0.7 la consola provee una manera muy conveniente de generar migraciones. -Si el nombre de la migración tiene una forma especial, por ejemplo `create_xxx` o `drop_xxx` entonces el archivo de la migración generada +Si el nombre de la migración tiene una forma especial, por ejemplo `create_xxx_table` o `drop_xxx_table` entonces el archivo de la migración generada contendrá código extra, en este caso para crear/eliminar tablas. A continuación se describen todas estas variantes. ### Crear Tabla ```php -yii migrate/create create_post +yii migrate/create create_post_table ``` esto genera @@ -201,7 +201,7 @@ esto genera /** * Handles the creation for table `post`. */ -class m150811_220037_create_post extends Migration +class m150811_220037_create_post_table extends Migration { /** * @inheritdoc @@ -226,7 +226,7 @@ class m150811_220037_create_post extends Migration Para crear las columnas en ese momento, las puedes especificar vía la opción `--fields`. ```php -yii migrate/create create_post --fields="title:string,body:text" +yii migrate/create create_post_table --fields="title:string,body:text" ``` genera @@ -235,7 +235,7 @@ genera /** * Handles the creation for table `post`. */ -class m150811_220037_create_post extends Migration +class m150811_220037_create_post_table extends Migration { /** * @inheritdoc @@ -263,7 +263,7 @@ class m150811_220037_create_post extends Migration Puedes especificar más parámetros para las columnas. ```php -yii migrate/create create_post --fields="title:string(12):notNull:unique,body:text" +yii migrate/create create_post_table --fields="title:string(12):notNull:unique,body:text" ``` genera @@ -272,7 +272,7 @@ genera /** * Handles the creation for table `post`. */ -class m150811_220037_create_post extends Migration +class m150811_220037_create_post_table extends Migration { /** * @inheritdoc @@ -304,7 +304,7 @@ class m150811_220037_create_post extends Migration Desde 2.0.8 el generador soporta claves foráneas utilizando la palabra clave `foreignKey`. ```php -yii migrate/create create_post --fields="author_id:integer:notNull:foreignKey(user),category_id:integer:defaultValue(1):foreignKey,title:string,body:text" +yii migrate/create create_post_table --fields="author_id:integer:notNull:foreignKey(user),category_id:integer:defaultValue(1):foreignKey,title:string,body:text" ``` genera @@ -317,7 +317,7 @@ genera * - `user` * - `category` */ -class m160328_040430_create_post extends Migration +class m160328_040430_create_post_table extends Migration { /** * @inheritdoc @@ -422,13 +422,13 @@ una columna llamada `author_id` con una clave foránea a la tabla `user` mientra ### Eliminar Tabla ```php -yii migrate/create drop_post --fields="title:string(12):notNull:unique,body:text" +yii migrate/create drop_post_table --fields="title:string(12):notNull:unique,body:text" ``` genera ```php -class m150811_220037_drop_post extends Migration +class m150811_220037_drop_post_table extends Migration { public function up() { @@ -448,19 +448,19 @@ class m150811_220037_drop_post extends Migration ### Agregar Columna -Si el nombre de la migración está en la forma `add_xxx_to_yyy` entonces el archivo generado contendrá +Si el nombre de la migración está en la forma `add_xxx_column_to_yyy_table` entonces el archivo generado contendrá las declaraciones `addColumn` y `dropColumn` necesarias. Para agregar una columna: ```php -yii migrate/create add_position_to_post --fields="position:integer" +yii migrate/create add_position_column_to_post_table --fields="position:integer" ``` genera ```php -class m150811_220037_add_position_to_post extends Migration +class m150811_220037_add_position_column_to_post_table extends Migration { public function up() { @@ -476,17 +476,17 @@ class m150811_220037_add_position_to_post extends Migration ### Eliminar Columna -Si el nombre de la migración está en la forma `drop_xxx_from_yyy` entonces el archivo generado contendrá +Si el nombre de la migración está en la forma `drop_xxx_column_from_yyy_table` entonces el archivo generado contendrá las declaraciones `addColumn` y `dropColumn` necesarias. ```php -yii migrate/create drop_position_from_post --fields="position:integer" +yii migrate/create drop_position_column_from_post_table --fields="position:integer" ``` genera ```php -class m150811_220037_drop_position_from_post extends Migration +class m150811_220037_drop_position_column_from_post_table extends Migration { public function up() { @@ -502,11 +502,11 @@ class m150811_220037_drop_position_from_post extends Migration ### Agregar Tabla de Unión -Si el nombre de la migración está en la forma `create_junction_xxx_and_yyy` entonces se generará el código necesario +Si el nombre de la migración está en la forma `create_junction_table_for_xxx_and_yyy_tables` entonces se generará el código necesario para una tabla de unión. ```php -yii migrate/create create_junction_post_and_tag --fields="created_at:dateTime" +yii migrate/create create_junction_table_for_post_and_tag_tables --fields="created_at:dateTime" ``` genera @@ -519,7 +519,7 @@ genera * - `post` * - `tag` */ -class m160328_041642_create_junction_post_and_tag extends Migration +class m160328_041642_create_junction_table_for_post_and_tag_tables extends Migration { /** * @inheritdoc diff --git a/docs/guide-ja/db-migrations.md b/docs/guide-ja/db-migrations.md index fb70cdc..7713b54 100644 --- a/docs/guide-ja/db-migrations.md +++ b/docs/guide-ja/db-migrations.md @@ -177,14 +177,14 @@ class m150101_185401_create_news_table extends Migration バージョン 2.0.7 以降では、マイグレーション・コンソールがマイグレーションを生成する便利な方法を提供しています。 マイグレーションの名前が特定の形式である場合は、生成されるマイグレーション・ファイルに追加のコードが書き込まれます。 -例えば、`create_xxx` や `drop_xxx` であれば、テーブルの作成や削除をするコードが追加されます。 +例えば、`create_xxx_table` や `drop_xxx_table` であれば、テーブルの作成や削除をするコードが追加されます。 以下で、この機能の全ての変種を説明します。 ### テーブルの作成 ```php -yii migrate/create create_post +yii migrate/create create_post_table ``` 上記のコマンドは、次のコードを生成します。 @@ -193,7 +193,7 @@ yii migrate/create create_post /** * Handles the creation for table `post`. */ -class m150811_220037_create_post extends Migration +class m150811_220037_create_post_table extends Migration { /** * @inheritdoc @@ -218,7 +218,7 @@ class m150811_220037_create_post extends Migration テーブルのフィールドも直接に生成したい場合は、`--fields` オプションでフィールドを指定します。 ```php -yii migrate/create create_post --fields="title:string,body:text" +yii migrate/create create_post_table --fields="title:string,body:text" ``` これは、次のコードを生成します。 @@ -227,7 +227,7 @@ yii migrate/create create_post --fields="title:string,body:text" /** * Handles the creation for table `post`. */ -class m150811_220037_create_post extends Migration +class m150811_220037_create_post_table extends Migration { /** * @inheritdoc @@ -255,7 +255,7 @@ class m150811_220037_create_post extends Migration さらに多くのフィールド・パラメータを指定することも出来ます。 ```php -yii migrate/create create_post --fields="title:string(12):notNull:unique,body:text" +yii migrate/create create_post_table --fields="title:string(12):notNull:unique,body:text" ``` これは、次のコードを生成します。 @@ -264,7 +264,7 @@ yii migrate/create create_post --fields="title:string(12):notNull:unique,body:te /** * Handles the creation for table `post`. */ -class m150811_220037_create_post extends Migration +class m150811_220037_create_post_table extends Migration { /** * @inheritdoc @@ -297,7 +297,7 @@ class m150811_220037_create_post extends Migration バージョン 2.0.8 からは、`foreignKey` キーワードを使って外部キーを生成することができます。 ```php -yii migrate/create create_post --fields="author_id:integer:notNull:foreignKey(user),category_id:integer:defaultValue(1):foreignKey,title:string,body:text" +yii migrate/create create_post_table --fields="author_id:integer:notNull:foreignKey(user),category_id:integer:defaultValue(1):foreignKey,title:string,body:text" ``` これは、次のコードを生成します。 @@ -310,7 +310,7 @@ yii migrate/create create_post --fields="author_id:integer:notNull:foreignKey(us * - `user` * - `category` */ -class m160328_040430_create_post extends Migration +class m160328_040430_create_post_table extends Migration { /** * @inheritdoc @@ -413,13 +413,13 @@ class m160328_040430_create_post extends Migration ### テーブルを削除する ```php -yii migrate/create drop_post --fields="title:string(12):notNull:unique,body:text" +yii migrate/create drop_post_table --fields="title:string(12):notNull:unique,body:text" ``` これは、次のコードを生成します。 ```php -class m150811_220037_drop_post extends Migration +class m150811_220037_drop_post_table extends Migration { public function up() { @@ -439,18 +439,18 @@ class m150811_220037_drop_post extends Migration ### カラムを追加する -マイグレーションの名前が `add_xxx_to_yyy` の形式である場合、ファイルの内容は、必要となる `addColumn` と `dropColumn` を含むことになります。 +マイグレーションの名前が `add_xxx_column_to_yyy_table` の形式である場合、ファイルの内容は、必要となる `addColumn` と `dropColumn` を含むことになります。 カラムを追加するためには、次のようにします。 ```php -yii migrate/create add_position_to_post --fields="position:integer" +yii migrate/create add_position_column_to_post_table --fields="position:integer" ``` これが次のコードを生成します。 ```php -class m150811_220037_add_position_to_post extends Migration +class m150811_220037_add_position_column_to_post_table extends Migration { public function up() { @@ -466,16 +466,16 @@ class m150811_220037_add_position_to_post extends Migration ### カラムを削除する -マイグレーションの名前が `drop_xxx_from_yyy` の形式である場合、ファイルの内容は、必要となる `addColumn` と `dropColumn` を含むことになります。 +マイグレーションの名前が `drop_xxx_column_from_yyy_table` の形式である場合、ファイルの内容は、必要となる `addColumn` と `dropColumn` を含むことになります。 ```php -yii migrate/create drop_position_from_post --fields="position:integer" +yii migrate/create drop_position_column_from_post_table --fields="position:integer" ``` これは、次のコードを生成します。 ```php -class m150811_220037_drop_position_from_post extends Migration +class m150811_220037_drop_position_column_from_post_table extends Migration { public function up() { @@ -491,10 +491,10 @@ class m150811_220037_drop_position_from_post extends Migration ### 中間テーブルを追加する -マイグレーションの名前が `create_junction_xxx_and_yyy` の形式である場合は、中間テーブルを作成するのに必要となるコードが生成されます。 +マイグレーションの名前が `create_junction_table_for_xxx_and_yyy_tables` の形式である場合は、中間テーブルを作成するのに必要となるコードが生成されます。 ```php -yii migrate/create create_junction_post_and_tag --fields="created_at:dateTime" +yii migrate/create create_junction_table_for_post_and_tag_tables --fields="created_at:dateTime" ``` これは、次のコードを生成します。 @@ -507,7 +507,7 @@ yii migrate/create create_junction_post_and_tag --fields="created_at:dateTime" * - `post` * - `tag` */ -class m160328_041642_create_junction_post_and_tag extends Migration +class m160328_041642_create_junction_table_for_post_and_tag_tables extends Migration { /** * @inheritdoc diff --git a/docs/guide-ru/db-migrations.md b/docs/guide-ru/db-migrations.md index 356c2fd..5e3c4c0 100644 --- a/docs/guide-ru/db-migrations.md +++ b/docs/guide-ru/db-migrations.md @@ -160,19 +160,19 @@ class m150101_185401_create_news_table extends Migration Начиная с версии 2.0.7 появился удобный способ создания миграций из консоли. -В том случае, если миграция названа особым образом, таким как, например, `create_xxx` или `drop_xxx` сгенерированный +В том случае, если миграция названа особым образом, таким как, например, `create_xxx_table` или `drop_xxx_table` сгенерированный файл миграции будет содержать дополнительный код. ### Создание таблицы ```php -yii migrate/create create_post +yii migrate/create create_post_table ``` сгенерирует ```php -class m150811_220037_create_post extends Migration +class m150811_220037_create_post_table extends Migration { public function up() { @@ -191,13 +191,13 @@ class m150811_220037_create_post extends Migration Чтобы сразу создать поля таблицы, укажите их через опцию `--fields`. ```php -yii migrate/create create_post --fields=title:string,body:text +yii migrate/create create_post_table --fields=title:string,body:text ``` сгенерирует ```php -class m150811_220037_create_post extends Migration +class m150811_220037_create_post_table extends Migration { public function up() { @@ -218,13 +218,13 @@ class m150811_220037_create_post extends Migration Можно указать дополнительные параметры. ```php -yii migrate/create create_post --fields=title:string(12):notNull:unique,body:text +yii migrate/create create_post_table --fields=title:string(12):notNull:unique,body:text ``` сгенерирует ```php -class m150811_220037_create_post extends Migration +class m150811_220037_create_post_table extends Migration { public function up() { @@ -249,13 +249,13 @@ class m150811_220037_create_post extends Migration ### Удаление таблицы ```php -yii migrate/create drop_post --fields=title:string(12):notNull:unique,body:text +yii migrate/create drop_post_table --fields=title:string(12):notNull:unique,body:text ``` сгенерирует ```php -class m150811_220037_drop_post extends Migration +class m150811_220037_drop_post_table extends Migration { public function up() { @@ -275,18 +275,18 @@ class m150811_220037_drop_post extends Migration ### Добавление столбца -Если имя миграции задано как `add_xxx_to_yyy`, файл будет содержать необходимые методы `addColumn` и `dropColumn`. +Если имя миграции задано как `add_xxx_column_to_yyy_table`, файл будет содержать необходимые методы `addColumn` и `dropColumn`. Для добавления столбца: ```php -yii migrate/create add_position_to_post --fields=position:integer +yii migrate/create add_position_column_to_post_table --fields=position:integer ``` сгенерирует ```php -class m150811_220037_add_position_to_post extends Migration +class m150811_220037_add_position_column_to_post_table extends Migration { public function up() { @@ -302,16 +302,16 @@ class m150811_220037_add_position_to_post extends Migration ### Удаление столбца -Если имя миграции задано как `drop_xxx_from_yyy`, файл будет содержать необходимые методы `addColumn` и `dropColumn`. +Если имя миграции задано как `drop_xxx_column_from_yyy_table`, файл будет содержать необходимые методы `addColumn` и `dropColumn`. ```php -yii migrate/create drop_position_from_post --fields=position:integer +yii migrate/create drop_position_column_from_post_table --fields=position:integer ``` сгенерирует ```php -class m150811_220037_drop_position_from_post extends Migration +class m150811_220037_drop_position_column_from_post_table extends Migration { public function up() { @@ -327,10 +327,10 @@ class m150811_220037_drop_position_from_post extends Migration ### Добавление промежуточной таблицы -Если имя миграции задано как `create_junction_xxx_and_yyy`, файл будет содержать код для создания промежуточной таблцы. +Если имя миграции задано как `create_junction_table_for_xxx_and_yyy_tables`, файл будет содержать код для создания промежуточной таблцы. ```php -yii migrate/create create_junction_post_and_tag +yii migrate/create create_junction_table_for_post_and_tag_tables ``` сгенерирует diff --git a/docs/guide/db-migrations.md b/docs/guide/db-migrations.md index 4cf9031..b7e7908 100644 --- a/docs/guide/db-migrations.md +++ b/docs/guide/db-migrations.md @@ -185,14 +185,14 @@ A list of all available methods for defining the column types is available in th Since version 2.0.7 migration console provides a convenient way to create migrations. -If the migration name is of a special form, for example `create_xxx` or `drop_xxx` then the generated migration +If the migration name is of a special form, for example `create_xxx_table` then the generated migration file will contain extra code, in this case for creating/dropping tables. In the following all variants of this feature are described. ### Create Table ```php -yii migrate/create create_post +yii migrate/create create_post_table ``` generates @@ -201,7 +201,7 @@ generates /** * Handles the creation for table `post`. */ -class m150811_220037_create_post extends Migration +class m150811_220037_create_post_table extends Migration { /** * @inheritdoc @@ -226,7 +226,7 @@ class m150811_220037_create_post extends Migration To create table fields right away, specify them via `--fields` option. ```php -yii migrate/create create_post --fields="title:string,body:text" +yii migrate/create create_post_table --fields="title:string,body:text" ``` generates @@ -235,7 +235,7 @@ generates /** * Handles the creation for table `post`. */ -class m150811_220037_create_post extends Migration +class m150811_220037_create_post_table extends Migration { /** * @inheritdoc @@ -263,7 +263,7 @@ class m150811_220037_create_post extends Migration You can specify more field parameters. ```php -yii migrate/create create_post --fields="title:string(12):notNull:unique,body:text" +yii migrate/create create_post_table --fields="title:string(12):notNull:unique,body:text" ``` generates @@ -272,7 +272,7 @@ generates /** * Handles the creation for table `post`. */ -class m150811_220037_create_post extends Migration +class m150811_220037_create_post_table extends Migration { /** * @inheritdoc @@ -304,7 +304,7 @@ class m150811_220037_create_post extends Migration Since 2.0.8 the generator supports foreign keys using the `foreignKey` keyword. ```php -yii migrate/create create_post --fields="author_id:integer:notNull:foreignKey(user),category_id:integer:defaultValue(1):foreignKey,title:string,body:text" +yii migrate/create create_post_table --fields="author_id:integer:notNull:foreignKey(user),category_id:integer:defaultValue(1):foreignKey,title:string,body:text" ``` generates @@ -317,7 +317,7 @@ generates * - `user` * - `category` */ -class m160328_040430_create_post extends Migration +class m160328_040430_create_post_table extends Migration { /** * @inheritdoc @@ -422,13 +422,13 @@ column named `author_id` with a foreign key to the `user` table while ### Drop Table ```php -yii migrate/create drop_post --fields="title:string(12):notNull:unique,body:text" +yii migrate/create drop_post_table --fields="title:string(12):notNull:unique,body:text" ``` generates ```php -class m150811_220037_drop_post extends Migration +class m150811_220037_drop_post_table extends Migration { public function up() { @@ -448,19 +448,19 @@ class m150811_220037_drop_post extends Migration ### Add Column -If the migration name is of the form `add_xxx_to_yyy` then the file content would contain `addColumn` and `dropColumn` -statements necessary. +If the migration name is of the form `add_xxx_column_to_yyy_table` then the file +content would contain `addColumn` and `dropColumn` statements necessary. To add column: ```php -yii migrate/create add_position_to_post --fields="position:integer" +yii migrate/create add_position_column_to_post_table --fields="position:integer" ``` generates ```php -class m150811_220037_add_position_to_post extends Migration +class m150811_220037_add_position_column_to_post_table extends Migration { public function up() { @@ -476,17 +476,17 @@ class m150811_220037_add_position_to_post extends Migration ### Drop Column -If the migration name is of the form `drop_xxx_from_yyy` then the file content would contain `addColumn` and `dropColumn` -statements necessary. +If the migration name is of the form `drop_xxx_column_from_yyy_table` then +the file content would contain `addColumn` and `dropColumn` statements necessary. ```php -yii migrate/create drop_position_from_post --fields="position:integer" +yii migrate/create drop_position_column_from_post_table --fields="position:integer" ``` generates ```php -class m150811_220037_drop_position_from_post extends Migration +class m150811_220037_drop_position_column_from_post_table extends Migration { public function up() { @@ -502,11 +502,11 @@ class m150811_220037_drop_position_from_post extends Migration ### Add Junction Table -If the migration name is in if the form of `create_junction_xxx_and_yyy` then code necessary to create junction table -will be generated. +If the migration name is of the form `create_junction_table_for_xxx_and_yyy_tables` or `create_junction_xxx_and_yyy_tables` +then code necessary to create junction table will be generated. ```php -yii migrate/create create_junction_post_and_tag --fields="created_at:dateTime" +yii migrate/create create_junction_table_for_post_and_tag_tables --fields="created_at:dateTime" ``` generates @@ -519,7 +519,7 @@ generates * - `post` * - `tag` */ -class m160328_041642_create_junction_post_and_tag extends Migration +class m160328_041642_create_junction_table_for_post_and_tag_tables extends Migration { /** * @inheritdoc diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index b265fbe..fd537d7 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -44,6 +44,7 @@ Yii Framework 2 Change Log - Bug #11672: Fixed `yii\validators\NumberValidator` erroring when value is an object without `__toString()` method (SamMousa) - Bug #11561: Fixed DI container throwing exceptions for optional dependencies (SamMousa) - Enh #11168: `yii\helpers\BaseHtml` now uses abstracted `booleanInput()` and `activeBooleanInput()` methods to render `radio()`, `checkbox()`, `activeRadio()` and `activeCheckbox()` (cesarnicola) +- Enh #11808: `_table` and `_column` suffixes are now required when generating migration (rob006) - Bug #11822: Fixed exception on non-string value provided as CSRF token (cebe) - Enh #11850: Introduced `yii\widgets\Pjax::$submitEvent` to be able to customize event triggering PJAX form submit (Bvanleeuwen) - Bug #11847: Fixed `yii\widgets\Pjax` to properly respond with partials when custom selector is used for container (pigochu, samdark) diff --git a/framework/console/controllers/MigrateController.php b/framework/console/controllers/MigrateController.php index 01aac89..487af24 100644 --- a/framework/console/controllers/MigrateController.php +++ b/framework/console/controllers/MigrateController.php @@ -246,7 +246,7 @@ class MigrateController extends BaseMigrateController $templateFile = $this->templateFile; $table = null; - if (preg_match('/^create_junction_(.+)_and_(.+)$/', $name, $matches)) { + if (preg_match('/^create_junction(?:_table_for_|_for_|_)(.+)_and_(.+)_tables?$/', $name, $matches)) { $templateFile = $this->generatorTemplateFiles['create_junction']; $firstTable = mb_strtolower($matches[1], Yii::$app->charset); $secondTable = mb_strtolower($matches[2], Yii::$app->charset); @@ -275,17 +275,17 @@ class MigrateController extends BaseMigrateController $foreignKeys[$firstTable . '_id'] = $firstTable; $foreignKeys[$secondTable . '_id'] = $secondTable; $table = $firstTable . '_' . $secondTable; - } elseif (preg_match('/^add_(.+)_to_(.+)$/', $name, $matches)) { + } elseif (preg_match('/^add_(.+)_columns?_to_(.+)_table$/', $name, $matches)) { $templateFile = $this->generatorTemplateFiles['add_column']; $table = mb_strtolower($matches[2], Yii::$app->charset); - } elseif (preg_match('/^drop_(.+)_from_(.+)$/', $name, $matches)) { + } elseif (preg_match('/^drop_(.+)_columns?_from_(.+)_table$/', $name, $matches)) { $templateFile = $this->generatorTemplateFiles['drop_column']; $table = mb_strtolower($matches[2], Yii::$app->charset); - } elseif (preg_match('/^create_(.+)$/', $name, $matches)) { + } elseif (preg_match('/^create_(.+)_table$/', $name, $matches)) { $this->addDefaultPrimaryKey($fields); $templateFile = $this->generatorTemplateFiles['create_table']; $table = mb_strtolower($matches[1], Yii::$app->charset); - } elseif (preg_match('/^drop_(.+)$/', $name, $matches)) { + } elseif (preg_match('/^drop_(.+)_table$/', $name, $matches)) { $this->addDefaultPrimaryKey($fields); $templateFile = $this->generatorTemplateFiles['drop_table']; $table = mb_strtolower($matches[1], Yii::$app->charset); diff --git a/framework/views/addColumnMigration.php b/framework/views/addColumnMigration.php index f580e09..ec56751 100644 --- a/framework/views/addColumnMigration.php +++ b/framework/views/addColumnMigration.php @@ -7,7 +7,7 @@ /* @var $table string the name table */ /* @var $fields array the fields */ -preg_match('/^add_(.+)_to_(.+)$/', $name, $matches); +preg_match('/^add_(.+)_columns?_to_(.+)_table$/', $name, $matches); $columns = $matches[1]; echo "createTable('products_from_store', [ + 'id' => \$this->primaryKey(), + ]); + } + + /** + * @inheritdoc + */ + public function down() + { + \$this->dropTable('products_from_store'); + } +} + +CODE; diff --git a/tests/data/console/migrate_create/drop_products_from_store_table.php b/tests/data/console/migrate_create/drop_products_from_store_table.php new file mode 100644 index 0000000..96830ac --- /dev/null +++ b/tests/data/console/migrate_create/drop_products_from_store_table.php @@ -0,0 +1,32 @@ +dropTable('products_from_store'); + } + + /** + * @inheritdoc + */ + public function down() + { + \$this->createTable('products_from_store', [ + 'id' => \$this->primaryKey(), + ]); + } +} + +CODE; diff --git a/tests/framework/console/controllers/MigrateControllerTestTrait.php b/tests/framework/console/controllers/MigrateControllerTestTrait.php index cce9b6f..a443067 100644 --- a/tests/framework/console/controllers/MigrateControllerTestTrait.php +++ b/tests/framework/console/controllers/MigrateControllerTestTrait.php @@ -194,93 +194,123 @@ CODE; public function testGenerateCreateMigration() { - $migrationName = 'create_test'; - - $this->assertCommandCreatedFile('create_test', $migrationName); - - $this->assertCommandCreatedFile('create_fields', $migrationName, [ - 'fields' => 'title:string(10):notNull:unique:defaultValue("test"), - body:text:notNull, - price:money(11,2):notNull' - ]); - - $this->assertCommandCreatedFile('create_title_pk', $migrationName, [ - 'fields' => 'title:primaryKey,body:text:notNull,price:money(11,2)', - ]); - - $this->assertCommandCreatedFile('create_id_pk', $migrationName, [ - 'fields' => 'id:primaryKey, - address:string, - address2:string, - email:string', - ]); - - $this->assertCommandCreatedFile('create_foreign_key', $migrationName, [ - 'fields' => 'user_id:integer:foreignKey, - product_id:foreignKey:integer:unsigned:notNull, - order_id:integer:foreignKey(user_order):notNull, - created_at:dateTime:notNull', - ]); - - $this->assertCommandCreatedFile('create_prefix', $migrationName, [ - 'useTablePrefix' => true, - 'fields' => 'user_id:integer:foreignKey, - product_id:foreignKey:integer:unsigned:notNull, - order_id:integer:foreignKey(user_order):notNull, - created_at:dateTime:notNull', - ]); + $migrationNames = [ + 'create_test_table', + ]; + foreach ($migrationNames as $migrationName) { + $this->assertCommandCreatedFile('create_test', $migrationName); + + $this->assertCommandCreatedFile('create_fields', $migrationName, [ + 'fields' => 'title:string(10):notNull:unique:defaultValue("test"), + body:text:notNull, + price:money(11,2):notNull' + ]); + + $this->assertCommandCreatedFile('create_title_pk', $migrationName, [ + 'fields' => 'title:primaryKey,body:text:notNull,price:money(11,2)', + ]); + + $this->assertCommandCreatedFile('create_id_pk', $migrationName, [ + 'fields' => 'id:primaryKey, + address:string, + address2:string, + email:string', + ]); + + $this->assertCommandCreatedFile('create_foreign_key', $migrationName, [ + 'fields' => 'user_id:integer:foreignKey, + product_id:foreignKey:integer:unsigned:notNull, + order_id:integer:foreignKey(user_order):notNull, + created_at:dateTime:notNull', + ]); + + $this->assertCommandCreatedFile('create_prefix', $migrationName, [ + 'useTablePrefix' => true, + 'fields' => 'user_id:integer:foreignKey, + product_id:foreignKey:integer:unsigned:notNull, + order_id:integer:foreignKey(user_order):notNull, + created_at:dateTime:notNull', + ]); + } + + // @see https://github.com/yiisoft/yii2/issues/10876 + $this->assertCommandCreatedFile('create_products_from_store_table', 'create_products_from_store_table'); } public function testGenerateDropMigration() { - $migrationName = 'drop_test'; - $this->assertCommandCreatedFile('drop_test', $migrationName); - - $this->assertCommandCreatedFile('drop_fields', $migrationName, [ - 'fields' => 'body:text:notNull,price:money(11,2)' - ]); + $migrationNames = [ + 'drop_test_table', + ]; + foreach ($migrationNames as $migrationName) { + $this->assertCommandCreatedFile('drop_test', $migrationName); + + $this->assertCommandCreatedFile('drop_fields', $migrationName, [ + 'fields' => 'body:text:notNull,price:money(11,2)' + ]); + } + + // @see https://github.com/yiisoft/yii2/issues/10876 + $this->assertCommandCreatedFile('drop_products_from_store_table', 'drop_products_from_store_table'); } public function testGenerateAddColumnMigration() { - $migrationName = 'add_columns_to_test'; - $this->assertCommandCreatedFile('add_columns_test', $migrationName, [ - 'fields' => 'title:string(10):notNull, - body:text:notNull, - price:money(11,2):notNull, - created_at:dateTime' - ]); - - $this->assertCommandCreatedFile('add_columns_fk', $migrationName, [ - 'fields' => 'user_id:integer:foreignKey, - product_id:foreignKey:integer:unsigned:notNull, - order_id:integer:foreignKey(user_order):notNull, - created_at:dateTime:notNull', - ]); - - $this->assertCommandCreatedFile('add_columns_prefix', $migrationName, [ - 'useTablePrefix' => true, - 'fields' => 'user_id:integer:foreignKey, - product_id:foreignKey:integer:unsigned:notNull, - order_id:integer:foreignKey(user_order):notNull, - created_at:dateTime:notNull', - ]); + $migrationNames = [ + 'add_columns_column_to_test_table', + 'add_columns_columns_to_test_table', + ]; + foreach ($migrationNames as $migrationName) { + $this->assertCommandCreatedFile('add_columns_test', $migrationName, [ + 'fields' => 'title:string(10):notNull, + body:text:notNull, + price:money(11,2):notNull, + created_at:dateTime' + ]); + + $this->assertCommandCreatedFile('add_columns_fk', $migrationName, [ + 'fields' => 'user_id:integer:foreignKey, + product_id:foreignKey:integer:unsigned:notNull, + order_id:integer:foreignKey(user_order):notNull, + created_at:dateTime:notNull', + ]); + + $this->assertCommandCreatedFile('add_columns_prefix', $migrationName, [ + 'useTablePrefix' => true, + 'fields' => 'user_id:integer:foreignKey, + product_id:foreignKey:integer:unsigned:notNull, + order_id:integer:foreignKey(user_order):notNull, + created_at:dateTime:notNull', + ]); + } } public function testGenerateDropColumnMigration() { - $migrationName = 'drop_columns_from_test'; - $this->assertCommandCreatedFile('drop_columns_test', $migrationName, [ - 'fields' => 'title:string(10):notNull,body:text:notNull, - price:money(11,2):notNull, - created_at:dateTime' - ]); + $migrationNames = [ + 'drop_columns_column_from_test_table', + 'drop_columns_columns_from_test_table', + ]; + foreach ($migrationNames as $migrationName) { + $this->assertCommandCreatedFile('drop_columns_test', $migrationName, [ + 'fields' => 'title:string(10):notNull,body:text:notNull, + price:money(11,2):notNull, + created_at:dateTime' + ]); + } } public function testGenerateCreateJunctionMigration() { - $migrationName = 'create_junction_post_and_tag'; - $this->assertCommandCreatedFile('junction_test', $migrationName); + $migrationNames = [ + 'create_junction_post_and_tag_tables', + 'create_junction_for_post_and_tag_tables', + 'create_junction_table_for_post_and_tag_tables', + 'create_junction_table_for_post_and_tag_table', + ]; + foreach ($migrationNames as $migrationName) { + $this->assertCommandCreatedFile('junction_test', $migrationName); + } } public function testUp() From 062895111fb658a6aad7b09d462b45d6d5655fb9 Mon Sep 17 00:00:00 2001 From: Carsten Brandt Date: Mon, 4 Jul 2016 11:52:06 +0200 Subject: [PATCH 029/163] fixed php 7.1 test breaks that depend on ICU data version --- tests/framework/helpers/InflectorTest.php | 4 ++-- tests/framework/i18n/FormatterNumberTest.php | 6 +++++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/tests/framework/helpers/InflectorTest.php b/tests/framework/helpers/InflectorTest.php index cb15fc0..4a9a1c6 100644 --- a/tests/framework/helpers/InflectorTest.php +++ b/tests/framework/helpers/InflectorTest.php @@ -250,7 +250,7 @@ class InflectorTest extends TestCase 'العربي' => 'alʿrby', 'عرب' => 'ʿrb', // Hebrew - 'עִבְרִית' => 'ʻiberiyt', + 'עִבְרִית' => version_compare(INTL_ICU_DATA_VERSION, '57.1', '>=') ? '\'iberiyt' : 'ʻiberiyt', // Turkish 'Sanırım hepimiz aynı şeyi düşünüyoruz.' => 'Sanirim hepimiz ayni seyi dusunuyoruz.', @@ -293,7 +293,7 @@ class InflectorTest extends TestCase 'العربي' => 'alrby', 'عرب' => 'rb', // Hebrew - 'עִבְרִית' => 'iberiyt', + 'עִבְרִית' => version_compare(INTL_ICU_DATA_VERSION, '57.1', '>=') ? '\'iberiyt' : 'iberiyt', // Turkish 'Sanırım hepimiz aynı şeyi düşünüyoruz.' => 'Sanirim hepimiz ayni seyi dusunuyoruz.', diff --git a/tests/framework/i18n/FormatterNumberTest.php b/tests/framework/i18n/FormatterNumberTest.php index e0399b1..cfb6d20 100644 --- a/tests/framework/i18n/FormatterNumberTest.php +++ b/tests/framework/i18n/FormatterNumberTest.php @@ -264,7 +264,11 @@ class FormatterNumberTest extends TestCase // default russian currency symbol $this->formatter->locale = 'ru-RU'; $this->formatter->currencyCode = null; - $this->assertSame('123,00 руб.', $this->formatter->asCurrency('123')); + if (version_compare(INTL_ICU_DATA_VERSION, '57.1', '>=')) { + $this->assertSame('123,00 ₽', $this->formatter->asCurrency('123')); + } else { + $this->assertSame('123,00 руб.', $this->formatter->asCurrency('123')); + } $this->formatter->currencyCode = 'RUB'; $this->assertSame('123,00 руб.', $this->formatter->asCurrency('123')); From 73bc7aab71bbec4316338e3fa056be26c1fec82a Mon Sep 17 00:00:00 2001 From: stevekr Date: Sun, 3 Jul 2016 19:57:48 +0300 Subject: [PATCH 030/163] Fixes #11878: Fixed i18n gettext fallback language message loading --- framework/CHANGELOG.md | 1 + framework/i18n/GettextMessageSource.php | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index fd537d7..d05a591 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -54,6 +54,7 @@ Yii Framework 2 Change Log - Bug #11865: Fixed setting `selected` for dropdown list using options (samdark) - Bug #11528: Fixed MessageFormatter construction exception caught for PHP 7 compatibility (subdee, cebe) +- Bug #11878: Fixed i18n gettext fallback language message loading (stevekr) 2.0.8 April 28, 2016 -------------------- diff --git a/framework/i18n/GettextMessageSource.php b/framework/i18n/GettextMessageSource.php index 18981a6..16ddf81 100644 --- a/framework/i18n/GettextMessageSource.php +++ b/framework/i18n/GettextMessageSource.php @@ -73,7 +73,7 @@ class GettextMessageSource extends MessageSource $fallbackSourceLanguage = substr($this->sourceLanguage, 0, 2); if ($fallbackLanguage !== $language) { - $this->loadFallbackMessages($category, $fallbackLanguage, $messages, $messageFile); + $messages = $this->loadFallbackMessages($category, $fallbackLanguage, $messages, $messageFile); } elseif ($language === $fallbackSourceLanguage) { $messages = $this->loadFallbackMessages($category, $this->sourceLanguage, $messages, $messageFile); } else { From 07642098c061e03a7b804a3ffe7614ac43a58a60 Mon Sep 17 00:00:00 2001 From: Robert Korulczyk Date: Mon, 4 Jul 2016 12:11:34 +0200 Subject: [PATCH 031/163] Update db-migrations.md [skip ci] (#11886) --- docs/guide/db-migrations.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/guide/db-migrations.md b/docs/guide/db-migrations.md index b7e7908..a3600db 100644 --- a/docs/guide/db-migrations.md +++ b/docs/guide/db-migrations.md @@ -185,7 +185,7 @@ A list of all available methods for defining the column types is available in th Since version 2.0.7 migration console provides a convenient way to create migrations. -If the migration name is of a special form, for example `create_xxx_table` then the generated migration +If the migration name is of a special form, for example `create_xxx_table` or `drop_xxx_table` then the generated migration file will contain extra code, in this case for creating/dropping tables. In the following all variants of this feature are described. From 93f6ddfbe9cfd8a0c08fd5314e2908c6f1404ce8 Mon Sep 17 00:00:00 2001 From: Carsten Brandt Date: Mon, 4 Jul 2016 12:04:30 +0200 Subject: [PATCH 032/163] document the fact that widgets use output buffering so they may break ob stack when end() and begin() are called in different views. close #11687 --- docs/guide/structure-widgets.md | 5 +++++ framework/base/Widget.php | 4 ++++ 2 files changed, 9 insertions(+) diff --git a/docs/guide/structure-widgets.md b/docs/guide/structure-widgets.md index 27cde16..55ddb1f 100644 --- a/docs/guide/structure-widgets.md +++ b/docs/guide/structure-widgets.md @@ -68,6 +68,11 @@ use yii\helpers\Html; Note that unlike [[yii\base\Widget::widget()]] which returns the rendering result of a widget, the method [[yii\base\Widget::begin()]] returns an instance of the widget which you can use to build the widget content. +> Note: Some widgets will use [output buffering](http://php.net/manual/en/book.outcontrol.php) to adjust the enclosed +> content when [[yii\base\Widget::end()]] is called. For this reason calling [[yii\base\Widget::begin()]] and +> [[yii\base\Widget::end()]] is expected to happen in the same view file. +> Not following this rule may result in unexpected output. + ### Configuring global defaults diff --git a/framework/base/Widget.php b/framework/base/Widget.php index 7282d34..9f5d477 100644 --- a/framework/base/Widget.php +++ b/framework/base/Widget.php @@ -46,8 +46,11 @@ class Widget extends Component implements ViewContextInterface * Begins a widget. * This method creates an instance of the calling class. It will apply the configuration * to the created instance. A matching [[end()]] call should be called later. + * As some widgets may use output buffering, the [[end()]] call should be made in the same view + * to avoid breaking the nesting of output buffers. * @param array $config name-value pairs that will be used to initialize the object properties * @return static the newly created widget instance + * @see end() */ public static function begin($config = []) { @@ -64,6 +67,7 @@ class Widget extends Component implements ViewContextInterface * Note that the rendering result of the widget is directly echoed out. * @return static the widget instance that is ended. * @throws InvalidCallException if [[begin()]] and [[end()]] calls are not properly nested + * @see begin() */ public static function end() { From 43fddc74c957c44804024c8efc54dd0b0e2c54dd Mon Sep 17 00:00:00 2001 From: Nikola Kovacs Date: Mon, 7 Sep 2015 16:18:00 +0200 Subject: [PATCH 033/163] remove unnecessary gettimeofday system call close #9628 --- framework/i18n/Formatter.php | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/framework/i18n/Formatter.php b/framework/i18n/Formatter.php index 82018c6..9e82bd1 100644 --- a/framework/i18n/Formatter.php +++ b/framework/i18n/Formatter.php @@ -672,9 +672,7 @@ class Formatter extends Component } try { if (is_numeric($value)) { // process as unix timestamp, which is always in UTC - $timestamp = new DateTime(); - $timestamp->setTimezone(new DateTimeZone('UTC')); - $timestamp->setTimestamp($value); + $timestamp = new DateTime('@' . $value, new DateTimeZone('UTC')); return $checkTimeInfo ? [$timestamp, true] : $timestamp; } elseif (($timestamp = DateTime::createFromFormat('Y-m-d', $value, new DateTimeZone($this->defaultTimeZone))) !== false) { // try Y-m-d format (support invalid dates like 2012-13-01) return $checkTimeInfo ? [$timestamp, false] : $timestamp; From 07d3217706d9bd195b3c0b13b680d3c943d9e4ec Mon Sep 17 00:00:00 2001 From: Carsten Brandt Date: Mon, 4 Jul 2016 12:41:19 +0200 Subject: [PATCH 034/163] added test for negative date formatter values test for #9628 --- tests/framework/i18n/FormatterDateTest.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/framework/i18n/FormatterDateTest.php b/tests/framework/i18n/FormatterDateTest.php index 30c9e7b..7869fa1 100644 --- a/tests/framework/i18n/FormatterDateTest.php +++ b/tests/framework/i18n/FormatterDateTest.php @@ -205,7 +205,11 @@ class FormatterDateTest extends TestCase $value = time(); $this->assertSame("$value", $this->formatter->asTimestamp($value)); $this->assertSame("$value", $this->formatter->asTimestamp((string) $value)); + $this->assertSame("$value", $this->formatter->asTimestamp(date('Y-m-d H:i:s', $value))); + $value = -time(); + $this->assertSame("$value", $this->formatter->asTimestamp($value)); + $this->assertSame("$value", $this->formatter->asTimestamp((string) $value)); $this->assertSame("$value", $this->formatter->asTimestamp(date('Y-m-d H:i:s', $value))); // empty input From a46e88dea50d4979950ba27f0ace04ea2549e9f4 Mon Sep 17 00:00:00 2001 From: Carsten Brandt Date: Mon, 4 Jul 2016 13:41:02 +0200 Subject: [PATCH 035/163] fixed inverseof test assertation fixed wrong test to actually test what it should. current assertation is a duplicate. thanks to @laszlovl for spotting it. pr #8497 --- tests/framework/db/ActiveRecordTest.php | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tests/framework/db/ActiveRecordTest.php b/tests/framework/db/ActiveRecordTest.php index 3db0e64..6b64007 100644 --- a/tests/framework/db/ActiveRecordTest.php +++ b/tests/framework/db/ActiveRecordTest.php @@ -927,8 +927,10 @@ abstract class ActiveRecordTest extends DatabaseTestCase $customer = Customer::findOne(2); $orders = $customer->getOrders2()->all(); $this->assertTrue(count($orders) === 2); - $this->assertTrue($customer->orders2[0]->customer2 === $customer); - $this->assertTrue($customer->orders2[1]->customer2 === $customer); + $this->assertTrue($orders[0]->isRelationPopulated('customer2'), 'inverse relation did not populate the relation'); + $this->assertTrue($orders[1]->isRelationPopulated('customer2'), 'inverse relation did not populate the relation'); + $this->assertTrue($orders[0]->customer2 === $customer); + $this->assertTrue($orders[1]->customer2 === $customer); // the other way around $customer = Customer::find()->with('orders2')->where(['id' => 1])->asArray()->one(); From 8ca845b68093f61da8bb1b9a45d5c56f04f40108 Mon Sep 17 00:00:00 2001 From: stevekr Date: Mon, 4 Jul 2016 15:13:38 +0300 Subject: [PATCH 036/163] Fixes #11212: Added headers to PO file in `yii\i18n\GettextPoFile::save()` --- framework/CHANGELOG.md | 1 + framework/i18n/GettextPoFile.php | 16 +++++++++++++++- tests/framework/i18n/GettextPoFileTest.php | 7 +++++++ 3 files changed, 23 insertions(+), 1 deletion(-) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index d05a591..a028ef9 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -55,6 +55,7 @@ Yii Framework 2 Change Log - Bug #11528: Fixed MessageFormatter construction exception caught for PHP 7 compatibility (subdee, cebe) - Bug #11878: Fixed i18n gettext fallback language message loading (stevekr) +- Enh #11212: Added headers to PO file in `yii\i18n\GettextPoFile::save()` (stevekr) 2.0.8 April 28, 2016 -------------------- diff --git a/framework/i18n/GettextPoFile.php b/framework/i18n/GettextPoFile.php index 3f61141..55770ec 100644 --- a/framework/i18n/GettextPoFile.php +++ b/framework/i18n/GettextPoFile.php @@ -54,7 +54,21 @@ class GettextPoFile extends GettextFile */ public function save($filePath, $messages) { - $content = ''; + $language = str_replace('-', '_', basename(dirname($filePath))); + $headers = [ + 'msgid ""', + 'msgstr ""', + '"Project-Id-Version: \n"', + '"POT-Creation-Date: \n"', + '"PO-Revision-Date: \n"', + '"Last-Translator: \n"', + '"Language-Team: \n"', + '"Language: ' . $language . '\n"', + '"MIME-Version: 1.0\n"', + '"Content-Type: text/plain; charset=' . Yii::$app->charset . '\n"', + '"Content-Transfer-Encoding: 8bit\n"' + ]; + $content = implode("\n", $headers) . "\n\n"; foreach ($messages as $id => $message) { $separatorPosition = strpos($id, chr(4)); if ($separatorPosition !== false) { diff --git a/tests/framework/i18n/GettextPoFileTest.php b/tests/framework/i18n/GettextPoFileTest.php index 42aa24a..b7cf3f8 100644 --- a/tests/framework/i18n/GettextPoFileTest.php +++ b/tests/framework/i18n/GettextPoFileTest.php @@ -10,6 +10,13 @@ use yiiunit\TestCase; */ class GettextPoFileTest extends TestCase { + + protected function setUp() + { + parent::setUp(); + $this->mockApplication(); + } + public function testLoad() { $poFile = new GettextPoFile(); From 0f640c7138f089c065caae99605330a7c7ea6352 Mon Sep 17 00:00:00 2001 From: Laszlovl Date: Wed, 20 May 2015 08:46:37 -0400 Subject: [PATCH 037/163] Make sure inverseOf relations are also populated during dynamic relational queries Refs #6347 --- framework/CHANGELOG.md | 1 + framework/db/ActiveQuery.php | 5 ++++ framework/db/ActiveRelationTrait.php | 43 +++++++++++++++------------------ tests/framework/db/ActiveRecordTest.php | 26 ++++++++++++++++++++ 4 files changed, 51 insertions(+), 24 deletions(-) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index d05a591..7fa4286 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -332,6 +332,7 @@ Yii Framework 2 Change Log - Enh #5991: Added `updateMessages()` to `yii.activeForm.js` to support manually updating ActiveForm messages (nkovacs) - Enh #6043: Specification for 'class' and 'style' in array format added to `yii\helpers\Html` (klimov-paul) - Enh #6853: Console application will now register PHP constants for `STDIN`, `STDOUT`, and `STDERR` itself if they are not defined (cebe) +- Bug #6347: `inverseOf()` not working for dynamic relational queries (laszlovl) - Enh #7169: `yii\widgets\ActiveField` now uses corresponding methods for default parts rendering (klimov-paul) - Enh #7259: Added `errorAttributes` parameter to ActiveForm `afterValidate` event. Made scrolling to first error optional (nkovacs) - Enh #8070: `yii\console\controllers\MessageController` now sorts created messages, even if there is no new one, while saving to PHP file (klimov-paul) diff --git a/framework/db/ActiveQuery.php b/framework/db/ActiveQuery.php index 3a53a7a..a79e15b 100644 --- a/framework/db/ActiveQuery.php +++ b/framework/db/ActiveQuery.php @@ -214,6 +214,11 @@ class ActiveQuery extends Query implements ActiveQueryInterface if (!empty($this->with)) { $this->findWith($this->with, $models); } + + if ($this->inverseOf !== null) { + $this->addInverseRelations($models); + } + if (!$this->asArray) { foreach ($models as $model) { $model->afterFind(); diff --git a/framework/db/ActiveRelationTrait.php b/framework/db/ActiveRelationTrait.php index 0a31031..eddcc3e 100644 --- a/framework/db/ActiveRelationTrait.php +++ b/framework/db/ActiveRelationTrait.php @@ -154,37 +154,32 @@ trait ActiveRelationTrait } } - $related = $this->multiple ? $this->all() : $this->one(); + return $this->multiple ? $this->all() : $this->one(); + } - if ($this->inverseOf === null || empty($related)) { - return $related; + /** + * If applicable, populate the query's primary model into the related records' inverse relationship + * @param array $result the array of related records as generated by [[populate()]] + */ + private function addInverseRelations(&$result) + { + if ($this->inverseOf === null) { + return; } - if ($this->multiple) { - foreach ($related as $i => $relatedModel) { - if ($relatedModel instanceof ActiveRecordInterface) { - if (!isset($inverseRelation)) { - $inverseRelation = $relatedModel->getRelation($this->inverseOf); - } - $relatedModel->populateRelation($this->inverseOf, $inverseRelation->multiple ? [$model] : $model); - } else { - if (!isset($inverseRelation)) { - $inverseRelation = (new $this->modelClass)->getRelation($this->inverseOf); - } - $related[$i][$this->inverseOf] = $inverseRelation->multiple ? [$model] : $model; + foreach ($result as $i => $relatedModel) { + if ($relatedModel instanceof ActiveRecordInterface) { + if (!isset($inverseRelation)) { + $inverseRelation = $relatedModel->getRelation($this->inverseOf); } - } - } else { - if ($related instanceof ActiveRecordInterface) { - $inverseRelation = $related->getRelation($this->inverseOf); - $related->populateRelation($this->inverseOf, $inverseRelation->multiple ? [$model] : $model); + $relatedModel->populateRelation($this->inverseOf, $inverseRelation->multiple ? [$this->primaryModel] : $this->primaryModel); } else { - $inverseRelation = (new $this->modelClass)->getRelation($this->inverseOf); - $related[$this->inverseOf] = $inverseRelation->multiple ? [$model] : $model; + if (!isset($inverseRelation)) { + $inverseRelation = (new $this->modelClass)->getRelation($this->inverseOf); + } + $result[$i][$this->inverseOf] = $inverseRelation->multiple ? [$this->primaryModel] : $this->primaryModel; } } - - return $related; } /** diff --git a/tests/framework/db/ActiveRecordTest.php b/tests/framework/db/ActiveRecordTest.php index 6b64007..b1d5780 100644 --- a/tests/framework/db/ActiveRecordTest.php +++ b/tests/framework/db/ActiveRecordTest.php @@ -964,6 +964,32 @@ abstract class ActiveRecordTest extends DatabaseTestCase $this->assertTrue($orders[1]['customer2']['orders2'][1]['id'] === $orders[1]['id']); } + public function testInverseOfDynamic() + { + $customer = Customer::findOne(1); + + // request the inverseOf relation without explicitly (eagerly) loading it + $orders2 = $customer->getOrders2()->all(); + $this->assertSame($customer, $orders2[0]->customer2); + + $orders2 = $customer->getOrders2()->one(); + $this->assertSame($customer, $orders2->customer2); + + // request the inverseOf relation while also explicitly eager loading it (while possible, this is of course redundant) + $orders2 = $customer->getOrders2()->with('customer2')->all(); + $this->assertSame($customer, $orders2[0]->customer2); + + $orders2 = $customer->getOrders2()->with('customer2')->one(); + $this->assertSame($customer, $orders2->customer2); + + // request the inverseOf relation as array + $orders2 = $customer->getOrders2()->asArray()->all(); + $this->assertEquals($customer['id'], $orders2[0]['customer2']['id']); + + $orders2 = $customer->getOrders2()->asArray()->one(); + $this->assertEquals($customer['id'], $orders2['customer2']['id']); + } + public function testDefaultValues() { $model = new Type(); From 1c200626287588b53b51c3abec4ba653c0962f31 Mon Sep 17 00:00:00 2001 From: Carsten Brandt Date: Mon, 4 Jul 2016 15:16:45 +0200 Subject: [PATCH 038/163] fixed changelog position --- framework/CHANGELOG.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index 9f7a089..1033371 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -53,9 +53,10 @@ Yii Framework 2 Change Log - Bug #11863: Fixed usage of `mb_substr` with PHP < 5.4.8 where length of NULL was treated the same as 0 (samdark) - Bug #11865: Fixed setting `selected` for dropdown list using options (samdark) - Bug #11528: Fixed MessageFormatter construction exception caught for PHP 7 compatibility (subdee, cebe) - - Bug #11878: Fixed i18n gettext fallback language message loading (stevekr) - Enh #11212: Added headers to PO file in `yii\i18n\GettextPoFile::save()` (stevekr) +- Bug #6347: `inverseOf()` not working for dynamic relational queries (laszlovl) + 2.0.8 April 28, 2016 -------------------- @@ -333,7 +334,6 @@ Yii Framework 2 Change Log - Enh #5991: Added `updateMessages()` to `yii.activeForm.js` to support manually updating ActiveForm messages (nkovacs) - Enh #6043: Specification for 'class' and 'style' in array format added to `yii\helpers\Html` (klimov-paul) - Enh #6853: Console application will now register PHP constants for `STDIN`, `STDOUT`, and `STDERR` itself if they are not defined (cebe) -- Bug #6347: `inverseOf()` not working for dynamic relational queries (laszlovl) - Enh #7169: `yii\widgets\ActiveField` now uses corresponding methods for default parts rendering (klimov-paul) - Enh #7259: Added `errorAttributes` parameter to ActiveForm `afterValidate` event. Made scrolling to first error optional (nkovacs) - Enh #8070: `yii\console\controllers\MessageController` now sorts created messages, even if there is no new one, while saving to PHP file (klimov-paul) From 65232792b9c7ba32c66d1e85be5532bc4acee614 Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Tue, 5 Jul 2016 23:05:39 +0300 Subject: [PATCH 039/163] #10503: Added note about flusing APC and OpCache from CLI --- framework/console/controllers/CacheController.php | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/framework/console/controllers/CacheController.php b/framework/console/controllers/CacheController.php index a2f6fe4..a7faa61 100644 --- a/framework/console/controllers/CacheController.php +++ b/framework/console/controllers/CacheController.php @@ -32,6 +32,12 @@ use yii\console\Exception; * configured are different from web application, web application cache won't be cleared. In order to fix it please * duplicate web application cache components in console config. You can use any component names. * + * Both APC and OpCache aren't shared between PHP processes so flushing cache from command line has no effect on web. + * Flushing web cache could be either done by: + * + * - Putting a php file under web root and calling it via HTTP + * - Using [Cachetool](http://gordalina.github.io/cachetool/) + * * @author Alexander Makarov * @author Mark Jebri * @since 2.0 From 7fb447506d166097e20ea21cd3a067e967288e01 Mon Sep 17 00:00:00 2001 From: Carsten Brandt Date: Wed, 6 Jul 2016 00:11:07 +0200 Subject: [PATCH 040/163] fix mixed case column names for unique indexes in postgres fixes #10613 --- framework/CHANGELOG.md | 1 + framework/db/pgsql/Schema.php | 8 +++++++- tests/framework/db/SchemaTest.php | 36 ++++++++++++++++++++++++++++++++++++ 3 files changed, 44 insertions(+), 1 deletion(-) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index 1033371..95df568 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -56,6 +56,7 @@ Yii Framework 2 Change Log - Bug #11878: Fixed i18n gettext fallback language message loading (stevekr) - Enh #11212: Added headers to PO file in `yii\i18n\GettextPoFile::save()` (stevekr) - Bug #6347: `inverseOf()` not working for dynamic relational queries (laszlovl) +- Bug #10613: Fixed PostgreSQL Schema to return correct column names for unique indexes that have mixed case column names (cebe) 2.0.8 April 28, 2016 diff --git a/framework/db/pgsql/Schema.php b/framework/db/pgsql/Schema.php index 149245c..d99eb55 100644 --- a/framework/db/pgsql/Schema.php +++ b/framework/db/pgsql/Schema.php @@ -370,7 +370,13 @@ SQL; $rows = $this->getUniqueIndexInformation($table); foreach ($rows as $row) { - $uniqueIndexes[$row['indexname']][] = $row['columnname']; + $column = $row['columnname']; + if (!empty($column) && $column[0] === '"') { + // postgres will quote names that are not lowercase-only + // https://github.com/yiisoft/yii2/issues/10613 + $column = substr($column, 1, -1); + } + $uniqueIndexes[$row['indexname']][] = $column; } return $uniqueIndexes; diff --git a/tests/framework/db/SchemaTest.php b/tests/framework/db/SchemaTest.php index a2dd590..3f1002e 100644 --- a/tests/framework/db/SchemaTest.php +++ b/tests/framework/db/SchemaTest.php @@ -377,4 +377,40 @@ abstract class SchemaTest extends DatabaseTestCase $this->assertSame('', $columnSchema->dbTypecast('')); } + public function testFindUniqueIndexes() + { + $db = $this->getConnection(); + + try { + $db->createCommand()->dropTable('uniqueIndex')->execute(); + } catch(\Exception $e) { + } + $db->createCommand()->createTable('uniqueIndex', [ + 'somecol' => 'string', + 'someCol2' => 'string', + ])->execute(); + + /* @var $schema Schema */ + $schema = $db->schema; + + $uniqueIndexes = $schema->findUniqueIndexes($schema->getTableSchema('uniqueIndex', true)); + $this->assertEquals([], $uniqueIndexes); + + $db->createCommand()->createIndex('somecolUnique', 'uniqueIndex', 'somecol', true)->execute(); + + $uniqueIndexes = $schema->findUniqueIndexes($schema->getTableSchema('uniqueIndex', true)); + $this->assertEquals([ + 'somecolUnique' => ['somecol'], + ], $uniqueIndexes); + + // create another column with upper case letter that fails postgres + // see https://github.com/yiisoft/yii2/issues/10613 + $db->createCommand()->createIndex('someCol2Unique', 'uniqueIndex', 'someCol2', true)->execute(); + + $uniqueIndexes = $schema->findUniqueIndexes($schema->getTableSchema('uniqueIndex', true)); + $this->assertEquals([ + 'somecolUnique' => ['somecol'], + 'someCol2Unique' => ['someCol2'], + ], $uniqueIndexes); + } } From 8c17e4a6c13e9336800f42bbdb9652759b0c9fa1 Mon Sep 17 00:00:00 2001 From: Carsten Brandt Date: Wed, 6 Jul 2016 00:33:30 +0200 Subject: [PATCH 041/163] updated jQuery dependency to include 1.12.x close #11364 --- composer.json | 2 +- framework/CHANGELOG.md | 1 + framework/composer.json | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/composer.json b/composer.json index 8d52e52..f155ee5 100644 --- a/composer.json +++ b/composer.json @@ -68,7 +68,7 @@ "yiisoft/yii2-composer": "~2.0.4", "ezyang/htmlpurifier": "~4.6", "cebe/markdown": "~1.0.0 | ~1.1.0", - "bower-asset/jquery": "2.2.*@stable | 2.1.*@stable | 1.11.*@stable", + "bower-asset/jquery": "2.2.*@stable | 2.1.*@stable | 1.11.*@stable | 1.12.*@stable", "bower-asset/jquery.inputmask": "~3.2.2", "bower-asset/punycode": "1.3.*", "bower-asset/yii2-pjax": "~2.0.1" diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index 95df568..9993695 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -57,6 +57,7 @@ Yii Framework 2 Change Log - Enh #11212: Added headers to PO file in `yii\i18n\GettextPoFile::save()` (stevekr) - Bug #6347: `inverseOf()` not working for dynamic relational queries (laszlovl) - Bug #10613: Fixed PostgreSQL Schema to return correct column names for unique indexes that have mixed case column names (cebe) +- Chg #11364: Updated jQuery dependency to include versions `1.12.*` (cebe) 2.0.8 April 28, 2016 diff --git a/framework/composer.json b/framework/composer.json index e4ada6d..4ca2f0f 100644 --- a/framework/composer.json +++ b/framework/composer.json @@ -64,7 +64,7 @@ "yiisoft/yii2-composer": "~2.0.4", "ezyang/htmlpurifier": "~4.6", "cebe/markdown": "~1.0.0 | ~1.1.0", - "bower-asset/jquery": "2.2.*@stable | 2.1.*@stable | 1.11.*@stable", + "bower-asset/jquery": "2.2.*@stable | 2.1.*@stable | 1.11.*@stable | 1.12.*@stable", "bower-asset/jquery.inputmask": "~3.2.2", "bower-asset/punycode": "1.3.*", "bower-asset/yii2-pjax": "~2.0.1" From 16f065be479eaee525bcc4e90711d8cc7fdd9142 Mon Sep 17 00:00:00 2001 From: Evgeniy Moiseenko Date: Wed, 6 Jul 2016 14:05:41 +0500 Subject: [PATCH 042/163] Correcting Russian translate (#11904) [skip ci] --- docs/guide-ru/input-multiple-models.md | 2 +- docs/guide-ru/output-sorting.md | 2 +- docs/guide-ru/output-theming.md | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/guide-ru/input-multiple-models.md b/docs/guide-ru/input-multiple-models.md index e4dd9af..ad9d605 100644 --- a/docs/guide-ru/input-multiple-models.md +++ b/docs/guide-ru/input-multiple-models.md @@ -52,7 +52,7 @@ class UserController extends Controller } ``` -В действии `update`, мы сначала загружаем из базы модели `$user` and `$profile`. Затем мы вызываем метод [[yii\base\Model::load()]] +В действии `update`, мы сначала загружаем из базы модели `$user` и `$profile`. Затем мы вызываем метод [[yii\base\Model::load()]] для заполнения этих двух моделей данными, введенными пользователем. В случае успеха мы проверяем модели и сохраняем их. В противном случае мы рендерим представление `update`, которое содержит следующий контент: diff --git a/docs/guide-ru/output-sorting.md b/docs/guide-ru/output-sorting.md index 8b7d241..0e54f13 100644 --- a/docs/guide-ru/output-sorting.md +++ b/docs/guide-ru/output-sorting.md @@ -47,7 +47,7 @@ foreach ($models as $model) { } ``` -В примере выше, мы объявляем два атрибута, которые поддерживают сортировку: `name` and `age`. +В примере выше, мы объявляем два атрибута, которые поддерживают сортировку: `name` и `age`. Мы передаем информацию о сортировке в запрос статьи, поэтому результаты запроса будут отсортированы согласно сортировке, установленной в объекте Sort. В представлении, мы отображаем две ссылки, которые ведут на страницы с данными, отсортированными по соответствующим атрибутам. diff --git a/docs/guide-ru/output-theming.md b/docs/guide-ru/output-theming.md index e5b853e..4473ffb 100644 --- a/docs/guide-ru/output-theming.md +++ b/docs/guide-ru/output-theming.md @@ -5,7 +5,7 @@ замечательно подходит для изменения внешнего вида приложения. Для того, чтобы начать использовать темизацию, настройте свойство [[yii\base\View::theme|theme]] компонента -приложения `view`. Конфигурация настраивает объект [[yii\base\Theme]], который отвечает за то, как как именно +приложения `view`. Конфигурация настраивает объект [[yii\base\Theme]], который отвечает за то, как именно заменяются файлы отображений. Главным образом, стоит настроить следующие свойства [[yii\base\Theme]]: - [[yii\base\Theme::basePath]]: базовая директория, в которой размещены темизированные ресурсы (CSS, JS, изображения, From bcc19e97cb60b9cc97e9d675ca23b7770c7876e5 Mon Sep 17 00:00:00 2001 From: Carsten Brandt Date: Wed, 6 Jul 2016 13:00:18 +0200 Subject: [PATCH 043/163] added note about Oracle DB connection charset close #11387 --- framework/db/Connection.php | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/framework/db/Connection.php b/framework/db/Connection.php index efa1e63..e1c4ae0 100644 --- a/framework/db/Connection.php +++ b/framework/db/Connection.php @@ -238,10 +238,13 @@ class Connection extends Component /** * @var string the charset used for database connection. The property is only used * for MySQL, PostgreSQL and CUBRID databases. Defaults to null, meaning using default charset - * as specified by the database. + * as configured by the database. * - * Note that if you're using GBK or BIG5 then it's highly recommended to - * specify charset via DSN like 'mysql:dbname=mydatabase;host=127.0.0.1;charset=GBK;'. + * For Oracle Database, the charset must be specified in the [[dsn]], for example for UTF-8 by appending `;charset=UTF-8` + * to the DSN string. + * + * The same applies for if you're using GBK or BIG5 charset with MySQL, then it's highly recommended to + * specify charset via [[dsn]] like `'mysql:dbname=mydatabase;host=127.0.0.1;charset=GBK;'`. */ public $charset; /** From 393d945a7b3ad8eb58c826934e1ef98f812f4c43 Mon Sep 17 00:00:00 2001 From: Carsten Brandt Date: Wed, 6 Jul 2016 13:21:03 +0200 Subject: [PATCH 044/163] response formatting docs about JSON configuration close #11399 --- docs/guide/rest-response-formatting.md | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/docs/guide/rest-response-formatting.md b/docs/guide/rest-response-formatting.md index 6b0eace..996cff1 100644 --- a/docs/guide/rest-response-formatting.md +++ b/docs/guide/rest-response-formatting.md @@ -155,3 +155,33 @@ Content-Type: application/json; charset=UTF-8 } } ``` + +### Controlling JSON output + +The JSON response is generated by the [[yii\web\JsonResponseFormatter|JsonResponseFormatter]] class which will +use the [[yii\helpers\Json|JSON helper]] internally. This formatter can be configured with different options like +for example the [[yii\web\JsonResponseFormatter::$prettyPrint|$prettyPrint]] option, which is useful on development for +better readable responses, or [[yii\web\JsonResponseFormatter::$encodeOptions|$encodeOptions]] to control the output +of the JSON encoding. + +The formatter can be configured in the [[yii\web\Response::formatters|formatters]] property of the `response` application +component in the application [configuration](concept-configuration.md) like the following: + +```php +'response' => [ + // ... + 'formatters' => [ + \yii\web\Response::FORMAT_JSON => [ + 'class' => 'yii\web\JsonResponseFormatter', + 'prettyPrint' => YII_DEBUG, // use "pretty" output in debug mode + 'encodeOptions' => JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE, + // ... + ], + ], +], +``` + +When returning data from a database using the [DAO](db-dao.md) database layer all data will be represented +as strings, which is not always the expected result especially numeric values should be represented as +numbers in JSON. When using the ActiveRecord layer for retrieving data from the database, the values for numeric +columns will be converted to integers when data is fetched from the database in [[yii\db\ActiveRecord::populateRecord()]]. From e0ace833d0e12b22339b42da3433ceddc7c9054f Mon Sep 17 00:00:00 2001 From: PowerGamer1 Date: Mon, 11 Apr 2016 11:59:34 +0300 Subject: [PATCH 045/163] Added Error message for combined attributes to unique validator - error message `$comboNotUnique` to include model attribute labels instead of attribute names. - Fixes #11322 close #11323 --- framework/CHANGELOG.md | 1 + framework/validators/UniqueValidator.php | 39 +++++++++++++++++++++++++++++++- 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index 9993695..6df177e 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -57,6 +57,7 @@ Yii Framework 2 Change Log - Enh #11212: Added headers to PO file in `yii\i18n\GettextPoFile::save()` (stevekr) - Bug #6347: `inverseOf()` not working for dynamic relational queries (laszlovl) - Bug #10613: Fixed PostgreSQL Schema to return correct column names for unique indexes that have mixed case column names (cebe) +- Bug #11322: Fixed incorrect error message in `yii\validators\UniqueValidator` for composite `targetAttribute` (PowerGamer1, silverfire, cebe) - Chg #11364: Updated jQuery dependency to include versions `1.12.*` (cebe) diff --git a/framework/validators/UniqueValidator.php b/framework/validators/UniqueValidator.php index b0f415e..5e677dd 100644 --- a/framework/validators/UniqueValidator.php +++ b/framework/validators/UniqueValidator.php @@ -58,6 +58,15 @@ class UniqueValidator extends Validator * is the [[\yii\db\Query|Query]] object that you can modify in the function. */ public $filter; + /** + * @var string the user-defined error message used when [[targetAttribute]] is an array. It may contain the following placeholders: + * + * - `{attributes}`: the labels of the attributes being validated. + * - `{values}`: the values of the attributes being validated. + * + * @since 2.0.9 + */ + public $comboNotUnique; /** @@ -69,6 +78,9 @@ class UniqueValidator extends Validator if ($this->message === null) { $this->message = Yii::t('yii', '{attribute} "{value}" has already been taken.'); } + if ($this->comboNotUnique === null) { + $this->comboNotUnique = Yii::t('yii', 'The combination {values} of {attributes} has already been taken.'); + } } /** @@ -133,7 +145,32 @@ class UniqueValidator extends Validator } if ($exists) { - $this->addError($model, $attribute, $this->message); + if (is_array($targetAttribute)) { + $this->addComboNotUniqueError($model, $attribute); + } else { + $this->addError($model, $attribute, $this->message); + } + } + } + + /** + * Builds and adds [[comboNotUnique]] error message to the specified model attribute. + * @param \yii\base\Model $model the data model. + * @param string $attribute the name of the attribute. + */ + private function addComboNotUniqueError($model, $attribute) + { + $attributeCombo = []; + $valueCombo = []; + foreach ($this->targetAttribute as $key => $value) { + if(is_int($key)) { + $attributeCombo[] = $model->getAttributeLabel($value); + $valueCombo[] = '"' . $model->$value . '"'; + } else { + $attributeCombo[] = $model->getAttributeLabel($key); + $valueCombo[] = '"' . $model->$key . '"'; + } } + $this->addError($model, $attribute, $this->comboNotUnique, ['attributes' => implode(', ', $attributeCombo), 'values' => implode(', ', $valueCombo)]); } } From d2dd232b6f7e3af2c31f0ddc71f6963e771695d7 Mon Sep 17 00:00:00 2001 From: Carsten Brandt Date: Wed, 6 Jul 2016 14:27:50 +0200 Subject: [PATCH 046/163] message improvement and test for #11323 --- framework/validators/UniqueValidator.php | 8 ++++++-- tests/framework/db/mysql/ExistValidatorTest.php | 2 +- tests/framework/validators/UniqueValidatorTest.php | 5 +++++ 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/framework/validators/UniqueValidator.php b/framework/validators/UniqueValidator.php index 5e677dd..e9503e9 100644 --- a/framework/validators/UniqueValidator.php +++ b/framework/validators/UniqueValidator.php @@ -9,6 +9,7 @@ namespace yii\validators; use Yii; use yii\db\ActiveRecordInterface; +use yii\helpers\Inflector; /** * UniqueValidator validates that the attribute value is unique in the specified database table. @@ -145,7 +146,7 @@ class UniqueValidator extends Validator } if ($exists) { - if (is_array($targetAttribute)) { + if (count($targetAttribute) > 1) { $this->addComboNotUniqueError($model, $attribute); } else { $this->addError($model, $attribute, $this->message); @@ -171,6 +172,9 @@ class UniqueValidator extends Validator $valueCombo[] = '"' . $model->$key . '"'; } } - $this->addError($model, $attribute, $this->comboNotUnique, ['attributes' => implode(', ', $attributeCombo), 'values' => implode(', ', $valueCombo)]); + $this->addError($model, $attribute, $this->comboNotUnique, [ + 'attributes' => Inflector::sentence($attributeCombo), + 'values' => implode('-', $valueCombo) + ]); } } diff --git a/tests/framework/db/mysql/ExistValidatorTest.php b/tests/framework/db/mysql/ExistValidatorTest.php index 877747a..d7269f9 100644 --- a/tests/framework/db/mysql/ExistValidatorTest.php +++ b/tests/framework/db/mysql/ExistValidatorTest.php @@ -9,5 +9,5 @@ namespace yiiunit\framework\db\mysql; */ class ExistValidatorTest extends \yiiunit\framework\validators\ExistValidatorTest { - public $driverName = 'sqlsrv'; + public $driverName = 'mysql'; } diff --git a/tests/framework/validators/UniqueValidatorTest.php b/tests/framework/validators/UniqueValidatorTest.php index 0130a25..ceb01f7 100644 --- a/tests/framework/validators/UniqueValidatorTest.php +++ b/tests/framework/validators/UniqueValidatorTest.php @@ -123,11 +123,13 @@ abstract class UniqueValidatorTest extends DatabaseTestCase $m->item_id = 1; $val->validateAttribute($m, 'order_id'); $this->assertTrue($m->hasErrors('order_id')); + $this->assertStringStartsWith('The combination "1"-"1" of Order Id and Item Id', $m->getFirstError('order_id')); // validate new record $m = new OrderItem(['order_id' => 1, 'item_id' => 2]); $val->validateAttribute($m, 'order_id'); $this->assertTrue($m->hasErrors('order_id')); + $this->assertStringStartsWith('The combination "1"-"2" of Order Id and Item Id', $m->getFirstError('order_id')); $m = new OrderItem(['order_id' => 10, 'item_id' => 2]); $val->validateAttribute($m, 'order_id'); $this->assertFalse($m->hasErrors('order_id')); @@ -141,10 +143,12 @@ abstract class UniqueValidatorTest extends DatabaseTestCase $m = Order::findOne(1); $val->validateAttribute($m, 'id'); $this->assertTrue($m->hasErrors('id')); + $this->assertStringStartsWith('Id "1" has already been taken.', $m->getFirstError('id')); $m = Order::findOne(1); $m->id = 2; $val->validateAttribute($m, 'id'); $this->assertTrue($m->hasErrors('id')); + $this->assertStringStartsWith('Id "2" has already been taken.', $m->getFirstError('id')); $m = Order::findOne(1); $m->id = 10; $val->validateAttribute($m, 'id'); @@ -153,6 +157,7 @@ abstract class UniqueValidatorTest extends DatabaseTestCase $m = new Order(['id' => 1]); $val->validateAttribute($m, 'id'); $this->assertTrue($m->hasErrors('id')); + $this->assertStringStartsWith('Id "1" has already been taken.', $m->getFirstError('id')); $m = new Order(['id' => 10]); $val->validateAttribute($m, 'id'); $this->assertFalse($m->hasErrors('id')); From 6b6fa96319fa3b926ea6958b6f5cad83be3b7251 Mon Sep 17 00:00:00 2001 From: Angel Guevara Date: Fri, 1 Apr 2016 02:27:27 -0600 Subject: [PATCH 047/163] Fix #11252 use strict comparison on hasAttribute() close #11256 --- framework/CHANGELOG.md | 1 + framework/db/BaseActiveRecord.php | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index 6df177e..56168b9 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -59,6 +59,7 @@ Yii Framework 2 Change Log - Bug #10613: Fixed PostgreSQL Schema to return correct column names for unique indexes that have mixed case column names (cebe) - Bug #11322: Fixed incorrect error message in `yii\validators\UniqueValidator` for composite `targetAttribute` (PowerGamer1, silverfire, cebe) - Chg #11364: Updated jQuery dependency to include versions `1.12.*` (cebe) +- Bug #11252: Use strict comparison on ActiveRecord::hasAttribute() to avoid cases where it returns true when a number is passed to it (Faryshta) 2.0.8 April 28, 2016 diff --git a/framework/db/BaseActiveRecord.php b/framework/db/BaseActiveRecord.php index 3606d5f..da9601d 100644 --- a/framework/db/BaseActiveRecord.php +++ b/framework/db/BaseActiveRecord.php @@ -424,7 +424,7 @@ abstract class BaseActiveRecord extends Model implements ActiveRecordInterface */ public function hasAttribute($name) { - return isset($this->_attributes[$name]) || in_array($name, $this->attributes()); + return isset($this->_attributes[$name]) || in_array($name, $this->attributes(), true); } /** From 326cdfeb52601fb2a1d86492c2c03d40b959936d Mon Sep 17 00:00:00 2001 From: Carsten Brandt Date: Wed, 6 Jul 2016 14:51:59 +0200 Subject: [PATCH 048/163] added test for #11256 --- framework/db/Connection.php | 2 +- tests/framework/ar/ActiveRecordTestTrait.php | 20 ++++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/framework/db/Connection.php b/framework/db/Connection.php index e1c4ae0..430e7c2 100644 --- a/framework/db/Connection.php +++ b/framework/db/Connection.php @@ -616,7 +616,7 @@ class Connection extends Component if ($this->emulatePrepare !== null && constant('PDO::ATTR_EMULATE_PREPARES')) { $this->pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, $this->emulatePrepare); } - if ($this->charset !== null && in_array($this->getDriverName(), ['pgsql', 'mysql', 'mysqli', 'cubrid'])) { + if ($this->charset !== null && in_array($this->getDriverName(), ['pgsql', 'mysql', 'mysqli', 'cubrid'], true)) { $this->pdo->exec('SET NAMES ' . $this->pdo->quote($this->charset)); } $this->trigger(self::EVENT_AFTER_OPEN); diff --git a/tests/framework/ar/ActiveRecordTestTrait.php b/tests/framework/ar/ActiveRecordTestTrait.php index 9334838..710ff52 100644 --- a/tests/framework/ar/ActiveRecordTestTrait.php +++ b/tests/framework/ar/ActiveRecordTestTrait.php @@ -141,6 +141,26 @@ trait ActiveRecordTestTrait $this->assertArrayHasKey('status', $customers[2]); } + public function testHasAttribute() + { + /* @var $customerClass \yii\db\ActiveRecordInterface */ + $customerClass = $this->getCustomerClass(); + + $customer = new $customerClass; + $this->assertTrue($customer->hasAttribute('id')); + $this->assertTrue($customer->hasAttribute('email')); + $this->assertFalse($customer->hasAttribute(0)); + $this->assertFalse($customer->hasAttribute(null)); + $this->assertFalse($customer->hasAttribute(42)); + + $customer = $customerClass::findOne(1); + $this->assertTrue($customer->hasAttribute('id')); + $this->assertTrue($customer->hasAttribute('email')); + $this->assertFalse($customer->hasAttribute(0)); + $this->assertFalse($customer->hasAttribute(null)); + $this->assertFalse($customer->hasAttribute(42)); + } + public function testFindScalar() { /* @var $customerClass \yii\db\ActiveRecordInterface */ From 8c240ed0679d55676134ea91eb12f7e5967a7a58 Mon Sep 17 00:00:00 2001 From: Angel Guevara Date: Mon, 6 Jun 2016 23:15:01 -0500 Subject: [PATCH 049/163] Fixes #11683: Fixed fixture command to work with short syntax. `yii fixture "*, -User"` should be used instead of `yii fixture "*" -User` --- docs/guide-es/test-fixtures.md | 8 ++--- docs/guide-ja/test-fixtures.md | 8 ++--- docs/guide-ru/test-fixtures.md | 8 ++--- docs/guide/test-fixtures.md | 8 ++--- framework/CHANGELOG.md | 1 + framework/UPGRADE.md | 2 ++ .../console/controllers/FixtureController.php | 34 ++++++++------------ .../console/controllers/FixtureControllerTest.php | 37 ++++++++++++---------- 8 files changed, 53 insertions(+), 53 deletions(-) diff --git a/docs/guide-es/test-fixtures.md b/docs/guide-es/test-fixtures.md index 445617d..238f636 100644 --- a/docs/guide-es/test-fixtures.md +++ b/docs/guide-es/test-fixtures.md @@ -310,7 +310,7 @@ yii fixture/load User yii fixture User // carga varios fixtures -yii fixture User UserProfile +yii fixture "User, UserProfile" // carga todos los fixtures yii fixture/load "*" @@ -319,7 +319,7 @@ yii fixture/load "*" yii fixture "*" // carga todos los fixtures excepto uno -yii fixture "*" -DoNotLoadThisOne +yii fixture "*, -DoNotLoadThisOne" // carga fixtures, pero los busca en diferente espacio de nombre. El espacio de nombre por defecto es: tests\unit\fixtures. yii fixture User --namespace='alias\my\custom\namespace' @@ -340,13 +340,13 @@ Para descargar un fixture, ejecuta el siguiente comando: yii fixture/unload User // descarga varios fixtures -yii fixture/unload User,UserProfile +yii fixture/unload "User, UserProfile" // descarga todos los fixtures yii fixture/unload "*" // descarga todos los fixtures excepto uno -yii fixture/unload "*" -DoNotUnloadThisOne +yii fixture/unload "*, -DoNotUnloadThisOne" ``` diff --git a/docs/guide-ja/test-fixtures.md b/docs/guide-ja/test-fixtures.md index c08f40d..c948f98 100644 --- a/docs/guide-ja/test-fixtures.md +++ b/docs/guide-ja/test-fixtures.md @@ -307,7 +307,7 @@ yii fixture/load User yii fixture User // load several fixtures -yii fixture User UserProfile +yii fixture "User, UserProfile" // load all fixtures yii fixture/load "*" @@ -316,7 +316,7 @@ yii fixture/load "*" yii fixture "*" // load all fixtures except ones -yii fixture "*" -DoNotLoadThisOne +yii fixture "*, -DoNotLoadThisOne" // load fixtures, but search them in different namespace. By default namespace is: tests\unit\fixtures. yii fixture User --namespace='alias\my\custom\namespace' @@ -337,13 +337,13 @@ To unload fixture, run the following command: yii fixture/unload User // Unload several fixtures -yii fixture/unload User,UserProfile +yii fixture/unload "User, UserProfile" // unload all fixtures yii fixture/unload "*" // unload all fixtures except ones -yii fixture/unload "*" -DoNotUnloadThisOne +yii fixture/unload "*, -DoNotUnloadThisOne" ``` diff --git a/docs/guide-ru/test-fixtures.md b/docs/guide-ru/test-fixtures.md index f7fc694..a17cbce 100644 --- a/docs/guide-ru/test-fixtures.md +++ b/docs/guide-ru/test-fixtures.md @@ -312,7 +312,7 @@ yii fixture/load User yii fixture User // загрузить нескольких фикстур -yii fixture User UserProfile +yii fixture "User, UserProfile" // загрузить все фикстуры yii fixture/load "*" @@ -321,7 +321,7 @@ yii fixture/load "*" yii fixture "*" // загрузить все фикстуры кроме указанной -yii fixture "*" -DoNotLoadThisOne +yii fixture "*, -DoNotLoadThisOne" // загрузка фикстур, но искать их следует в другом пространстве имен. Пространство имен по умолчанию: tests\unit\fixtures. yii fixture User --namespace='alias\my\custom\namespace' @@ -342,13 +342,13 @@ yii fixture User --globalFixtures='some\name\space\Custom' yii fixture/unload User // выгрузить несколько фикстур -yii fixture/unload User,UserProfile +yii fixture/unload "User, UserProfile" // выгрузить все фикстуры yii fixture/unload "*" // выгрузить все фикстуры за исключением указанной -yii fixture/unload "*" -DoNotUnloadThisOne +yii fixture/unload "*, -DoNotUnloadThisOne" ``` diff --git a/docs/guide/test-fixtures.md b/docs/guide/test-fixtures.md index ef1fa16..96f5fec 100644 --- a/docs/guide/test-fixtures.md +++ b/docs/guide/test-fixtures.md @@ -310,7 +310,7 @@ yii fixture/load User yii fixture User // load several fixtures -yii fixture User UserProfile +yii fixture "User, UserProfile" // load all fixtures yii fixture/load "*" @@ -319,7 +319,7 @@ yii fixture/load "*" yii fixture "*" // load all fixtures except ones -yii fixture "*" -DoNotLoadThisOne +yii fixture "*, -DoNotLoadThisOne" // load fixtures, but search them in different namespace. By default namespace is: tests\unit\fixtures. yii fixture User --namespace='alias\my\custom\namespace' @@ -340,13 +340,13 @@ To unload fixture, run the following command: yii fixture/unload User // Unload several fixtures -yii fixture/unload User,UserProfile +yii fixture/unload "User, UserProfile" // unload all fixtures yii fixture/unload "*" // unload all fixtures except ones -yii fixture/unload "*" -DoNotUnloadThisOne +yii fixture/unload "*, -DoNotUnloadThisOne" ``` diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index 56168b9..38ea78f 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -60,6 +60,7 @@ Yii Framework 2 Change Log - Bug #11322: Fixed incorrect error message in `yii\validators\UniqueValidator` for composite `targetAttribute` (PowerGamer1, silverfire, cebe) - Chg #11364: Updated jQuery dependency to include versions `1.12.*` (cebe) - Bug #11252: Use strict comparison on ActiveRecord::hasAttribute() to avoid cases where it returns true when a number is passed to it (Faryshta) +- Chg #11683: Fixed fixture command to work with short syntax. `yii fixture "*, -User"` should be used instead of `yii fixture "*" -User` (Faryshta, samdark) 2.0.8 April 28, 2016 diff --git a/framework/UPGRADE.md b/framework/UPGRADE.md index 516531c..25e8bdf 100644 --- a/framework/UPGRADE.md +++ b/framework/UPGRADE.md @@ -20,6 +20,8 @@ Upgrade from Yii 2.0.8 * Part of code from `yii\web\User::loginByCookie()` method was moved to new `getIdentityAndDurationFromCookie()` and `removeIdentityCookie()` methods. If you override `loginByCookie()` method, update it in order use new methods. +* Fixture console command syntax was changed from `yii fixture "*" -User` to `yii fixture "*, -User"`. Upgrade your + scripts if necessary. Upgrade from Yii 2.0.7 ---------------------- diff --git a/framework/console/controllers/FixtureController.php b/framework/console/controllers/FixtureController.php index 79b7993..d9c901a 100644 --- a/framework/console/controllers/FixtureController.php +++ b/framework/console/controllers/FixtureController.php @@ -28,7 +28,7 @@ use yii\test\FixtureTrait; * yii fixture "*" * * #load all fixtures except User - * yii fixture "*" -User + * yii fixture "*, -User" * * #load fixtures with different namespace. * yii fixture/load User --namespace=alias\my\custom\namespace\goes\here @@ -89,20 +89,19 @@ class FixtureController extends Controller * ``` * # load the fixture data specified by User and UserProfile. * # any existing fixture data will be removed first - * yii fixture/load User UserProfile + * yii fixture/load "User, UserProfile" * * # load all available fixtures found under 'tests\unit\fixtures' * yii fixture/load "*" * * # load all fixtures except User and UserProfile - * yii fixture/load "*" -User -UserProfile + * yii fixture/load "*, -User, -UserProfile" * ``` * * @throws Exception if the specified fixture does not exist. */ - public function actionLoad() + public function actionLoad(array $fixturesInput = []) { - $fixturesInput = func_get_args(); if ($fixturesInput === []) { $this->stdout($this->getHelpSummary() . "\n"); @@ -116,7 +115,6 @@ class FixtureController extends Controller $except = $filtered['except']; if (!$this->needToApplyAll($fixturesInput[0])) { - $fixtures = $filtered['apply']; $foundFixtures = $this->findFixtures($fixtures); @@ -125,7 +123,6 @@ class FixtureController extends Controller if ($notFoundFixtures) { $this->notifyNotFound($notFoundFixtures); } - } else { $foundFixtures = $this->findFixtures(); } @@ -134,8 +131,8 @@ class FixtureController extends Controller if (!$foundFixtures) { throw new Exception( - "No files were found by name: \"" . implode(', ', $fixturesInput) . "\".\n" . - "Check that files with these name exists, under fixtures path: \n\"" . $this->getFixturePath() . "\"." + "No files were found for: \"" . implode(', ', $fixturesInput) . "\".\n" . + "Check that files exist under fixtures path: \n\"" . $this->getFixturePath() . "\"." ); } @@ -169,25 +166,23 @@ class FixtureController extends Controller * * ``` * # unload the fixture data specified by User and UserProfile. - * yii fixture/unload User UserProfile + * yii fixture/unload "User, UserProfile" * * # unload all fixtures found under 'tests\unit\fixtures' * yii fixture/unload "*" * * # unload all fixtures except User and UserProfile - * yii fixture/unload "*" -User -UserProfile + * yii fixture/unload "*, -User, -UserProfile" * ``` * * @throws Exception if the specified fixture does not exist. */ - public function actionUnload() + public function actionUnload(array $fixturesInput = []) { - $fixturesInput = func_get_args(); $filtered = $this->filterFixtures($fixturesInput); $except = $filtered['except']; if (!$this->needToApplyAll($fixturesInput[0])) { - $fixtures = $filtered['apply']; $foundFixtures = $this->findFixtures($fixtures); @@ -196,7 +191,6 @@ class FixtureController extends Controller if ($notFoundFixtures) { $this->notifyNotFound($notFoundFixtures); } - } else { $foundFixtures = $this->findFixtures(); } @@ -205,8 +199,8 @@ class FixtureController extends Controller if (!$foundFixtures) { throw new Exception( - "No files were found by name: \"" . implode(', ', $fixturesInput) . "\".\n" . - "Check that files with these name exists, under fixtures path: \n\"" . $this->getFixturePath() . "\"." + "No files were found for: \"" . implode(', ', $fixturesInput) . "\".\n" . + "Check that files exist under fixtures path: \n\"" . $this->getFixturePath() . "\"." ); } @@ -269,12 +263,12 @@ class FixtureController extends Controller */ public function notifyNothingToUnload($foundFixtures, $except) { - $this->stdout("Fixtures to unload could not be found according given conditions:\n\n", Console::FG_RED); + $this->stdout("Fixtures to unload could not be found according to given conditions:\n\n", Console::FG_RED); $this->stdout("Fixtures namespace is: \n", Console::FG_YELLOW); $this->stdout("\t" . $this->namespace . "\n", Console::FG_GREEN); if (count($foundFixtures)) { - $this->stdout("\nFixtures founded under the namespace:\n\n", Console::FG_YELLOW); + $this->stdout("\nFixtures found under the namespace:\n\n", Console::FG_YELLOW); $this->outputList($foundFixtures); } @@ -404,7 +398,6 @@ class FixtureController extends Controller $findAll = ($fixtures === []); if (!$findAll) { - $filesToSearch = []; foreach ($fixtures as $fileName) { @@ -432,7 +425,6 @@ class FixtureController extends Controller $config = []; foreach ($fixtures as $fixture) { - $isNamespaced = (strpos($fixture, '\\') !== false); $fullClassName = $isNamespaced ? $fixture . 'Fixture' : $this->namespace . '\\' . $fixture . 'Fixture'; diff --git a/tests/framework/console/controllers/FixtureControllerTest.php b/tests/framework/console/controllers/FixtureControllerTest.php index 1dc99f2..628d8f3 100644 --- a/tests/framework/console/controllers/FixtureControllerTest.php +++ b/tests/framework/console/controllers/FixtureControllerTest.php @@ -30,7 +30,7 @@ class FixtureControllerTest extends TestCase 'interactive' => false, 'globalFixtures' => [], 'namespace' => 'yiiunit\data\console\controllers\fixtures', - ],[null, null]); //id and module are null + ], [null, null]); //id and module are null } protected function tearDown() @@ -47,7 +47,7 @@ class FixtureControllerTest extends TestCase '\yiiunit\data\console\controllers\fixtures\Global' ]; - $this->_fixtureController->actionLoad('First'); + $this->_fixtureController->actionLoad(['First']); $this->assertCount(1, FixtureStorage::$globalFixturesData, 'global fixture data should be loaded'); $this->assertCount(1, FixtureStorage::$firstFixtureData, 'first fixture data should be loaded'); @@ -65,7 +65,7 @@ class FixtureControllerTest extends TestCase $this->assertCount(1, FixtureStorage::$globalFixturesData, 'global fixture data should be loaded'); $this->assertCount(1, FixtureStorage::$firstFixtureData, 'first fixture data should be loaded'); - $this->_fixtureController->actionUnload('First'); + $this->_fixtureController->actionUnload(['First']); $this->assertEmpty(FixtureStorage::$globalFixturesData, 'global fixture data should be unloaded'); $this->assertEmpty(FixtureStorage::$firstFixtureData, 'first fixture data should be unloaded'); @@ -77,7 +77,7 @@ class FixtureControllerTest extends TestCase $this->assertEmpty(FixtureStorage::$firstFixtureData, 'first fixture data should be empty'); $this->assertEmpty(FixtureStorage::$secondFixtureData, 'second fixture data should be empty'); - $this->_fixtureController->actionLoad('*'); + $this->_fixtureController->actionLoad(['*']); $this->assertCount(1, FixtureStorage::$globalFixturesData, 'global fixture data should be loaded'); $this->assertCount(1, FixtureStorage::$firstFixtureData, 'first fixture data should be loaded'); @@ -94,7 +94,7 @@ class FixtureControllerTest extends TestCase $this->assertCount(1, FixtureStorage::$firstFixtureData, 'first fixture data should be loaded'); $this->assertCount(1, FixtureStorage::$secondFixtureData, 'second fixture data should be loaded'); - $this->_fixtureController->actionUnload('*'); + $this->_fixtureController->actionUnload(['*']); $this->assertEmpty(FixtureStorage::$globalFixturesData, 'global fixture data should be unloaded'); $this->assertEmpty(FixtureStorage::$firstFixtureData, 'first fixture data should be unloaded'); @@ -103,7 +103,7 @@ class FixtureControllerTest extends TestCase public function testLoadParticularExceptOnes() { - $this->_fixtureController->actionLoad('First', '-Second', '-Global'); + $this->_fixtureController->actionLoad(['First', '-Second', '-Global']); $this->assertCount(1, FixtureStorage::$firstFixtureData, 'first fixture data should be loaded'); $this->assertEmpty(FixtureStorage::$globalFixturesData, 'global fixture data should not be loaded'); @@ -116,7 +116,11 @@ class FixtureControllerTest extends TestCase FixtureStorage::$firstFixtureData[] = 'some seeded first fixture data'; FixtureStorage::$secondFixtureData[] = 'some seeded second fixture data'; - $this->_fixtureController->actionUnload('First', '-Second', '-Global'); + $this->_fixtureController->actionUnload([ + 'First', + '-Second', + '-Global', + ]); $this->assertEmpty(FixtureStorage::$firstFixtureData, 'first fixture data should be unloaded'); $this->assertNotEmpty(FixtureStorage::$globalFixturesData, 'global fixture data should not be unloaded'); @@ -125,7 +129,7 @@ class FixtureControllerTest extends TestCase public function testLoadAllExceptOnes() { - $this->_fixtureController->actionLoad('*', '-Second', '-Global'); + $this->_fixtureController->actionLoad(['*', '-Second', '-Global']); $this->assertCount(1, FixtureStorage::$firstFixtureData, 'first fixture data should be loaded'); $this->assertEmpty(FixtureStorage::$globalFixturesData, 'global fixture data should not be loaded'); @@ -138,7 +142,7 @@ class FixtureControllerTest extends TestCase FixtureStorage::$firstFixtureData[] = 'some seeded first fixture data'; FixtureStorage::$secondFixtureData[] = 'some seeded second fixture data'; - $this->_fixtureController->actionUnload('*', '-Second', '-Global'); + $this->_fixtureController->actionUnload(['*', '-Second', '-Global']); $this->assertEmpty(FixtureStorage::$firstFixtureData, 'first fixture data should be unloaded'); $this->assertNotEmpty(FixtureStorage::$globalFixturesData, 'global fixture data should not be unloaded'); @@ -147,14 +151,17 @@ class FixtureControllerTest extends TestCase public function testNothingToLoadParticularExceptOnes() { - $this->_fixtureController->actionLoad('First', '-First'); + $this->_fixtureController->actionLoad(['First', '-First']); - $this->assertEmpty(FixtureStorage::$firstFixtureData, 'first fixture data should not be loaded'); + $this->assertEmpty( + FixtureStorage::$firstFixtureData, + 'first fixture data should not be loaded' + ); } public function testNothingToUnloadParticularExceptOnes() { - $this->_fixtureController->actionUnload('First', '-First'); + $this->_fixtureController->actionUnload(['First', '-First']); $this->assertEmpty(FixtureStorage::$firstFixtureData, 'first fixture data should not be loaded'); } @@ -164,7 +171,7 @@ class FixtureControllerTest extends TestCase */ public function testNoFixturesWereFoundInLoad() { - $this->_fixtureController->actionLoad('NotExistingFixture'); + $this->_fixtureController->actionLoad(['NotExistingFixture']); } /** @@ -172,9 +179,8 @@ class FixtureControllerTest extends TestCase */ public function testNoFixturesWereFoundInUnload() { - $this->_fixtureController->actionUnload('NotExistingFixture'); + $this->_fixtureController->actionUnload(['NotExistingFixture']); } - } class FixtureConsoledController extends FixtureController @@ -183,5 +189,4 @@ class FixtureConsoledController extends FixtureController public function stdout($string) { } - } From fead450998b37b6bd31ce0bfdfc35ca77c189eda Mon Sep 17 00:00:00 2001 From: Robert Korulczyk Date: Thu, 7 Jul 2016 10:44:00 +0200 Subject: [PATCH 050/163] Fix links in helper-array.md. [skip ci] (#11913) --- docs/guide-es/helper-array.md | 5 +++-- docs/guide-ja/helper-array.md | 7 ++++--- docs/guide-ru/helper-array.md | 7 ++++--- docs/guide/helper-array.md | 5 +++-- 4 files changed, 14 insertions(+), 10 deletions(-) diff --git a/docs/guide-es/helper-array.md b/docs/guide-es/helper-array.md index 5c8fe62..7eb52aa 100644 --- a/docs/guide-es/helper-array.md +++ b/docs/guide-es/helper-array.md @@ -371,8 +371,9 @@ mediante la implementación de la interfaz [[yii\base\Arrayable|Arrayable]] en e A menudo necesitarás comprobar está en un array o un grupo de elementos es un sub-grupo de otro. A pesar de que PHP ofrece `in_array()`, este no soporta sub-grupos u objetos de tipo `\Traversable`. -Para ayudar en este tipo de pruebas, [[yii\base\ArrayHelper]] provee [[yii\base\ArrayHelper::isIn()|isIn()]] -y [[yii\base\ArrayHelper::isSubset()|isSubset()]] con la misma firma del método [[in_array()]]. +Para ayudar en este tipo de pruebas, [[yii\helpers\ArrayHelper]] provee [[yii\helpers\ArrayHelper::isIn()|isIn()]] +y [[yii\helpers\ArrayHelper::isSubset()|isSubset()]] con la misma firma del método +[in_array()](http://php.net/manual/en/function.in-array.php). ```php // true diff --git a/docs/guide-ja/helper-array.md b/docs/guide-ja/helper-array.md index 0edcb00..147bcc1 100644 --- a/docs/guide-ja/helper-array.md +++ b/docs/guide-ja/helper-array.md @@ -368,8 +368,9 @@ $data = ArrayHelper::toArray($posts, [ ある要素が配列の中に存在するかどうか、また、一連の要素が配列のサブセットであるかどうか、ということを調べる必要がある場合がよくあります。 PHP は `in_array()` を提供していますが、これはサブセットや `\Traversable` なオブジェクトをサポートしていません。 -この種のチェックを助けるために、[[yii\base\ArrayHelper]] は [[yii\base\ArrayHelper::isIn()|isIn()]] -および [[yii\base\ArrayHelper::isSubset()|isSubset()]] を [[in_array()]] と同じシグニチャで提供しています。 +この種のチェックを助けるために、[[yii\helpers\ArrayHelper]] は [[yii\helpers\ArrayHelper::isIn()|isIn()]] +および [[yii\helpers\ArrayHelper::isSubset()|isSubset()]] を +[in_array()](http://php.net/manual/en/function.in-array.php) と同じシグニチャで提供しています。 ```php // true @@ -377,7 +378,7 @@ ArrayHelper::isIn('a', ['a']); // true ArrayHelper::isIn('a', new(ArrayObject['a'])); -// true +// true ArrayHelper::isSubset(new(ArrayObject['a', 'c']), new(ArrayObject['a', 'b', 'c']) ``` diff --git a/docs/guide-ru/helper-array.md b/docs/guide-ru/helper-array.md index 095fde0..a1d67d1 100644 --- a/docs/guide-ru/helper-array.md +++ b/docs/guide-ru/helper-array.md @@ -280,10 +280,11 @@ $data = ArrayHelper::toArray($posts, [ ## Проверка на присутствие в массиве Часто необходимо проверить, содержится ли элемент в массиве, или является ли массив подмножеством другого массива. -К сожалению, PHP функция [[in_array()]] не поддерживает подмножества объектов, реализующих интерфейс `\Traversable`. +К сожалению, PHP функция `in_array()` не поддерживает подмножества объектов, реализующих интерфейс `\Traversable`. -Для таких случаев [[yii\base\ArrayHelper]] предоставляет [[yii\base\ArrayHelper::isIn()|isIn()]] и -[[yii\base\ArrayHelper::isSubset()|isSubset()]]. Методы принимают такие же параметры, что и [[in_array()]]. +Для таких случаев [[yii\helpers\ArrayHelper]] предоставляет [[yii\helpers\ArrayHelper::isIn()|isIn()]] и +[[yii\helpers\ArrayHelper::isSubset()|isSubset()]]. Методы принимают такие же параметры, что и +[in_array()](http://php.net/manual/en/function.in-array.php). ```php // true diff --git a/docs/guide/helper-array.md b/docs/guide/helper-array.md index f84d598..4669357 100644 --- a/docs/guide/helper-array.md +++ b/docs/guide/helper-array.md @@ -371,8 +371,9 @@ It is possible to provide default way of converting object to array for a specif Often you need to check if an element is in an array or a set of elements is a subset of another. While PHP offers `in_array()`, this does not support subsets or `\Traversable` objects. -To aid these kinds of tests, [[yii\base\ArrayHelper]] provides [[yii\base\ArrayHelper::isIn()|isIn()]] -and [[yii\base\ArrayHelper::isSubset()|isSubset()]] with the same signature as [[in_array()]]. +To aid these kinds of tests, [[yii\helpers\ArrayHelper]] provides [[yii\helpers\ArrayHelper::isIn()|isIn()]] +and [[yii\helpers\ArrayHelper::isSubset()|isSubset()]] with the same signature as +[in_array()](http://php.net/manual/en/function.in-array.php). ```php // true From b019d23281a64d616acad8b847f3512c4cc9d4be Mon Sep 17 00:00:00 2001 From: Alberto Barradas Spezzia Date: Thu, 7 Jul 2016 15:34:36 -0500 Subject: [PATCH 051/163] Fix #11896 DROP TRIGGER for migrate/down in RBAC (#11919) --- framework/CHANGELOG.md | 1 + framework/rbac/migrations/m140506_102106_rbac_init.php | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index 38ea78f..eb54dd4 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -5,6 +5,7 @@ Yii Framework 2 Change Log 2.0.9 under development ----------------------- +- Bug #11896: Fix for DROP TRIGGER in migrations from RBAC. (barradas-alberto) - Enh #11725: Added indexes on message tables (OndrejVasicek) - Enh #10422: Added `null` method on `yii\db\ColumnSchemaBuilder` to explicitly set column nullability (nevermnd) - Enh #9574: Implicit run `ColumnSchemaBuilder::null()` when default value is set to `null`. (rob006) diff --git a/framework/rbac/migrations/m140506_102106_rbac_init.php b/framework/rbac/migrations/m140506_102106_rbac_init.php index 886ec09..a946169 100644 --- a/framework/rbac/migrations/m140506_102106_rbac_init.php +++ b/framework/rbac/migrations/m140506_102106_rbac_init.php @@ -138,7 +138,7 @@ class m140506_102106_rbac_init extends \yii\db\Migration $this->db = $authManager->db; if ($this->isMSSQL()) { - $this->execute('DROP dbo.trigger_auth_item_child;'); + $this->execute('DROP TRIGGER dbo.trigger_auth_item_child;'); } $this->dropTable($authManager->assignmentTable); From dd28a257203512207793cdd57241cd9c87c799c4 Mon Sep 17 00:00:00 2001 From: et-soft Date: Fri, 8 Jul 2016 12:04:47 +0300 Subject: [PATCH 052/163] Update version fxp/composer-asset-plugin in Russian and Ukrainian docs. (#11920) [skip ci] --- docs/guide-ru/start-installation.md | 2 +- docs/guide-uk/start-installation.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/guide-ru/start-installation.md b/docs/guide-ru/start-installation.md index e28e988..927b81a 100644 --- a/docs/guide-ru/start-installation.md +++ b/docs/guide-ru/start-installation.md @@ -30,7 +30,7 @@ mv composer.phar /usr/local/bin/composer После установки Composer устанавливать Yii можно запустив следующую команду в папке доступной через веб: ```bash -composer global require "fxp/composer-asset-plugin:~1.1.1" +composer global require "fxp/composer-asset-plugin:^1.2.0" composer create-project --prefer-dist yiisoft/yii2-app-basic basic ``` diff --git a/docs/guide-uk/start-installation.md b/docs/guide-uk/start-installation.md index e36599d..9e5c3fb 100644 --- a/docs/guide-uk/start-installation.md +++ b/docs/guide-uk/start-installation.md @@ -40,7 +40,7 @@ Після встановлення Composer, встановити Yii можна виконавши наступну команду з директорії, яка доступна через Web: ```bash - composer global require "fxp/composer-asset-plugin:~1.1.1" + composer global require "fxp/composer-asset-plugin:^1.2.0" composer create-project --prefer-dist yiisoft/yii2-app-basic basic ``` From 9114a430b552bc0372371ea91022d8a3a360935d Mon Sep 17 00:00:00 2001 From: Carsten Brandt Date: Fri, 8 Jul 2016 16:37:40 +0200 Subject: [PATCH 053/163] Update release.md --- docs/internals/release.md | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/docs/internals/release.md b/docs/internals/release.md index b75431b..35d092d 100644 --- a/docs/internals/release.md +++ b/docs/internals/release.md @@ -28,7 +28,18 @@ the framework: The release command depends on the development environment introduced in the [Git Workflow Document](git-workflow.md#extensions), i.e. the application templates must be located under `/apps/` and extensions must be located under `/extensions/`. -This structure is preferably created using the `dev/app` command. +This structure is preferably created using the `dev/app` and `dev/ext` commands. + +e.g. install an extension: + + ./build/build dev/ext authclient + +or an application: + + ./build/build dev/app basic + +This installation will ensure that the extension will use the same framework code that is in the current +repositories state. ### Version overview From 7076b38ea9dbddfe40f53928f93944eef9b92d0b Mon Sep 17 00:00:00 2001 From: Carsten Brandt Date: Mon, 11 Jul 2016 12:09:35 +0200 Subject: [PATCH 054/163] added a test for #11925 --- tests/framework/helpers/UrlTest.php | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/tests/framework/helpers/UrlTest.php b/tests/framework/helpers/UrlTest.php index d634ec4..f72f975 100644 --- a/tests/framework/helpers/UrlTest.php +++ b/tests/framework/helpers/UrlTest.php @@ -1,10 +1,13 @@ set('urlManager', [ + 'class' => 'yii\web\UrlManager', + 'enablePrettyUrl' => true, + 'showScriptName' => false, + 'cache' => null, + 'rules' => [ + '/' => '/view', + '//' => '/', + '/' => '/', + ], + 'baseUrl' => '/', + 'scriptUrl' => '/index.php', + 'suffix' => '.html', + ]); + $url = Yii::$app->urlManager->createUrl(['/site/page', 'view' => 'about']); + $this->assertEquals('/site/page.html?view=about', $url); + + $url = Url::to(['/site/page', 'view' => 'about']); + $this->assertEquals('/site/page.html?view=about', $url); + + $output = Menu::widget([ + 'items' => [ + ['label' => 'Test', 'url' => ['/site/page', 'view' => 'about']], + ], + ]); + $this->assertRegExp('~~', $output); + } + public function testBase() { $this->mockAction('page', 'view', null, ['id' => 10]); From 217d50e4ff690d651d910e61cb3601044031e185 Mon Sep 17 00:00:00 2001 From: Carsten Brandt Date: Mon, 11 Jul 2016 12:58:43 +0200 Subject: [PATCH 055/163] improved PHPdoc and `@since` annotations --- framework/behaviors/AttributeBehavior.php | 4 ++-- framework/behaviors/BlameableBehavior.php | 4 ++-- framework/behaviors/SluggableBehavior.php | 4 ++-- framework/behaviors/TimestampBehavior.php | 4 ++-- framework/data/ArrayDataProvider.php | 1 + framework/db/ActiveRelationTrait.php | 1 + framework/grid/CheckboxColumn.php | 1 + framework/log/Target.php | 5 +++++ framework/web/Session.php | 2 +- 9 files changed, 17 insertions(+), 9 deletions(-) diff --git a/framework/behaviors/AttributeBehavior.php b/framework/behaviors/AttributeBehavior.php index 9931583..aad6f82 100644 --- a/framework/behaviors/AttributeBehavior.php +++ b/framework/behaviors/AttributeBehavior.php @@ -42,8 +42,8 @@ use yii\db\ActiveRecord; * } * ``` * - * Because attribute values will be set automatically, it's a good idea to make sure attribute names aren't - * in `rules()` method of the model. + * Because attribute values will be set automatically by this behavior, they are usually not user input and should therefore + * not be validated, i.e. they should not appear in the [[\yii\base\Model::rules()|rules()]] method of the model. * * @author Luciano Baraglia * @author Qiang Xue diff --git a/framework/behaviors/BlameableBehavior.php b/framework/behaviors/BlameableBehavior.php index 0fb5a11..f790abd 100644 --- a/framework/behaviors/BlameableBehavior.php +++ b/framework/behaviors/BlameableBehavior.php @@ -30,8 +30,8 @@ use yii\db\BaseActiveRecord; * when the associated AR object is being inserted; it will fill the `updated_by` attribute * with the current user ID when the AR object is being updated. * - * Because attribute values will be set automatically, it's a good idea to make sure `created_by` and `updated_by` aren't - * in `rules()` method of the model. + * Because attribute values will be set automatically by this behavior, they are usually not user input and should therefore + * not be validated, i.e. `created_by` and `updated_by` should not appear in the [[\yii\base\Model::rules()|rules()]] method of the model. * * If your attribute names are different, you may configure the [[createdByAttribute]] and [[updatedByAttribute]] * properties like the following: diff --git a/framework/behaviors/SluggableBehavior.php b/framework/behaviors/SluggableBehavior.php index fa1ad9c..b1f722e 100644 --- a/framework/behaviors/SluggableBehavior.php +++ b/framework/behaviors/SluggableBehavior.php @@ -36,8 +36,8 @@ use Yii; * By default, SluggableBehavior will fill the `slug` attribute with a value that can be used a slug in a URL * when the associated AR object is being validated. * - * Because attribute value will be set automatically, it's a good idea to make sure `slug` isn't - * in `rules()` method of the model. + * Because attribute values will be set automatically by this behavior, they are usually not user input and should therefore + * not be validated, i.e. the `slug` attribute should not appear in the [[\yii\base\Model::rules()|rules()]] method of the model. * * If your attribute name is different, you may configure the [[slugAttribute]] property like the following: * diff --git a/framework/behaviors/TimestampBehavior.php b/framework/behaviors/TimestampBehavior.php index 5d74518..50da344 100644 --- a/framework/behaviors/TimestampBehavior.php +++ b/framework/behaviors/TimestampBehavior.php @@ -30,8 +30,8 @@ use yii\db\BaseActiveRecord; * when the associated AR object is being inserted; it will fill the `updated_at` attribute * with the timestamp when the AR object is being updated. The timestamp value is obtained by `time()`. * - * Because attribute values will be set automatically, it's a good idea to make sure `created_at` and `updated_at` aren't - * in `rules()` method of the model. + * Because attribute values will be set automatically by this behavior, they are usually not user input and should therefore + * not be validated, i.e. `created_at` and `updated_at` should not appear in the [[\yii\base\Model::rules()|rules()]] method of the model. * * For the above implementation to work with MySQL database, please declare the columns(`created_at`, `updated_at`) as int(11) for being UNIX timestamp. * diff --git a/framework/data/ArrayDataProvider.php b/framework/data/ArrayDataProvider.php index 367d3a4..f4b63cd 100644 --- a/framework/data/ArrayDataProvider.php +++ b/framework/data/ArrayDataProvider.php @@ -70,6 +70,7 @@ class ArrayDataProvider extends BaseDataProvider */ public $modelClass; + /** * @inheritdoc */ diff --git a/framework/db/ActiveRelationTrait.php b/framework/db/ActiveRelationTrait.php index eddcc3e..e5bfdfe 100644 --- a/framework/db/ActiveRelationTrait.php +++ b/framework/db/ActiveRelationTrait.php @@ -160,6 +160,7 @@ trait ActiveRelationTrait /** * If applicable, populate the query's primary model into the related records' inverse relationship * @param array $result the array of related records as generated by [[populate()]] + * @since 2.0.9 */ private function addInverseRelations(&$result) { diff --git a/framework/grid/CheckboxColumn.php b/framework/grid/CheckboxColumn.php index 53b772c..79a658c 100644 --- a/framework/grid/CheckboxColumn.php +++ b/framework/grid/CheckboxColumn.php @@ -69,6 +69,7 @@ class CheckboxColumn extends Column public $multiple = true; /** * @var string the css class that will be used to find the checkboxes. + * @since 2.0.9 */ public $cssClass; diff --git a/framework/log/Target.php b/framework/log/Target.php index 49c7a7b..0544824 100644 --- a/framework/log/Target.php +++ b/framework/log/Target.php @@ -57,12 +57,17 @@ abstract class Target extends Component /** * @var array list of the PHP predefined variables that should be logged in a message. * Note that a variable must be accessible via `$GLOBALS`. Otherwise it won't be logged. + * * Defaults to `['_GET', '_POST', '_FILES', '_COOKIE', '_SESSION', '_SERVER']`. + * + * Since version 2.0.9 additional syntax can be used: * Each element could be specified as one of the following: + * * - `var` - `var` will be logged. * - `var.key` - only `var[key]` key will be logged. * - `!var.key` - `var[key]` key will be excluded. * + * @see \yii\helpers\ArrayHelper::filter() */ public $logVars = ['_GET', '_POST', '_FILES', '_COOKIE', '_SESSION', '_SERVER']; /** diff --git a/framework/web/Session.php b/framework/web/Session.php index 41658db..0425132 100644 --- a/framework/web/Session.php +++ b/framework/web/Session.php @@ -98,8 +98,8 @@ class Session extends Component implements \IteratorAggregate, \ArrayAccess, \Co parent::init(); register_shutdown_function([$this, 'close']); if ($this->getIsActive()) { - $this->updateFlashCounters(); Yii::warning("Session is already started", __METHOD__); + $this->updateFlashCounters(); } } From b668aaf8759eaa959e5dfcd5ef87cf039c21615b Mon Sep 17 00:00:00 2001 From: Carsten Brandt Date: Mon, 11 Jul 2016 14:42:15 +0200 Subject: [PATCH 056/163] more verbose and better links in installation instructions fixes yiisoft/yii2-app-basic#29 --- docs/guide/start-installation.md | 37 +++++++++++++++++++++++++++++-------- 1 file changed, 29 insertions(+), 8 deletions(-) diff --git a/docs/guide/start-installation.md b/docs/guide/start-installation.md index 84e9655..59881ed 100644 --- a/docs/guide/start-installation.md +++ b/docs/guide/start-installation.md @@ -5,7 +5,7 @@ You can install Yii in two ways, using the [Composer](https://getcomposer.org/) The former is the preferred way, as it allows you to install new [extensions](structure-extensions.md) or update Yii by simply running a single command. Standard installations of Yii result in both the framework and a project template being downloaded and installed. -A project template is a working Yii project implementing some basic features, such as login, contact form, etc. +A project template is a working Yii project implementing some basic features, such as login, contact form, etc. Its code is organized in a recommended way. Therefore, it can serve as a good starting point for your projects. In this and the next few sections, we will describe how to install Yii with the so-called *Basic Project Template* and @@ -21,6 +21,8 @@ to develop applications with multiple tiers. Installing via Composer ----------------------- +### Installing Composer + If you do not already have Composer installed, you may do so by following the instructions at [getcomposer.org](https://getcomposer.org/download/). On Linux and Mac OS X, you'll run the following commands: @@ -31,12 +33,28 @@ mv composer.phar /usr/local/bin/composer On Windows, you'll download and run [Composer-Setup.exe](https://getcomposer.org/Composer-Setup.exe). -Please refer to the [Composer Documentation](https://getcomposer.org/doc/) if you encounter any -problems or want to learn more about Composer usage. +Please refer to the [Troubleshooting section of the Composer Documentation](https://getcomposer.org/doc/articles/troubleshooting.md) +if you encounter any problems. +If you are new to Composer, we also recommend to read at least the [Basic usage section](https://getcomposer.org/doc/01-basic-usage.md) +of the Composer documentation. + +In this guide all composer commands assume you have installed composer [globally](https://getcomposer.org/doc/00-intro.md#globally) +so that it is available as the `composer` command. If you are using the `composer.phar` in the local directory instead, +you have to adjust the example commands accordingly. If you had Composer already installed before, make sure you use an up to date version. You can update Composer by running `composer self-update`. +> Note: During the installation of Yii, Composer will need to request a lot of information from the Github API. +> The amount of requests depends on the number of dependencies your application has and may be bigger than the +> **Github API rate limit**. If you hit this limit, Composer may ask for your Github login credentials to obtain +> a Github API access token. On fast connections you may hit this limit earlier than Composer can handle so we +> recommend to configure the access token before installing Yii. +> Please refer to the [Composer documentation about Github API tokens](https://getcomposer.org/doc/articles/troubleshooting.md#api-rate-limit-and-oauth-tokens) +> for instructions on how to do this. + +### Installing Yii + With Composer installed, you can install Yii by running the following commands under a Web-accessible folder: ```bash @@ -46,11 +64,14 @@ composer create-project --prefer-dist yiisoft/yii2-app-basic basic The first command installs the [composer asset plugin](https://github.com/francoispluchino/composer-asset-plugin/) which allows managing bower and npm package dependencies through Composer. You only need to run this command -once for all. The second command installs Yii in a directory named `basic`. You can choose a different directory name if you want. - -> Note: During the installation Composer may ask for your Github login credentials. This is normal because Composer -> needs to get enough API rate-limit to retrieve the dependent package information from Github. For more details, -> please refer to the [Composer documentation](https://getcomposer.org/doc/articles/troubleshooting.md#api-rate-limit-and-oauth-tokens). +once for all. The second command installs the latest stable version of Yii in a directory named `basic`. +You can choose a different directory name if you want. + +> Info: If the `composer create-project` command fails make sure you have the composer asset plugin installed correctly. +> You can do that by running `composer global show`, which should contain an entry `fxp/composer-asset-plugin`. +> You may also refer to the [Troubleshooting section of the Composer Documentation](https://getcomposer.org/doc/articles/troubleshooting.md) +> for common errors. When you have fixed the error, you can resume the aborted installation +> by running `composer update` inside of the `basic` directory. > Tip: If you want to install the latest development version of Yii, you may use the following command instead, > which adds a [stability option](https://getcomposer.org/doc/04-schema.md#minimum-stability): From bda42b68ce3951174b21fe81b33fcbe233542e26 Mon Sep 17 00:00:00 2001 From: Carsten Brandt Date: Mon, 11 Jul 2016 15:01:17 +0200 Subject: [PATCH 057/163] fixed yii\di\Instance documentation fixes #11637 --- framework/di/Instance.php | 5 ++++- tests/framework/di/InstanceTest.php | 20 ++++++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/framework/di/Instance.php b/framework/di/Instance.php index f51e0f2..6fe4169 100644 --- a/framework/di/Instance.php +++ b/framework/di/Instance.php @@ -25,7 +25,10 @@ use yii\base\InvalidConfigException; * * ```php * $container = new \yii\di\Container; - * $container->set('cache', 'yii\caching\DbCache', Instance::of('db')); + * $container->set('cache', [ + * 'class' => 'yii\caching\DbCache', + * 'db' => Instance::of('db') + * ]); * $container->set('db', [ * 'class' => 'yii\db\Connection', * 'dsn' => 'sqlite:path/to/file.db', diff --git a/tests/framework/di/InstanceTest.php b/tests/framework/di/InstanceTest.php index cc1f78b..564d22e 100644 --- a/tests/framework/di/InstanceTest.php +++ b/tests/framework/di/InstanceTest.php @@ -116,4 +116,24 @@ class InstanceTest extends TestCase $this->destroyApplication(); } + + /** + * This tests the usage example given in yii\di\Instance class PHPdoc + */ + public function testLazyInitializationExample() + { + Yii::$container = new Container; + Yii::$container->set('cache', [ + 'class' => 'yii\caching\DbCache', + 'db' => Instance::of('db') + ]); + Yii::$container->set('db', [ + 'class' => 'yii\db\Connection', + 'dsn' => 'sqlite:path/to/file.db', + ]); + + $this->assertInstanceOf('yii\caching\DbCache', $cache = Yii::$container->get('cache')); + $this->assertInstanceOf('yii\db\Connection', $db = $cache->db); + $this->assertEquals('sqlite:path/to/file.db', $db->dsn); + } } From 1423e34131735cfef50b41915045b3d9c295738c Mon Sep 17 00:00:00 2001 From: Carsten Brandt Date: Mon, 11 Jul 2016 15:24:48 +0200 Subject: [PATCH 058/163] documentation about method injection fixes #11565 --- docs/guide/concept-di-container.md | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/docs/guide/concept-di-container.md b/docs/guide/concept-di-container.md index 4b0c201..6f0e3bf 100644 --- a/docs/guide/concept-di-container.md +++ b/docs/guide/concept-di-container.md @@ -13,6 +13,7 @@ Yii provides the DI container feature through the class [[yii\di\Container]]. It dependency injection: * Constructor injection; +* Method injection; * Setter and property injection; * PHP callable injection; @@ -39,6 +40,36 @@ $foo = new Foo($bar); ``` +### Method Injection + +Usually the dependencies of a class are passed to the constructor and are available inside of the class during the whole lifecycle. +With Method Injection it is possible to provide a dependency that is only needed by a single method of the class +and passing it to the constructor may not be possible or may cause too much overhead in the majority of use cases. + +A class method can be defined like the `doSomething()` method in the following example: + +```php +class MyClass extends \yii\base\Component +{ + public function __construct(/*Some lightweight dependencies here*/, $config = []) + { + // ... + } + + public function doSomething($param1, \my\heavy\Dependency $something) + { + // do something with $something + } +} +``` + +You may call that method either by passing an instance of `\my\heavy\Dependency` yourself or using [[yii\di\Container::invoke()]] like the following: + +```php +$obj = new MyClass(/*...*/); +Yii::$container->invoke([$obj, 'doSomethingWithHeavyDependency'], ['param1' => 42]); // $something will be provided by the DI container +``` + ### Setter and Property Injection Setter and property injection is supported through [configurations](concept-configurations.md). From ee92cfa7ba618bf4acc19ab540eaa674b828a092 Mon Sep 17 00:00:00 2001 From: Carsten Brandt Date: Mon, 11 Jul 2016 15:36:42 +0200 Subject: [PATCH 059/163] release version 2.0.9 --- framework/BaseYii.php | 2 +- framework/CHANGELOG.md | 76 ++++++++++++++++---------------- framework/classes.php | 2 + framework/console/Application.php | 4 ++ framework/db/ColumnSchemaBuilder.php | 3 +- framework/db/pgsql/Schema.php | 3 ++ framework/grid/CheckboxColumn.php | 1 + framework/rbac/CheckAccessInterface.php | 6 +++ framework/validators/UniqueValidator.php | 2 +- framework/web/Application.php | 3 ++ 10 files changed, 61 insertions(+), 41 deletions(-) diff --git a/framework/BaseYii.php b/framework/BaseYii.php index 0f99597..b5d2992 100644 --- a/framework/BaseYii.php +++ b/framework/BaseYii.php @@ -93,7 +93,7 @@ class BaseYii */ public static function getVersion() { - return '2.0.9-dev'; + return '2.0.9'; } /** diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index eb54dd4..27c8884 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -2,65 +2,65 @@ Yii Framework 2 Change Log ========================== -2.0.9 under development ------------------------ +2.0.9 July 11, 2016 +------------------- -- Bug #11896: Fix for DROP TRIGGER in migrations from RBAC. (barradas-alberto) -- Enh #11725: Added indexes on message tables (OndrejVasicek) -- Enh #10422: Added `null` method on `yii\db\ColumnSchemaBuilder` to explicitly set column nullability (nevermnd) -- Enh #9574: Implicit run `ColumnSchemaBuilder::null()` when default value is set to `null`. (rob006) -- Enh #8795: Refactored `yii\web\User::loginByCookie()` in order to make it easier to override (maine-mike, silverfire) -- Enh #9948: `yii\rbac\PhpManager` now invalidates script file cache performed by 'OPCache' or 'APC' on file saving (klimov-paul) -- Enh #11195: Added ability to append custom string to schema builder column definition (df2, samdark) -- Enh #11490: Added `yii\data\ArrayDataProvider::$modelClass` property to specify a model used to provide column labels even when data array is empty (PowerGamer1) -- Enh #11591: Added support for wildcards for `only` and `except` at `yii\base\ActionFilter` (klimov-paul) +- Bug #6347: `inverseOf()` not working for dynamic relational queries (laszlovl) +- Bug #8644: Fixed trying to ENABLE/DISABLE TRIGGER ALL on a view in PostgreSQL (ricpelo) - Bug #9950: Updated `yii\grid\DataColumn::getHeaderCellLabel()` to extract attribute label from the `filterModel` of Grid (silverfire) +- Bug #10613: Fixed PostgreSQL Schema to return correct column names for unique indexes that have mixed case column names (cebe) +- Bug #10681: Fixed active form `beforeValidate` wasn't triggered in some cases (lynicidn) +- Bug #11252: Use strict comparison on ActiveRecord::hasAttribute() to avoid cases where it returns true when a number is passed to it (Faryshta) +- Bug #11322: Fixed incorrect error message in `yii\validators\UniqueValidator` for composite `targetAttribute` (PowerGamer1, silverfire, cebe) - Bug #11429: Fixed `yii\i18n\PhpMessageSource::loadFallbackMessages()` not to log error when source and language is same, but locales are different (silverfire) -- Enh #11484: Speed up `yii\db\oci\Schema::loadTableSchema()` for Oracle DBMS (SSiwek) -- Enh #11428: Speedup SQL query in `yii\db\oci\Schema::findColumns()` (SSiwek) -- Enh #11414: Files specified as `null` in `yii\web\AssetBundle` won't be registered (Razzwan) -- Enh #11432: Added HTTP status 421 "Misdirected Request" to list of statuses in `yii\web\Response` (dasmfm) -- Enh #11438: Configurable `yii\helpers\Markdown` default flavor (mdmunir) -- Enh #11729: Added `yii\grid\CheckboxColumn::$cssClass` property to specify a class added to checkbox input (thiagotalma) - Bug #11459: Fixed flash messages not destroyed when `session.auto_start = 1` set in php.ini (cartmanchen) -- Enh #11462: Added support of filtering rules to `yii\log\Target::$logVar` (HaruAtari) -- Enh #11462: Added `\yii\helpers\BaseArrayHelper::filter()` method (HaruAtari) - Bug #11498: Fixed inability to save serialized object into PostgreSQL binary column (klimov-paul) - Bug #11507: Fixed `yii\validators\EachValidator::validateAttribute()` does not respect `skipOnEmpty` rule parameter (webdevsega) - Bug #11523: Fixed `yii\web\User::checkRedirectAcceptable()` to treat acceptable content type `*/*` as `*` (silverfire) +- Bug #11527: Fixed `bigPrimaryKey()` for SQLite (dynasource) +- Bug #11528: Fixed MessageFormatter construction exception caught for PHP 7 compatibility (subdee, cebe) - Bug #11532: Fixed casting of empty char value to `null` resulting in integrity constraint violation for not null columns (samdark) +- Bug #11536: Fixed regression introduced in 2.0.8, where scalar value was not allowed in QueryBuilder `IN` condition anymore (cebe) +- Bug #11549: Fixed `ArrayHelper::getValue()` to work properly with float keys (zsounder, AnikanovD) +- Bug #11561: Fixed DI container throwing exceptions for optional dependencies (SamMousa) - Bug #11571: Fixed `yii\db\ColumnSchemaBuilder` to work with custom column types (andrey-mokhov, silverfire) - Bug #11662: Fixed `schema-oci.sql` for RBAC (jonny7) -- Bug #11527: Fixed `bigPrimaryKey()` for SQLite (dynasource) +- Bug #11672: Fixed `yii\validators\NumberValidator` erroring when value is an object without `__toString()` method (SamMousa) - Bug #11686: `BaseArrayHelper::isIn()` comparison did not work in strict mode (taobig) -- Enh #11679: Extracted `CheckAccessInterface` from `ManagerInterface` (SamMousa, samdark, mdomba) +- Bug #11693: Handle `QueryBuilder::batchInsert()` calls with no data to insert (rob006) - Bug #11723: Fixed PHP 7 + XDebug error handling displaying "Expected array for frame 0" (tanakahisateru) - Bug #11735: Fixed `yii\web\UploadedFile` to return `null` when there's no file uploaded (brummm) -- Bug #11774: Fixed incorrect recusuive symlinks check in FileHelper (AnikanovD) - Bug #11739: Fixed `ArrayHelper::index()` losing precision for float keys (AnikanovD) -- Bug #11549: Fixed `ArrayHelper::getValue()` to work properly with float keys (zsounder, AnikanovD) -- Bug #8644: Fixed trying to ENABLE/DISABLE TRIGGER ALL on a view in PostgreSQL (ricpelo) -- Bug #11536: Fixed regression introduced in 2.0.8, where scalar value was not allowed in QueryBuilder `IN` condition anymore (cebe) -- Bug #11693: Handle `QueryBuilder::batchInsert()` calls with no data to insert (rob006) -- Bug #11672: Fixed `yii\validators\NumberValidator` erroring when value is an object without `__toString()` method (SamMousa) -- Bug #11561: Fixed DI container throwing exceptions for optional dependencies (SamMousa) -- Enh #11168: `yii\helpers\BaseHtml` now uses abstracted `booleanInput()` and `activeBooleanInput()` methods to render `radio()`, `checkbox()`, `activeRadio()` and `activeCheckbox()` (cesarnicola) -- Enh #11808: `_table` and `_column` suffixes are now required when generating migration (rob006) +- Bug #11774: Fixed incorrect recusuive symlinks check in FileHelper (AnikanovD) - Bug #11822: Fixed exception on non-string value provided as CSRF token (cebe) -- Enh #11850: Introduced `yii\widgets\Pjax::$submitEvent` to be able to customize event triggering PJAX form submit (Bvanleeuwen) - Bug #11847: Fixed `yii\widgets\Pjax` to properly respond with partials when custom selector is used for container (pigochu, samdark) -- Bug #10681: Fixed active form `beforeValidate` wasn't triggered in some cases (lynicidn) -- Enh #11857: `yii\filters\AccessRule::$verbs` can now be configured in upper and lowercase (DrDeath72, samdark) - Bug #11863: Fixed usage of `mb_substr` with PHP < 5.4.8 where length of NULL was treated the same as 0 (samdark) - Bug #11865: Fixed setting `selected` for dropdown list using options (samdark) -- Bug #11528: Fixed MessageFormatter construction exception caught for PHP 7 compatibility (subdee, cebe) - Bug #11878: Fixed i18n gettext fallback language message loading (stevekr) +- Bug #11896: Fix for DROP TRIGGER in migrations from RBAC. (barradas-alberto) +- Enh #8795: Refactored `yii\web\User::loginByCookie()` in order to make it easier to override (maine-mike, silverfire) +- Enh #9574: Implicit run `ColumnSchemaBuilder::null()` when default value is set to `null`. (rob006) +- Enh #9948: `yii\rbac\PhpManager` now invalidates script file cache performed by 'OPCache' or 'APC' on file saving (klimov-paul) +- Enh #10422: Added `null` method on `yii\db\ColumnSchemaBuilder` to explicitly set column nullability (nevermnd) +- Enh #11168: `yii\helpers\BaseHtml` now uses abstracted `booleanInput()` and `activeBooleanInput()` methods to render `radio()`, `checkbox()`, `activeRadio()` and `activeCheckbox()` (cesarnicola) +- Enh #11195: Added ability to append custom string to schema builder column definition (df2, samdark) - Enh #11212: Added headers to PO file in `yii\i18n\GettextPoFile::save()` (stevekr) -- Bug #6347: `inverseOf()` not working for dynamic relational queries (laszlovl) -- Bug #10613: Fixed PostgreSQL Schema to return correct column names for unique indexes that have mixed case column names (cebe) -- Bug #11322: Fixed incorrect error message in `yii\validators\UniqueValidator` for composite `targetAttribute` (PowerGamer1, silverfire, cebe) +- Enh #11414: Files specified as `null` in `yii\web\AssetBundle` won't be registered (Razzwan) +- Enh #11428: Speedup SQL query in `yii\db\oci\Schema::findColumns()` (SSiwek) +- Enh #11432: Added HTTP status 421 "Misdirected Request" to list of statuses in `yii\web\Response` (dasmfm) +- Enh #11438: Configurable `yii\helpers\Markdown` default flavor (mdmunir) +- Enh #11462: Added support of filtering rules to `yii\log\Target::$logVar` (HaruAtari) +- Enh #11462: Added `\yii\helpers\BaseArrayHelper::filter()` method (HaruAtari) +- Enh #11484: Speed up `yii\db\oci\Schema::loadTableSchema()` for Oracle DBMS (SSiwek) +- Enh #11490: Added `yii\data\ArrayDataProvider::$modelClass` property to specify a model used to provide column labels even when data array is empty (PowerGamer1) +- Enh #11591: Added support for wildcards for `only` and `except` at `yii\base\ActionFilter` (klimov-paul) +- Enh #11679: Extracted `CheckAccessInterface` from `ManagerInterface` (SamMousa, samdark, mdomba) +- Enh #11725: Added indexes on message tables (OndrejVasicek) +- Enh #11729: Added `yii\grid\CheckboxColumn::$cssClass` property to specify a class added to checkbox input (thiagotalma) +- Enh #11808: `_table` and `_column` suffixes are now required when generating migration (rob006) +- Enh #11850: Introduced `yii\widgets\Pjax::$submitEvent` to be able to customize event triggering PJAX form submit (Bvanleeuwen) +- Enh #11857: `yii\filters\AccessRule::$verbs` can now be configured in upper and lowercase (DrDeath72, samdark) - Chg #11364: Updated jQuery dependency to include versions `1.12.*` (cebe) -- Bug #11252: Use strict comparison on ActiveRecord::hasAttribute() to avoid cases where it returns true when a number is passed to it (Faryshta) - Chg #11683: Fixed fixture command to work with short syntax. `yii fixture "*, -User"` should be used instead of `yii fixture "*" -User` (Faryshta, samdark) diff --git a/framework/classes.php b/framework/classes.php index af49488..40f6f9c 100644 --- a/framework/classes.php +++ b/framework/classes.php @@ -134,6 +134,7 @@ return [ 'yii\db\sqlite\Schema' => YII2_PATH . '/db/sqlite/Schema.php', 'yii\di\Container' => YII2_PATH . '/di/Container.php', 'yii\di\Instance' => YII2_PATH . '/di/Instance.php', + 'yii\di\NotInstantiableException' => YII2_PATH . '/di/NotInstantiableException.php', 'yii\di\ServiceLocator' => YII2_PATH . '/di/ServiceLocator.php', 'yii\filters\AccessControl' => YII2_PATH . '/filters/AccessControl.php', 'yii\filters\AccessRule' => YII2_PATH . '/filters/AccessRule.php', @@ -211,6 +212,7 @@ return [ 'yii\mutex\PgsqlMutex' => YII2_PATH . '/mutex/PgsqlMutex.php', 'yii\rbac\Assignment' => YII2_PATH . '/rbac/Assignment.php', 'yii\rbac\BaseManager' => YII2_PATH . '/rbac/BaseManager.php', + 'yii\rbac\CheckAccessInterface' => YII2_PATH . '/rbac/CheckAccessInterface.php', 'yii\rbac\DbManager' => YII2_PATH . '/rbac/DbManager.php', 'yii\rbac\Item' => YII2_PATH . '/rbac/Item.php', 'yii\rbac\ManagerInterface' => YII2_PATH . '/rbac/ManagerInterface.php', diff --git a/framework/console/Application.php b/framework/console/Application.php index acb2c82..7a08662 100644 --- a/framework/console/Application.php +++ b/framework/console/Application.php @@ -50,6 +50,10 @@ defined('STDERR') or define('STDERR', fopen('php://stderr', 'w')); * yii help * ``` * + * @property ErrorHandler $errorHandler The error handler application component. This property is read-only. + * @property Request $request The request component. This property is read-only. + * @property Response $response The response component. This property is read-only. + * * @author Qiang Xue * @since 2.0 */ diff --git a/framework/db/ColumnSchemaBuilder.php b/framework/db/ColumnSchemaBuilder.php index b381b58..f19dee2 100644 --- a/framework/db/ColumnSchemaBuilder.php +++ b/framework/db/ColumnSchemaBuilder.php @@ -77,6 +77,7 @@ class ColumnSchemaBuilder extends Object */ protected $isFirst; + /** * @var array mapping of abstract column types (keys) to type categories (values). * @since 2.0.8 @@ -301,7 +302,7 @@ class ColumnSchemaBuilder extends Object /** * Builds the not null constraint for the column. - * @return string returns 'NOT NULL' if [[isNotNull]] is true, + * @return string returns 'NOT NULL' if [[isNotNull]] is true, * 'NULL' if [[isNotNull]] is false or an empty string otherwise. */ protected function buildNotNullString() diff --git a/framework/db/pgsql/Schema.php b/framework/db/pgsql/Schema.php index d99eb55..96b4438 100644 --- a/framework/db/pgsql/Schema.php +++ b/framework/db/pgsql/Schema.php @@ -15,6 +15,8 @@ use yii\db\ColumnSchema; * Schema is the class for retrieving metadata from a PostgreSQL database * (version 9.x and above). * + * @property string[] $viewNames All view names in the database. This property is read-only. + * * @author Gevik Babakhani * @since 2.0 */ @@ -107,6 +109,7 @@ class Schema extends \yii\db\Schema 'jsonb' => self::TYPE_STRING, 'xml' => self::TYPE_STRING, ]; + /** * @var array list of ALL view names in the database */ diff --git a/framework/grid/CheckboxColumn.php b/framework/grid/CheckboxColumn.php index 79a658c..aa34f4e 100644 --- a/framework/grid/CheckboxColumn.php +++ b/framework/grid/CheckboxColumn.php @@ -73,6 +73,7 @@ class CheckboxColumn extends Column */ public $cssClass; + /** * @inheritdoc * @throws \yii\base\InvalidConfigException if [[name]] is not set. diff --git a/framework/rbac/CheckAccessInterface.php b/framework/rbac/CheckAccessInterface.php index d67c89e..1b1cb83 100644 --- a/framework/rbac/CheckAccessInterface.php +++ b/framework/rbac/CheckAccessInterface.php @@ -1,4 +1,10 @@ Date: Mon, 11 Jul 2016 15:38:16 +0200 Subject: [PATCH 060/163] prepare for next release --- build/controllers/ReleaseController.php | 2 +- framework/BaseYii.php | 2 +- framework/CHANGELOG.md | 6 ++++++ 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/build/controllers/ReleaseController.php b/build/controllers/ReleaseController.php index 4951ce3..bda6a51 100644 --- a/build/controllers/ReleaseController.php +++ b/build/controllers/ReleaseController.php @@ -437,7 +437,7 @@ class ReleaseController extends Controller $this->runGit("git push --tags", $frameworkPath); $this->stdout("\n\n"); - $this->stdout("CONGRATULATIONS! You have just released extension ", Console::FG_YELLOW, Console::BOLD); + $this->stdout("CONGRATULATIONS! You have just released ", Console::FG_YELLOW, Console::BOLD); $this->stdout('framework', Console::FG_RED, Console::BOLD); $this->stdout(" version ", Console::FG_YELLOW, Console::BOLD); $this->stdout($version, Console::BOLD); diff --git a/framework/BaseYii.php b/framework/BaseYii.php index b5d2992..5e07cca 100644 --- a/framework/BaseYii.php +++ b/framework/BaseYii.php @@ -93,7 +93,7 @@ class BaseYii */ public static function getVersion() { - return '2.0.9'; + return '2.0.10-dev'; } /** diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index 27c8884..c8a66df 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -1,6 +1,12 @@ Yii Framework 2 Change Log ========================== +2.0.10 under development +------------------------ + +- no changes in this release. + + 2.0.9 July 11, 2016 ------------------- From ad796dbf225ac52b41ee6652190c1361445e3b0b Mon Sep 17 00:00:00 2001 From: Evgeniy Date: Tue, 12 Jul 2016 03:49:43 +0600 Subject: [PATCH 061/163] #11912: Postgresql negative default values support for integer/float/decimal columns (#11933) * fixes #11912: Postgresql negative default values support for integer/float/decimal columns * added more tests * updated CHANGELOG.md --- framework/CHANGELOG.md | 2 +- framework/db/pgsql/Schema.php | 2 +- tests/data/cubrid.sql | 9 +++++++++ tests/data/mssql.sql | 9 +++++++++ tests/data/mysql.sql | 9 +++++++++ tests/data/oci.sql | 9 +++++++++ tests/data/postgres.sql | 9 +++++++++ tests/data/sqlite.sql | 9 +++++++++ tests/framework/db/SchemaTest.php | 13 +++++++++++++ 9 files changed, 69 insertions(+), 2 deletions(-) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index c8a66df..3bc9457 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -4,7 +4,7 @@ Yii Framework 2 Change Log 2.0.10 under development ------------------------ -- no changes in this release. +- Bug #11912: Fixed PostgreSQL Schema to support negative default values for integer/float/decimal columns (nsknewbie) diff --git a/framework/db/pgsql/Schema.php b/framework/db/pgsql/Schema.php index 96b4438..b1df0f9 100644 --- a/framework/db/pgsql/Schema.php +++ b/framework/db/pgsql/Schema.php @@ -471,7 +471,7 @@ SQL; $column->defaultValue = bindec(trim($column->defaultValue, 'B\'')); } elseif (preg_match("/^'(.*?)'::/", $column->defaultValue, $matches)) { $column->defaultValue = $matches[1]; - } elseif (preg_match('/^(.*?)::/', $column->defaultValue, $matches)) { + } elseif (preg_match('/^(?:\()?(.*?)(?(1)\))(?:::.+)?$/', $column->defaultValue, $matches)) { if ($matches[1] === 'NULL') { $column->defaultValue = null; } else { diff --git a/tests/data/cubrid.sql b/tests/data/cubrid.sql index b0134c9..03ef72e 100644 --- a/tests/data/cubrid.sql +++ b/tests/data/cubrid.sql @@ -13,6 +13,7 @@ DROP TABLE IF EXISTS "category"; DROP TABLE IF EXISTS "customer"; DROP TABLE IF EXISTS "profile"; DROP TABLE IF EXISTS "null_values"; +DROP TABLE IF EXISTS "negative_default_values"; DROP TABLE IF EXISTS "type"; DROP TABLE IF EXISTS "constraints"; DROP TABLE IF EXISTS "animal"; @@ -100,6 +101,14 @@ CREATE TABLE null_values ( PRIMARY KEY (id) ); +CREATE TABLE "negative_default_values" ( + smallint_col smallint default '-123', + int_col int default '-123', + bigint_col bigint default '-123', + float_col double default '-12345.6789', + numeric_col decimal(5,2) default '-33.22' +); + CREATE TABLE "type" ( "int_col" int(11) NOT NULL, diff --git a/tests/data/mssql.sql b/tests/data/mssql.sql index c4f3d27..9a5733d 100644 --- a/tests/data/mssql.sql +++ b/tests/data/mssql.sql @@ -8,6 +8,7 @@ IF OBJECT_ID('[dbo].[customer]', 'U') IS NOT NULL DROP TABLE [dbo].[customer]; IF OBJECT_ID('[dbo].[profile]', 'U') IS NOT NULL DROP TABLE [dbo].[profile]; IF OBJECT_ID('[dbo].[type]', 'U') IS NOT NULL DROP TABLE [dbo].[type]; IF OBJECT_ID('[dbo].[null_values]', 'U') IS NOT NULL DROP TABLE [dbo].[null_values]; +IF OBJECT_ID('[dbo].[negative_default_values]', 'U') IS NOT NULL DROP TABLE [dbo].[negative_default_values]; IF OBJECT_ID('[dbo].[animal]', 'U') IS NOT NULL DROP TABLE [dbo].[animal]; IF OBJECT_ID('[dbo].[default_pk]', 'U') IS NOT NULL DROP TABLE [dbo].[default_pk]; IF OBJECT_ID('[dbo].[document]', 'U') IS NOT NULL DROP TABLE [dbo].[document]; @@ -96,6 +97,14 @@ CREATE TABLE [dbo].[null_values] ( PRIMARY KEY (id) ); +CREATE TABLE [dbo].[negative_default_values] ( + [smallint_col] [tinyint] DEFAULT '-123', + [int_col] [smallint] DEFAULT '-123', + [bigint_col] [int] DEFAULT '-123', + [float_col] [float] DEFAULT '-12345.6789', + [numeric_col] [decimal](5,2) DEFAULT '-33.22' +); + CREATE TABLE [dbo].[type] ( [int_col] [int] NOT NULL, [int_col2] [int] DEFAULT '1', diff --git a/tests/data/mysql.sql b/tests/data/mysql.sql index 8bdc46d..edd4d76 100644 --- a/tests/data/mysql.sql +++ b/tests/data/mysql.sql @@ -13,6 +13,7 @@ DROP TABLE IF EXISTS `category` CASCADE; DROP TABLE IF EXISTS `customer` CASCADE; DROP TABLE IF EXISTS `profile` CASCADE; DROP TABLE IF EXISTS `null_values` CASCADE; +DROP TABLE IF EXISTS `negative_default_values` CASCADE; DROP TABLE IF EXISTS `type` CASCADE; DROP TABLE IF EXISTS `constraints` CASCADE; DROP TABLE IF EXISTS `animal` CASCADE; @@ -112,6 +113,14 @@ CREATE TABLE null_values ( PRIMARY KEY (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `negative_default_values` ( + `smallint_col` smallint default '-123', + `int_col` integer default '-123', + `bigint_col` bigint default '-123', + `float_col` double default '-12345.6789', + `numeric_col` decimal(5,2) default '-33.22' +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + CREATE TABLE `type` ( `int_col` integer NOT NULL, `int_col2` integer DEFAULT '1', diff --git a/tests/data/oci.sql b/tests/data/oci.sql index 43c4941..1a3584b 100644 --- a/tests/data/oci.sql +++ b/tests/data/oci.sql @@ -13,6 +13,7 @@ BEGIN EXECUTE IMMEDIATE 'DROP TABLE "customer"'; EXCEPTION WHEN OTHERS THEN IF S BEGIN EXECUTE IMMEDIATE 'DROP TABLE "profile"'; EXCEPTION WHEN OTHERS THEN IF SQLCODE != -942 THEN RAISE; END IF; END;-- BEGIN EXECUTE IMMEDIATE 'DROP TABLE "type"'; EXCEPTION WHEN OTHERS THEN IF SQLCODE != -942 THEN RAISE; END IF; END;-- BEGIN EXECUTE IMMEDIATE 'DROP TABLE "null_values"'; EXCEPTION WHEN OTHERS THEN IF SQLCODE != -942 THEN RAISE; END IF; END;-- +BEGIN EXECUTE IMMEDIATE 'DROP TABLE "negative_default_values"'; EXCEPTION WHEN OTHERS THEN IF SQLCODE != -942 THEN RAISE; END IF; END;-- BEGIN EXECUTE IMMEDIATE 'DROP TABLE "constraints"'; EXCEPTION WHEN OTHERS THEN IF SQLCODE != -942 THEN RAISE; END IF; END;-- BEGIN EXECUTE IMMEDIATE 'DROP TABLE "bool_values"'; EXCEPTION WHEN OTHERS THEN IF SQLCODE != -942 THEN RAISE; END IF; END;-- BEGIN EXECUTE IMMEDIATE 'DROP TABLE "animal"'; EXCEPTION WHEN OTHERS THEN IF SQLCODE != -942 THEN RAISE; END IF; END;-- @@ -130,6 +131,14 @@ CREATE TABLE "null_values" ( ); CREATE SEQUENCE "null_values_SEQ"; +CREATE TABLE "negative_default_values" ( + "smallint_col" smallint default -123, + "int_col" integer default -123, + "bigint_col" integer default -123, + "float_col" double precision default -12345.6789, + "numeric_col" decimal(5,2) default -33.22 +); + CREATE TABLE "type" ( "int_col" integer NOT NULL, "int_col2" integer DEFAULT 1, diff --git a/tests/data/postgres.sql b/tests/data/postgres.sql index a15adac..6defb4c 100644 --- a/tests/data/postgres.sql +++ b/tests/data/postgres.sql @@ -15,6 +15,7 @@ DROP TABLE IF EXISTS "customer" CASCADE; DROP TABLE IF EXISTS "profile" CASCADE; DROP TABLE IF EXISTS "type" CASCADE; DROP TABLE IF EXISTS "null_values" CASCADE; +DROP TABLE IF EXISTS "negative_default_values" CASCADE; DROP TABLE IF EXISTS "constraints" CASCADE; DROP TABLE IF EXISTS "bool_values" CASCADE; DROP TABLE IF EXISTS "animal" CASCADE; @@ -139,6 +140,14 @@ CREATE TABLE "bool_values" ( default_false boolean not null default false ); +CREATE TABLE "negative_default_values" ( + smallint_col smallint default '-123', + int_col integer default '-123', + bigint_col bigint default '-123', + float_col double precision default '-12345.6789', + numeric_col decimal(5,2) default '-33.22' +); + CREATE TABLE "animal" ( id serial primary key, type varchar(255) not null diff --git a/tests/data/sqlite.sql b/tests/data/sqlite.sql index fdcc199..324635d 100644 --- a/tests/data/sqlite.sql +++ b/tests/data/sqlite.sql @@ -14,6 +14,7 @@ DROP TABLE IF EXISTS "customer"; DROP TABLE IF EXISTS "profile"; DROP TABLE IF EXISTS "type"; DROP TABLE IF EXISTS "null_values"; +DROP TABLE IF EXISTS "negative_default_values"; DROP TABLE IF EXISTS "animal"; DROP TABLE IF EXISTS "default_pk"; DROP TABLE IF EXISTS "document"; @@ -95,6 +96,14 @@ CREATE TABLE "null_values" ( stringcol VARCHAR(32) DEFAULT NULL ); +CREATE TABLE "negative_default_values" ( + smallint_col integer default '-123', + int_col integer default '-123', + bigint_col integer default '-123', + float_col double default '-12345.6789', + numeric_col decimal(5,2) default '-33.22' +); + CREATE TABLE "type" ( int_col INTEGER NOT NULL, int_col2 INTEGER DEFAULT '1', diff --git a/tests/framework/db/SchemaTest.php b/tests/framework/db/SchemaTest.php index 3f1002e..b7e02d5 100644 --- a/tests/framework/db/SchemaTest.php +++ b/tests/framework/db/SchemaTest.php @@ -339,6 +339,19 @@ abstract class SchemaTest extends DatabaseTestCase ]; } + public function testNegativeDefaultValues() + { + /* @var $schema Schema */ + $schema = $this->getConnection()->schema; + + $table = $schema->getTableSchema('negative_default_values'); + $this->assertEquals(-123, $table->getColumn('smallint_col')->defaultValue); + $this->assertEquals(-123, $table->getColumn('int_col')->defaultValue); + $this->assertEquals(-123, $table->getColumn('bigint_col')->defaultValue); + $this->assertEquals(-12345.6789, $table->getColumn('float_col')->defaultValue); + $this->assertEquals(-33.22, $table->getColumn('numeric_col')->defaultValue); + } + public function testColumnSchema() { $columns = $this->getExpectedColumns(); From 952d6cbe9aa62165349d5042ca2b994b7f53df9f Mon Sep 17 00:00:00 2001 From: Carsten Brandt Date: Tue, 12 Jul 2016 12:43:47 +0200 Subject: [PATCH 062/163] updated german translation --- framework/messages/de/yii.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/framework/messages/de/yii.php b/framework/messages/de/yii.php index 1d928c0..700784b 100644 --- a/framework/messages/de/yii.php +++ b/framework/messages/de/yii.php @@ -17,7 +17,7 @@ * NOTE: this file must be saved in UTF-8 encoding. */ return [ - 'Unknown alias: -{name}' => 'Unbekannter Alias: -{name}', + 'The combination {values} of {attributes} has already been taken.' => 'Die Kombination {values} für {attributes} wird bereits verwendet.', '(not set)' => '(nicht gesetzt)', 'An internal server error occurred.' => 'Es ist ein interner Serverfehler aufgetreten.', 'Are you sure you want to delete this item?' => 'Wollen Sie diesen Eintrag wirklich löschen?', @@ -50,6 +50,7 @@ return [ 'The verification code is incorrect.' => 'Der Prüfcode ist falsch.', 'Total {count, number} {count, plural, one{item} other{items}}.' => 'Insgesamt {count, number} {count, plural, one{Eintrag} other{Einträge}}.', 'Unable to verify your data submission.' => 'Es ist nicht möglich, Ihre Dateneingabe zu prüfen.', + 'Unknown alias: -{name}' => 'Unbekannter Alias: -{name}', 'Unknown option: --{name}' => 'Unbekannte Option: --{name}', 'Update' => 'Bearbeiten', 'View' => 'Anzeigen', From 23fae0a7f9e86b8a2de7a729e9bf7415a83b4d7e Mon Sep 17 00:00:00 2001 From: Shaig Khaligli Date: Wed, 13 Jul 2016 12:16:02 +0400 Subject: [PATCH 063/163] Updated "az" translations (#11942) [skip ci] Minor changes in Azerbaijani translation - more fluent. --- framework/messages/az/yii.php | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/framework/messages/az/yii.php b/framework/messages/az/yii.php index be787c7..a794ef8 100644 --- a/framework/messages/az/yii.php +++ b/framework/messages/az/yii.php @@ -42,10 +42,10 @@ return [ 'The file "{file}" is too big. Its size cannot exceed {formattedLimit}.' => '"{file}" faylı çox böyükdür. Həcmi {formattedLimit} qiymətindən böyük ola bilməz.', 'The file "{file}" is too small. Its size cannot be smaller than {formattedLimit}.' => '"{file}" faylı çox kiçikdir. Həcmi {formattedLimit} qiymətindən kiçik ola bilməz.', 'The format of {attribute} is invalid.' => '{attribute} formatı düzgün deyil.', - 'The image "{file}" is too large. The height cannot be larger than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => '"{file}" çox böyükdür. Uzunluq {limit, plural, one{pixel} other{pixels}} qiymətindən böyük ola bilməz.', - 'The image "{file}" is too large. The width cannot be larger than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => '"{file}" çox böyükdür. Eni {limit, number} {limit, plural, one{pixel} other{pixel}} qiymətindən böyük ola bilməz.', - 'The image "{file}" is too small. The height cannot be smaller than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => '"{file}" çox kiçikdir. Eni {limit, number} {limit, plural, one{pixel} other{pixel}} qiymətindən kiçik ola bilməz.', - 'The image "{file}" is too small. The width cannot be smaller than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => '"{file}" çox kiçikdir. Eni {limit, number} {limit, plural, one{pixel} other{pixels}} qiymətindən kiçik ola bilməz.', + 'The image "{file}" is too large. The height cannot be larger than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => '"{file}" şəkli çox böyükdür. Uzunluq {limit, plural, one{pixel} other{pixels}} qiymətindən böyük ola bilməz.', + 'The image "{file}" is too large. The width cannot be larger than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => '"{file}" şəkli çox böyükdür. Eni {limit, number} {limit, plural, one{pixel} other{pixel}} qiymətindən böyük ola bilməz.', + 'The image "{file}" is too small. The height cannot be smaller than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => '"{file}" şəkli çox kiçikdir. Eni {limit, number} {limit, plural, one{pixel} other{pixel}} qiymətindən kiçik ola bilməz.', + 'The image "{file}" is too small. The width cannot be smaller than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => '"{file}" şəkli çox kiçikdir. Eni {limit, number} {limit, plural, one{pixel} other{pixels}} qiymətindən kiçik ola bilməz.', 'The verification code is incorrect.' => 'Təsdiqləmə kodu səhvdir.', 'Total {count, number} {count, plural, one{item} other{items}}.' => 'Toplam {count, number} {count, plural, one{element} other{element}}.', 'Unable to verify your data submission.' => 'Təqdim etdiyiniz məlumat təsdiqlənmədi.', @@ -64,16 +64,16 @@ return [ '{attribute} is not a valid email address.' => '{attribute} düzgün e-mail deyil.', '{attribute} must be "{requiredValue}".' => '{attribute} {requiredValue} olmalıdır.', '{attribute} must be a number.' => '{attribute} ədəd olmalıdır.', - '{attribute} must be a string.' => '{attribute} hərf olmalıdır.', + '{attribute} must be a string.' => '{attribute} simvol tipli olmalıdır.', '{attribute} must be an integer.' => '{attribute} tam ədəd olmalıdır.', - '{attribute} must be either "{true}" or "{false}".' => '{attribute} {true} ya da {false} ola bilər.', + '{attribute} must be either "{true}" or "{false}".' => '{attribute} ya {true} ya da {false} ola bilər.', '{attribute} must be greater than "{compareValue}".' => '{attribute}, "{compareValue}" dən böyük olmalıdır.', '{attribute} must be greater than or equal to "{compareValue}".' => '{attribute}, "{compareValue}"dən böyük və ya bərabər olmalıdır.', - '{attribute} must be less than "{compareValue}".' => '{attribute}, "{compareValue}" dən az olmalıdır.', - '{attribute} must be less than or equal to "{compareValue}".' => '{attribute}, "{compareValue}"dən az və ya bərabər olmalıdır.', + '{attribute} must be less than "{compareValue}".' => '{attribute}, "{compareValue}" dən kiçik olmalıdır.', + '{attribute} must be less than or equal to "{compareValue}".' => '{attribute}, "{compareValue}"dən kiçik və ya bərabər olmalıdır.', '{attribute} must be no greater than {max}.' => '{attribute} {max} dən böyük olmamalıdır.', '{attribute} must be no less than {min}.' => '{attribute} {min} dən kiçik olmamalıdır.', - '{attribute} must be repeated exactly.' => '{attribute} dəqiq təkrar olunmalıdir.', + '{attribute} must be repeated exactly.' => '{attribute} dəqiqliklə təkrar olunmalıdir.', '{attribute} must not be equal to "{compareValue}".' => '{attribute}, "{compareValue}" ilə eyni olmamalıdır', '{attribute} should contain at least {min, number} {min, plural, one{character} other{characters}}.' => '{attribute} ən az {min, number} simvol olmalıdır.', '{attribute} should contain at most {max, number} {max, plural, one{character} other{characters}}.' => '{attribute} ən çox {max, number} simvol olmalıdır.', From 355d83ac58f4fd7ca92727ae49dd83726f22d2e1 Mon Sep 17 00:00:00 2001 From: pavlm Date: Wed, 13 Jul 2016 22:34:00 +0300 Subject: [PATCH 064/163] Fixes #11947: Fixed `gridData` initialization in `yii.gridView.js` --- framework/CHANGELOG.md | 2 +- framework/assets/yii.gridView.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index 3bc9457..a21b348 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -5,7 +5,7 @@ Yii Framework 2 Change Log ------------------------ - Bug #11912: Fixed PostgreSQL Schema to support negative default values for integer/float/decimal columns (nsknewbie) - +- Bug #11947: Fixed `gridData` initialization in `yii.gridView.js` (pavlm) 2.0.9 July 11, 2016 diff --git a/framework/assets/yii.gridView.js b/framework/assets/yii.gridView.js index 039b84a..108ebf7 100644 --- a/framework/assets/yii.gridView.js +++ b/framework/assets/yii.gridView.js @@ -147,7 +147,7 @@ setSelectionColumn: function (options) { var $grid = $(this); var id = $(this).attr('id'); - if (gridData.id === undefined) { + if (gridData[id] === undefined) { gridData[id] = {}; } gridData[id].selectionColumn = options.name; From 2118d96655a70d6f4da159a228aea4a309e54e2c Mon Sep 17 00:00:00 2001 From: Nikola Kovacs Date: Thu, 14 Jul 2016 11:20:41 +0200 Subject: [PATCH 065/163] Fix double space after array key (#11954) [skip ci] --- docs/internals/core-code-style.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/internals/core-code-style.md b/docs/internals/core-code-style.md index eff0b8b..26e85b0 100644 --- a/docs/internals/core-code-style.md +++ b/docs/internals/core-code-style.md @@ -236,7 +236,7 @@ Use the following format for associative arrays: ```php $config = [ - 'name' => 'Yii', + 'name' => 'Yii', 'options' => ['usePHP' => true], ]; ``` From f7f24d3c4739983f293367aea866c884e9f3ff89 Mon Sep 17 00:00:00 2001 From: Roman Grinyov Date: Thu, 14 Jul 2016 12:21:42 +0300 Subject: [PATCH 066/163] Fix code block in phpDoc of BaseArrayHelper::filter (#11948) [skip ci] --- framework/helpers/BaseArrayHelper.php | 1 - 1 file changed, 1 deletion(-) diff --git a/framework/helpers/BaseArrayHelper.php b/framework/helpers/BaseArrayHelper.php index 2445d25..88b639f 100644 --- a/framework/helpers/BaseArrayHelper.php +++ b/framework/helpers/BaseArrayHelper.php @@ -782,7 +782,6 @@ class BaseArrayHelper * // 'A' => [1, 2], * // 'B' => ['C' => 1], * // ] - * ``` * * $result = \yii\helpers\ArrayHelper::filter($array, ['B', '!B.C']); * // $result will be: From 2fbd55b6342285ff60851be4e8338179593388f3 Mon Sep 17 00:00:00 2001 From: Egor Verbitskiy Date: Thu, 14 Jul 2016 02:38:26 -0700 Subject: [PATCH 067/163] Fixes #11949: Fixed `ActiveField::end` generates close tag when it's `option['tag']` is null --- framework/CHANGELOG.md | 1 + framework/widgets/ActiveField.php | 2 +- tests/framework/widgets/ActiveFieldTest.php | 34 ++++++++++++++++++++++++++++- 3 files changed, 35 insertions(+), 2 deletions(-) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index a21b348..e792b53 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -4,6 +4,7 @@ Yii Framework 2 Change Log 2.0.10 under development ------------------------ +- Bug #11949: Fixed `ActiveField::end` generates close tag when it's `option['tag']` is null (egorio) - Bug #11912: Fixed PostgreSQL Schema to support negative default values for integer/float/decimal columns (nsknewbie) - Bug #11947: Fixed `gridData` initialization in `yii.gridView.js` (pavlm) diff --git a/framework/widgets/ActiveField.php b/framework/widgets/ActiveField.php index 45d1df4..9995755 100644 --- a/framework/widgets/ActiveField.php +++ b/framework/widgets/ActiveField.php @@ -245,7 +245,7 @@ class ActiveField extends Component */ public function end() { - return Html::endTag(isset($this->options['tag']) ? $this->options['tag'] : 'div'); + return Html::endTag(ArrayHelper::keyExists('tag', $this->options) ? $this->options['tag'] : 'div'); } /** diff --git a/tests/framework/widgets/ActiveFieldTest.php b/tests/framework/widgets/ActiveFieldTest.php index b4de017..37d3af0 100644 --- a/tests/framework/widgets/ActiveFieldTest.php +++ b/tests/framework/widgets/ActiveFieldTest.php @@ -147,6 +147,26 @@ EOD; $this->assertEquals($expectedValue, $actualValue); } + public function testBegin() { + $expectedValue = '

'; + $this->activeField->options['tag'] = 'article'; + $actualValue = $this->activeField->begin(); + + $this->assertEquals($expectedValue, $actualValue); + + $expectedValue = ""; + $this->activeField->options['tag'] = null; + $actualValue = $this->activeField->begin(); + + $this->assertEquals($expectedValue, $actualValue); + + $expectedValue = ""; + $this->activeField->options['tag'] = false; + $actualValue = $this->activeField->begin(); + + $this->assertEquals($expectedValue, $actualValue); + } + public function testEnd() { $expectedValue = ''; @@ -159,7 +179,19 @@ EOD; $this->activeField->options['tag'] = 'article'; $actualValue = $this->activeField->end(); - $this->assertTrue($actualValue === $expectedValue); + $this->assertEquals($expectedValue, $actualValue); + + $expectedValue = ""; + $this->activeField->options['tag'] = false; + $actualValue = $this->activeField->end(); + + $this->assertEquals($expectedValue, $actualValue); + + $expectedValue = ""; + $this->activeField->options['tag'] = null; + $actualValue = $this->activeField->end(); + + $this->assertEquals($expectedValue, $actualValue); } public function testLabel() From 466fc9db32be0f7432760a96d512246f6584e39d Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Thu, 14 Jul 2016 12:42:33 +0300 Subject: [PATCH 068/163] Adjusted wording --- docs/internals/core-code-style.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/internals/core-code-style.md b/docs/internals/core-code-style.md index 26e85b0..c4e0ce8 100644 --- a/docs/internals/core-code-style.md +++ b/docs/internals/core-code-style.md @@ -475,7 +475,7 @@ Always use `static` except the following cases: - accessing constants MUST be done via `self`: `self::MY_CONSTANT` - accessing private static properties MUST be done via `self`: `self::$_events` -- It is allowed to use `self` for recursion to call current implementation again instead of extending classes implementation. +- It is allowed to use `self` for method calls where it makes sense such as recursive call to current implementation instead of extending classes implementation. ### value for "don't do something" From c99acb618287fd77b93b013745a8e448c33c869e Mon Sep 17 00:00:00 2001 From: Egor Verbitskiy Date: Fri, 15 Jul 2016 04:53:25 -0700 Subject: [PATCH 069/163] Fixes #11950: Improve BaseArrayHelper::keyExists speed --- framework/CHANGELOG.md | 4 ++-- framework/helpers/BaseArrayHelper.php | 4 +++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index e792b53..3268dd2 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -4,10 +4,10 @@ Yii Framework 2 Change Log 2.0.10 under development ------------------------ -- Bug #11949: Fixed `ActiveField::end` generates close tag when it's `option['tag']` is null (egorio) - Bug #11912: Fixed PostgreSQL Schema to support negative default values for integer/float/decimal columns (nsknewbie) - Bug #11947: Fixed `gridData` initialization in `yii.gridView.js` (pavlm) - +- Bug #11949: Fixed `ActiveField::end` generates close tag when it's `option['tag']` is null (egorio) +- Enh #11950: Improve BaseArrayHelper::keyExists speed (egorio) 2.0.9 July 11, 2016 ------------------- diff --git a/framework/helpers/BaseArrayHelper.php b/framework/helpers/BaseArrayHelper.php index 88b639f..1968772 100644 --- a/framework/helpers/BaseArrayHelper.php +++ b/framework/helpers/BaseArrayHelper.php @@ -486,7 +486,9 @@ class BaseArrayHelper public static function keyExists($key, $array, $caseSensitive = true) { if ($caseSensitive) { - return array_key_exists($key, $array); + // Function `isset` checks key faster but skips `null`, `array_key_exists` handles this case + // http://php.net/manual/en/function.array-key-exists.php#107786 + return isset($array[$key]) || array_key_exists($key, $array); } else { foreach (array_keys($array) as $k) { if (strcasecmp($key, $k) === 0) { From a3ea354479990d36f880d53515e8c95fa34a43d9 Mon Sep 17 00:00:00 2001 From: Roman Grinyov Date: Fri, 15 Jul 2016 16:39:45 +0300 Subject: [PATCH 070/163] Docs: typo, replace comma to semicolon (#11966) [skip ci] --- docs/guide/concept-configurations.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/guide/concept-configurations.md b/docs/guide/concept-configurations.md index 6a62c23..cb4fa3c 100644 --- a/docs/guide/concept-configurations.md +++ b/docs/guide/concept-configurations.md @@ -222,7 +222,7 @@ the specified classes when they are being created using [[Yii::createObject()]]. can be specified by calling `Yii::$container->set()` in the [bootstrapping](runtime-bootstrapping.md) code. For example, if you want to customize [[yii\widgets\LinkPager]] so that ALL link pagers will show at most 5 page buttons -(the default value is 10), you may use the following code to achieve this goal, +(the default value is 10), you may use the following code to achieve this goal: ```php \Yii::$container->set('yii\widgets\LinkPager', [ From 6728d5d0e094fb85a1707dc581ec1dd7ad305df2 Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Fri, 15 Jul 2016 21:46:14 +0300 Subject: [PATCH 071/163] Fixes #11965: fixed docs for MessageController only and except --- framework/console/controllers/MessageController.php | 10 +++------- framework/views/messageConfig.php | 10 +++------- 2 files changed, 6 insertions(+), 14 deletions(-) diff --git a/framework/console/controllers/MessageController.php b/framework/console/controllers/MessageController.php index 980c192..3a86491 100644 --- a/framework/console/controllers/MessageController.php +++ b/framework/console/controllers/MessageController.php @@ -84,12 +84,8 @@ class MessageController extends Controller /** * @var array list of patterns that specify which files/directories should NOT be processed. * If empty or not set, all files/directories will be processed. - * A path matches a pattern if it contains the pattern string at its end. For example, - * '/a/b' will match all files and directories ending with '/a/b'; - * the '*.svn' will match all files and directories whose name ends with '.svn'. - * and the '.svn' will match all files and directories named exactly '.svn'. - * Note, the '/' characters in a pattern matches both '/' and '\'. - * See helpers/FileHelper::findFiles() description for more details on pattern matching rules. + * See helpers/FileHelper::findFiles() description for pattern matching rules. + * If a file/directory matches both a pattern in "only" and "except", it will NOT be processed. */ public $except = [ '.svn', @@ -104,7 +100,7 @@ class MessageController extends Controller /** * @var array list of patterns that specify which files (not directories) should be processed. * If empty or not set, all files will be processed. - * Please refer to "except" for details about the patterns. + * See helpers/FileHelper::findFiles() description for pattern matching rules. * If a file/directory matches both a pattern in "only" and "except", it will NOT be processed. */ public $only = ['*.php']; diff --git a/framework/views/messageConfig.php b/framework/views/messageConfig.php index f416928..af61d10 100644 --- a/framework/views/messageConfig.php +++ b/framework/views/messageConfig.php @@ -23,16 +23,12 @@ return [ 'markUnused' => true, // array, list of patterns that specify which files (not directories) should be processed. // If empty or not set, all files will be processed. - // Please refer to "except" for details about the patterns. + // See helpers/FileHelper::findFiles() for pattern matching rules. + // If a file/directory matches both a pattern in "only" and "except", it will NOT be processed. 'only' => ['*.php'], // array, list of patterns that specify which files/directories should NOT be processed. // If empty or not set, all files/directories will be processed. - // A path matches a pattern if it contains the pattern string at its end. For example, - // '/a/b' will match all files and directories ending with '/a/b'; - // the '*.svn' will match all files and directories whose name ends with '.svn'. - // and the '.svn' will match all files and directories named exactly '.svn'. - // Note, the '/' characters in a pattern matches both '/' and '\'. - // See helpers/FileHelper::findFiles() description for more details on pattern matching rules. + // See helpers/FileHelper::findFiles() for pattern matching rules. // If a file/directory matches both a pattern in "only" and "except", it will NOT be processed. 'except' => [ '.svn', From b9245f7107bbaba1265f9c4ba1fff0d3321c72b5 Mon Sep 17 00:00:00 2001 From: Roman Grinyov Date: Fri, 15 Jul 2016 22:23:26 +0300 Subject: [PATCH 072/163] Fixes #11967: added missing string of YII_ENV definition [skip ci] --- docs/guide/structure-entry-scripts.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/guide/structure-entry-scripts.md b/docs/guide/structure-entry-scripts.md index 1349c2e..c27962f 100644 --- a/docs/guide/structure-entry-scripts.md +++ b/docs/guide/structure-entry-scripts.md @@ -63,6 +63,7 @@ Similarly, the following is the code for the entry script of a console applicati */ defined('YII_DEBUG') or define('YII_DEBUG', true); +defined('YII_ENV') or define('YII_ENV', 'dev'); // register Composer autoloader require(__DIR__ . '/vendor/autoload.php'); From 1d478bdd14cedb9dce96aca7cf14cd644b4263c8 Mon Sep 17 00:00:00 2001 From: Nobuo Kihara Date: Tue, 19 Jul 2016 21:30:29 +0900 Subject: [PATCH 073/163] framework/messages/ja/yii.php updated [ci skip] --- framework/messages/ja/yii.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/framework/messages/ja/yii.php b/framework/messages/ja/yii.php index 5551c90..3ab9d6d 100644 --- a/framework/messages/ja/yii.php +++ b/framework/messages/ja/yii.php @@ -36,6 +36,7 @@ return [ 'Please fix the following errors:' => '次のエラーを修正してください :', 'Please upload a file.' => 'ファイルをアップロードしてください。', 'Showing {begin, number}-{end, number} of {totalCount, number} {totalCount, plural, one{item} other{items}}.' => '{totalCount, number} 件中 {begin, number} から {end, number} までを表示しています。', + 'The combination {values} of {attributes} has already been taken.' => '', '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} より小さくてはいけません。', @@ -48,6 +49,7 @@ return [ 'The verification code is incorrect.' => '検証コードが正しくありません。', 'Total {count, number} {count, plural, one{item} other{items}}.' => '合計 {count} 件。', 'Unable to verify your data submission.' => 'データ送信を検証できませんでした。', + 'Unknown alias: -{name}' => '不明なエイリアス: -{name}', 'Unknown option: --{name}' => '不明なオプション: --{name}', 'Update' => '更新', 'View' => '閲覧', From 2afdbfd25f6738483e4ec86dae0c94b9a03494cc Mon Sep 17 00:00:00 2001 From: Nobuo Kihara Date: Tue, 19 Jul 2016 21:31:07 +0900 Subject: [PATCH 074/163] docs/guide-ja updated [ci skip] --- docs/guide-ja/concept-di-container.md | 32 +++++++++++++++++++++++++++++++ docs/guide-ja/db-migrations.md | 2 +- docs/guide-ja/rest-response-formatting.md | 27 ++++++++++++++++++++++++++ docs/guide-ja/start-installation.md | 30 +++++++++++++++++++++++------ docs/guide-ja/structure-entry-scripts.md | 1 + docs/guide-ja/structure-widgets.md | 4 ++++ 6 files changed, 89 insertions(+), 7 deletions(-) diff --git a/docs/guide-ja/concept-di-container.md b/docs/guide-ja/concept-di-container.md index 73840a8..3bf03b2 100644 --- a/docs/guide-ja/concept-di-container.md +++ b/docs/guide-ja/concept-di-container.md @@ -12,6 +12,7 @@ Yii は [[yii\di\Container]] クラスを通して DI コンテナの機能を提供します。これは、次の種類の依存注入をサポートしています: * コンストラクタ·インジェクション +* メソッド・インジェクション * セッター/プロパティ·インジェクション * PHP コーラブル·インジェクション @@ -38,6 +39,37 @@ $foo = new Foo($bar); ``` +### メソッド・インジェクション + +通常、クラスの依存はコンストラクタに渡されて、そのクラスの内部でライフサイクル全体にわたって利用可能になります。 +メソッド・インジェクションを使うと、クラスのメソッドの一つだけに必要となる依存、例えば、コンストラクタに渡すことが不可能であったり、大半のユースケースにおいてはオーバーヘッドが大きすぎるような依存を提供することが可能になります。 + +クラスのメソッドを次の例の `doSomething` メソッドのように定義することが出来ます。 + +```php +class MyClass extends \yii\base\Component +{ + public function __construct(/* 軽量の依存はここに */, $config = []) + { + // ... + } + + public function doSomething($param1, \my\heavy\Dependency $something) + { + // $something を使って何かをする + } +} +``` + +あなた自身で `\my\heavy\Dependency` のインスタンスを渡すか、次のように +[[yii\di\Container::invoke()]] を使えば、このメソッドを呼ぶことが出来ます。 + +```php +$obj = new MyClass(/*...*/); +Yii::$container->invoke([$obj, 'doSomethingWithHeavyDependency'], ['param1' => 42]); // $something は DI コンテナによって提供される +``` + + ### セッター/プロパティ·インジェクション セッター/プロパティ·インジェクションは、[構成情報](concept-configurations.md) を通してサポートされます。 diff --git a/docs/guide-ja/db-migrations.md b/docs/guide-ja/db-migrations.md index 7713b54..71c0250 100644 --- a/docs/guide-ja/db-migrations.md +++ b/docs/guide-ja/db-migrations.md @@ -176,7 +176,7 @@ class m150101_185401_create_news_table extends Migration バージョン 2.0.7 以降では、マイグレーション・コンソールがマイグレーションを生成する便利な方法を提供しています。 -マイグレーションの名前が特定の形式である場合は、生成されるマイグレーション・ファイルに追加のコードが書き込まれます。 +マイグレーションの名前が特別な形式である場合は、生成されるマイグレーション・ファイルに追加のコードが書き込まれます。 例えば、`create_xxx_table` や `drop_xxx_table` であれば、テーブルの作成や削除をするコードが追加されます。 以下で、この機能の全ての変種を説明します。 diff --git a/docs/guide-ja/rest-response-formatting.md b/docs/guide-ja/rest-response-formatting.md index 2b816c1..2acc5a8 100644 --- a/docs/guide-ja/rest-response-formatting.md +++ b/docs/guide-ja/rest-response-formatting.md @@ -146,3 +146,30 @@ Content-Type: application/json; charset=UTF-8 } } ``` + +### JSON 出力を制御する + +JSON 形式のレスポンスを生成する [[yii\web\JsonResponseFormatter|JsonResponseFormatter]] クラスは [[yii\helpers\Json|JSON ヘルパ]] を内部的に使用します。 +このフォーマッタはさまざまなオプションによって構成することが可能です。 +例えば、[[yii\web\JsonResponseFormatter::$prettyPrint|$prettyPrint]] オプションは、より読みやすいレスポンスのためのもので、開発時に有用なオプションです。 +また、[[yii\web\JsonResponseFormatter::$encodeOptions|$encodeOptions]] によって JSON エンコーディングの出力を制御することが出来ます。 + +フォーマッタは、以下のように、アプリケーションの [構成情報](concept-configuration.md) の中で、`response` アプリケーション・コンポーネントの [[yii\web\Response::formatters|formatters]] プロパティの中で構成することが出来ます。 + +```php +'response' => [ + // ... + 'formatters' => [ + \yii\web\Response::FORMAT_JSON => [ + 'class' => 'yii\web\JsonResponseFormatter', + 'prettyPrint' => YII_DEBUG, // デバッグモードでは "きれい" な出力を使用 + 'encodeOptions' => JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE, + // ... + ], + ], +], +``` + +[DAO](db-dao.md) データベース・レイヤを使ってデータベースからデータを返す場合は、全てのデータが文字列として表されます。 +しかし、特に数値は JSON では数として表現されなければなりませんので、これは必ずしも期待通りの結果であるとは言えません。 +一方、ActiveRecord レイヤを使ってデータベースからデータを取得する場合は、数値カラムの値は、[[yii\db\ActiveRecord::populateRecord()]] においてデータベースからデータが取得される際に、整数に変換されます。 diff --git a/docs/guide-ja/start-installation.md b/docs/guide-ja/start-installation.md index 0439ac1..7b6e1aa 100644 --- a/docs/guide-ja/start-installation.md +++ b/docs/guide-ja/start-installation.md @@ -21,7 +21,9 @@ Yii はもう一つ、[アドバンストプロジェクトテンプレート](h Composer によるインストール --------------------------- -まだ Composer をインストールしていない場合は、[getcomposer.org](https://getcomposer.org/download/) の指示に従ってインストールすることが出来ます。 +### Composer をインストールする + +まだ Composer をインストールしていない場合は、[getcomposer.org]() の指示に従ってインストールすることが出来ます。 Linux や Mac OS X では、次のコマンドを実行します。 ```bash @@ -31,11 +33,25 @@ mv composer.phar /usr/local/bin/composer Windows では、[Composer-Setup.exe](https://getcomposer.org/Composer-Setup.exe) をダウンロードして実行します。 -何か問題が生じたときや、Composer の使い方に関してもっと学習したいときは、[Composer ドキュメント](https://getcomposer.org/doc/) を参照してください。 +何か問題が生じたときは、[Composer ドキュメントのトラブル・シューティングの節](https://getcomposer.org/doc/articles/troubleshooting.md) を参照してください。 +Composer は初めてだという場合は、少なくとも、Composer ドキュメントの [基本的な使い方の節](https://getcomposer.org/doc/01-basic-usage.md) も参照することを推奨します。 + +このガイドでは、composer のコマンドの全ては、あなたが composer を [グローバル](https://getcomposer.org/doc/00-intro.md#globally) にインストールし、`composer` コマンドとして使用できるようにしているものと想定しています。 +そうではなく、ローカル・ディレクトリにある `composer.phar` を使おうとする場合は、例に出てくるコマンドをそれに合せて修正しなければなりません。 以前に Composer をインストールしたことがある場合は、確実に最新のバージョンを使うようにしてください。 Composer は `composer self-update` コマンドを実行してアップデートすることが出来ます。 +> Note: Yii のインストールを実行する際に、Composer は大量の情報を Github API から要求する必要が生じます。 +> リクエストの量は、あなたのアプリケーションが持つ依存の数に依存しますが、**Github API レート制限** より大きくなることがあり得ます。 +> この制限にかかった場合、Composer は Github API トークンを取得するために、あなたの Github ログイン認証情報を要求するでしょう。 +> 高速な接続においては、Composer が対処できるよりも早い段階でこの制限にかかることもありますので、 +> Yii のインストールの前に、このアクセス・トークンを構成することを推奨します。 +> アクセス・トークンの構成の仕方については、[Github API トークンに関する Composer ドキュメント](https://getcomposer.org/doc/articles/troubleshooting.md#api-rate-limit-and-oauth-tokens) +> の指示を参照して下さい。 + +### Yii をインストールする + Composer がインストールされたら、ウェブからアクセスできるフォルダで下記のコマンドを実行することによって Yii をインストールすることが出来ます。 ```bash @@ -46,12 +62,14 @@ composer create-project --prefer-dist yiisoft/yii2-app-basic basic 最初のコマンドは [composer アセットプラグイン](https://github.com/francoispluchino/composer-asset-plugin/) をインストールします。 これにより、Composer を通じて bower と npm の依存パッケージを管理することが出来るようになります。 このコマンドは一度だけ実行すれば十分です。 -第二のコマンドは `basic` という名前のディレクトリに Yii をインストールします。 +第二のコマンドは `basic` という名前のディレクトリに Yii の最新の安定版をインストールします。 必要なら別のディレクトリ名を選ぶことも出来ます。 -> Note: インストール実行中に Composer が あなたの Github のログイン認証情報を求めることがあるかも知れません。 -> これは、Comoser が依存パッケージの情報を Github から読み出すために十分な API レートを必要とするためで、普通にあることです。 -> 詳細については、[Composer ドキュメント](https://getcomposer.org/doc/articles/troubleshooting.md#api-rate-limit-and-oauth-tokens) を参照してください。 +> Info: `composer create-project` コマンドが失敗するときは、composer asset plugin が正しくインストール出来ているかどうかを確認して下さい。 +> `composer global show` を実行することで確認することが出来ます。このコマンドの出力に `fxp/composer-asset-plugin` のエントリが含まれていなければなりません。. +> よくあるエラーについては、[Composer ドキュメントのトラブル・シューティングの節](https://getcomposer.org/doc/articles/troubleshooting.md) +> も参照して下さい。 +> エラーを修正した後は、`basic` ディレクトリの中で `composer update` を実行して、中断されたインストールを再開することが出来ます。 > Tip: Yii の最新の開発バージョンをインストールしたい場合は、[stability option](https://getcomposer.org/doc/04-schema.md#minimum-stability) を追加した次のコマンドを代りに使うことが出来ます。 > diff --git a/docs/guide-ja/structure-entry-scripts.md b/docs/guide-ja/structure-entry-scripts.md index 08c599d..4503fe4 100644 --- a/docs/guide-ja/structure-entry-scripts.md +++ b/docs/guide-ja/structure-entry-scripts.md @@ -61,6 +61,7 @@ $config = require(__DIR__ . '/../config/web.php'); */ defined('YII_DEBUG') or define('YII_DEBUG', true); +defined('YII_ENV') or define('YII_ENV', 'dev'); // Composer のオートローダを登録 require(__DIR__ . '/vendor/autoload.php'); diff --git a/docs/guide-ja/structure-widgets.md b/docs/guide-ja/structure-widgets.md index ba89912..a1b6273 100644 --- a/docs/guide-ja/structure-widgets.md +++ b/docs/guide-ja/structure-widgets.md @@ -67,6 +67,10 @@ use yii\helpers\Html; [[yii\base\Widget::widget()]] がウィジェットのレンダリング結果を返すのとは違って、[[yii\base\Widget::begin()]] メソッドがウィジェットのインスタンスを返すことに注意してください。 返されたウィジェットのインスタンスを使って、ウィジェットのコンテントを構築することが出来ます。 +> Note: いくつかのウィジェットは、[[yii\base\Widget::end()]] が呼ばれるときに内包されるコンテンツを調整するため、[出力バッファリング](http://php.net/manual/ja/book.outcontrol.php) を使用します。 +> この理由から、[[yii\base\Widget::begin()]] と [[yii\base\Widget::end()]] の呼び出しは、同じビューファイルの中で発生するものと想定されています。 +> この規則に従わない場合は、予期しない出力結果が生じ得ます。 + ### グローバルなデフォルトを構成する From f6b1b2a0148d1dec2529988fe57db506fa9ab889 Mon Sep 17 00:00:00 2001 From: Nobuo Kihara Date: Tue, 19 Jul 2016 21:31:29 +0900 Subject: [PATCH 075/163] docs/internals-ja updated [ci skip] --- docs/internals-ja/core-code-style.md | 4 ++-- docs/internals-ja/release.md | 12 +++++++++++- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/docs/internals-ja/core-code-style.md b/docs/internals-ja/core-code-style.md index 70ffe74..96bd761 100644 --- a/docs/internals-ja/core-code-style.md +++ b/docs/internals-ja/core-code-style.md @@ -239,7 +239,7 @@ $arr = [ ```php $config = [ - 'name' => 'Yii', + 'name' => 'Yii', 'options' => ['usePHP' => true], ]; ``` @@ -474,7 +474,7 @@ public function getEventHandlers($name) - 定数へのアクセスには `self` を使わなければなりません: `self::MY_CONSTANT` - private な静的プロパティへのアクセスには `self` を使わなければなりません: `self::$_events` -- 再帰呼出しにおいて、拡張クラスの実装ではなく、現在のクラスの実装を再び呼び出したいときには、`self` を使うことが許可されます。 +- 再帰呼出しにおいて、拡張クラスの実装ではなく、現在のクラスの実装を再び呼び出したいときなど、合理的な理由がある場合には、`self` を使うことが許可されます。 ### 「何かをするな」を示す値 diff --git a/docs/internals-ja/release.md b/docs/internals-ja/release.md index cdfce88..248efcc 100644 --- a/docs/internals-ja/release.md +++ b/docs/internals-ja/release.md @@ -26,7 +26,17 @@ リリースコマンドは、[Git ワークフローのドキュメント](git-workflow.md#extensions) で紹介されている開発環境に依存しています。 すなわち、アプリケーションテンプレートは `/apps/` の下に配置されていなければならず、 エクステンションは `/extensions/` の下に配置されていなければなりません。 -`dev/app` コマンドを使うと、この構成がデフォルトで作成されます。 +この構成は `dev/app` および `dev/ext` のコマンドを使って作成することが推奨されます。 + +例えば、エクステンションのインストールは: + + ./build/build dev/ext authclient + +アプリケーションは: + + ./build/build dev/app basic + +このインストール方法によって、エクステンションが現在のレポジトリの状態と同じフレームワークコードを使用する事を保証することが出来ます。 ### バージョンの概要 From c86e700e2650b10e7d0b1c4e7182cf1a82599554 Mon Sep 17 00:00:00 2001 From: Roman Grinyov Date: Tue, 19 Jul 2016 16:12:07 +0300 Subject: [PATCH 076/163] Typo "registerMetaTagS" (#11985) [skip ci] --- docs/guide/structure-views.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/guide/structure-views.md b/docs/guide/structure-views.md index acfd0aa..5434cfc 100644 --- a/docs/guide/structure-views.md +++ b/docs/guide/structure-views.md @@ -626,7 +626,7 @@ The code above will result in ``` -Similar as [[yii\web\View::registerMetaTag()|registerMetaTags()]], you can specify a key when calling +Similar as [[yii\web\View::registerMetaTag()|registerMetaTag()]], you can specify a key when calling [[yii\web\View::registerLinkTag()|registerLinkTag()]] to avoid generating repeated link tags. From cbcd85814803278b67470ee560e05315e0edd6b5 Mon Sep 17 00:00:00 2001 From: Roman Grinyov Date: Wed, 20 Jul 2016 14:01:00 +0300 Subject: [PATCH 077/163] Wrong anchor to "controllerMap" (#11989) [skip ci] --- docs/guide/structure-modules.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/guide/structure-modules.md b/docs/guide/structure-modules.md index 198f038..2abeaeb 100644 --- a/docs/guide/structure-modules.md +++ b/docs/guide/structure-modules.md @@ -101,7 +101,7 @@ class PostController extends Controller You may customize the namespace of controller classes by configuring the [[yii\base\Module::controllerNamespace]] property. In case some of the controllers are outside of this namespace, you may make them accessible -by configuring the [[yii\base\Module::controllerMap]] property, similar to [what you do in an application](structure-applications.md#controller-map). +by configuring the [[yii\base\Module::controllerMap]] property, similar to [what you do in an application](structure-applications.md#controllerMap). ### Views in Modules From 8c6cbae6de9cf4ee4937dc1802860752eb445023 Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Thu, 21 Jul 2016 00:37:27 +0300 Subject: [PATCH 078/163] Fixes #11991: array helper documentation issues --- docs/guide/helper-array.md | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/docs/guide/helper-array.md b/docs/guide/helper-array.md index 4669357..df4fcce 100644 --- a/docs/guide/helper-array.md +++ b/docs/guide/helper-array.md @@ -209,7 +209,7 @@ $array = [ ['id' => '123', 'name' => 'aaa', 'class' => 'x'], ['id' => '124', 'name' => 'bbb', 'class' => 'x'], ['id' => '345', 'name' => 'ccc', 'class' => 'y'], -); +]; $result = ArrayHelper::map($array, 'id', 'name'); // the result is: @@ -379,9 +379,8 @@ and [[yii\helpers\ArrayHelper::isSubset()|isSubset()]] with the same signature a // true ArrayHelper::isIn('a', ['a']); // true -ArrayHelper::isIn('a', new(ArrayObject['a'])); +ArrayHelper::isIn('a', new ArrayObject(['a'])); // true -ArrayHelper::isSubset(new(ArrayObject['a', 'c']), new(ArrayObject['a', 'b', 'c']) - +ArrayHelper::isSubset(new ArrayObject(['a', 'c']), new ArrayObject(['a', 'b', 'c'])); ``` From 91c67262cee723bb458d0869f814f406552f5bba Mon Sep 17 00:00:00 2001 From: Ilya Sevostyanov Date: Thu, 21 Jul 2016 15:02:54 +0300 Subject: [PATCH 079/163] Fix typo (#11998) [skip ci] --- framework/web/User.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/web/User.php b/framework/web/User.php index 7723c85..c799420 100644 --- a/framework/web/User.php +++ b/framework/web/User.php @@ -105,7 +105,7 @@ class User extends Component */ public $authTimeout; /** - * @var CheckAccessInterface The acess checker to use for checking access. + * @var CheckAccessInterface The access checker to use for checking access. * If not set the application auth manager will be used. * @since 2.0.9 */ From 8211dcc41bef562cbb3249f89f97a3cee72310d5 Mon Sep 17 00:00:00 2001 From: lynicidn Date: Thu, 21 Jul 2016 02:06:20 +0300 Subject: [PATCH 080/163] Fixes #11972: Fixed active form `afterValidate` wasn't triggered in some cases --- framework/CHANGELOG.md | 1 + framework/assets/yii.activeForm.js | 17 +++++++++-------- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index 3268dd2..43bbbbd 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -8,6 +8,7 @@ Yii Framework 2 Change Log - Bug #11947: Fixed `gridData` initialization in `yii.gridView.js` (pavlm) - Bug #11949: Fixed `ActiveField::end` generates close tag when it's `option['tag']` is null (egorio) - Enh #11950: Improve BaseArrayHelper::keyExists speed (egorio) +- Bug #11972: Fixed active form `afterValidate` wasn't triggered in some cases (lynicidn) 2.0.9 July 11, 2016 ------------------- diff --git a/framework/assets/yii.activeForm.js b/framework/assets/yii.activeForm.js index 86a4632..ad6a93f 100644 --- a/framework/assets/yii.activeForm.js +++ b/framework/assets/yii.activeForm.js @@ -551,15 +551,16 @@ var updateInputs = function ($form, messages, submitting) { var data = $form.data('yiiActiveForm'); - if (submitting) { - var errorAttributes = []; - $.each(data.attributes, function () { - if (!$(this.input).is(":disabled") && !this.cancelled && updateInput($form, this, messages)) { - errorAttributes.push(this); - } - }); + var errorAttributes = []; + $.each(data.attributes, function () { + if (!$(this.input).is(":disabled") && !this.cancelled && updateInput($form, this, messages)) { + errorAttributes.push(this); + } + }); - $form.trigger(events.afterValidate, [messages, errorAttributes]); + $form.trigger(events.afterValidate, [messages, errorAttributes]); + + if (submitting) { updateSummary($form, messages); From d6dc4828fa6da1c1e1da0f35e5b530e5b79b3513 Mon Sep 17 00:00:00 2001 From: Nobuo Kihara Date: Mon, 25 Jul 2016 22:09:08 +0900 Subject: [PATCH 081/163] docs/guide-ja updated (typo fix) [ci skip] (#12012) --- docs/guide-ja/helper-array.md | 6 +++--- docs/guide-ja/structure-modules.md | 2 +- docs/guide-ja/structure-views.md | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/guide-ja/helper-array.md b/docs/guide-ja/helper-array.md index 147bcc1..6f2ff71 100644 --- a/docs/guide-ja/helper-array.md +++ b/docs/guide-ja/helper-array.md @@ -207,7 +207,7 @@ $array = [ ['id' => '123', 'name' => 'aaa', 'class' => 'x'], ['id' => '124', 'name' => 'bbb', 'class' => 'x'], ['id' => '345', 'name' => 'ccc', 'class' => 'y'], -); +]; $result = ArrayHelper::map($array, 'id', 'name'); // 結果は次のようになります @@ -376,9 +376,9 @@ PHP は `in_array()` を提供していますが、これはサブセットや ` // true ArrayHelper::isIn('a', ['a']); // true -ArrayHelper::isIn('a', new(ArrayObject['a'])); +ArrayHelper::isIn('a', new ArrayObject(['a'])); // true -ArrayHelper::isSubset(new(ArrayObject['a', 'c']), new(ArrayObject['a', 'b', 'c']) +ArrayHelper::isSubset(new ArrayObject(['a', 'c']), new ArrayObject(['a', 'b', 'c'])); ``` diff --git a/docs/guide-ja/structure-modules.md b/docs/guide-ja/structure-modules.md index c7713c1..d9c7b12 100644 --- a/docs/guide-ja/structure-modules.md +++ b/docs/guide-ja/structure-modules.md @@ -95,7 +95,7 @@ class PostController extends Controller コントローラクラスの名前空間は、[[yii\base\Module::controllerNamespace]] プロパティを構成してカスタマイズすることが出来ます。 いくつかのコントローラがこの名前空間の外にある場合でも、[[yii\base\Module::controllerMap]] プロパティを構成することによって、それらをアクセス可能にすることが出来ます。 -これは、[アプリケーションでのコントローラマップ](structure-applications.md#controller-map) の場合と同様です。 +これは、[アプリケーションでのコントローラマップ](structure-applications.md#controllerMap) の場合と同様です。 ### モジュール内のビュー diff --git a/docs/guide-ja/structure-views.md b/docs/guide-ja/structure-views.md index edfa8fa..a165cf2 100644 --- a/docs/guide-ja/structure-views.md +++ b/docs/guide-ja/structure-views.md @@ -587,7 +587,7 @@ $this->registerLinkTag([ ``` -[[yii\web\View::registerMetaTag()|registerMetaTags()]] と同じように、[[yii\web\View::registerLinkTag()|registerLinkTag()]] を呼ぶときにキーを指定すると、同じリンクタグを繰り返して生成するのを避けることが出来ます。 +[[yii\web\View::registerMetaTag()|registerMetaTag()]] と同じように、[[yii\web\View::registerLinkTag()|registerLinkTag()]] を呼ぶときにキーを指定すると、同じリンクタグを繰り返して生成するのを避けることが出来ます。 ## ビューのイベント From 6263eeba6972ff24e7a57c8a13cea563622efcb4 Mon Sep 17 00:00:00 2001 From: SilverFire - Dmitry Naumenko Date: Mon, 25 Jul 2016 23:33:42 +0300 Subject: [PATCH 082/163] Updated PHPDoc --- framework/db/Connection.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/db/Connection.php b/framework/db/Connection.php index 430e7c2..c9b405f 100644 --- a/framework/db/Connection.php +++ b/framework/db/Connection.php @@ -15,7 +15,7 @@ use yii\base\NotSupportedException; use yii\caching\Cache; /** - * Connection represents a connection to a database via [PDO](php.net/manual/en/book.pdo.php). + * Connection represents a connection to a database via [PDO](http://php.net/manual/en/book.pdo.php). * * Connection works together with [[Command]], [[DataReader]] and [[Transaction]] * to provide data access to various DBMS in a common set of APIs. They are a thin wrapper From fa845ee481650a26d304017065ea2fa985f59ccd Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Tue, 26 Jul 2016 15:35:55 +0300 Subject: [PATCH 083/163] Fixes #11726: `DbSession` was echoing database errors in production mode --- framework/CHANGELOG.md | 1 + framework/web/DbSession.php | 5 +++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index 43bbbbd..710cd7d 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -9,6 +9,7 @@ Yii Framework 2 Change Log - Bug #11949: Fixed `ActiveField::end` generates close tag when it's `option['tag']` is null (egorio) - Enh #11950: Improve BaseArrayHelper::keyExists speed (egorio) - Bug #11972: Fixed active form `afterValidate` wasn't triggered in some cases (lynicidn) +- Bug #11726: `DbSession` was echoing database errors in production mode (samdark, pastuhov, deadkrolik) 2.0.9 July 11, 2016 ------------------- diff --git a/framework/web/DbSession.php b/framework/web/DbSession.php index 108e94b..ac57883 100644 --- a/framework/web/DbSession.php +++ b/framework/web/DbSession.php @@ -181,8 +181,9 @@ class DbSession extends MultiFieldSession $exception = ErrorHandler::convertExceptionToString($e); // its too late to use Yii logging here error_log($exception); - echo $exception; - + if (YII_DEBUG) { + echo $exception; + } return false; } From 83496853c816a78338b0b95d46811a0f426adbf1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20G=C3=B3mez=20Pan?= Date: Thu, 28 Jul 2016 00:15:55 +0200 Subject: [PATCH 084/163] Fixes #11461: Fixed migration tool error when create migrate with comma in defaultValue --- framework/CHANGELOG.md | 1 + framework/console/Controller.php | 2 +- .../create_titlte_with_comma_default_values.php | 35 ++++++++++++++++++++++ .../controllers/MigrateControllerTestTrait.php | 9 +++++- 4 files changed, 45 insertions(+), 2 deletions(-) create mode 100644 tests/data/console/migrate_create/create_titlte_with_comma_default_values.php diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index 710cd7d..436c6b7 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -4,6 +4,7 @@ Yii Framework 2 Change Log 2.0.10 under development ------------------------ +- Bug #11461: Fixed migration tool error when create migrate with comma in defaultValue (pana1990, s-o-f) - Bug #11912: Fixed PostgreSQL Schema to support negative default values for integer/float/decimal columns (nsknewbie) - Bug #11947: Fixed `gridData` initialization in `yii.gridView.js` (pavlm) - Bug #11949: Fixed `ActiveField::end` generates close tag when it's `option['tag']` is null (egorio) diff --git a/framework/console/Controller.php b/framework/console/Controller.php index 2d4c312..d8d6807 100644 --- a/framework/console/Controller.php +++ b/framework/console/Controller.php @@ -102,7 +102,7 @@ class Controller extends \yii\base\Controller if (in_array($name, $options, true)) { $default = $this->$name; if (is_array($default)) { - $this->$name = preg_split('/(?!\(\d+)\s*,\s*(?!\d+\))/', $value); + $this->$name = preg_split('/\s*,\s*(?![^()]*\))/', $value); } elseif ($default !== null) { settype($value, gettype($default)); $this->$name = $value; diff --git a/tests/data/console/migrate_create/create_titlte_with_comma_default_values.php b/tests/data/console/migrate_create/create_titlte_with_comma_default_values.php new file mode 100644 index 0000000..bda50fd --- /dev/null +++ b/tests/data/console/migrate_create/create_titlte_with_comma_default_values.php @@ -0,0 +1,35 @@ +createTable('test', [ + 'id' => \$this->primaryKey(), + 'title' => \$this->string(10)->notNull()->unique()->defaultValue(",te,st"), + 'body' => \$this->text()->notNull()->defaultValue(",test"), + 'test' => \$this->custom(11,2,"s")->notNull(), + ]); + } + + /** + * @inheritdoc + */ + public function down() + { + \$this->dropTable('test'); + } +} + +CODE; diff --git a/tests/framework/console/controllers/MigrateControllerTestTrait.php b/tests/framework/console/controllers/MigrateControllerTestTrait.php index a443067..dbd73ac 100644 --- a/tests/framework/console/controllers/MigrateControllerTestTrait.php +++ b/tests/framework/console/controllers/MigrateControllerTestTrait.php @@ -235,6 +235,13 @@ CODE; // @see https://github.com/yiisoft/yii2/issues/10876 $this->assertCommandCreatedFile('create_products_from_store_table', 'create_products_from_store_table'); + + // @see https://github.com/yiisoft/yii2/issues/11461 + $this->assertCommandCreatedFile('create_titlte_with_comma_default_values', 'create_test_table', [ + 'fields' => 'title:string(10):notNull:unique:defaultValue(",te,st"), + body:text:notNull:defaultValue(",test"), + test:custom(11,2,"s"):notNull', + ]); } public function testGenerateDropMigration() @@ -249,7 +256,7 @@ CODE; 'fields' => 'body:text:notNull,price:money(11,2)' ]); } - + // @see https://github.com/yiisoft/yii2/issues/10876 $this->assertCommandCreatedFile('drop_products_from_store_table', 'drop_products_from_store_table'); } From 8de6a5117ca4bd95333cbd6f3d0bbe0cfdd800b1 Mon Sep 17 00:00:00 2001 From: Klimov Paul Date: Thu, 28 Jul 2016 12:33:16 +0300 Subject: [PATCH 085/163] Fixed `yii\base\Model::offsetExists()` throws an exception on un-existing field --- framework/CHANGELOG.md | 1 + framework/base/Model.php | 6 +++--- tests/framework/base/ModelTest.php | 1 + 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index 436c6b7..3b5aa28 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -11,6 +11,7 @@ Yii Framework 2 Change Log - Enh #11950: Improve BaseArrayHelper::keyExists speed (egorio) - Bug #11972: Fixed active form `afterValidate` wasn't triggered in some cases (lynicidn) - Bug #11726: `DbSession` was echoing database errors in production mode (samdark, pastuhov, deadkrolik) +- Bug #12030: Fixed `yii\base\Model::offsetExists()` throws an exception on un-existing field (klimov-paul) 2.0.9 July 11, 2016 ------------------- diff --git a/framework/base/Model.php b/framework/base/Model.php index 03a25f2..0ab6e6d 100644 --- a/framework/base/Model.php +++ b/framework/base/Model.php @@ -964,12 +964,12 @@ class Model extends Component implements IteratorAggregate, ArrayAccess, Arrayab * Returns whether there is an element at the specified offset. * This method is required by the SPL interface [[\ArrayAccess]]. * It is implicitly called when you use something like `isset($model[$offset])`. - * @param mixed $offset the offset to check on - * @return boolean + * @param mixed $offset the offset to check on. + * @return boolean whether or not an offset exists. */ public function offsetExists($offset) { - return $this->$offset !== null; + return isset($this->$offset); } /** diff --git a/tests/framework/base/ModelTest.php b/tests/framework/base/ModelTest.php index a6fa22c..2bf4042 100644 --- a/tests/framework/base/ModelTest.php +++ b/tests/framework/base/ModelTest.php @@ -321,6 +321,7 @@ class ModelTest extends TestCase // isset $this->assertFalse(isset($speaker['firstName'])); + $this->assertFalse(isset($speaker['unExistingField'])); // set $speaker['firstName'] = 'Qiang'; From aaff45ebf13134a6311e0623a3cb982ef3b47d2d Mon Sep 17 00:00:00 2001 From: SilverFire - Dmitry Naumenko Date: Thu, 28 Jul 2016 13:13:09 +0300 Subject: [PATCH 086/163] Revert "Fixes #11972: Fixed active form `afterValidate` wasn't triggered in some cases" This reverts commit 8211dcc41bef562cbb3249f89f97a3cee72310d5. --- framework/assets/yii.activeForm.js | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/framework/assets/yii.activeForm.js b/framework/assets/yii.activeForm.js index ad6a93f..86a4632 100644 --- a/framework/assets/yii.activeForm.js +++ b/framework/assets/yii.activeForm.js @@ -551,16 +551,15 @@ var updateInputs = function ($form, messages, submitting) { var data = $form.data('yiiActiveForm'); - var errorAttributes = []; - $.each(data.attributes, function () { - if (!$(this.input).is(":disabled") && !this.cancelled && updateInput($form, this, messages)) { - errorAttributes.push(this); - } - }); - - $form.trigger(events.afterValidate, [messages, errorAttributes]); - if (submitting) { + var errorAttributes = []; + $.each(data.attributes, function () { + if (!$(this.input).is(":disabled") && !this.cancelled && updateInput($form, this, messages)) { + errorAttributes.push(this); + } + }); + + $form.trigger(events.afterValidate, [messages, errorAttributes]); updateSummary($form, messages); From a2123d8bb916a5db7ded23dc5bc052c6f141e7f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=95=D0=B3=D0=BE=D1=80=20=D0=9C=D0=B0=D0=BB=D1=8B=D0=B3?= =?UTF-8?q?=D0=B8=D0=BD?= Date: Thu, 28 Jul 2016 18:34:48 +0500 Subject: [PATCH 087/163] Fixed typo in BaseMigrateController.php (#12033) --- framework/console/controllers/BaseMigrateController.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/console/controllers/BaseMigrateController.php b/framework/console/controllers/BaseMigrateController.php index adad1dd..a1ab0bb 100644 --- a/framework/console/controllers/BaseMigrateController.php +++ b/framework/console/controllers/BaseMigrateController.php @@ -257,7 +257,7 @@ abstract class BaseMigrateController extends Controller } foreach (array_reverse($migrations) as $migration) { if (!$this->migrateUp($migration)) { - $this->stdout("\nMigration failed. The rest of the migrations migrations are canceled.\n", Console::FG_RED); + $this->stdout("\nMigration failed. The rest of the migrations are canceled.\n", Console::FG_RED); return self::EXIT_CODE_ERROR; } From b2b2cb2ada7a246025ec2a8fab4db7f07645b992 Mon Sep 17 00:00:00 2001 From: Dmitriy Makarov Date: Thu, 28 Jul 2016 19:43:03 +0300 Subject: [PATCH 088/163] Added more tests for logger (#12034) - testLogWithTraceLavel - testLogWithFlush --- tests/framework/log/LoggerTest.php | 66 +++++++++++++++++++++++++++++++------- 1 file changed, 55 insertions(+), 11 deletions(-) diff --git a/tests/framework/log/LoggerTest.php b/tests/framework/log/LoggerTest.php index 44fd5b4..a791f8e 100644 --- a/tests/framework/log/LoggerTest.php +++ b/tests/framework/log/LoggerTest.php @@ -13,21 +13,65 @@ use yiiunit\TestCase; */ class LoggerTest extends TestCase { + /** + * @var Logger + */ + protected $logger; + protected function setUp() + { + $this->logger = new Logger(); + } + + /** + * @covers yii\log\Logger::Log() + */ public function testLog() { - $logger = new Logger(); + $this->logger->log('test1', Logger::LEVEL_INFO); + $this->assertEquals(1, count($this->logger->messages)); + $this->assertEquals('test1', $this->logger->messages[0][0]); + $this->assertEquals(Logger::LEVEL_INFO, $this->logger->messages[0][1]); + $this->assertEquals('application', $this->logger->messages[0][2]); + $this->assertEquals([], $this->logger->messages[0][4]); + + $this->logger->log('test2', Logger::LEVEL_ERROR, 'category'); + $this->assertEquals(2, count($this->logger->messages)); + $this->assertEquals('test2', $this->logger->messages[1][0]); + $this->assertEquals(Logger::LEVEL_ERROR, $this->logger->messages[1][1]); + $this->assertEquals('category', $this->logger->messages[1][2]); + $this->assertEquals([], $this->logger->messages[1][4]); + } + /** + * @covers yii\log\Logger::Log() + */ + public function testLogWithTraceLevel() + { + $this->logger->traceLevel = 3; + $this->logger->log('test3', Logger::LEVEL_INFO); + $this->assertEquals(1, count($this->logger->messages)); + $this->assertEquals('test3', $this->logger->messages[0][0]); + $this->assertEquals(Logger::LEVEL_INFO, $this->logger->messages[0][1]); + $this->assertEquals('application', $this->logger->messages[0][2]); + $this->assertEquals([ + 'file' => __FILE__, + 'line' => 52, + 'function' => 'log', + 'class' => get_class($this->logger), + 'type' => '->' + ], $this->logger->messages[0][4][0]); + $this->assertEquals(3, count($this->logger->messages[0][4])); + } + + /** + * @covers yii\log\Logger::Log() + */ + public function testLogWithFlush() + { + $logger = $this->getMock('yii\\log\\Logger', ['flush']); + $logger->flushInterval = 1; + $logger->expects($this->exactly(1))->method('flush'); $logger->log('test1', Logger::LEVEL_INFO); - $this->assertEquals(1, count($logger->messages)); - $this->assertEquals('test1', $logger->messages[0][0]); - $this->assertEquals(Logger::LEVEL_INFO, $logger->messages[0][1]); - $this->assertEquals('application', $logger->messages[0][2]); - - $logger->log('test2', Logger::LEVEL_ERROR, 'category'); - $this->assertEquals(2, count($logger->messages)); - $this->assertEquals('test2', $logger->messages[1][0]); - $this->assertEquals(Logger::LEVEL_ERROR, $logger->messages[1][1]); - $this->assertEquals('category', $logger->messages[1][2]); } } From edc62172fad9fb4a914ce76a975a137a77ece8d1 Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Thu, 28 Jul 2016 23:35:31 +0300 Subject: [PATCH 089/163] Fixes #12037: Fixed 2.0.7 regression in memcahe/memcached cache backend --- framework/CHANGELOG.md | 1 + framework/caching/MemCache.php | 33 +++++++++++---------------------- framework/mail/BaseMailer.php | 2 +- 3 files changed, 13 insertions(+), 23 deletions(-) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index 3b5aa28..b847776 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -12,6 +12,7 @@ Yii Framework 2 Change Log - Bug #11972: Fixed active form `afterValidate` wasn't triggered in some cases (lynicidn) - Bug #11726: `DbSession` was echoing database errors in production mode (samdark, pastuhov, deadkrolik) - Bug #12030: Fixed `yii\base\Model::offsetExists()` throws an exception on un-existing field (klimov-paul) +- Bug #12037: Fixed 2.0.7 regression in memcahe/memcached cache backend (samdark) 2.0.9 July 11, 2016 ------------------- diff --git a/framework/caching/MemCache.php b/framework/caching/MemCache.php index 6a1207a..77dd09e 100644 --- a/framework/caching/MemCache.php +++ b/framework/caching/MemCache.php @@ -289,7 +289,9 @@ class MemCache extends Cache */ protected function setValue($key, $value, $duration) { - $duration = $this->trimDuration($duration); + // Use UNIX timestamp since it doesn't have any limitation + // @see http://php.net/manual/en/memcache.set.php + // @see http://php.net/manual/en/memcached.expiration.php $expire = $duration > 0 ? $duration + time() : 0; return $this->useMemcached ? $this->_cache->set($key, $value, $expire) : $this->_cache->set($key, $value, 0, $expire); @@ -303,10 +305,12 @@ class MemCache extends Cache */ protected function setValues($data, $duration) { - $duration = $this->trimDuration($duration); - if ($this->useMemcached) { - $this->_cache->setMulti($data, $duration > 0 ? $duration + time() : 0); + // Use UNIX timestamp since it doesn't have any limitation + // @see http://php.net/manual/en/memcache.set.php + // @see http://php.net/manual/en/memcached.expiration.php + $expire = $duration > 0 ? $duration + time() : 0; + $this->_cache->setMulti($data, $expire); return []; } else { @@ -325,7 +329,9 @@ class MemCache extends Cache */ protected function addValue($key, $value, $duration) { - $duration = $this->trimDuration($duration); + // Use UNIX timestamp since it doesn't have any limitation + // @see http://php.net/manual/en/memcache.set.php + // @see http://php.net/manual/en/memcached.expiration.php $expire = $duration > 0 ? $duration + time() : 0; return $this->useMemcached ? $this->_cache->add($key, $value, $expire) : $this->_cache->add($key, $value, 0, $expire); @@ -351,21 +357,4 @@ class MemCache extends Cache { return $this->_cache->flush(); } - - /** - * Trims duration to 30 days (2592000 seconds). - * @param integer $duration the number of seconds - * @return integer the duration - * @since 2.0.7 - * @see http://php.net/manual/en/memcache.set.php - * @see http://php.net/manual/en/memcached.expiration.php - */ - protected function trimDuration($duration) - { - if ($duration > 2592000) { - Yii::warning('Duration has been truncated to 30 days due to Memcache/Memcached limitation.', __METHOD__); - return 2592000; - } - return $duration; - } } diff --git a/framework/mail/BaseMailer.php b/framework/mail/BaseMailer.php index 913a97b..fb08aec 100644 --- a/framework/mail/BaseMailer.php +++ b/framework/mail/BaseMailer.php @@ -137,7 +137,7 @@ abstract class BaseMailer extends Component implements MailerInterface, ViewCont * @param array $config view configuration. * @return View view instance. */ - protected function createView(array $config) + protected function view(array $config) { if (!array_key_exists('class', $config)) { $config['class'] = View::className(); From c584acd2964eb648b1d1bc60aab930fec41f9c7d Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Fri, 29 Jul 2016 00:57:10 +0300 Subject: [PATCH 090/163] Reverted accidental change --- framework/mail/BaseMailer.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/mail/BaseMailer.php b/framework/mail/BaseMailer.php index fb08aec..913a97b 100644 --- a/framework/mail/BaseMailer.php +++ b/framework/mail/BaseMailer.php @@ -137,7 +137,7 @@ abstract class BaseMailer extends Component implements MailerInterface, ViewCont * @param array $config view configuration. * @return View view instance. */ - protected function view(array $config) + protected function createView(array $config) { if (!array_key_exists('class', $config)) { $config['class'] = View::className(); From 9a82e1a01f1450d1751c40120749bf47d076a503 Mon Sep 17 00:00:00 2001 From: SilverFire - Dmitry Naumenko Date: Fri, 29 Jul 2016 12:01:52 +0300 Subject: [PATCH 091/163] CHANGELOG updated --- framework/CHANGELOG.md | 1 - 1 file changed, 1 deletion(-) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index b847776..e08332f 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -9,7 +9,6 @@ Yii Framework 2 Change Log - Bug #11947: Fixed `gridData` initialization in `yii.gridView.js` (pavlm) - Bug #11949: Fixed `ActiveField::end` generates close tag when it's `option['tag']` is null (egorio) - Enh #11950: Improve BaseArrayHelper::keyExists speed (egorio) -- Bug #11972: Fixed active form `afterValidate` wasn't triggered in some cases (lynicidn) - Bug #11726: `DbSession` was echoing database errors in production mode (samdark, pastuhov, deadkrolik) - Bug #12030: Fixed `yii\base\Model::offsetExists()` throws an exception on un-existing field (klimov-paul) - Bug #12037: Fixed 2.0.7 regression in memcahe/memcached cache backend (samdark) From 5189693560808a796a360648f8743909a99b3e2b Mon Sep 17 00:00:00 2001 From: Dmitriy Makarov Date: Fri, 29 Jul 2016 16:25:03 +0300 Subject: [PATCH 092/163] Added 'LEVEL_PROFILE' to the map of levels (#12045) --- framework/log/Logger.php | 1 + 1 file changed, 1 insertion(+) diff --git a/framework/log/Logger.php b/framework/log/Logger.php index 86b584b..6a0e062 100644 --- a/framework/log/Logger.php +++ b/framework/log/Logger.php @@ -307,6 +307,7 @@ class Logger extends Component self::LEVEL_TRACE => 'trace', self::LEVEL_PROFILE_BEGIN => 'profile begin', self::LEVEL_PROFILE_END => 'profile end', + self::LEVEL_PROFILE => 'profile' ]; return isset($levels[$level]) ? $levels[$level] : 'unknown'; From c249cf56528de268d411cd5b1b3e36efe93acc07 Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Fri, 29 Jul 2016 16:27:27 +0300 Subject: [PATCH 093/163] Changelog for #12045 --- framework/CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index e08332f..af21d65 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -12,6 +12,7 @@ Yii Framework 2 Change Log - Bug #11726: `DbSession` was echoing database errors in production mode (samdark, pastuhov, deadkrolik) - Bug #12030: Fixed `yii\base\Model::offsetExists()` throws an exception on un-existing field (klimov-paul) - Bug #12037: Fixed 2.0.7 regression in memcahe/memcached cache backend (samdark) +- Bug #12045: Added missing `LEVEL_PROFILE` to `yii\log\Logger::getLevelName()` map (Mak-Di) 2.0.9 July 11, 2016 ------------------- From 7c6f76cb1a88523ea044ce0036c7b62a919f42b3 Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Fri, 29 Jul 2016 22:44:04 +0300 Subject: [PATCH 094/163] Fixes #10583: Do not silence session errors in debug mode --- framework/CHANGELOG.md | 1 + framework/web/Session.php | 49 ++++++++++++++++++++++++++++++----------------- 2 files changed, 32 insertions(+), 18 deletions(-) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index af21d65..eab4802 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -13,6 +13,7 @@ Yii Framework 2 Change Log - Bug #12030: Fixed `yii\base\Model::offsetExists()` throws an exception on un-existing field (klimov-paul) - Bug #12037: Fixed 2.0.7 regression in memcahe/memcached cache backend (samdark) - Bug #12045: Added missing `LEVEL_PROFILE` to `yii\log\Logger::getLevelName()` map (Mak-Di) +- Enh #10583: Do not silence session errors in debug mode (samdark) 2.0.9 July 11, 2016 ------------------- diff --git a/framework/web/Session.php b/framework/web/Session.php index 0425132..d11775f 100644 --- a/framework/web/Session.php +++ b/framework/web/Session.php @@ -128,7 +128,7 @@ class Session extends Component implements \IteratorAggregate, \ArrayAccess, \Co $this->setCookieParamsInternal(); - @session_start(); + YII_DEBUG ? session_start() : @session_start(); if ($this->getIsActive()) { Yii::info('Session started', __METHOD__); @@ -153,16 +153,27 @@ class Session extends Component implements \IteratorAggregate, \ArrayAccess, \Co if (!$this->handler instanceof \SessionHandlerInterface) { throw new InvalidConfigException('"' . get_class($this) . '::handler" must implement the SessionHandlerInterface.'); } - @session_set_save_handler($this->handler, false); + YII_DEBUG ? session_set_save_handler($this->handler, false) : @session_set_save_handler($this->handler, false); } elseif ($this->getUseCustomStorage()) { - @session_set_save_handler( - [$this, 'openSession'], - [$this, 'closeSession'], - [$this, 'readSession'], - [$this, 'writeSession'], - [$this, 'destroySession'], - [$this, 'gcSession'] - ); + if (YII_DEBUG) { + session_set_save_handler( + [$this, 'openSession'], + [$this, 'closeSession'], + [$this, 'readSession'], + [$this, 'writeSession'], + [$this, 'destroySession'], + [$this, 'gcSession'] + ); + } else { + @session_set_save_handler( + [$this, 'openSession'], + [$this, 'closeSession'], + [$this, 'readSession'], + [$this, 'writeSession'], + [$this, 'destroySession'], + [$this, 'gcSession'] + ); + } } } @@ -172,7 +183,7 @@ class Session extends Component implements \IteratorAggregate, \ArrayAccess, \Co public function close() { if ($this->getIsActive()) { - @session_write_close(); + YII_DEBUG ? session_write_close() : @session_write_close(); } } @@ -182,10 +193,10 @@ class Session extends Component implements \IteratorAggregate, \ArrayAccess, \Co public function destroy() { if ($this->getIsActive()) { - @session_unset(); + YII_DEBUG ? session_unset() : @session_unset(); $sessionId = session_id(); - @session_destroy(); - @session_id($sessionId); + YII_DEBUG ? session_destroy() : @session_destroy(); + YII_DEBUG ? session_id($sessionId) : @session_id($sessionId); } } @@ -194,7 +205,7 @@ class Session extends Component implements \IteratorAggregate, \ArrayAccess, \Co */ public function getIsActive() { - return session_status() == PHP_SESSION_ACTIVE; + return session_status() === PHP_SESSION_ACTIVE; } private $_hasSessionId; @@ -261,9 +272,11 @@ class Session extends Component implements \IteratorAggregate, \ArrayAccess, \Co */ public function regenerateID($deleteOldSession = false) { - // add @ to inhibit possible warning due to race condition - // https://github.com/yiisoft/yii2/pull/1812 - @session_regenerate_id($deleteOldSession); + if ($this->getIsActive()) { + // add @ to inhibit possible warning due to race condition + // https://github.com/yiisoft/yii2/pull/1812 + YII_DEBUG ? session_regenerate_id($deleteOldSession) : @session_regenerate_id($deleteOldSession); + } } /** From 0061692e60bb2544a5f64da07b2f9cf38ca46e92 Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Fri, 29 Jul 2016 22:56:38 +0300 Subject: [PATCH 095/163] Replaced unnecessary double quotes with single quotes --- framework/UPGRADE.md | 2 +- framework/db/Migration.php | 2 +- framework/db/Query.php | 2 +- framework/db/cubrid/ColumnSchemaBuilder.php | 2 +- framework/db/mysql/ColumnSchemaBuilder.php | 2 +- framework/web/Session.php | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/framework/UPGRADE.md b/framework/UPGRADE.md index 25e8bdf..e598189 100644 --- a/framework/UPGRADE.md +++ b/framework/UPGRADE.md @@ -305,7 +305,7 @@ new ones save the following code as `convert.php` that should be placed in the s function saveToFile($data, $fileName) { $out = var_export($data, true); - $out = "db->createCommand()->addCommentOnColumn($table, $column, $type->comment)->execute(); } } - echo " done (time: " . sprintf('%.3f', microtime(true) - $time) . "s)\n"; + echo ' done (time: ' . sprintf('%.3f', microtime(true) - $time) . "s)\n"; } /** diff --git a/framework/db/Query.php b/framework/db/Query.php index 0f4b1a1..ba54559 100644 --- a/framework/db/Query.php +++ b/framework/db/Query.php @@ -609,7 +609,7 @@ class Query extends Component implements QueryInterface */ public function andFilterCompare($name, $value, $defaultOperator = '=') { - if (preg_match("/^(<>|>=|>|<=|<|=)/", $value, $matches)) { + if (preg_match('/^(<>|>=|>|<=|<|=)/', $value, $matches)) { $operator = $matches[1]; $value = substr($value, strlen($operator)); } else { diff --git a/framework/db/cubrid/ColumnSchemaBuilder.php b/framework/db/cubrid/ColumnSchemaBuilder.php index d418e80..5ca5745 100644 --- a/framework/db/cubrid/ColumnSchemaBuilder.php +++ b/framework/db/cubrid/ColumnSchemaBuilder.php @@ -48,7 +48,7 @@ class ColumnSchemaBuilder extends AbstractColumnSchemaBuilder */ protected function buildCommentString() { - return $this->comment !== null ? " COMMENT " . $this->db->quoteValue($this->comment) : ''; + return $this->comment !== null ? ' COMMENT ' . $this->db->quoteValue($this->comment) : ''; } /** diff --git a/framework/db/mysql/ColumnSchemaBuilder.php b/framework/db/mysql/ColumnSchemaBuilder.php index e740c78..bdd6a0a 100644 --- a/framework/db/mysql/ColumnSchemaBuilder.php +++ b/framework/db/mysql/ColumnSchemaBuilder.php @@ -48,7 +48,7 @@ class ColumnSchemaBuilder extends AbstractColumnSchemaBuilder */ protected function buildCommentString() { - return $this->comment !== null ? " COMMENT " . $this->db->quoteValue($this->comment) : ''; + return $this->comment !== null ? ' COMMENT ' . $this->db->quoteValue($this->comment) : ''; } /** diff --git a/framework/web/Session.php b/framework/web/Session.php index d11775f..74e12cc 100644 --- a/framework/web/Session.php +++ b/framework/web/Session.php @@ -98,7 +98,7 @@ class Session extends Component implements \IteratorAggregate, \ArrayAccess, \Co parent::init(); register_shutdown_function([$this, 'close']); if ($this->getIsActive()) { - Yii::warning("Session is already started", __METHOD__); + Yii::warning('Session is already started', __METHOD__); $this->updateFlashCounters(); } } From ef4885f4787d8679610a9674b95543eb9e1f27ef Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Fri, 29 Jul 2016 22:57:47 +0300 Subject: [PATCH 096/163] Removed unnecessary semicolon --- framework/db/QueryBuilder.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/db/QueryBuilder.php b/framework/db/QueryBuilder.php index 0186448..c691e0e 100644 --- a/framework/db/QueryBuilder.php +++ b/framework/db/QueryBuilder.php @@ -1279,7 +1279,7 @@ class QueryBuilder extends \yii\base\Object if (empty($vss)) { return $operator === 'IN' ? '0=1' : ''; - }; + } $sqlColumns = []; foreach ($columns as $i => $column) { From c7d5e69cda632fd413444384032978a04a1113c0 Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Fri, 29 Jul 2016 23:06:38 +0300 Subject: [PATCH 097/163] Eliminated unused variables --- framework/db/mssql/QueryBuilder.php | 3 +-- framework/requirements/YiiRequirementChecker.php | 8 ++------ framework/web/ErrorHandler.php | 3 +-- 3 files changed, 4 insertions(+), 10 deletions(-) diff --git a/framework/db/mssql/QueryBuilder.php b/framework/db/mssql/QueryBuilder.php index d6332fa..7661d9c 100644 --- a/framework/db/mssql/QueryBuilder.php +++ b/framework/db/mssql/QueryBuilder.php @@ -236,8 +236,7 @@ class QueryBuilder extends \yii\db\QueryBuilder /* @var $model \yii\db\ActiveRecord */ $model = new $modelClass; $schema = $model->getTableSchema(); - $columns = array_keys($schema->columns); - return $columns; + return array_keys($schema->columns); } /** diff --git a/framework/requirements/YiiRequirementChecker.php b/framework/requirements/YiiRequirementChecker.php index ef902f1..ee971b0 100644 --- a/framework/requirements/YiiRequirementChecker.php +++ b/framework/requirements/YiiRequirementChecker.php @@ -386,9 +386,7 @@ class YiiRequirementChecker */ function getServerInfo() { - $info = isset($_SERVER['SERVER_SOFTWARE']) ? $_SERVER['SERVER_SOFTWARE'] : ''; - - return $info; + return isset($_SERVER['SERVER_SOFTWARE']) ? $_SERVER['SERVER_SOFTWARE'] : '';; } /** @@ -397,8 +395,6 @@ class YiiRequirementChecker */ function getNowDate() { - $nowDate = @strftime('%Y-%m-%d %H:%M', time()); - - return $nowDate; + return @strftime('%Y-%m-%d %H:%M', time());; } } diff --git a/framework/web/ErrorHandler.php b/framework/web/ErrorHandler.php index 7098fcc..0274f4a 100644 --- a/framework/web/ErrorHandler.php +++ b/framework/web/ErrorHandler.php @@ -423,9 +423,8 @@ class ErrorHandler extends \yii\base\ErrorHandler $args[$key] = "$key => $args[$key]"; } } - $out = implode(', ', $args); - return $out; + return implode(', ', $args); } /** From 0dbe589bf56ab065e569e072b115432e07951117 Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Fri, 29 Jul 2016 23:35:09 +0300 Subject: [PATCH 098/163] Fixes #12048: Improved message extraction command performance --- framework/CHANGELOG.md | 1 + framework/console/controllers/MessageController.php | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index eab4802..ecb3087 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -14,6 +14,7 @@ Yii Framework 2 Change Log - Bug #12037: Fixed 2.0.7 regression in memcahe/memcached cache backend (samdark) - Bug #12045: Added missing `LEVEL_PROFILE` to `yii\log\Logger::getLevelName()` map (Mak-Di) - Enh #10583: Do not silence session errors in debug mode (samdark) +- Enh #12048: Improved message extraction command performance (samdark) 2.0.9 July 11, 2016 ------------------- diff --git a/framework/console/controllers/MessageController.php b/framework/console/controllers/MessageController.php index 3a86491..ff94706 100644 --- a/framework/console/controllers/MessageController.php +++ b/framework/console/controllers/MessageController.php @@ -449,10 +449,10 @@ EOD; $subject = file_get_contents($fileName); $messages = []; + $tokens = token_get_all($subject); foreach ((array) $translator as $currentTranslator) { $translatorTokens = token_get_all('extractMessagesFromTokens($tokens, $translatorTokens, $ignoreCategories)); } From 33a45b196cf96aff1d3ff00d0da3022e2d1802c9 Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Fri, 29 Jul 2016 23:37:41 +0300 Subject: [PATCH 099/163] Additional optimization for #12048 --- framework/console/controllers/MessageController.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/console/controllers/MessageController.php b/framework/console/controllers/MessageController.php index ff94706..0099455 100644 --- a/framework/console/controllers/MessageController.php +++ b/framework/console/controllers/MessageController.php @@ -851,11 +851,11 @@ EOD; foreach ($msgs as $message) { $merged[$category . chr(4) . $message] = ''; } - ksort($merged); $this->stdout("Category \"$category\" merged.\n"); $hasSomethingToWrite = true; } if ($hasSomethingToWrite) { + ksort($merged); $poFile->save($file, $merged); $this->stdout("Translation saved.\n", Console::FG_GREEN); } else { From 9b1b4fc5fabfa00ec888ffee06ae00309f9fa2c8 Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Sat, 30 Jul 2016 00:02:51 +0300 Subject: [PATCH 100/163] Added missing phpdoc --- framework/console/controllers/FixtureController.php | 4 ++++ framework/console/controllers/MessageController.php | 3 ++- framework/db/mysql/Schema.php | 1 + framework/validators/DateValidator.php | 1 + 4 files changed, 8 insertions(+), 1 deletion(-) diff --git a/framework/console/controllers/FixtureController.php b/framework/console/controllers/FixtureController.php index d9c901a..16540d6 100644 --- a/framework/console/controllers/FixtureController.php +++ b/framework/console/controllers/FixtureController.php @@ -98,6 +98,8 @@ class FixtureController extends Controller * yii fixture/load "*, -User, -UserProfile" * ``` * + * @param array $fixturesInput + * @return int return code * @throws Exception if the specified fixture does not exist. */ public function actionLoad(array $fixturesInput = []) @@ -175,6 +177,8 @@ class FixtureController extends Controller * yii fixture/unload "*, -User, -UserProfile" * ``` * + * @param array $fixturesInput + * @return int return code * @throws Exception if the specified fixture does not exist. */ public function actionUnload(array $fixturesInput = []) diff --git a/framework/console/controllers/MessageController.php b/framework/console/controllers/MessageController.php index 0099455..5d2ec1b 100644 --- a/framework/console/controllers/MessageController.php +++ b/framework/console/controllers/MessageController.php @@ -640,6 +640,7 @@ EOD; * @param boolean $sort if translations should be sorted * @param string $category message category * @param boolean $markUnused if obsolete translations should be marked + * @return int exit code */ protected function saveMessagesCategoryToPHP($messages, $fileName, $overwrite, $removeUnused, $sort, $category, $markUnused) { @@ -650,7 +651,7 @@ EOD; ksort($existingMessages); if (array_keys($existingMessages) === $messages && (!$sort || array_keys($rawExistingMessages) === $messages)) { $this->stdout("Nothing new in \"$category\" category... Nothing to save.\n\n", Console::FG_GREEN); - return; + return self::EXIT_CODE_NORMAL; } unset($rawExistingMessages); $merged = []; diff --git a/framework/db/mysql/Schema.php b/framework/db/mysql/Schema.php index 1b67be2..7c94ba1 100644 --- a/framework/db/mysql/Schema.php +++ b/framework/db/mysql/Schema.php @@ -243,6 +243,7 @@ class Schema extends \yii\db\Schema /** * Collects the foreign key column details for the given table. * @param TableSchema $table the table metadata + * @throws \Exception */ protected function findConstraints($table) { diff --git a/framework/validators/DateValidator.php b/framework/validators/DateValidator.php index 9efcc18..9926974 100644 --- a/framework/validators/DateValidator.php +++ b/framework/validators/DateValidator.php @@ -346,6 +346,7 @@ class DateValidator extends Validator * @param string $value string representing date * @param string $format the expected date format * @return integer|boolean a UNIX timestamp or `false` on failure. + * @throws InvalidConfigException */ private function parseDateValueIntl($value, $format) { From 876ef142c11e6bd7b4c73c843568e931ac2ef8d3 Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Sat, 30 Jul 2016 00:18:05 +0300 Subject: [PATCH 101/163] Remove explicit property initialization with null --- framework/db/ColumnSchemaBuilder.php | 2 +- framework/widgets/LinkPager.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/framework/db/ColumnSchemaBuilder.php b/framework/db/ColumnSchemaBuilder.php index f19dee2..c5d09c7 100644 --- a/framework/db/ColumnSchemaBuilder.php +++ b/framework/db/ColumnSchemaBuilder.php @@ -43,7 +43,7 @@ class ColumnSchemaBuilder extends Object * @var boolean|null whether the column is or not nullable. If this is `true`, a `NOT NULL` constraint will be added. * If this is `false`, a `NULL` constraint will be added. */ - protected $isNotNull = null; + protected $isNotNull; /** * @var boolean whether the column values should be unique. If this is `true`, a `UNIQUE` constraint will be added. */ diff --git a/framework/widgets/LinkPager.php b/framework/widgets/LinkPager.php index b500fd8..9530acc 100644 --- a/framework/widgets/LinkPager.php +++ b/framework/widgets/LinkPager.php @@ -47,7 +47,7 @@ class LinkPager extends Widget * @var string the CSS class for the each page button. * @since 2.0.7 */ - public $pageCssClass = null; + public $pageCssClass; /** * @var string the CSS class for the "first" page button. */ From ffb7ca2a7838fc5df94d50c19adb3ccea9c15580 Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Sat, 30 Jul 2016 00:18:14 +0300 Subject: [PATCH 102/163] Removed unused import --- framework/grid/ActionColumn.php | 1 - 1 file changed, 1 deletion(-) diff --git a/framework/grid/ActionColumn.php b/framework/grid/ActionColumn.php index 6e5e3fd..fee2d4e 100644 --- a/framework/grid/ActionColumn.php +++ b/framework/grid/ActionColumn.php @@ -8,7 +8,6 @@ namespace yii\grid; use Yii; -use Closure; use yii\helpers\Html; use yii\helpers\Url; From 25e0a879d6180f1a763a353b0eca98eeecdba401 Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Sat, 30 Jul 2016 00:57:49 +0300 Subject: [PATCH 103/163] Added output check for session handler #10583 --- framework/web/Session.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/framework/web/Session.php b/framework/web/Session.php index 74e12cc..ce81be9 100644 --- a/framework/web/Session.php +++ b/framework/web/Session.php @@ -128,7 +128,9 @@ class Session extends Component implements \IteratorAggregate, \ArrayAccess, \Co $this->setCookieParamsInternal(); - YII_DEBUG ? session_start() : @session_start(); + if (!headers_sent()) { + YII_DEBUG ? session_start() : @session_start(); + } if ($this->getIsActive()) { Yii::info('Session started', __METHOD__); From b2fbbdf5d703bce6c7c94b41c4be2ba145fe63b3 Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Sat, 30 Jul 2016 01:09:39 +0300 Subject: [PATCH 104/163] Reverted non-suppression of session_start since it seems it's not possible to achieve same behavior w/o it #10583 --- framework/web/Session.php | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/framework/web/Session.php b/framework/web/Session.php index ce81be9..ab01cd2 100644 --- a/framework/web/Session.php +++ b/framework/web/Session.php @@ -128,9 +128,7 @@ class Session extends Component implements \IteratorAggregate, \ArrayAccess, \Co $this->setCookieParamsInternal(); - if (!headers_sent()) { - YII_DEBUG ? session_start() : @session_start(); - } + @session_start(); if ($this->getIsActive()) { Yii::info('Session started', __METHOD__); From ce65e238515ed36103c7b4278d1c72a2cbf0d375 Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Sat, 30 Jul 2016 01:18:52 +0300 Subject: [PATCH 105/163] #10583 check for sent content before attempting to regenerate headers in debug mode --- framework/web/Session.php | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/framework/web/Session.php b/framework/web/Session.php index ab01cd2..df9e7fb 100644 --- a/framework/web/Session.php +++ b/framework/web/Session.php @@ -275,7 +275,11 @@ class Session extends Component implements \IteratorAggregate, \ArrayAccess, \Co if ($this->getIsActive()) { // add @ to inhibit possible warning due to race condition // https://github.com/yiisoft/yii2/pull/1812 - YII_DEBUG ? session_regenerate_id($deleteOldSession) : @session_regenerate_id($deleteOldSession); + if (YII_DEBUG && !headers_sent()) { + session_regenerate_id($deleteOldSession); + } else { + @session_regenerate_id($deleteOldSession); + } } } From 9f71bf400e4879716d8d5baf33bf1d5dfa67b340 Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Sat, 30 Jul 2016 15:07:56 +0300 Subject: [PATCH 106/163] Fixes #12038: Introduced `yii\base\ViewNotFoundException` which is thrown when views file doesn't exists, used it in `ViewAction` --- framework/CHANGELOG.md | 1 + framework/base/View.php | 7 ++++--- framework/base/ViewNotFoundException.php | 25 +++++++++++++++++++++++++ framework/web/ViewAction.php | 3 ++- 4 files changed, 32 insertions(+), 4 deletions(-) create mode 100644 framework/base/ViewNotFoundException.php diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index ecb3087..a48d932 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -15,6 +15,7 @@ Yii Framework 2 Change Log - Bug #12045: Added missing `LEVEL_PROFILE` to `yii\log\Logger::getLevelName()` map (Mak-Di) - Enh #10583: Do not silence session errors in debug mode (samdark) - Enh #12048: Improved message extraction command performance (samdark) +- Enh #12038: Introduced `yii\base\ViewNotFoundException` which is thrown when views file doesn't exists, used it in `ViewAction` (samdark) 2.0.9 July 11, 2016 ------------------- diff --git a/framework/base/View.php b/framework/base/View.php index 53c0eab..c8ca30d 100644 --- a/framework/base/View.php +++ b/framework/base/View.php @@ -140,7 +140,8 @@ class View extends Component * in the view. If the context implements [[ViewContextInterface]], it may also be used to locate * the view file corresponding to a relative view name. * @return string the rendering result - * @throws InvalidParamException if the view cannot be resolved or the view file does not exist. + * @throws ViewNotFoundException if the view file does not exist. + * @throws InvalidCallException if the view cannot be resolved. * @see renderFile() */ public function render($view, $params = [], $context = null) @@ -211,7 +212,7 @@ class View extends Component * @param object $context the context that the view should use for rendering the view. If null, * existing [[context]] will be used. * @return string the rendering result - * @throws InvalidParamException if the view file does not exist + * @throws ViewNotFoundException if the view file does not exist */ public function renderFile($viewFile, $params = [], $context = null) { @@ -223,7 +224,7 @@ class View extends Component if (is_file($viewFile)) { $viewFile = FileHelper::localize($viewFile); } else { - throw new InvalidParamException("The view file does not exist: $viewFile"); + throw new ViewNotFoundException("The view file does not exist: $viewFile"); } $oldContext = $this->context; diff --git a/framework/base/ViewNotFoundException.php b/framework/base/ViewNotFoundException.php new file mode 100644 index 0000000..191b05e --- /dev/null +++ b/framework/base/ViewNotFoundException.php @@ -0,0 +1,25 @@ +controller->layout = $controllerLayout; } - } catch (InvalidParamException $e) { + } catch (ViewNotFoundException $e) { if ($controllerLayout) { $this->controller->layout = $controllerLayout; From acfe21b4001b3a7775ea7755266548b96b1fd192 Mon Sep 17 00:00:00 2001 From: Klimov Paul Date: Mon, 1 Aug 2016 10:31:10 +0300 Subject: [PATCH 107/163] Fixed `yii\helpers\Json::encode()` encodes empty array returned by `JsonSerializable::jsonSerialize()` as object --- framework/CHANGELOG.md | 1 + framework/helpers/BaseJson.php | 2 +- tests/framework/helpers/JsonTest.php | 19 +++++++++++++++++-- 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index a48d932..b15d5e9 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -12,6 +12,7 @@ Yii Framework 2 Change Log - Bug #11726: `DbSession` was echoing database errors in production mode (samdark, pastuhov, deadkrolik) - Bug #12030: Fixed `yii\base\Model::offsetExists()` throws an exception on un-existing field (klimov-paul) - Bug #12037: Fixed 2.0.7 regression in memcahe/memcached cache backend (samdark) +- Bug #12043: Fixed `yii\helpers\Json::encode()` encodes empty array returned by `JsonSerializable::jsonSerialize()` as object (klimov-paul) - Bug #12045: Added missing `LEVEL_PROFILE` to `yii\log\Logger::getLevelName()` map (Mak-Di) - Enh #10583: Do not silence session errors in debug mode (samdark) - Enh #12048: Improved message extraction command performance (samdark) diff --git a/framework/helpers/BaseJson.php b/framework/helpers/BaseJson.php index 9eb014a..a331041 100644 --- a/framework/helpers/BaseJson.php +++ b/framework/helpers/BaseJson.php @@ -142,7 +142,7 @@ class BaseJson return $token; } elseif ($data instanceof \JsonSerializable) { - $data = $data->jsonSerialize(); + return $data->jsonSerialize(); } elseif ($data instanceof Arrayable) { $data = $data->toArray(); } elseif ($data instanceof \SimpleXMLElement) { diff --git a/tests/framework/helpers/JsonTest.php b/tests/framework/helpers/JsonTest.php index b175ea0..7d59e36 100644 --- a/tests/framework/helpers/JsonTest.php +++ b/tests/framework/helpers/JsonTest.php @@ -32,6 +32,12 @@ class JsonTest extends TestCase $data->b = 2; $this->assertSame('{"a":1,"b":2}', Json::encode($data)); + // empty data encoding + $data = []; + $this->assertSame('[]', Json::encode($data)); + $data = new \stdClass(); + $this->assertSame('{}', Json::encode($data)); + // expression encoding $expression = 'function () {}'; $data = new JsExpression($expression); @@ -55,6 +61,13 @@ class JsonTest extends TestCase // JsonSerializable $data = new JsonModel(); $this->assertSame('{"json":"serializable"}', Json::encode($data)); + // @see https://github.com/yiisoft/yii2/issues/12043 + $data = new JsonModel(); + $data->data = []; + $this->assertSame('[]', Json::encode($data)); + $data = new JsonModel(); + $data->data = (object) null; + $this->assertSame('{}', Json::encode($data)); } public function testHtmlEncode() @@ -166,8 +179,10 @@ class JsonTest extends TestCase class JsonModel extends Model implements \JsonSerializable { + public $data = ['json' => 'serializable']; + function jsonSerialize() { - return ['json' => 'serializable']; + return $this->data; } -} +} \ No newline at end of file From 01e2ba1d28c3945156ecfd88e298e1d5129d2eb4 Mon Sep 17 00:00:00 2001 From: Klimov Paul Date: Mon, 1 Aug 2016 10:38:51 +0300 Subject: [PATCH 108/163] BC for `JsonSerializable` at `BaseJson::processData()` restored --- framework/helpers/BaseJson.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/helpers/BaseJson.php b/framework/helpers/BaseJson.php index a331041..9e3b879 100644 --- a/framework/helpers/BaseJson.php +++ b/framework/helpers/BaseJson.php @@ -142,7 +142,7 @@ class BaseJson return $token; } elseif ($data instanceof \JsonSerializable) { - return $data->jsonSerialize(); + return static::processData($data->jsonSerialize(), $expressions, $expPrefix); } elseif ($data instanceof Arrayable) { $data = $data->toArray(); } elseif ($data instanceof \SimpleXMLElement) { From 1c65516153253e8a8084be2d9e5bce56febde95a Mon Sep 17 00:00:00 2001 From: Aris Karageorgos Date: Tue, 2 Aug 2016 15:30:01 +0700 Subject: [PATCH 109/163] Update AuthMethod.php (#12063) [skip ci] --- framework/filters/auth/AuthMethod.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/filters/auth/AuthMethod.php b/framework/filters/auth/AuthMethod.php index 798c2a4..bc37dc4 100644 --- a/framework/filters/auth/AuthMethod.php +++ b/framework/filters/auth/AuthMethod.php @@ -87,7 +87,7 @@ abstract class AuthMethod extends ActionFilter implements AuthInterface */ public function handleFailure($response) { - throw new UnauthorizedHttpException('You are requesting with an invalid credential.'); + throw new UnauthorizedHttpException('Your request was made with invalid credentials.'); } /** From ffb121ba63a9a19e70659dca8ea5b3193875c522 Mon Sep 17 00:00:00 2001 From: SilverFire - Dmitry Naumenko Date: Wed, 3 Aug 2016 09:04:37 +0300 Subject: [PATCH 110/163] Reverted fix of beforeValidate event calling in `yii.activeForm.js` --- framework/CHANGELOG.md | 1 + framework/assets/yii.activeForm.js | 5 +++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index b15d5e9..e02ba76 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -14,6 +14,7 @@ Yii Framework 2 Change Log - Bug #12037: Fixed 2.0.7 regression in memcahe/memcached cache backend (samdark) - Bug #12043: Fixed `yii\helpers\Json::encode()` encodes empty array returned by `JsonSerializable::jsonSerialize()` as object (klimov-paul) - Bug #12045: Added missing `LEVEL_PROFILE` to `yii\log\Logger::getLevelName()` map (Mak-Di) +- Bug #10681: Reverted fix of beforeValidate event calling in `yii.activeForm.js` (silverfire) - Enh #10583: Do not silence session errors in debug mode (samdark) - Enh #12048: Improved message extraction command performance (samdark) - Enh #12038: Introduced `yii\base\ViewNotFoundException` which is thrown when views file doesn't exists, used it in `ViewAction` (samdark) diff --git a/framework/assets/yii.activeForm.js b/framework/assets/yii.activeForm.js index 86a4632..f877ab3 100644 --- a/framework/assets/yii.activeForm.js +++ b/framework/assets/yii.activeForm.js @@ -290,9 +290,10 @@ deferreds = deferredArray(), submitting = data.submitting; - var event = $.Event(events.beforeValidate); - $form.trigger(event, [messages, deferreds]); if (submitting) { + var event = $.Event(events.beforeValidate); + $form.trigger(event, [messages, deferreds]); + if (event.result === false) { data.submitting = false; submitFinalize($form); From 51d9c288cbd38c44ec9911350012db079c8b2f3e Mon Sep 17 00:00:00 2001 From: Dmitriy Makarov Date: Wed, 3 Aug 2016 11:11:50 +0300 Subject: [PATCH 111/163] Added missing 'LEVEL_PROFILE' (#12068) --- framework/CHANGELOG.md | 1 + framework/log/SyslogTarget.php | 1 + 2 files changed, 2 insertions(+) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index b15d5e9..ebbff08 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -4,6 +4,7 @@ Yii Framework 2 Change Log 2.0.10 under development ------------------------ +- Bug #12068: Added missing 'LEVEL_PROFILE' for the syslog target (Mak-Di) - Bug #11461: Fixed migration tool error when create migrate with comma in defaultValue (pana1990, s-o-f) - Bug #11912: Fixed PostgreSQL Schema to support negative default values for integer/float/decimal columns (nsknewbie) - Bug #11947: Fixed `gridData` initialization in `yii.gridView.js` (pavlm) diff --git a/framework/log/SyslogTarget.php b/framework/log/SyslogTarget.php index e5998ce..08d17f5 100644 --- a/framework/log/SyslogTarget.php +++ b/framework/log/SyslogTarget.php @@ -34,6 +34,7 @@ class SyslogTarget extends Target Logger::LEVEL_TRACE => LOG_DEBUG, Logger::LEVEL_PROFILE_BEGIN => LOG_DEBUG, Logger::LEVEL_PROFILE_END => LOG_DEBUG, + Logger::LEVEL_PROFILE => LOG_DEBUG, Logger::LEVEL_INFO => LOG_INFO, Logger::LEVEL_WARNING => LOG_WARNING, Logger::LEVEL_ERROR => LOG_ERR, From 0ac161b69d77db3179cf17388aedd8df35246079 Mon Sep 17 00:00:00 2001 From: DumpOfTheVar Date: Wed, 3 Aug 2016 12:52:27 +0300 Subject: [PATCH 112/163] fix mistake in dependency injection section of documentation (#12066) --- docs/guide/concept-di-container.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/guide/concept-di-container.md b/docs/guide/concept-di-container.md index 6f0e3bf..976730b 100644 --- a/docs/guide/concept-di-container.md +++ b/docs/guide/concept-di-container.md @@ -67,7 +67,7 @@ You may call that method either by passing an instance of `\my\heavy\Dependency` ```php $obj = new MyClass(/*...*/); -Yii::$container->invoke([$obj, 'doSomethingWithHeavyDependency'], ['param1' => 42]); // $something will be provided by the DI container +Yii::$container->invoke([$obj, 'doSomething'], ['param1' => 42]); // $something will be provided by the DI container ``` ### Setter and Property Injection From 993f2aef28851a888878eaedb84db8233dfc12a3 Mon Sep 17 00:00:00 2001 From: Robert Korulczyk Date: Wed, 3 Aug 2016 21:49:49 +0200 Subject: [PATCH 113/163] Fixes #11275: Added possibility of unset or force replace former value in `ArrayHelper::merge()` --- docs/guide/helper-array.md | 75 +++++++++++++++++++++++------ framework/CHANGELOG.md | 1 + framework/helpers/BaseArrayHelper.php | 8 ++- framework/helpers/ReplaceArrayValue.php | 73 ++++++++++++++++++++++++++++ framework/helpers/UnsetArrayValue.php | 53 ++++++++++++++++++++ tests/framework/helpers/ArrayHelperTest.php | 73 ++++++++++++++++++++++++++++ 6 files changed, 268 insertions(+), 15 deletions(-) create mode 100644 framework/helpers/ReplaceArrayValue.php create mode 100644 framework/helpers/UnsetArrayValue.php diff --git a/docs/guide/helper-array.md b/docs/guide/helper-array.md index df4fcce..2552816 100644 --- a/docs/guide/helper-array.md +++ b/docs/guide/helper-array.md @@ -303,21 +303,68 @@ Encoding will use application charset and could be changed via third argument. ## Merging Arrays +You can use [[yii\helpers\ArrayHelper::merge()|ArrayHelper::merge()]] to merge two or more arrays into one recursively. +If each array has an element with the same string key value, the latter will overwrite the former +(different from [array_merge_recursive()](http://php.net/manual/en/function.array-merge-recursive.php)). +Recursive merging will be conducted if both arrays have an element of array type and are having the same key. +For integer-keyed elements, the elements from the latter array will be appended to the former array. +You can use [[yii\helpers\UnsetArrayValue]] object to unset value from previous array or +[[yii\helpers\ReplaceArrayValue]] to force replace former value instead of recursive merging. + +For example: + ```php - /** - * Merges two or more arrays into one recursively. - * If each array has an element with the same string key value, the latter - * will overwrite the former (different from array_merge_recursive). - * Recursive merging will be conducted if both arrays have an element of array - * type and are having the same key. - * For integer-keyed elements, the elements from the latter array will - * be appended to the former array. - * @param array $a array to be merged to - * @param array $b array to be merged from. You can specify additional - * arrays via third argument, fourth argument etc. - * @return array the merged array (the original arrays are not changed.) - */ - public static function merge($a, $b) +$array1 = [ + 'name' => 'Yii', + 'version' => '1.1', + 'ids' => [ + 1, + ], + 'validDomains' => [ + 'example.com', + 'www.example.com', + ], + 'emails' => [ + 'admin' => 'admin@example.com', + 'dev' => 'dev@example.com', + ], +]; + +$array2 = [ + 'version' => '2.0', + 'ids' => [ + 2, + ], + 'validDomains' => new \yii\helpers\ReplaceArrayValue([ + 'yiiframework.com', + 'www.yiiframework.com', + ]), + 'emails' => [ + 'dev' => new \yii\helpers\UnsetArrayValue(), + ], +]; + +$result = ArrayHelper::merge($array1, $array2); +``` + +The result will be: + +```php +[ + 'name' => 'Yii', + 'version' => '2.0', + 'ids' => [ + 1, + 2, + ], + 'validDomains' => [ + 'yiiframework.com', + 'www.yiiframework.com', + ], + 'emails' => [ + 'admin' => 'admin@example.com', + ], +] ``` diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index ebbff08..0e93ff9 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -9,6 +9,7 @@ Yii Framework 2 Change Log - Bug #11912: Fixed PostgreSQL Schema to support negative default values for integer/float/decimal columns (nsknewbie) - Bug #11947: Fixed `gridData` initialization in `yii.gridView.js` (pavlm) - Bug #11949: Fixed `ActiveField::end` generates close tag when it's `option['tag']` is null (egorio) +- Enh #11275: Added possibility of unset or force replace former value in `ArrayHelper::merge()` (mdmunir, rob006) - Enh #11950: Improve BaseArrayHelper::keyExists speed (egorio) - Bug #11726: `DbSession` was echoing database errors in production mode (samdark, pastuhov, deadkrolik) - Bug #12030: Fixed `yii\base\Model::offsetExists()` throws an exception on un-existing field (klimov-paul) diff --git a/framework/helpers/BaseArrayHelper.php b/framework/helpers/BaseArrayHelper.php index 1968772..48ca2fa 100644 --- a/framework/helpers/BaseArrayHelper.php +++ b/framework/helpers/BaseArrayHelper.php @@ -107,6 +107,8 @@ class BaseArrayHelper * type and are having the same key. * For integer-keyed elements, the elements from the latter array will * be appended to the former array. + * You can use [[UnsetArrayValue]] object to unset value from previous array or + * [[ReplaceArrayValue]] to force replace former value instead of recursive merging. * @param array $a array to be merged to * @param array $b array to be merged from. You can specify additional * arrays via third argument, fourth argument etc. @@ -119,7 +121,11 @@ class BaseArrayHelper while (!empty($args)) { $next = array_shift($args); foreach ($next as $k => $v) { - if (is_int($k)) { + if ($v instanceof UnsetArrayValue) { + unset($res[$k]); + } elseif ($v instanceof ReplaceArrayValue) { + $res[$k] = $v->value; + } elseif (is_int($k)) { if (isset($res[$k])) { $res[] = $v; } else { diff --git a/framework/helpers/ReplaceArrayValue.php b/framework/helpers/ReplaceArrayValue.php new file mode 100644 index 0000000..48644cf --- /dev/null +++ b/framework/helpers/ReplaceArrayValue.php @@ -0,0 +1,73 @@ + [ + * 1, + * ], + * 'validDomains' => [ + * 'example.com', + * 'www.example.com', + * ], + * ]; + * + * $array2 = [ + * 'ids' => [ + * 2, + * ], + * 'validDomains' => new \yii\helpers\ReplaceArrayValue([ + * 'yiiframework.com', + * 'www.yiiframework.com', + * ]), + * ]; + * + * $result = \yii\helpers\ArrayHelper::merge($array1, $array2); + * ``` + * + * The result will be + * + * ```php + * [ + * 'ids' => [ + * 1, + * 2, + * ], + * 'validDomains' => [ + * 'yiiframework.com', + * 'www.yiiframework.com', + * ], + * ] + * ``` + * + * @author Robert Korulczyk + * @since 2.0.10 + */ +class ReplaceArrayValue +{ + /** + * @var mixed value used as replacement. + */ + public $value; + + /** + * Constructor. + * @param mixed $value value used as replacement. + */ + public function __construct($value) + { + $this->value = $value; + } +} diff --git a/framework/helpers/UnsetArrayValue.php b/framework/helpers/UnsetArrayValue.php new file mode 100644 index 0000000..0cb4802 --- /dev/null +++ b/framework/helpers/UnsetArrayValue.php @@ -0,0 +1,53 @@ + [ + * 1, + * ], + * 'validDomains' => [ + * 'example.com', + * 'www.example.com', + * ], + * ]; + * + * $array2 = [ + * 'ids' => [ + * 2, + * ], + * 'validDomains' => new \yii\helpers\UnsetArrayValue(), + * ]; + * + * $result = \yii\helpers\ArrayHelper::merge($array1, $array2); + * ``` + * + * The result will be + * + * ```php + * [ + * 'ids' => [ + * 1, + * 2, + * ], + * ] + * ``` + * + * @author Robert Korulczyk + * @since 2.0.10 + */ +class UnsetArrayValue +{ +} diff --git a/tests/framework/helpers/ArrayHelperTest.php b/tests/framework/helpers/ArrayHelperTest.php index c8a89c3..16184dd 100644 --- a/tests/framework/helpers/ArrayHelperTest.php +++ b/tests/framework/helpers/ArrayHelperTest.php @@ -307,6 +307,79 @@ class ArrayHelperTest extends TestCase $this->assertEquals($expected, $result); } + public function testMergeWithUnset() + { + $a = [ + 'name' => 'Yii', + 'version' => '1.0', + 'options' => [ + 'namespace' => false, + 'unittest' => false, + ], + 'features' => [ + 'mvc', + ], + ]; + $b = [ + 'version' => '1.1', + 'options' => new \yii\helpers\UnsetArrayValue(), + 'features' => [ + 'gii', + ], + ]; + + $result = ArrayHelper::merge($a, $b); + $expected = [ + 'name' => 'Yii', + 'version' => '1.1', + 'features' => [ + 'mvc', + 'gii', + ], + ]; + + $this->assertEquals($expected, $result); + } + + public function testMergeWithReplace() + { + $a = [ + 'name' => 'Yii', + 'version' => '1.0', + 'options' => [ + 'namespace' => false, + 'unittest' => false, + ], + 'features' => [ + 'mvc', + ], + ]; + $b = [ + 'version' => '1.1', + 'options' => [ + 'unittest' => true, + ], + 'features' => new \yii\helpers\ReplaceArrayValue([ + 'gii', + ]), + ]; + + $result = ArrayHelper::merge($a, $b); + $expected = [ + 'name' => 'Yii', + 'version' => '1.1', + 'options' => [ + 'namespace' => false, + 'unittest' => true, + ], + 'features' => [ + 'gii', + ], + ]; + + $this->assertEquals($expected, $result); + } + /** * @see https://github.com/yiisoft/yii2/pull/11549 */ From 68d9e282ed5f5739f10727719c88bb9c3e795423 Mon Sep 17 00:00:00 2001 From: kir86975 Date: Thu, 4 Aug 2016 16:56:17 +0500 Subject: [PATCH 114/163] Update rest-resources.md (#12081) [skip ci] --- docs/guide-ru/rest-resources.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/guide-ru/rest-resources.md b/docs/guide-ru/rest-resources.md index 82f1568..8af6326 100644 --- a/docs/guide-ru/rest-resources.md +++ b/docs/guide-ru/rest-resources.md @@ -19,7 +19,7 @@ RESTful API строятся вокруг доступа к *ресурсам* ## Поля -Когда ресурс включается в ответ RESTful API, необходимо серилеазовать его в строку. Yii разбивает этот процесс на два этапа. +Когда ресурс включается в ответ RESTful API, необходимо сериализовать его в строку. Yii разбивает этот процесс на два этапа. Сначала ресурс конвертируется в массив при помощи [[yii\rest\Serializer]]. На втором этапе массив сериализуется в строку заданного формата (например, JSON или XML) при помощи [[yii\web\ResponseFormatterInterface|форматтера ответа]]. Именно на этом стоит сосредоточится при разработке класса ресурса. From 9d5bf60a8927c1ccfd9c5c7ab02dd24166b318dc Mon Sep 17 00:00:00 2001 From: Alexander Zlakomanov Date: Tue, 19 Jul 2016 10:56:39 +0300 Subject: [PATCH 115/163] Added Oracle mutex --- composer.lock | 1302 --------------------------------------- framework/CHANGELOG.md | 3 + framework/mutex/OracleMutex.php | 130 ++++ 3 files changed, 133 insertions(+), 1302 deletions(-) delete mode 100644 composer.lock create mode 100644 framework/mutex/OracleMutex.php diff --git a/composer.lock b/composer.lock deleted file mode 100644 index bf95a51..0000000 --- a/composer.lock +++ /dev/null @@ -1,1302 +0,0 @@ -{ - "_readme": [ - "This file locks the dependencies of your project to a known state", - "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", - "This file is @generated automatically" - ], - "hash": "d2005b487c5ff761d806b9a94bfe4cac", - "content-hash": "de99885237d7d9364d74fb5f93389801", - "packages": [ - { - "name": "bower-asset/jquery", - "version": "2.2.3", - "source": { - "type": "git", - "url": "https://github.com/jquery/jquery-dist.git", - "reference": "af22a351b2ea5801ffb1695abb3bb34d5bed9198" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/jquery/jquery-dist/zipball/af22a351b2ea5801ffb1695abb3bb34d5bed9198", - "reference": "af22a351b2ea5801ffb1695abb3bb34d5bed9198", - "shasum": "" - }, - "type": "bower-asset-library", - "extra": { - "bower-asset-main": "dist/jquery.js", - "bower-asset-ignore": [ - "package.json" - ] - }, - "license": [ - "MIT" - ], - "keywords": [ - "browser", - "javascript", - "jquery", - "library" - ] - }, - { - "name": "bower-asset/jquery.inputmask", - "version": "3.2.7", - "source": { - "type": "git", - "url": "https://github.com/RobinHerbots/jquery.inputmask.git", - "reference": "5a72c563b502b8e05958a524cdfffafe9987be38" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/RobinHerbots/jquery.inputmask/zipball/5a72c563b502b8e05958a524cdfffafe9987be38", - "reference": "5a72c563b502b8e05958a524cdfffafe9987be38", - "shasum": "" - }, - "require": { - "bower-asset/jquery": ">=1.7" - }, - "type": "bower-asset-library", - "extra": { - "bower-asset-main": [ - "./dist/inputmask/inputmask.js" - ], - "bower-asset-ignore": [ - "**/*", - "!dist/*", - "!dist/inputmask/*", - "!dist/min/*", - "!dist/min/inputmask/*", - "!extra/bindings/*", - "!extra/dependencyLibs/*", - "!extra/phone-codes/*" - ] - }, - "license": [ - "http://opensource.org/licenses/mit-license.php" - ], - "description": "jquery.inputmask is a jquery plugin which create an input mask.", - "keywords": [ - "form", - "input", - "inputmask", - "jquery", - "mask", - "plugins" - ] - }, - { - "name": "bower-asset/punycode", - "version": "v1.3.2", - "source": { - "type": "git", - "url": "https://github.com/bestiejs/punycode.js.git", - "reference": "38c8d3131a82567bfef18da09f7f4db68c84f8a3" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/bestiejs/punycode.js/zipball/38c8d3131a82567bfef18da09f7f4db68c84f8a3", - "reference": "38c8d3131a82567bfef18da09f7f4db68c84f8a3", - "shasum": "" - }, - "type": "bower-asset-library", - "extra": { - "bower-asset-main": "punycode.js", - "bower-asset-ignore": [ - "coverage", - "tests", - ".*", - "component.json", - "Gruntfile.js", - "node_modules", - "package.json" - ] - } - }, - { - "name": "bower-asset/yii2-pjax", - "version": "v2.0.6", - "source": { - "type": "git", - "url": "https://github.com/yiisoft/jquery-pjax.git", - "reference": "60728da6ade5879e807a49ce59ef9a72039b8978" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/yiisoft/jquery-pjax/zipball/60728da6ade5879e807a49ce59ef9a72039b8978", - "reference": "60728da6ade5879e807a49ce59ef9a72039b8978", - "shasum": "" - }, - "require": { - "bower-asset/jquery": ">=1.8" - }, - "type": "bower-asset-library", - "extra": { - "bower-asset-main": "./jquery.pjax.js", - "bower-asset-ignore": [ - ".travis.yml", - "Gemfile", - "Gemfile.lock", - "CONTRIBUTING.md", - "vendor/", - "script/", - "test/" - ] - }, - "license": [ - "MIT" - ] - }, - { - "name": "cebe/markdown", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/cebe/markdown.git", - "reference": "e2a490ceec590bf5bfd1b43bd424fb9dceceb7c5" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/cebe/markdown/zipball/e2a490ceec590bf5bfd1b43bd424fb9dceceb7c5", - "reference": "e2a490ceec590bf5bfd1b43bd424fb9dceceb7c5", - "shasum": "" - }, - "require": { - "lib-pcre": "*", - "php": ">=5.4.0" - }, - "require-dev": { - "cebe/indent": "*", - "facebook/xhprof": "*@dev", - "phpunit/phpunit": "4.1.*" - }, - "bin": [ - "bin/markdown" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.1.x-dev" - } - }, - "autoload": { - "psr-4": { - "cebe\\markdown\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Carsten Brandt", - "email": "mail@cebe.cc", - "homepage": "http://cebe.cc/", - "role": "Creator" - } - ], - "description": "A super fast, highly extensible markdown parser for PHP", - "homepage": "https://github.com/cebe/markdown#readme", - "keywords": [ - "extensible", - "fast", - "gfm", - "markdown", - "markdown-extra" - ], - "time": "2016-03-18 13:28:11" - }, - { - "name": "ezyang/htmlpurifier", - "version": "v4.7.0", - "source": { - "type": "git", - "url": "https://github.com/ezyang/htmlpurifier.git", - "reference": "ae1828d955112356f7677c465f94f7deb7d27a40" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/ezyang/htmlpurifier/zipball/ae1828d955112356f7677c465f94f7deb7d27a40", - "reference": "ae1828d955112356f7677c465f94f7deb7d27a40", - "shasum": "" - }, - "require": { - "php": ">=5.2" - }, - "type": "library", - "autoload": { - "psr-0": { - "HTMLPurifier": "library/" - }, - "files": [ - "library/HTMLPurifier.composer.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "LGPL" - ], - "authors": [ - { - "name": "Edward Z. Yang", - "email": "admin@htmlpurifier.org", - "homepage": "http://ezyang.com" - } - ], - "description": "Standards compliant HTML filter written in PHP", - "homepage": "http://htmlpurifier.org/", - "keywords": [ - "html" - ], - "time": "2015-08-05 01:03:42" - }, - { - "name": "yiisoft/yii2-composer", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/yiisoft/yii2-composer.git", - "reference": "f5fe6ba58dbc92b37daed5d9bd94cda777852ee4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/yiisoft/yii2-composer/zipball/f5fe6ba58dbc92b37daed5d9bd94cda777852ee4", - "reference": "f5fe6ba58dbc92b37daed5d9bd94cda777852ee4", - "shasum": "" - }, - "require": { - "composer-plugin-api": "^1.0" - }, - "type": "composer-plugin", - "extra": { - "class": "yii\\composer\\Plugin", - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "yii\\composer\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Qiang Xue", - "email": "qiang.xue@gmail.com" - } - ], - "description": "The composer plugin for Yii extension installer", - "keywords": [ - "composer", - "extension installer", - "yii2" - ], - "time": "2016-04-14 08:46:37" - } - ], - "packages-dev": [ - { - "name": "cebe/indent", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/cebe/indent.git", - "reference": "0f33ba3cb567726a726e7024072232839a0d7cd0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/cebe/indent/zipball/0f33ba3cb567726a726e7024072232839a0d7cd0", - "reference": "0f33ba3cb567726a726e7024072232839a0d7cd0", - "shasum": "" - }, - "bin": [ - "indent" - ], - "type": "library", - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Carsten Brandt", - "email": "mail@cebe.cc" - } - ], - "description": "a small tool to convert text file indentation", - "time": "2015-11-22 14:46:59" - }, - { - "name": "doctrine/instantiator", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/doctrine/instantiator.git", - "reference": "416fb8ad1d095a87f1d21bc40711843cd122fd4a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/instantiator/zipball/416fb8ad1d095a87f1d21bc40711843cd122fd4a", - "reference": "416fb8ad1d095a87f1d21bc40711843cd122fd4a", - "shasum": "" - }, - "require": { - "php": ">=5.3,<8.0-DEV" - }, - "require-dev": { - "athletic/athletic": "~0.1.8", - "ext-pdo": "*", - "ext-phar": "*", - "phpunit/phpunit": "~4.0", - "squizlabs/php_codesniffer": "~2.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com", - "homepage": "http://ocramius.github.com/" - } - ], - "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", - "homepage": "https://github.com/doctrine/instantiator", - "keywords": [ - "constructor", - "instantiate" - ], - "time": "2016-03-31 10:24:22" - }, - { - "name": "phpdocumentor/reflection-docblock", - "version": "2.0.4", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "d68dbdc53dc358a816f00b300704702b2eaff7b8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/d68dbdc53dc358a816f00b300704702b2eaff7b8", - "reference": "d68dbdc53dc358a816f00b300704702b2eaff7b8", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "require-dev": { - "phpunit/phpunit": "~4.0" - }, - "suggest": { - "dflydev/markdown": "~1.0", - "erusev/parsedown": "~1.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "autoload": { - "psr-0": { - "phpDocumentor": [ - "src/" - ] - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Mike van Riel", - "email": "mike.vanriel@naenius.com" - } - ], - "time": "2015-02-03 12:10:50" - }, - { - "name": "phpspec/prophecy", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/phpspec/prophecy.git", - "reference": "b02221e42163be673f9b44a0bc92a8b4907a7c6d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpspec/prophecy/zipball/b02221e42163be673f9b44a0bc92a8b4907a7c6d", - "reference": "b02221e42163be673f9b44a0bc92a8b4907a7c6d", - "shasum": "" - }, - "require": { - "doctrine/instantiator": "^1.0.2", - "php": "^5.3|^7.0", - "phpdocumentor/reflection-docblock": "~2.0", - "sebastian/comparator": "~1.1", - "sebastian/recursion-context": "~1.0" - }, - "require-dev": { - "phpspec/phpspec": "~2.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.6.x-dev" - } - }, - "autoload": { - "psr-0": { - "Prophecy\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Konstantin Kudryashov", - "email": "ever.zet@gmail.com", - "homepage": "http://everzet.com" - }, - { - "name": "Marcello Duarte", - "email": "marcello.duarte@gmail.com" - } - ], - "description": "Highly opinionated mocking framework for PHP 5.3+", - "homepage": "https://github.com/phpspec/prophecy", - "keywords": [ - "Double", - "Dummy", - "fake", - "mock", - "spy", - "stub" - ], - "time": "2016-02-21 17:41:21" - }, - { - "name": "phpunit/php-code-coverage", - "version": "2.2.x-dev", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "eabf68b476ac7d0f73793aada060f1c1a9bf8979" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/eabf68b476ac7d0f73793aada060f1c1a9bf8979", - "reference": "eabf68b476ac7d0f73793aada060f1c1a9bf8979", - "shasum": "" - }, - "require": { - "php": ">=5.3.3", - "phpunit/php-file-iterator": "~1.3", - "phpunit/php-text-template": "~1.2", - "phpunit/php-token-stream": "~1.3", - "sebastian/environment": "^1.3.2", - "sebastian/version": "~1.0" - }, - "require-dev": { - "ext-xdebug": ">=2.1.4", - "phpunit/phpunit": "~4" - }, - "suggest": { - "ext-dom": "*", - "ext-xdebug": ">=2.2.1", - "ext-xmlwriter": "*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.2.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sb@sebastian-bergmann.de", - "role": "lead" - } - ], - "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", - "homepage": "https://github.com/sebastianbergmann/php-code-coverage", - "keywords": [ - "coverage", - "testing", - "xunit" - ], - "time": "2015-10-06 15:47:00" - }, - { - "name": "phpunit/php-file-iterator", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "6150bf2c35d3fc379e50c7602b75caceaa39dbf0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/6150bf2c35d3fc379e50c7602b75caceaa39dbf0", - "reference": "6150bf2c35d3fc379e50c7602b75caceaa39dbf0", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.4.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sb@sebastian-bergmann.de", - "role": "lead" - } - ], - "description": "FilterIterator implementation that filters files based on a list of suffixes.", - "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", - "keywords": [ - "filesystem", - "iterator" - ], - "time": "2015-06-21 13:08:43" - }, - { - "name": "phpunit/php-text-template", - "version": "1.2.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-text-template.git", - "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686", - "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Simple template engine.", - "homepage": "https://github.com/sebastianbergmann/php-text-template/", - "keywords": [ - "template" - ], - "time": "2015-06-21 13:50:34" - }, - { - "name": "phpunit/php-timer", - "version": "1.0.7", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-timer.git", - "reference": "3e82f4e9fc92665fafd9157568e4dcb01d014e5b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/3e82f4e9fc92665fafd9157568e4dcb01d014e5b", - "reference": "3e82f4e9fc92665fafd9157568e4dcb01d014e5b", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sb@sebastian-bergmann.de", - "role": "lead" - } - ], - "description": "Utility class for timing", - "homepage": "https://github.com/sebastianbergmann/php-timer/", - "keywords": [ - "timer" - ], - "time": "2015-06-21 08:01:12" - }, - { - "name": "phpunit/php-token-stream", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-token-stream.git", - "reference": "cab6c6fefee93d7b7c3a01292a0fe0884ea66644" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/cab6c6fefee93d7b7c3a01292a0fe0884ea66644", - "reference": "cab6c6fefee93d7b7c3a01292a0fe0884ea66644", - "shasum": "" - }, - "require": { - "ext-tokenizer": "*", - "php": ">=5.3.3" - }, - "require-dev": { - "phpunit/phpunit": "~4.2" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.4-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Wrapper around PHP's tokenizer extension.", - "homepage": "https://github.com/sebastianbergmann/php-token-stream/", - "keywords": [ - "tokenizer" - ], - "time": "2015-09-23 14:46:55" - }, - { - "name": "phpunit/phpunit", - "version": "4.8.x-dev", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "3c4becbce99732549949904c47b76ffe602a7595" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/3c4becbce99732549949904c47b76ffe602a7595", - "reference": "3c4becbce99732549949904c47b76ffe602a7595", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-json": "*", - "ext-pcre": "*", - "ext-reflection": "*", - "ext-spl": "*", - "php": ">=5.3.3", - "phpspec/prophecy": "^1.3.1", - "phpunit/php-code-coverage": "~2.1", - "phpunit/php-file-iterator": "~1.4", - "phpunit/php-text-template": "~1.2", - "phpunit/php-timer": "^1.0.6", - "phpunit/phpunit-mock-objects": "~2.3", - "sebastian/comparator": "~1.1", - "sebastian/diff": "~1.2", - "sebastian/environment": "~1.3", - "sebastian/exporter": "~1.2", - "sebastian/global-state": "~1.0", - "sebastian/version": "~1.0", - "symfony/yaml": "~2.1|~3.0" - }, - "suggest": { - "phpunit/php-invoker": "~1.1" - }, - "bin": [ - "phpunit" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.8.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "The PHP Unit Testing framework.", - "homepage": "https://phpunit.de/", - "keywords": [ - "phpunit", - "testing", - "xunit" - ], - "time": "2016-04-25 09:17:33" - }, - { - "name": "phpunit/phpunit-mock-objects", - "version": "2.3.x-dev", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git", - "reference": "ac8e7a3db35738d56ee9a76e78a4e03d97628983" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/ac8e7a3db35738d56ee9a76e78a4e03d97628983", - "reference": "ac8e7a3db35738d56ee9a76e78a4e03d97628983", - "shasum": "" - }, - "require": { - "doctrine/instantiator": "^1.0.2", - "php": ">=5.3.3", - "phpunit/php-text-template": "~1.2", - "sebastian/exporter": "~1.2" - }, - "require-dev": { - "phpunit/phpunit": "~4.4" - }, - "suggest": { - "ext-soap": "*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.3.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sb@sebastian-bergmann.de", - "role": "lead" - } - ], - "description": "Mock Object library for PHPUnit", - "homepage": "https://github.com/sebastianbergmann/phpunit-mock-objects/", - "keywords": [ - "mock", - "xunit" - ], - "time": "2015-10-02 06:51:40" - }, - { - "name": "sebastian/comparator", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "937efb279bd37a375bcadf584dec0726f84dbf22" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/937efb279bd37a375bcadf584dec0726f84dbf22", - "reference": "937efb279bd37a375bcadf584dec0726f84dbf22", - "shasum": "" - }, - "require": { - "php": ">=5.3.3", - "sebastian/diff": "~1.2", - "sebastian/exporter": "~1.2" - }, - "require-dev": { - "phpunit/phpunit": "~4.4" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.2.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Volker Dusch", - "email": "github@wallbash.com" - }, - { - "name": "Bernhard Schussek", - "email": "bschussek@2bepublished.at" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Provides the functionality to compare PHP values for equality", - "homepage": "http://www.github.com/sebastianbergmann/comparator", - "keywords": [ - "comparator", - "compare", - "equality" - ], - "time": "2015-07-26 15:48:44" - }, - { - "name": "sebastian/diff", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "13edfd8706462032c2f52b4b862974dd46b71c9e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/13edfd8706462032c2f52b4b862974dd46b71c9e", - "reference": "13edfd8706462032c2f52b4b862974dd46b71c9e", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "require-dev": { - "phpunit/phpunit": "~4.8" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.4-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Kore Nordmann", - "email": "mail@kore-nordmann.de" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Diff implementation", - "homepage": "https://github.com/sebastianbergmann/diff", - "keywords": [ - "diff" - ], - "time": "2015-12-08 07:14:41" - }, - { - "name": "sebastian/environment", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "dc7a29032cf72b54f36dac15a1ca5b3a1b6029bf" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/dc7a29032cf72b54f36dac15a1ca5b3a1b6029bf", - "reference": "dc7a29032cf72b54f36dac15a1ca5b3a1b6029bf", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "require-dev": { - "phpunit/phpunit": "~4.4" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.3.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Provides functionality to handle HHVM/PHP environments", - "homepage": "http://www.github.com/sebastianbergmann/environment", - "keywords": [ - "Xdebug", - "environment", - "hhvm" - ], - "time": "2016-02-26 18:40:46" - }, - { - "name": "sebastian/exporter", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "f88f8936517d54ae6d589166810877fb2015d0a2" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/f88f8936517d54ae6d589166810877fb2015d0a2", - "reference": "f88f8936517d54ae6d589166810877fb2015d0a2", - "shasum": "" - }, - "require": { - "php": ">=5.3.3", - "sebastian/recursion-context": "~1.0" - }, - "require-dev": { - "ext-mbstring": "*", - "phpunit/phpunit": "~4.4" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.3.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Volker Dusch", - "email": "github@wallbash.com" - }, - { - "name": "Bernhard Schussek", - "email": "bschussek@2bepublished.at" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Adam Harvey", - "email": "aharvey@php.net" - } - ], - "description": "Provides the functionality to export PHP variables for visualization", - "homepage": "http://www.github.com/sebastianbergmann/exporter", - "keywords": [ - "export", - "exporter" - ], - "time": "2015-08-09 04:23:41" - }, - { - "name": "sebastian/global-state", - "version": "1.1.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bc37d50fea7d017d3d340f230811c9f1d7280af4", - "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "require-dev": { - "phpunit/phpunit": "~4.2" - }, - "suggest": { - "ext-uopz": "*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Snapshotting of global state", - "homepage": "http://www.github.com/sebastianbergmann/global-state", - "keywords": [ - "global state" - ], - "time": "2015-10-12 03:26:01" - }, - { - "name": "sebastian/recursion-context", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "7ff5b1b3dcc55b8ab8ae61ef99d4730940856ee7" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/7ff5b1b3dcc55b8ab8ae61ef99d4730940856ee7", - "reference": "7ff5b1b3dcc55b8ab8ae61ef99d4730940856ee7", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "require-dev": { - "phpunit/phpunit": "~4.4" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Adam Harvey", - "email": "aharvey@php.net" - } - ], - "description": "Provides functionality to recursively process PHP variables", - "homepage": "http://www.github.com/sebastianbergmann/recursion-context", - "time": "2016-01-28 05:39:29" - }, - { - "name": "sebastian/version", - "version": "1.0.6", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/version.git", - "reference": "58b3a85e7999757d6ad81c787a1fbf5ff6c628c6" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/58b3a85e7999757d6ad81c787a1fbf5ff6c628c6", - "reference": "58b3a85e7999757d6ad81c787a1fbf5ff6c628c6", - "shasum": "" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Library that helps with managing the version number of Git-hosted PHP projects", - "homepage": "https://github.com/sebastianbergmann/version", - "time": "2015-06-21 13:59:46" - }, - { - "name": "symfony/yaml", - "version": "2.8.x-dev", - "source": { - "type": "git", - "url": "https://github.com/symfony/yaml.git", - "reference": "e4fbcc65f90909c999ac3b4dfa699ee6563a9940" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/e4fbcc65f90909c999ac3b4dfa699ee6563a9940", - "reference": "e4fbcc65f90909c999ac3b4dfa699ee6563a9940", - "shasum": "" - }, - "require": { - "php": ">=5.3.9" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.8-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\Yaml\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Yaml Component", - "homepage": "https://symfony.com", - "time": "2016-03-29 19:00:15" - } - ], - "aliases": [], - "minimum-stability": "dev", - "stability-flags": { - "bower-asset/jquery": 0 - }, - "prefer-stable": false, - "prefer-lowest": false, - "platform": { - "php": ">=5.4.0", - "ext-mbstring": "*", - "ext-ctype": "*", - "lib-pcre": "*" - }, - "platform-dev": [] -} diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index 0e93ff9..d4b8dbe 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -8,6 +8,7 @@ Yii Framework 2 Change Log - Bug #11461: Fixed migration tool error when create migrate with comma in defaultValue (pana1990, s-o-f) - Bug #11912: Fixed PostgreSQL Schema to support negative default values for integer/float/decimal columns (nsknewbie) - Bug #11947: Fixed `gridData` initialization in `yii.gridView.js` (pavlm) +- Enh #11979: Oracle mutex (zlakomanoff) - Bug #11949: Fixed `ActiveField::end` generates close tag when it's `option['tag']` is null (egorio) - Enh #11275: Added possibility of unset or force replace former value in `ArrayHelper::merge()` (mdmunir, rob006) - Enh #11950: Improve BaseArrayHelper::keyExists speed (egorio) @@ -19,6 +20,8 @@ Yii Framework 2 Change Log - Enh #10583: Do not silence session errors in debug mode (samdark) - Enh #12048: Improved message extraction command performance (samdark) - Enh #12038: Introduced `yii\base\ViewNotFoundException` which is thrown when views file doesn't exists, used it in `ViewAction` (samdark) +- Enh #11979: Oracle mutex (zlakomanoff) + 2.0.9 July 11, 2016 ------------------- diff --git a/framework/mutex/OracleMutex.php b/framework/mutex/OracleMutex.php new file mode 100644 index 0000000..d6cba79 --- /dev/null +++ b/framework/mutex/OracleMutex.php @@ -0,0 +1,130 @@ + [ + * 'db' => [ + * 'class' => 'yii\db\Connection', + * 'dsn' => 'oci:dbname=LOCAL_XE', + * ... + * ] + * 'mutex' => [ + * 'class' => 'yii\mutex\OracleMutex', + * 'lockMode' => 'NL_MODE', + * 'releaseOnCommit' => true, + * ... + * ], + * ], + * ] + * ``` + * + * @see http://docs.oracle.com/cd/B19306_01/appdev.102/b14258/d_lock.htm + * @see Mutex + * + * @author Alexander Zlakomanov + * @since 2.0.10 + */ +class OracleMutex extends DbMutex +{ + /** available lock modes */ + const MODE_X = 'X_MODE'; + const MODE_NL = 'NL_MODE'; + const MODE_S = 'S_MODE'; + const MODE_SX = 'SX_MODE'; + const MODE_SS = 'SS_MODE'; + const MODE_SSX = 'SSX_MODE'; + + /** + * @var string lock mode to be used. + * @see http://docs.oracle.com/cd/B19306_01/appdev.102/b14258/d_lock.htm#CHDBCFDI + */ + public $lockMode = self::MODE_X; + /** + * @var boolean whether to release lock on commit. + */ + public $releaseOnCommit = false; + + + /** + * Initializes Oracle specific mutex component implementation. + * @throws InvalidConfigException if [[db]] is not Oracle connection. + */ + public function init() + { + parent::init(); + if (strpos($this->db->driverName, 'oci') !== 0 && strpos($this->db->driverName, 'odbc') !== 0) { + throw new InvalidConfigException('In order to use OracleMutex connection must be configured to use Oracle database.'); + } + } + + /** + * Acquires lock by given name. + * @see http://docs.oracle.com/cd/B19306_01/appdev.102/b14258/d_lock.htm + * @param string $name of the lock to be acquired. + * @param integer $timeout to wait for lock to become released. + * @return bool acquiring result. + */ + protected function acquireLock($name, $timeout = 0) + { + $lockStatus = null; + + /** clean vars before using */ + $releaseOnCommit = $this->releaseOnCommit ? 'TRUE' : 'FALSE'; + $timeout = abs((int)$timeout); + + /** inside pl/sql scopes pdo binding not working correctly :( */ + $this->db->createCommand( + 'DECLARE + handle VARCHAR2(128); +BEGIN + DBMS_LOCK.ALLOCATE_UNIQUE(:name, handle); + :lockStatus := DBMS_LOCK.REQUEST(handle, DBMS_LOCK.' . $this->lockMode . ', ' . $timeout . ', ' . $releaseOnCommit . '); +END;', + [':name' => $name] + ) + ->bindParam(':lockStatus', $lockStatus, PDO::PARAM_INT, 1) + ->execute(); + + return ($lockStatus === 0 || $lockStatus === '0'); + } + + /** + * Releases lock by given name. + * @param string $name of the lock to be released. + * @return boolean release result. + * @see http://docs.oracle.com/cd/B19306_01/appdev.102/b14258/d_lock.htm + */ + protected function releaseLock($name) + { + $releaseStatus = null; + $this->db->createCommand( + 'DECLARE + handle VARCHAR2(128); +BEGIN + DBMS_LOCK.ALLOCATE_UNIQUE(:name, handle); + :result := DBMS_LOCK.RELEASE(handle); +END;', + [':name' => $name] + ) + ->bindParam(':result', $releaseStatus, PDO::PARAM_INT, 1) + ->execute(); + + return ($releaseStatus === 0 || $releaseStatus === '0'); + } +} From f1af3133c9488d73aaa28f922bc34eb61886d806 Mon Sep 17 00:00:00 2001 From: Klimov Paul Date: Thu, 4 Aug 2016 17:43:52 +0300 Subject: [PATCH 116/163] `composer.lock` restored --- composer.lock | 1302 ++++++++++++++++++++++++++++++++++++++++++++++++ framework/CHANGELOG.md | 3 +- 2 files changed, 1303 insertions(+), 2 deletions(-) create mode 100644 composer.lock diff --git a/composer.lock b/composer.lock new file mode 100644 index 0000000..bf95a51 --- /dev/null +++ b/composer.lock @@ -0,0 +1,1302 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", + "This file is @generated automatically" + ], + "hash": "d2005b487c5ff761d806b9a94bfe4cac", + "content-hash": "de99885237d7d9364d74fb5f93389801", + "packages": [ + { + "name": "bower-asset/jquery", + "version": "2.2.3", + "source": { + "type": "git", + "url": "https://github.com/jquery/jquery-dist.git", + "reference": "af22a351b2ea5801ffb1695abb3bb34d5bed9198" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/jquery/jquery-dist/zipball/af22a351b2ea5801ffb1695abb3bb34d5bed9198", + "reference": "af22a351b2ea5801ffb1695abb3bb34d5bed9198", + "shasum": "" + }, + "type": "bower-asset-library", + "extra": { + "bower-asset-main": "dist/jquery.js", + "bower-asset-ignore": [ + "package.json" + ] + }, + "license": [ + "MIT" + ], + "keywords": [ + "browser", + "javascript", + "jquery", + "library" + ] + }, + { + "name": "bower-asset/jquery.inputmask", + "version": "3.2.7", + "source": { + "type": "git", + "url": "https://github.com/RobinHerbots/jquery.inputmask.git", + "reference": "5a72c563b502b8e05958a524cdfffafe9987be38" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/RobinHerbots/jquery.inputmask/zipball/5a72c563b502b8e05958a524cdfffafe9987be38", + "reference": "5a72c563b502b8e05958a524cdfffafe9987be38", + "shasum": "" + }, + "require": { + "bower-asset/jquery": ">=1.7" + }, + "type": "bower-asset-library", + "extra": { + "bower-asset-main": [ + "./dist/inputmask/inputmask.js" + ], + "bower-asset-ignore": [ + "**/*", + "!dist/*", + "!dist/inputmask/*", + "!dist/min/*", + "!dist/min/inputmask/*", + "!extra/bindings/*", + "!extra/dependencyLibs/*", + "!extra/phone-codes/*" + ] + }, + "license": [ + "http://opensource.org/licenses/mit-license.php" + ], + "description": "jquery.inputmask is a jquery plugin which create an input mask.", + "keywords": [ + "form", + "input", + "inputmask", + "jquery", + "mask", + "plugins" + ] + }, + { + "name": "bower-asset/punycode", + "version": "v1.3.2", + "source": { + "type": "git", + "url": "https://github.com/bestiejs/punycode.js.git", + "reference": "38c8d3131a82567bfef18da09f7f4db68c84f8a3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/bestiejs/punycode.js/zipball/38c8d3131a82567bfef18da09f7f4db68c84f8a3", + "reference": "38c8d3131a82567bfef18da09f7f4db68c84f8a3", + "shasum": "" + }, + "type": "bower-asset-library", + "extra": { + "bower-asset-main": "punycode.js", + "bower-asset-ignore": [ + "coverage", + "tests", + ".*", + "component.json", + "Gruntfile.js", + "node_modules", + "package.json" + ] + } + }, + { + "name": "bower-asset/yii2-pjax", + "version": "v2.0.6", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/jquery-pjax.git", + "reference": "60728da6ade5879e807a49ce59ef9a72039b8978" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/jquery-pjax/zipball/60728da6ade5879e807a49ce59ef9a72039b8978", + "reference": "60728da6ade5879e807a49ce59ef9a72039b8978", + "shasum": "" + }, + "require": { + "bower-asset/jquery": ">=1.8" + }, + "type": "bower-asset-library", + "extra": { + "bower-asset-main": "./jquery.pjax.js", + "bower-asset-ignore": [ + ".travis.yml", + "Gemfile", + "Gemfile.lock", + "CONTRIBUTING.md", + "vendor/", + "script/", + "test/" + ] + }, + "license": [ + "MIT" + ] + }, + { + "name": "cebe/markdown", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/cebe/markdown.git", + "reference": "e2a490ceec590bf5bfd1b43bd424fb9dceceb7c5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/cebe/markdown/zipball/e2a490ceec590bf5bfd1b43bd424fb9dceceb7c5", + "reference": "e2a490ceec590bf5bfd1b43bd424fb9dceceb7c5", + "shasum": "" + }, + "require": { + "lib-pcre": "*", + "php": ">=5.4.0" + }, + "require-dev": { + "cebe/indent": "*", + "facebook/xhprof": "*@dev", + "phpunit/phpunit": "4.1.*" + }, + "bin": [ + "bin/markdown" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1.x-dev" + } + }, + "autoload": { + "psr-4": { + "cebe\\markdown\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Carsten Brandt", + "email": "mail@cebe.cc", + "homepage": "http://cebe.cc/", + "role": "Creator" + } + ], + "description": "A super fast, highly extensible markdown parser for PHP", + "homepage": "https://github.com/cebe/markdown#readme", + "keywords": [ + "extensible", + "fast", + "gfm", + "markdown", + "markdown-extra" + ], + "time": "2016-03-18 13:28:11" + }, + { + "name": "ezyang/htmlpurifier", + "version": "v4.7.0", + "source": { + "type": "git", + "url": "https://github.com/ezyang/htmlpurifier.git", + "reference": "ae1828d955112356f7677c465f94f7deb7d27a40" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ezyang/htmlpurifier/zipball/ae1828d955112356f7677c465f94f7deb7d27a40", + "reference": "ae1828d955112356f7677c465f94f7deb7d27a40", + "shasum": "" + }, + "require": { + "php": ">=5.2" + }, + "type": "library", + "autoload": { + "psr-0": { + "HTMLPurifier": "library/" + }, + "files": [ + "library/HTMLPurifier.composer.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL" + ], + "authors": [ + { + "name": "Edward Z. Yang", + "email": "admin@htmlpurifier.org", + "homepage": "http://ezyang.com" + } + ], + "description": "Standards compliant HTML filter written in PHP", + "homepage": "http://htmlpurifier.org/", + "keywords": [ + "html" + ], + "time": "2015-08-05 01:03:42" + }, + { + "name": "yiisoft/yii2-composer", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/yii2-composer.git", + "reference": "f5fe6ba58dbc92b37daed5d9bd94cda777852ee4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/yii2-composer/zipball/f5fe6ba58dbc92b37daed5d9bd94cda777852ee4", + "reference": "f5fe6ba58dbc92b37daed5d9bd94cda777852ee4", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^1.0" + }, + "type": "composer-plugin", + "extra": { + "class": "yii\\composer\\Plugin", + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "yii\\composer\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Qiang Xue", + "email": "qiang.xue@gmail.com" + } + ], + "description": "The composer plugin for Yii extension installer", + "keywords": [ + "composer", + "extension installer", + "yii2" + ], + "time": "2016-04-14 08:46:37" + } + ], + "packages-dev": [ + { + "name": "cebe/indent", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/cebe/indent.git", + "reference": "0f33ba3cb567726a726e7024072232839a0d7cd0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/cebe/indent/zipball/0f33ba3cb567726a726e7024072232839a0d7cd0", + "reference": "0f33ba3cb567726a726e7024072232839a0d7cd0", + "shasum": "" + }, + "bin": [ + "indent" + ], + "type": "library", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Carsten Brandt", + "email": "mail@cebe.cc" + } + ], + "description": "a small tool to convert text file indentation", + "time": "2015-11-22 14:46:59" + }, + { + "name": "doctrine/instantiator", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/doctrine/instantiator.git", + "reference": "416fb8ad1d095a87f1d21bc40711843cd122fd4a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/416fb8ad1d095a87f1d21bc40711843cd122fd4a", + "reference": "416fb8ad1d095a87f1d21bc40711843cd122fd4a", + "shasum": "" + }, + "require": { + "php": ">=5.3,<8.0-DEV" + }, + "require-dev": { + "athletic/athletic": "~0.1.8", + "ext-pdo": "*", + "ext-phar": "*", + "phpunit/phpunit": "~4.0", + "squizlabs/php_codesniffer": "~2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com", + "homepage": "http://ocramius.github.com/" + } + ], + "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", + "homepage": "https://github.com/doctrine/instantiator", + "keywords": [ + "constructor", + "instantiate" + ], + "time": "2016-03-31 10:24:22" + }, + { + "name": "phpdocumentor/reflection-docblock", + "version": "2.0.4", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", + "reference": "d68dbdc53dc358a816f00b300704702b2eaff7b8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/d68dbdc53dc358a816f00b300704702b2eaff7b8", + "reference": "d68dbdc53dc358a816f00b300704702b2eaff7b8", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "phpunit/phpunit": "~4.0" + }, + "suggest": { + "dflydev/markdown": "~1.0", + "erusev/parsedown": "~1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-0": { + "phpDocumentor": [ + "src/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "mike.vanriel@naenius.com" + } + ], + "time": "2015-02-03 12:10:50" + }, + { + "name": "phpspec/prophecy", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/phpspec/prophecy.git", + "reference": "b02221e42163be673f9b44a0bc92a8b4907a7c6d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpspec/prophecy/zipball/b02221e42163be673f9b44a0bc92a8b4907a7c6d", + "reference": "b02221e42163be673f9b44a0bc92a8b4907a7c6d", + "shasum": "" + }, + "require": { + "doctrine/instantiator": "^1.0.2", + "php": "^5.3|^7.0", + "phpdocumentor/reflection-docblock": "~2.0", + "sebastian/comparator": "~1.1", + "sebastian/recursion-context": "~1.0" + }, + "require-dev": { + "phpspec/phpspec": "~2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.6.x-dev" + } + }, + "autoload": { + "psr-0": { + "Prophecy\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Konstantin Kudryashov", + "email": "ever.zet@gmail.com", + "homepage": "http://everzet.com" + }, + { + "name": "Marcello Duarte", + "email": "marcello.duarte@gmail.com" + } + ], + "description": "Highly opinionated mocking framework for PHP 5.3+", + "homepage": "https://github.com/phpspec/prophecy", + "keywords": [ + "Double", + "Dummy", + "fake", + "mock", + "spy", + "stub" + ], + "time": "2016-02-21 17:41:21" + }, + { + "name": "phpunit/php-code-coverage", + "version": "2.2.x-dev", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-code-coverage.git", + "reference": "eabf68b476ac7d0f73793aada060f1c1a9bf8979" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/eabf68b476ac7d0f73793aada060f1c1a9bf8979", + "reference": "eabf68b476ac7d0f73793aada060f1c1a9bf8979", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "phpunit/php-file-iterator": "~1.3", + "phpunit/php-text-template": "~1.2", + "phpunit/php-token-stream": "~1.3", + "sebastian/environment": "^1.3.2", + "sebastian/version": "~1.0" + }, + "require-dev": { + "ext-xdebug": ">=2.1.4", + "phpunit/phpunit": "~4" + }, + "suggest": { + "ext-dom": "*", + "ext-xdebug": ">=2.2.1", + "ext-xmlwriter": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sb@sebastian-bergmann.de", + "role": "lead" + } + ], + "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", + "homepage": "https://github.com/sebastianbergmann/php-code-coverage", + "keywords": [ + "coverage", + "testing", + "xunit" + ], + "time": "2015-10-06 15:47:00" + }, + { + "name": "phpunit/php-file-iterator", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-file-iterator.git", + "reference": "6150bf2c35d3fc379e50c7602b75caceaa39dbf0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/6150bf2c35d3fc379e50c7602b75caceaa39dbf0", + "reference": "6150bf2c35d3fc379e50c7602b75caceaa39dbf0", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.4.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sb@sebastian-bergmann.de", + "role": "lead" + } + ], + "description": "FilterIterator implementation that filters files based on a list of suffixes.", + "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", + "keywords": [ + "filesystem", + "iterator" + ], + "time": "2015-06-21 13:08:43" + }, + { + "name": "phpunit/php-text-template", + "version": "1.2.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-text-template.git", + "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686", + "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Simple template engine.", + "homepage": "https://github.com/sebastianbergmann/php-text-template/", + "keywords": [ + "template" + ], + "time": "2015-06-21 13:50:34" + }, + { + "name": "phpunit/php-timer", + "version": "1.0.7", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-timer.git", + "reference": "3e82f4e9fc92665fafd9157568e4dcb01d014e5b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/3e82f4e9fc92665fafd9157568e4dcb01d014e5b", + "reference": "3e82f4e9fc92665fafd9157568e4dcb01d014e5b", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sb@sebastian-bergmann.de", + "role": "lead" + } + ], + "description": "Utility class for timing", + "homepage": "https://github.com/sebastianbergmann/php-timer/", + "keywords": [ + "timer" + ], + "time": "2015-06-21 08:01:12" + }, + { + "name": "phpunit/php-token-stream", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-token-stream.git", + "reference": "cab6c6fefee93d7b7c3a01292a0fe0884ea66644" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/cab6c6fefee93d7b7c3a01292a0fe0884ea66644", + "reference": "cab6c6fefee93d7b7c3a01292a0fe0884ea66644", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "php": ">=5.3.3" + }, + "require-dev": { + "phpunit/phpunit": "~4.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.4-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Wrapper around PHP's tokenizer extension.", + "homepage": "https://github.com/sebastianbergmann/php-token-stream/", + "keywords": [ + "tokenizer" + ], + "time": "2015-09-23 14:46:55" + }, + { + "name": "phpunit/phpunit", + "version": "4.8.x-dev", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit.git", + "reference": "3c4becbce99732549949904c47b76ffe602a7595" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/3c4becbce99732549949904c47b76ffe602a7595", + "reference": "3c4becbce99732549949904c47b76ffe602a7595", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-json": "*", + "ext-pcre": "*", + "ext-reflection": "*", + "ext-spl": "*", + "php": ">=5.3.3", + "phpspec/prophecy": "^1.3.1", + "phpunit/php-code-coverage": "~2.1", + "phpunit/php-file-iterator": "~1.4", + "phpunit/php-text-template": "~1.2", + "phpunit/php-timer": "^1.0.6", + "phpunit/phpunit-mock-objects": "~2.3", + "sebastian/comparator": "~1.1", + "sebastian/diff": "~1.2", + "sebastian/environment": "~1.3", + "sebastian/exporter": "~1.2", + "sebastian/global-state": "~1.0", + "sebastian/version": "~1.0", + "symfony/yaml": "~2.1|~3.0" + }, + "suggest": { + "phpunit/php-invoker": "~1.1" + }, + "bin": [ + "phpunit" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.8.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "The PHP Unit Testing framework.", + "homepage": "https://phpunit.de/", + "keywords": [ + "phpunit", + "testing", + "xunit" + ], + "time": "2016-04-25 09:17:33" + }, + { + "name": "phpunit/phpunit-mock-objects", + "version": "2.3.x-dev", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git", + "reference": "ac8e7a3db35738d56ee9a76e78a4e03d97628983" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/ac8e7a3db35738d56ee9a76e78a4e03d97628983", + "reference": "ac8e7a3db35738d56ee9a76e78a4e03d97628983", + "shasum": "" + }, + "require": { + "doctrine/instantiator": "^1.0.2", + "php": ">=5.3.3", + "phpunit/php-text-template": "~1.2", + "sebastian/exporter": "~1.2" + }, + "require-dev": { + "phpunit/phpunit": "~4.4" + }, + "suggest": { + "ext-soap": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sb@sebastian-bergmann.de", + "role": "lead" + } + ], + "description": "Mock Object library for PHPUnit", + "homepage": "https://github.com/sebastianbergmann/phpunit-mock-objects/", + "keywords": [ + "mock", + "xunit" + ], + "time": "2015-10-02 06:51:40" + }, + { + "name": "sebastian/comparator", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/comparator.git", + "reference": "937efb279bd37a375bcadf584dec0726f84dbf22" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/937efb279bd37a375bcadf584dec0726f84dbf22", + "reference": "937efb279bd37a375bcadf584dec0726f84dbf22", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "sebastian/diff": "~1.2", + "sebastian/exporter": "~1.2" + }, + "require-dev": { + "phpunit/phpunit": "~4.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@2bepublished.at" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides the functionality to compare PHP values for equality", + "homepage": "http://www.github.com/sebastianbergmann/comparator", + "keywords": [ + "comparator", + "compare", + "equality" + ], + "time": "2015-07-26 15:48:44" + }, + { + "name": "sebastian/diff", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/diff.git", + "reference": "13edfd8706462032c2f52b4b862974dd46b71c9e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/13edfd8706462032c2f52b4b862974dd46b71c9e", + "reference": "13edfd8706462032c2f52b4b862974dd46b71c9e", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "phpunit/phpunit": "~4.8" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.4-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Kore Nordmann", + "email": "mail@kore-nordmann.de" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Diff implementation", + "homepage": "https://github.com/sebastianbergmann/diff", + "keywords": [ + "diff" + ], + "time": "2015-12-08 07:14:41" + }, + { + "name": "sebastian/environment", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/environment.git", + "reference": "dc7a29032cf72b54f36dac15a1ca5b3a1b6029bf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/dc7a29032cf72b54f36dac15a1ca5b3a1b6029bf", + "reference": "dc7a29032cf72b54f36dac15a1ca5b3a1b6029bf", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "phpunit/phpunit": "~4.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.3.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides functionality to handle HHVM/PHP environments", + "homepage": "http://www.github.com/sebastianbergmann/environment", + "keywords": [ + "Xdebug", + "environment", + "hhvm" + ], + "time": "2016-02-26 18:40:46" + }, + { + "name": "sebastian/exporter", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/exporter.git", + "reference": "f88f8936517d54ae6d589166810877fb2015d0a2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/f88f8936517d54ae6d589166810877fb2015d0a2", + "reference": "f88f8936517d54ae6d589166810877fb2015d0a2", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "sebastian/recursion-context": "~1.0" + }, + "require-dev": { + "ext-mbstring": "*", + "phpunit/phpunit": "~4.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.3.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@2bepublished.at" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + } + ], + "description": "Provides the functionality to export PHP variables for visualization", + "homepage": "http://www.github.com/sebastianbergmann/exporter", + "keywords": [ + "export", + "exporter" + ], + "time": "2015-08-09 04:23:41" + }, + { + "name": "sebastian/global-state", + "version": "1.1.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/global-state.git", + "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bc37d50fea7d017d3d340f230811c9f1d7280af4", + "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "phpunit/phpunit": "~4.2" + }, + "suggest": { + "ext-uopz": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Snapshotting of global state", + "homepage": "http://www.github.com/sebastianbergmann/global-state", + "keywords": [ + "global state" + ], + "time": "2015-10-12 03:26:01" + }, + { + "name": "sebastian/recursion-context", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/recursion-context.git", + "reference": "7ff5b1b3dcc55b8ab8ae61ef99d4730940856ee7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/7ff5b1b3dcc55b8ab8ae61ef99d4730940856ee7", + "reference": "7ff5b1b3dcc55b8ab8ae61ef99d4730940856ee7", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "phpunit/phpunit": "~4.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + } + ], + "description": "Provides functionality to recursively process PHP variables", + "homepage": "http://www.github.com/sebastianbergmann/recursion-context", + "time": "2016-01-28 05:39:29" + }, + { + "name": "sebastian/version", + "version": "1.0.6", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/version.git", + "reference": "58b3a85e7999757d6ad81c787a1fbf5ff6c628c6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/58b3a85e7999757d6ad81c787a1fbf5ff6c628c6", + "reference": "58b3a85e7999757d6ad81c787a1fbf5ff6c628c6", + "shasum": "" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that helps with managing the version number of Git-hosted PHP projects", + "homepage": "https://github.com/sebastianbergmann/version", + "time": "2015-06-21 13:59:46" + }, + { + "name": "symfony/yaml", + "version": "2.8.x-dev", + "source": { + "type": "git", + "url": "https://github.com/symfony/yaml.git", + "reference": "e4fbcc65f90909c999ac3b4dfa699ee6563a9940" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/yaml/zipball/e4fbcc65f90909c999ac3b4dfa699ee6563a9940", + "reference": "e4fbcc65f90909c999ac3b4dfa699ee6563a9940", + "shasum": "" + }, + "require": { + "php": ">=5.3.9" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.8-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Yaml\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Yaml Component", + "homepage": "https://symfony.com", + "time": "2016-03-29 19:00:15" + } + ], + "aliases": [], + "minimum-stability": "dev", + "stability-flags": { + "bower-asset/jquery": 0 + }, + "prefer-stable": false, + "prefer-lowest": false, + "platform": { + "php": ">=5.4.0", + "ext-mbstring": "*", + "ext-ctype": "*", + "lib-pcre": "*" + }, + "platform-dev": [] +} diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index d4b8dbe..1bb6b16 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -8,7 +8,6 @@ Yii Framework 2 Change Log - Bug #11461: Fixed migration tool error when create migrate with comma in defaultValue (pana1990, s-o-f) - Bug #11912: Fixed PostgreSQL Schema to support negative default values for integer/float/decimal columns (nsknewbie) - Bug #11947: Fixed `gridData` initialization in `yii.gridView.js` (pavlm) -- Enh #11979: Oracle mutex (zlakomanoff) - Bug #11949: Fixed `ActiveField::end` generates close tag when it's `option['tag']` is null (egorio) - Enh #11275: Added possibility of unset or force replace former value in `ArrayHelper::merge()` (mdmunir, rob006) - Enh #11950: Improve BaseArrayHelper::keyExists speed (egorio) @@ -20,7 +19,7 @@ Yii Framework 2 Change Log - Enh #10583: Do not silence session errors in debug mode (samdark) - Enh #12048: Improved message extraction command performance (samdark) - Enh #12038: Introduced `yii\base\ViewNotFoundException` which is thrown when views file doesn't exists, used it in `ViewAction` (samdark) -- Enh #11979: Oracle mutex (zlakomanoff) +- Enh #11979: Added `yii\mutex\OracleMutex` which implements mutex "lock" mechanism via Oracle locks (zlakomanoff) 2.0.9 July 11, 2016 From dc4a4b456c6fbf71efa00975f6dd4abeb669465a Mon Sep 17 00:00:00 2001 From: Dmitriy Makarov Date: Thu, 4 Aug 2016 20:19:04 +0300 Subject: [PATCH 117/163] Test for logger, flush method (#12041) * Added test for logger, flush method - testFlushWithoutDispatcher - testFlushWitDispatcherAndDefaultParam - testFlushWitDispatcherAndDefinedParam * Used 'yii\\log\\Dispatcher' instead of Dispatcher::class as parameter for the getMock method --- tests/framework/log/LoggerTest.php | 52 +++++++++++++++++++++++++++++++++++++- 1 file changed, 51 insertions(+), 1 deletion(-) diff --git a/tests/framework/log/LoggerTest.php b/tests/framework/log/LoggerTest.php index a791f8e..cf7db01 100644 --- a/tests/framework/log/LoggerTest.php +++ b/tests/framework/log/LoggerTest.php @@ -18,9 +18,15 @@ class LoggerTest extends TestCase */ protected $logger; + /** + * @var Dispatcher + */ + protected $dispatcher; + protected function setUp() { $this->logger = new Logger(); + $this->dispatcher = $this->getMock('yii\\log\\Dispatcher', ['dispatch']); } /** @@ -56,7 +62,7 @@ class LoggerTest extends TestCase $this->assertEquals('application', $this->logger->messages[0][2]); $this->assertEquals([ 'file' => __FILE__, - 'line' => 52, + 'line' => 58, 'function' => 'log', 'class' => get_class($this->logger), 'type' => '->' @@ -74,4 +80,48 @@ class LoggerTest extends TestCase $logger->expects($this->exactly(1))->method('flush'); $logger->log('test1', Logger::LEVEL_INFO); } + + /** + * @covers yii\log\Logger::Flush() + */ + public function testFlushWithoutDispatcher() + { + $dispatcher = $this->getMock('\stdClass'); + $dispatcher->expects($this->never())->method($this->anything()); + + $this->logger->messages = ['anything']; + $this->logger->dispatcher = $dispatcher; + $this->logger->flush(); + $this->assertEmpty($this->logger->messages); + } + + /** + * @covers yii\log\Logger::Flush() + */ + public function testFlushWithDispatcherAndDefaultParam() + { + $message = ['anything']; + $this->dispatcher->expects($this->once()) + ->method('dispatch')->with($this->equalTo($message), $this->equalTo(false)); + + $this->logger->messages = $message; + $this->logger->dispatcher = $this->dispatcher; + $this->logger->flush(); + $this->assertEmpty($this->logger->messages); + } + + /** + * @covers yii\log\Logger::Flush() + */ + public function testFlushWithDispatcherAndDefinedParam() + { + $message = ['anything']; + $this->dispatcher->expects($this->once()) + ->method('dispatch')->with($this->equalTo($message), $this->equalTo(true)); + + $this->logger->messages = $message; + $this->logger->dispatcher = $this->dispatcher; + $this->logger->flush(true); + $this->assertEmpty($this->logger->messages); + } } From f6ff90f6721a852b2d65a0cd36d387327e7c66eb Mon Sep 17 00:00:00 2001 From: Newerton Date: Thu, 4 Aug 2016 14:00:59 -0300 Subject: [PATCH 118/163] Fixes #12082: Used `jQuery.on(` instead of event method to ensure forwards compatibility --- framework/CHANGELOG.md | 1 + framework/web/View.php | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index 1bb6b16..79405ce 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -20,6 +20,7 @@ Yii Framework 2 Change Log - Enh #12048: Improved message extraction command performance (samdark) - Enh #12038: Introduced `yii\base\ViewNotFoundException` which is thrown when views file doesn't exists, used it in `ViewAction` (samdark) - Enh #11979: Added `yii\mutex\OracleMutex` which implements mutex "lock" mechanism via Oracle locks (zlakomanoff) +- Enh #12082: Used `jQuery.on(` instead of event method to ensure forwards compatibility (newerton) 2.0.9 July 11, 2016 diff --git a/framework/web/View.php b/framework/web/View.php index 2040e8e..ae8b3cb 100644 --- a/framework/web/View.php +++ b/framework/web/View.php @@ -566,7 +566,7 @@ class View extends \yii\base\View $lines[] = Html::script($js, ['type' => 'text/javascript']); } if (!empty($this->js[self::POS_LOAD])) { - $js = "jQuery(window).load(function () {\n" . implode("\n", $this->js[self::POS_LOAD]) . "\n});"; + $js = "jQuery(window).on('load', function () {\n" . implode("\n", $this->js[self::POS_LOAD]) . "\n});"; $lines[] = Html::script($js, ['type' => 'text/javascript']); } } From cffb3832d19d7101e99a1cf30ec22caa17aadf30 Mon Sep 17 00:00:00 2001 From: Daniel Gomez Pan Date: Sat, 30 Jul 2016 15:23:25 +0200 Subject: [PATCH 119/163] Fixes #12028: Add -h|--help option to console command to display help information --- framework/CHANGELOG.md | 2 +- framework/console/Controller.php | 16 +++++++++++++--- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index 79405ce..796991e 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -21,7 +21,7 @@ Yii Framework 2 Change Log - Enh #12038: Introduced `yii\base\ViewNotFoundException` which is thrown when views file doesn't exists, used it in `ViewAction` (samdark) - Enh #11979: Added `yii\mutex\OracleMutex` which implements mutex "lock" mechanism via Oracle locks (zlakomanoff) - Enh #12082: Used `jQuery.on(` instead of event method to ensure forwards compatibility (newerton) - +- Enh #12028: Add -h|--help option to console command to display help information (pana1990) 2.0.9 July 11, 2016 ------------------- diff --git a/framework/console/Controller.php b/framework/console/Controller.php index d8d6807..3080e2b 100644 --- a/framework/console/Controller.php +++ b/framework/console/Controller.php @@ -51,7 +51,11 @@ class Controller extends \yii\base\Controller * If not set, ANSI color will only be enabled for terminals that support it. */ public $color; - + /** + * @var boolean whether to display help information about current command. + * @since 2.0.10 + */ + public $help; /** * @var array the options passed during execution. */ @@ -116,6 +120,10 @@ class Controller extends \yii\base\Controller } } } + if ($this->help) { + $route = $this->id . '/' . $id; + return Yii::$app->runAction('help', [$route]); + } return parent::runAction($id, $params); } @@ -303,7 +311,7 @@ class Controller extends \yii\base\Controller public function options($actionID) { // $actionId might be used in subclasses to provide options specific to action id - return ['color', 'interactive']; + return ['color', 'interactive', 'help']; } /** @@ -318,7 +326,9 @@ class Controller extends \yii\base\Controller */ public function optionAliases() { - return []; + return [ + 'h' => 'help' + ]; } /** From 496de65ee276c8b9344941145fdd43f27668731b Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Fri, 5 Aug 2016 01:09:55 +0300 Subject: [PATCH 120/163] Fixes #12053: `./yii migrate/create` was generating wrong code when using `bigPrimaryKey` --- framework/CHANGELOG.md | 1 + framework/console/controllers/MigrateController.php | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index 796991e..4187ff0 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -22,6 +22,7 @@ Yii Framework 2 Change Log - Enh #11979: Added `yii\mutex\OracleMutex` which implements mutex "lock" mechanism via Oracle locks (zlakomanoff) - Enh #12082: Used `jQuery.on(` instead of event method to ensure forwards compatibility (newerton) - Enh #12028: Add -h|--help option to console command to display help information (pana1990) +- Bug #12053: `./yii migrate/create` was generating wrong code when using `bigPrimaryKey` (VojtechH, samdark) 2.0.9 July 11, 2016 ------------------- diff --git a/framework/console/controllers/MigrateController.php b/framework/console/controllers/MigrateController.php index 487af24..bcdeb62 100644 --- a/framework/console/controllers/MigrateController.php +++ b/framework/console/controllers/MigrateController.php @@ -375,7 +375,7 @@ class MigrateController extends BaseMigrateController protected function addDefaultPrimaryKey(&$fields) { foreach ($fields as $field) { - if ($field['decorators'] === 'primaryKey()') { + if ($field['decorators'] === 'primaryKey()' || $field['decorators'] === 'bigPrimaryKey()') { return; } } From 8a9c8a89532cbe403458793b92884ea53b58fcf0 Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Fri, 5 Aug 2016 01:33:52 +0300 Subject: [PATCH 121/163] Fixes #11907: Fixed `yii\helpers\Console::getScreenSize()` on Windows was giving out width and height swapped --- framework/CHANGELOG.md | 1 + framework/helpers/BaseConsole.php | 6 +++--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index 4187ff0..f03ffe8 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -23,6 +23,7 @@ Yii Framework 2 Change Log - Enh #12082: Used `jQuery.on(` instead of event method to ensure forwards compatibility (newerton) - Enh #12028: Add -h|--help option to console command to display help information (pana1990) - Bug #12053: `./yii migrate/create` was generating wrong code when using `bigPrimaryKey` (VojtechH, samdark) +- Bug #11907: Fixed `yii\helpers\Console::getScreenSize()` on Windows was giving out width and height swapped (Spell6inder, samdark, cebe) 2.0.9 July 11, 2016 ------------------- diff --git a/framework/helpers/BaseConsole.php b/framework/helpers/BaseConsole.php index b49ad73..6e6f913 100644 --- a/framework/helpers/BaseConsole.php +++ b/framework/helpers/BaseConsole.php @@ -613,14 +613,14 @@ class BaseConsole if (static::isRunningOnWindows()) { $output = []; exec('mode con', $output); - if (isset($output, $output[1]) && strpos($output[1], 'CON') !== false) { - return $size = [(int) preg_replace('~\D~', '', $output[3]), (int) preg_replace('~\D~', '', $output[4])]; + if (isset($output, $output[1]) && preg_match('/con:.*lines:\s+(\d+)\s+columns:\s+(\d+)/mi', implode(' ', $output), $matches)) { + return $size = [(int)$matches[2], (int)$matches[1]]; } } else { // try stty if available $stty = []; if (exec('stty -a 2>&1', $stty) && preg_match('/rows\s+(\d+);\s*columns\s+(\d+);/mi', implode(' ', $stty), $matches)) { - return $size = [$matches[2], $matches[1]]; + return $size = [(int)$matches[2], (int)$matches[1]]; } // fallback to tput, which may not be updated on terminal resize From 01c4dde2026bf106cce2c379bcc5d7f60b79dc5d Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Fri, 5 Aug 2016 02:22:46 +0300 Subject: [PATCH 122/163] Added tests for column schema builder comment() method --- tests/framework/db/ColumnSchemaBuilderTest.php | 7 +++++-- tests/framework/db/cubrid/ColumnSchemaBuilderTest.php | 7 ++++++- tests/framework/db/mssql/ColumnSchemaBuilderTest.php | 4 +++- tests/framework/db/mysql/ColumnSchemaBuilderTest.php | 7 ++++++- tests/framework/db/oci/ColumnSchemaBuilderTest.php | 4 +++- tests/framework/db/pgsql/ColumnSchemaBuilderTest.php | 5 +++-- tests/framework/db/sqlite/ColumnSchemaBuilderTest.php | 8 +++++++- 7 files changed, 33 insertions(+), 9 deletions(-) diff --git a/tests/framework/db/ColumnSchemaBuilderTest.php b/tests/framework/db/ColumnSchemaBuilderTest.php index 807f76f..7341175 100644 --- a/tests/framework/db/ColumnSchemaBuilderTest.php +++ b/tests/framework/db/ColumnSchemaBuilderTest.php @@ -7,7 +7,7 @@ use yii\db\Expression; use yii\db\Schema; use yiiunit\TestCase; -abstract class ColumnSchemaBuilderTest extends TestCase +abstract class ColumnSchemaBuilderTest extends DatabaseTestCase { /** * @param string $type @@ -16,7 +16,7 @@ abstract class ColumnSchemaBuilderTest extends TestCase */ public function getColumnSchemaBuilder($type, $length = null) { - return new ColumnSchemaBuilder($type, $length); + return new ColumnSchemaBuilder($type, $length, $this->getConnection()); } /** @@ -37,6 +37,9 @@ abstract class ColumnSchemaBuilderTest extends TestCase ['timestamp() WITH TIME ZONE DEFAULT NOW()', 'timestamp() WITH TIME ZONE', null, [ ['defaultValue', new Expression('NOW()')] ]], + ['integer(10)', Schema::TYPE_INTEGER, 10, [ + ['comment', 'test'] + ]], ]; } diff --git a/tests/framework/db/cubrid/ColumnSchemaBuilderTest.php b/tests/framework/db/cubrid/ColumnSchemaBuilderTest.php index 734f0d3..d9ba209 100644 --- a/tests/framework/db/cubrid/ColumnSchemaBuilderTest.php +++ b/tests/framework/db/cubrid/ColumnSchemaBuilderTest.php @@ -12,6 +12,8 @@ use yii\db\Schema; */ class ColumnSchemaBuilderTest extends \yiiunit\framework\db\ColumnSchemaBuilderTest { + public $driverName = 'cubrid'; + /** * @param string $type * @param integer $length @@ -19,7 +21,7 @@ class ColumnSchemaBuilderTest extends \yiiunit\framework\db\ColumnSchemaBuilderT */ public function getColumnSchemaBuilder($type, $length = null) { - return new ColumnSchemaBuilder($type, $length); + return new ColumnSchemaBuilder($type, $length, $this->getConnection()); } /** @@ -34,6 +36,9 @@ class ColumnSchemaBuilderTest extends \yiiunit\framework\db\ColumnSchemaBuilderT ['integer(10) UNSIGNED', Schema::TYPE_INTEGER, 10, [ ['unsigned'], ]], + ['integer(10) COMMENT \'test\'', Schema::TYPE_INTEGER, 10, [ + ['comment', 'test'] + ]], ]; } } diff --git a/tests/framework/db/mssql/ColumnSchemaBuilderTest.php b/tests/framework/db/mssql/ColumnSchemaBuilderTest.php index bbec361..b20fbaf 100644 --- a/tests/framework/db/mssql/ColumnSchemaBuilderTest.php +++ b/tests/framework/db/mssql/ColumnSchemaBuilderTest.php @@ -12,6 +12,8 @@ use yii\db\Schema; */ class ColumnSchemaBuilderTest extends \yiiunit\framework\db\ColumnSchemaBuilderTest { + public $driverName = 'sqlsrv'; + /** * @param string $type * @param integer $length @@ -19,6 +21,6 @@ class ColumnSchemaBuilderTest extends \yiiunit\framework\db\ColumnSchemaBuilderT */ public function getColumnSchemaBuilder($type, $length = null) { - return new ColumnSchemaBuilder($type, $length); + return new ColumnSchemaBuilder($type, $length, $this->getConnection()); } } diff --git a/tests/framework/db/mysql/ColumnSchemaBuilderTest.php b/tests/framework/db/mysql/ColumnSchemaBuilderTest.php index 8dcde35..28142d8 100644 --- a/tests/framework/db/mysql/ColumnSchemaBuilderTest.php +++ b/tests/framework/db/mysql/ColumnSchemaBuilderTest.php @@ -12,6 +12,8 @@ use yii\db\Schema; */ class ColumnSchemaBuilderTest extends \yiiunit\framework\db\ColumnSchemaBuilderTest { + protected $driverName = 'mysql'; + /** * @param string $type * @param integer $length @@ -19,7 +21,7 @@ class ColumnSchemaBuilderTest extends \yiiunit\framework\db\ColumnSchemaBuilderT */ public function getColumnSchemaBuilder($type, $length = null) { - return new ColumnSchemaBuilder($type, $length); + return new ColumnSchemaBuilder($type, $length, $this->getConnection()); } /** @@ -34,6 +36,9 @@ class ColumnSchemaBuilderTest extends \yiiunit\framework\db\ColumnSchemaBuilderT ['integer(10) UNSIGNED', Schema::TYPE_INTEGER, 10, [ ['unsigned'], ]], + ['integer(10) COMMENT \'test\'', Schema::TYPE_INTEGER, 10, [ + ['comment', 'test'] + ]], ]; } } diff --git a/tests/framework/db/oci/ColumnSchemaBuilderTest.php b/tests/framework/db/oci/ColumnSchemaBuilderTest.php index f0b6712..7fef471 100644 --- a/tests/framework/db/oci/ColumnSchemaBuilderTest.php +++ b/tests/framework/db/oci/ColumnSchemaBuilderTest.php @@ -12,6 +12,8 @@ use yii\db\Schema; */ class ColumnSchemaBuilderTest extends \yiiunit\framework\db\ColumnSchemaBuilderTest { + public $driverName = 'oci'; + /** * @param string $type * @param integer $length @@ -19,7 +21,7 @@ class ColumnSchemaBuilderTest extends \yiiunit\framework\db\ColumnSchemaBuilderT */ public function getColumnSchemaBuilder($type, $length = null) { - return new ColumnSchemaBuilder($type, $length); + return new ColumnSchemaBuilder($type, $length, $this->getConnection()); } /** diff --git a/tests/framework/db/pgsql/ColumnSchemaBuilderTest.php b/tests/framework/db/pgsql/ColumnSchemaBuilderTest.php index 88b26b4..ea946bc 100644 --- a/tests/framework/db/pgsql/ColumnSchemaBuilderTest.php +++ b/tests/framework/db/pgsql/ColumnSchemaBuilderTest.php @@ -3,7 +3,6 @@ namespace yiiunit\framework\db\pgsql; use yii\db\ColumnSchemaBuilder; -use yii\db\Schema; /** * ColumnSchemaBuilderTest tests ColumnSchemaBuilder for Oracle @@ -12,6 +11,8 @@ use yii\db\Schema; */ class ColumnSchemaBuilderTest extends \yiiunit\framework\db\ColumnSchemaBuilderTest { + public $driverName = 'pgsql'; + /** * @param string $type * @param integer $length @@ -19,6 +20,6 @@ class ColumnSchemaBuilderTest extends \yiiunit\framework\db\ColumnSchemaBuilderT */ public function getColumnSchemaBuilder($type, $length = null) { - return new ColumnSchemaBuilder($type, $length); + return new ColumnSchemaBuilder($type, $length, $this->getConnection()); } } diff --git a/tests/framework/db/sqlite/ColumnSchemaBuilderTest.php b/tests/framework/db/sqlite/ColumnSchemaBuilderTest.php index e029f4c..598c5e5 100644 --- a/tests/framework/db/sqlite/ColumnSchemaBuilderTest.php +++ b/tests/framework/db/sqlite/ColumnSchemaBuilderTest.php @@ -12,6 +12,8 @@ use yii\db\Schema; */ class ColumnSchemaBuilderTest extends \yiiunit\framework\db\ColumnSchemaBuilderTest { + public $driverName = 'sqlite'; + /** * @param string $type * @param integer $length @@ -19,7 +21,7 @@ class ColumnSchemaBuilderTest extends \yiiunit\framework\db\ColumnSchemaBuilderT */ public function getColumnSchemaBuilder($type, $length = null) { - return new ColumnSchemaBuilder($type, $length); + return new ColumnSchemaBuilder($type, $length, $this->getConnection()); } /** @@ -34,6 +36,10 @@ class ColumnSchemaBuilderTest extends \yiiunit\framework\db\ColumnSchemaBuilderT ['integer(10) UNSIGNED', Schema::TYPE_INTEGER, 10, [ ['unsigned'], ]], + // comments are ignored + ['integer(10)', Schema::TYPE_INTEGER, 10, [ + ['comment', 'test'] + ]], ]; } } From 5d09f32b3b661fc49c09131272dd49def46c77bf Mon Sep 17 00:00:00 2001 From: Dmitriy Makarov Date: Fri, 5 Aug 2016 11:34:29 +0300 Subject: [PATCH 123/163] Added logger tests of the following methods: (#12083) - getDbProfiling() - calculateTimings() - getElapsedTime() - getLevelName() - getProfiling() --- tests/framework/log/LoggerTest.php | 268 +++++++++++++++++++++++++++++++++++++ 1 file changed, 268 insertions(+) diff --git a/tests/framework/log/LoggerTest.php b/tests/framework/log/LoggerTest.php index cf7db01..7ecd5d9 100644 --- a/tests/framework/log/LoggerTest.php +++ b/tests/framework/log/LoggerTest.php @@ -124,4 +124,272 @@ class LoggerTest extends TestCase $this->logger->flush(true); $this->assertEmpty($this->logger->messages); } + + /** + * @covers yii\log\Logger::getDbProfiling() + */ + public function testGetDbProfiling() + { + $timings = [ + ['duration' => 5], + ['duration' => 15], + ['duration' => 30], + ]; + + $logger = $this->getMock('yii\\log\\Logger', ['getProfiling']); + $logger->method('getProfiling')->willReturn($timings); + $logger->expects($this->once()) + ->method('getProfiling') + ->with($this->equalTo(['yii\db\Command::query', 'yii\db\Command::execute'])); + $this->assertEquals([3, 50], $logger->getDbProfiling()); + } + + /** + * @covers yii\log\Logger::calculateTimings() + */ + public function testCalculateTimingsWithEmptyMessages() + { + $this->assertEmpty($this->logger->calculateTimings([])); + } + + /** + * @covers yii\log\Logger::calculateTimings() + */ + public function testCalculateTimingsWithProfileNotBeginOrEnd() + { + $messages = [ + ['message0', Logger::LEVEL_ERROR, 'category', 'time', 'trace'], + ['message1', Logger::LEVEL_INFO, 'category', 'time', 'trace'], + ['message2', Logger::LEVEL_PROFILE, 'category', 'time', 'trace'], + ['message3', Logger::LEVEL_TRACE, 'category', 'time', 'trace'], + ['message4', Logger::LEVEL_WARNING, 'category', 'time', 'trace'], + ]; + $this->assertEmpty($this->logger->calculateTimings($messages)); + } + + /** + * @covers yii\log\Logger::calculateTimings() + */ + public function testCalculateTimingsWithProfileBeginEnd() + { + $messages = [ + 'anyKey' => ['token', Logger::LEVEL_PROFILE_BEGIN, 'category', 10, 'trace'], + 'anyKey2' => ['token', Logger::LEVEL_PROFILE_END, 'category', 15, 'trace'], + ]; + $this->assertEquals([ + [ + 'info' => 'token', + 'category' => 'category', + 'timestamp' => 10, + 'trace' => 'trace', + 'level' => 0, + 'duration' => 5, + ] + ], + $this->logger->calculateTimings($messages) + ); + } + + /** + * @covers yii\log\Logger::calculateTimings() + */ + public function testCalculateTimingsWithProfileBeginEndAndNestedLevels() + { + $messages = [ + ['firstLevel', Logger::LEVEL_PROFILE_BEGIN, 'firstLevelCategory', 10, 'firstTrace'], + ['secondLevel', Logger::LEVEL_PROFILE_BEGIN, 'secondLevelCategory', 15, 'secondTrace'], + ['secondLevel', Logger::LEVEL_PROFILE_END, 'secondLevelCategory', 55, 'secondTrace'], + ['firstLevel', Logger::LEVEL_PROFILE_END, 'firstLevelCategory', 80, 'firstTrace'], + ]; + $this->assertEquals([ + [ + 'info' => 'firstLevel', + 'category' => 'firstLevelCategory', + 'timestamp' => 10, + 'trace' => 'firstTrace', + 'level' => 0, + 'duration' => 70, + ], + [ + 'info' => 'secondLevel', + 'category' => 'secondLevelCategory', + 'timestamp' => 15, + 'trace' => 'secondTrace', + 'level' => 1, + 'duration' => 40, + ] + ], + $this->logger->calculateTimings($messages) + ); + } + + /** + * @covers yii\log\Logger::getElapsedTime() + */ + public function testGetElapsedTime() + { + $timeBefore = microtime(true) - YII_BEGIN_TIME; + $actual = $this->logger->getElapsedTime(); + $timeAfter = microtime(true) - YII_BEGIN_TIME; + + $this->assertGreaterThan($timeBefore, $actual); + $this->assertLessThan($timeAfter, $actual); + } + + /** + * @covers yii\log\Logger::getLevelName() + */ + public function testGetLevelName() + { + $this->assertEquals('info', Logger::getLevelName(Logger::LEVEL_INFO)); + $this->assertEquals('error', Logger::getLevelName(Logger::LEVEL_ERROR)); + $this->assertEquals('warning', Logger::getLevelName(Logger::LEVEL_WARNING)); + $this->assertEquals('trace', Logger::getLevelName(Logger::LEVEL_TRACE)); + $this->assertEquals('profile', Logger::getLevelName(Logger::LEVEL_PROFILE)); + $this->assertEquals('profile begin', Logger::getLevelName(Logger::LEVEL_PROFILE_BEGIN)); + $this->assertEquals('profile end', Logger::getLevelName(Logger::LEVEL_PROFILE_END)); + $this->assertEquals('unknown', Logger::getLevelName(0)); + } + + /** + * @covers yii\log\Logger::getProfiling() + */ + public function testGetProfilingWithEmptyCategoriesAndExcludeCategories() + { + $messages = ['anyData']; + $returnValue = 'return value'; + $logger = $this->getMock('yii\\log\\Logger', ['calculateTimings']); + + $logger->messages = $messages; + $logger->method('calculateTimings')->willReturn($returnValue); + $logger->expects($this->once())->method('calculateTimings')->with($this->equalTo($messages)); + $this->assertEquals($returnValue, $logger->getProfiling()); + } + + /** + * @covers yii\log\Logger::getProfiling() + */ + public function testGetProfilingWithNotEmptyCategoriesAndNotMatched() + { + $messages = ['anyData']; + $returnValue = [ + [ + 'info' => 'token', + 'category' => 'category', + 'timestamp' => 10, + 'trace' => 'trace', + 'level' => 0, + 'duration' => 5, + ] + ]; + $logger = $this->getMock('yii\\log\\Logger', ['calculateTimings']); + + $logger->messages = $messages; + $logger->method('calculateTimings')->willReturn($returnValue); + $logger->expects($this->once())->method('calculateTimings')->with($this->equalTo($messages)); + $this->assertEquals([], $logger->getProfiling(['not-matched-category'])); + } + + /** + * @covers yii\log\Logger::getProfiling() + */ + public function testGetProfilingWithNotEmptyCategoriesAndMatched() + { + $messages = ['anyData']; + $matchedByCategoryName = [ + 'info' => 'token', + 'category' => 'category', + 'timestamp' => 10, + 'trace' => 'trace', + 'level' => 0, + 'duration' => 5, + ]; + $secondCategory = [ + 'info' => 'secondToken', + 'category' => 'category2', + 'timestamp' => 10, + 'trace' => 'trace', + 'level' => 0, + 'duration' => 5, + ]; + $returnValue = [ + 'anyKey' => $matchedByCategoryName, + $secondCategory + ]; + /** + * Matched by category name + */ + $logger = $this->getMock('yii\\log\\Logger', ['calculateTimings']); + + $logger->messages = $messages; + $logger->method('calculateTimings')->willReturn($returnValue); + $logger->expects($this->once())->method('calculateTimings')->with($this->equalTo($messages)); + $this->assertEquals([$matchedByCategoryName], $logger->getProfiling(['category'])); + + /** + * Matched by prefix + */ + $logger = $this->getMock('yii\\log\\Logger', ['calculateTimings']); + + $logger->messages = $messages; + $logger->method('calculateTimings')->willReturn($returnValue); + $logger->expects($this->once())->method('calculateTimings')->with($this->equalTo($messages)); + $this->assertEquals([$matchedByCategoryName, $secondCategory], $logger->getProfiling(['category*'])); + } + + /** + * @covers yii\log\Logger::getProfiling() + */ + public function testGetProfilingWithNotEmptyCategoriesMatchedAndExcludeCategories() + { + $messages = ['anyData']; + $fistCategory = [ + 'info' => 'fistToken', + 'category' => 'cat', + 'timestamp' => 10, + 'trace' => 'trace', + 'level' => 0, + 'duration' => 5, + ]; + $secondCategory = [ + 'info' => 'secondToken', + 'category' => 'category2', + 'timestamp' => 10, + 'trace' => 'trace', + 'level' => 0, + 'duration' => 5, + ]; + $returnValue = [ + $fistCategory, + $secondCategory, + [ + 'info' => 'anotherToken', + 'category' => 'category3', + 'timestamp' => 10, + 'trace' => 'trace', + 'level' => 0, + 'duration' => 5, + ] + ]; + + /** + * Exclude by category name + */ + $logger = $this->getMock('yii\\log\\Logger', ['calculateTimings']); + + $logger->messages = $messages; + $logger->method('calculateTimings')->willReturn($returnValue); + $logger->expects($this->once())->method('calculateTimings')->with($this->equalTo($messages)); + $this->assertEquals([$fistCategory, $secondCategory], $logger->getProfiling(['cat*'], ['category3'])); + + /** + * Exclude by category prefix + */ + $logger = $this->getMock('yii\\log\\Logger', ['calculateTimings']); + + $logger->messages = $messages; + $logger->method('calculateTimings')->willReturn($returnValue); + $logger->expects($this->once())->method('calculateTimings')->with($this->equalTo($messages)); + $this->assertEquals([$fistCategory], $logger->getProfiling(['cat*'], ['category*'])); + } } From a53c1f9525b2d706fe95d09f3a71263b1244adee Mon Sep 17 00:00:00 2001 From: Paul Klimov Date: Fri, 5 Aug 2016 13:26:26 +0300 Subject: [PATCH 124/163] Added `yii\behaviors\AttributeTypecastBehavior` (#12067) Added `yii\behaviors\AttributeTypecastBehavior` --- framework/CHANGELOG.md | 1 + framework/behaviors/AttributeTypecastBehavior.php | 338 +++++++++++++++++++++ .../behaviors/AttributeTypecastBehaviorTest.php | 204 +++++++++++++ 3 files changed, 543 insertions(+) create mode 100644 framework/behaviors/AttributeTypecastBehavior.php create mode 100644 tests/framework/behaviors/AttributeTypecastBehaviorTest.php diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index f03ffe8..27423f6 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -17,6 +17,7 @@ Yii Framework 2 Change Log - Bug #12043: Fixed `yii\helpers\Json::encode()` encodes empty array returned by `JsonSerializable::jsonSerialize()` as object (klimov-paul) - Bug #12045: Added missing `LEVEL_PROFILE` to `yii\log\Logger::getLevelName()` map (Mak-Di) - Enh #10583: Do not silence session errors in debug mode (samdark) +- Enh #11804: Added `yii\behaviors\AttributeTypecastBehavior` for maintaining of strict ActiveRecord attribute types (klimov-paul) - Enh #12048: Improved message extraction command performance (samdark) - Enh #12038: Introduced `yii\base\ViewNotFoundException` which is thrown when views file doesn't exists, used it in `ViewAction` (samdark) - Enh #11979: Added `yii\mutex\OracleMutex` which implements mutex "lock" mechanism via Oracle locks (zlakomanoff) diff --git a/framework/behaviors/AttributeTypecastBehavior.php b/framework/behaviors/AttributeTypecastBehavior.php new file mode 100644 index 0000000..a9e1227 --- /dev/null +++ b/framework/behaviors/AttributeTypecastBehavior.php @@ -0,0 +1,338 @@ + [ + * 'class' => AttributeTypecastBehavior::className(), + * 'attributeTypes' => [ + * 'amount' => AttributeTypecastBehavior::TYPE_INTEGER, + * 'price' => AttributeTypecastBehavior::TYPE_FLOAT, + * 'is_active' => AttributeTypecastBehavior::TYPE_BOOLEAN, + * ], + * 'typecastAfterValidate' => true, + * 'typecastBeforeSave' => false, + * 'typecastAfterFind' => false, + * ], + * ]; + * } + * + * // ... + * } + * ``` + * + * Tip: you may left [[attributeTypes]] blank - in this case its value will be detected + * automatically based on owner validation rules. + * Following example will automatically create same [[attributeTypes]] value as it was configured at the above one: + * + * ```php + * use yii\behaviors\AttributeTypecastBehavior; + * + * class Item extends \yii\db\ActiveRecord + * { + * + * public function rules() + * { + * return [ + * ['amount', 'integer'], + * ['price', 'number'], + * ['is_active', 'boolean'], + * ]; + * } + * + * public function behaviors() + * { + * return [ + * 'typecast' => [ + * 'class' => AttributeTypecastBehavior::className(), + * // 'attributeTypes' will be composed automatically according to `rules()` + * ], + * ]; + * } + * + * // ... + * } + * ``` + * + * This behavior allows automatic attribute typecasting at following cases: + * + * - after successful model validation + * - before model save (insert or update) + * - after model find (found by query or refreshed) + * + * You may control automatic typecasting for particular case using fields [[typecastAfterValidate]], + * [[typecastBeforeSave]] and [[typecastAfterFind]]. + * By default typecasting will be performed only after model validation. + * + * Note: you can manually trigger attribute typecasting anytime invoking [[typecastAttributes()]] method: + * + * ```php + * $model = new Item(); + * $model->price = '38.5'; + * $model->is_active = 1; + * $model->typecastAttributes(); + * ``` + * + * @property Model|BaseActiveRecord $owner the owner of this behavior. + * + * @author Paul Klimov + * @since 2.0.10 + */ +class AttributeTypecastBehavior extends Behavior +{ + const TYPE_INTEGER = 'integer'; + const TYPE_FLOAT = 'float'; + const TYPE_BOOLEAN = 'boolean'; + const TYPE_STRING = 'string'; + + /** + * @var array attribute typecast map in format: attributeName => type. + * Type can be set via PHP callable, which accept raw value as an argument and should return + * typecast result. + * For example: + * + * ```php + * [ + * 'amount' => 'integer', + * 'price' => 'float', + * 'is_active' => 'boolean', + * 'date' => function ($value) { + * return ($value instanceof \DateTime) ? $value->getTimestamp(): (int)$value; + * }, + * ] + * ``` + * + * If not set, attribute type map will be composed automatically from the owner validation rules. + */ + public $attributeTypes; + /** + * @var boolean whether to skip typecasting of `null` values. + * If enabled attribute value which equals to `null` will not be type-casted (e.g. `null` remains `null`), + * otherwise it will be converted according to the type configured at [[attributeTypes]]. + */ + public $skipOnNull = true; + /** + * @var boolean whether to perform typecasting after owner model validation. + * Note that typecasting will be performed only if validation was successful, e.g. + * owner model has no errors. + * Note that changing this option value will have no effect after this behavior has been attached to the model. + */ + public $typecastAfterValidate = true; + /** + * @var boolean whether to perform typecasting before saving owner model (insert or update). + * This option may be disabled in order to achieve better performance. + * For example, in case of [[\yii\db\ActiveRecord]] usage, typecasting before save + * will grant no benefit an thus can be disabled. + * Note that changing this option value will have no effect after this behavior has been attached to the model. + */ + public $typecastBeforeSave = false; + /** + * @var boolean whether to perform typecasting after retrieving owner model data from + * the database (after find or refresh). + * This option may be disabled in order to achieve better performance. + * For example, in case of [[\yii\db\ActiveRecord]] usage, typecasting after find + * will grant no benefit in most cases an thus can be disabled. + * Note that changing this option value will have no effect after this behavior has been attached to the model. + */ + public $typecastAfterFind = false; + + /** + * @var array internal static cache for auto detected [[attributeTypes]] values + * in format: ownerClassName => attributeTypes + */ + private static $autoDetectedAttributeTypes = []; + + + /** + * Clears internal static cache of auto detected [[attributeTypes]] values + * over all affected owner classes. + */ + public static function clearAutoDetectedAttributeTypes() + { + self::$autoDetectedAttributeTypes = []; + } + + /** + * @inheritdoc + */ + public function init() + { + parent::init(); + + if ($this->attributeTypes === null) { + $ownerClass = get_class($this->owner); + if (!isset(self::$autoDetectedAttributeTypes[$ownerClass])) { + self::$autoDetectedAttributeTypes[$ownerClass] = $this->detectAttributeTypes(); + } + $this->attributeTypes = self::$autoDetectedAttributeTypes[$ownerClass]; + } + } + + /** + * Typecast owner attributes according to [[attributeTypes]]. + * @param array $attributeNames list of attribute names that should be type-casted. + * If this parameter is empty, it means any attribute listed in the [[attributeTypes]] + * should be type-casted. + */ + public function typecastAttributes($attributeNames = null) + { + $attributeTypes = []; + + if ($attributeNames === null) { + $attributeTypes = $this->attributeTypes; + } else { + foreach ($attributeNames as $attribute) { + if (!isset($this->attributeTypes[$attribute])) { + throw new InvalidParamException("There is no type mapping for '{$attribute}'."); + } + $attributeTypes[$attribute] = $this->attributeTypes[$attribute]; + } + } + + foreach ($attributeTypes as $attribute => $type) { + $this->owner->{$attribute} = $this->typecastValue($this->owner->{$attribute}, $type); + } + } + + /** + * Casts the given value to the specified type. + * @param mixed $value value to be type-casted. + * @param string|callable $type type name or typecast callable. + * @return mixed typecast result. + */ + protected function typecastValue($value, $type) + { + if ($this->skipOnNull && $value === null) { + return $value; + } + + if (is_scalar($type)) { + if (is_object($value) && method_exists($value, '__toString')) { + $value = $value->__toString(); + } + + switch ($type) { + case self::TYPE_INTEGER: + return (int)$value; + case self::TYPE_FLOAT: + return (float)$value; + case self::TYPE_BOOLEAN: + return (boolean)$value; + case self::TYPE_STRING: + return (string)$value; + default: + throw new InvalidParamException("Unsupported type '{$type}'"); + } + } + + return call_user_func($type, $value); + } + + /** + * Composes default value for [[attributeTypes]] from the owner validation rules. + * @return array attribute type map. + */ + protected function detectAttributeTypes() + { + $attributeTypes = []; + foreach ($this->owner->getValidators() as $validator) { + $type = null; + if ($validator instanceof BooleanValidator) { + $type = self::TYPE_BOOLEAN; + } elseif ($validator instanceof NumberValidator) { + $type = $validator->integerOnly ? self::TYPE_INTEGER : self::TYPE_FLOAT; + } elseif ($validator instanceof StringValidator) { + $type = self::TYPE_STRING; + } + + if ($type !== null) { + foreach ((array)$validator->attributes as $attribute) { + $attributeTypes[$attribute] = $type; + } + } + } + return $attributeTypes; + } + + /** + * @inheritdoc + */ + public function events() + { + $events = []; + + if ($this->typecastAfterValidate) { + $events[Model::EVENT_AFTER_VALIDATE] = 'afterValidate'; + } + if ($this->typecastBeforeSave) { + $events[BaseActiveRecord::EVENT_BEFORE_INSERT] = 'beforeSave'; + $events[BaseActiveRecord::EVENT_BEFORE_UPDATE] = 'beforeSave'; + } + if ($this->typecastAfterFind) { + $events[BaseActiveRecord::EVENT_AFTER_FIND] = 'afterFind'; + } + + return $events; + } + + /** + * Handles owner 'afterValidate' event, ensuring attribute typecasting. + * @param \yii\base\Event $event event instance. + */ + public function afterValidate($event) + { + if (!$this->owner->hasErrors()) { + $this->typecastAttributes(); + } + } + + /** + * Handles owner 'afterInsert' and 'afterUpdate' events, ensuring attribute typecasting. + * @param \yii\base\Event $event event instance. + */ + public function beforeSave($event) + { + $this->typecastAttributes(); + } + + /** + * Handles owner 'afterFind' event, ensuring attribute typecasting. + * @param \yii\base\Event $event event instance. + */ + public function afterFind($event) + { + $this->typecastAttributes(); + } +} \ No newline at end of file diff --git a/tests/framework/behaviors/AttributeTypecastBehaviorTest.php b/tests/framework/behaviors/AttributeTypecastBehaviorTest.php new file mode 100644 index 0000000..b372bc0 --- /dev/null +++ b/tests/framework/behaviors/AttributeTypecastBehaviorTest.php @@ -0,0 +1,204 @@ +mockApplication([ + 'components' => [ + 'db' => [ + 'class' => '\yii\db\Connection', + 'dsn' => 'sqlite::memory:', + ] + ] + ]); + + $columns = [ + 'id' => 'pk', + 'name' => 'string', + 'amount' => 'integer', + 'price' => 'float', + 'isActive' => 'boolean', + 'callback' => 'string', + ]; + Yii::$app->getDb()->createCommand()->createTable('test_attribute_typecast', $columns)->execute(); + } + + protected function tearDown() + { + parent::tearDown(); + AttributeTypecastBehavior::clearAutoDetectedAttributeTypes(); + } + + // Tests : + + public function testTypecast() + { + $model = new ActiveRecordAttributeTypecast(); + + $model->name = 123; + $model->amount = '58'; + $model->price = '100.8'; + $model->isActive = 1; + $model->callback = 'foo'; + + $model->getAttributeTypecastBehavior()->typecastAttributes(); + + $this->assertSame('123', $model->name); + $this->assertSame(58, $model->amount); + $this->assertSame(100.8, $model->price); + $this->assertSame(true, $model->isActive); + $this->assertSame('callback: foo', $model->callback); + } + + /** + * @depends testTypecast + */ + public function testSkipNull() + { + $model = new ActiveRecordAttributeTypecast(); + $model->getAttributeTypecastBehavior()->skipOnNull = true; + + $model->name = null; + $model->amount = null; + $model->price = null; + $model->isActive = null; + $model->callback = null; + + $model->getAttributeTypecastBehavior()->typecastAttributes(); + + $this->assertNull($model->name); + $this->assertNull($model->amount); + $this->assertNull($model->price); + $this->assertNull($model->isActive); + $this->assertNull($model->callback); + + $model->getAttributeTypecastBehavior()->skipOnNull = false; + $model->getAttributeTypecastBehavior()->typecastAttributes(); + + $this->assertSame('', $model->name); + $this->assertSame(0, $model->amount); + $this->assertSame(0.0, $model->price); + $this->assertSame(false, $model->isActive); + $this->assertSame('callback: ', $model->callback); + } + + /** + * @depends testTypecast + */ + public function testEvents() + { + $model = new ActiveRecordAttributeTypecast(); + + $model->callback = 'validate'; + $model->validate(); + $this->assertSame('callback: validate', $model->callback); + + $model->callback = 'insert'; + $model->save(false); + $this->assertSame('callback: insert', $model->callback); + + $model->callback = 'update'; + $model->save(false); + $this->assertSame('callback: update', $model->callback); + + $model->updateAll(['callback' => 'find']); + $model->refresh(); + $this->assertSame('callback: find', $model->callback); + } + + public function testAutoDetectAttributeTypes() + { + $model = new ActiveRecordAttributeTypecast(); + + $model->getAttributeTypecastBehavior()->attributeTypes = null; + $model->getAttributeTypecastBehavior()->init(); + + $expectedAttributeTypes = [ + 'name' => AttributeTypecastBehavior::TYPE_STRING, + 'amount' => AttributeTypecastBehavior::TYPE_INTEGER, + 'price' => AttributeTypecastBehavior::TYPE_FLOAT, + 'isActive' => AttributeTypecastBehavior::TYPE_BOOLEAN, + ]; + $this->assertEquals($expectedAttributeTypes, $model->getAttributeTypecastBehavior()->attributeTypes); + } +} + +/** + * Test Active Record class with [[AttributeTypecastBehavior]] behavior attached. + * + * @property integer $id + * @property string $name + * @property integer $amount + * @property float $price + * @property boolean $isActive + * @property string $callback + * + * @property AttributeTypecastBehavior $attributeTypecastBehavior + */ +class ActiveRecordAttributeTypecast extends ActiveRecord +{ + public function behaviors() + { + return [ + 'attributeTypecast' => [ + 'class' => AttributeTypecastBehavior::className(), + 'attributeTypes' => [ + 'name' => AttributeTypecastBehavior::TYPE_STRING, + 'amount' => AttributeTypecastBehavior::TYPE_INTEGER, + 'price' => AttributeTypecastBehavior::TYPE_FLOAT, + 'isActive' => AttributeTypecastBehavior::TYPE_BOOLEAN, + 'callback' => function ($value) { + return 'callback: ' . $value; + }, + ], + 'typecastAfterValidate' => true, + 'typecastBeforeSave' => true, + 'typecastAfterFind' => true, + ], + ]; + } + + public static function tableName() + { + return 'test_attribute_typecast'; + } + + public function rules() + { + return [ + ['name', 'string'], + ['amount', 'integer'], + ['price', 'number'], + ['isActive', 'boolean'], + ]; + } + + /** + * @return AttributeTypecastBehavior + */ + public function getAttributeTypecastBehavior() + { + return $this->getBehavior('attributeTypecast'); + } +} \ No newline at end of file From 3fcc26996b9395d2892839b5bc8071c99a6cab07 Mon Sep 17 00:00:00 2001 From: SilverFire - Dmitry Naumenko Date: Fri, 5 Aug 2016 15:08:51 +0300 Subject: [PATCH 125/163] Fixed #11973: `yii\helpers\BaseHtml::getAttributeValue()` fixed to work with `items[]` notation correctly --- framework/CHANGELOG.md | 1 + framework/helpers/BaseHtml.php | 2 +- tests/framework/helpers/HtmlTest.php | 16 ++++++++++++++++ 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index 566e1cb..ec8369e 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -26,6 +26,7 @@ Yii Framework 2 Change Log - Enh #12028: Add -h|--help option to console command to display help information (pana1990) - Bug #12053: `./yii migrate/create` was generating wrong code when using `bigPrimaryKey` (VojtechH, samdark) - Bug #11907: Fixed `yii\helpers\Console::getScreenSize()` on Windows was giving out width and height swapped (Spell6inder, samdark, cebe) +- Bug #11973: Fixed `yii\helpers\BaseHtml::getAttributeValue()` to work with `items[]` notation correctly (silverfire) 2.0.9 July 11, 2016 ------------------- diff --git a/framework/helpers/BaseHtml.php b/framework/helpers/BaseHtml.php index 553aee8..d5e5fd6 100644 --- a/framework/helpers/BaseHtml.php +++ b/framework/helpers/BaseHtml.php @@ -2031,7 +2031,7 @@ class BaseHtml } $attribute = $matches[2]; $value = $model->$attribute; - if ($matches[3] !== '') { + if ($matches[3] !== '' && $matches[3] !== '[]') { foreach (explode('][', trim($matches[3], '[]')) as $id) { if ((is_array($value) || $value instanceof \ArrayAccess) && isset($value[$id])) { $value = $value[$id]; diff --git a/tests/framework/helpers/HtmlTest.php b/tests/framework/helpers/HtmlTest.php index edf6a53..3f332cb 100644 --- a/tests/framework/helpers/HtmlTest.php +++ b/tests/framework/helpers/HtmlTest.php @@ -949,11 +949,27 @@ EOD; $noCsrfForm = Html::beginForm('/index.php', 'post', ['csrf' => false, 'id' => 'myform']); $this->assertEquals('
', $noCsrfForm); } + + public function testGetAttributeValue() + { + $model = new HtmlTestModel(); + $model->types = ['type1', 'type2', ['sub-array', 'sub-array2']]; + + $this->assertEquals($model->types, Html::getAttributeValue($model, 'types')); + $this->assertEquals($model->types, Html::getAttributeValue($model, 'types[]')); + $this->assertEquals('type1', Html::getAttributeValue($model, 'types[0]')); + $this->assertEquals('type2', Html::getAttributeValue($model, 'types[1]')); + $this->assertEquals('type2', Html::getAttributeValue($model, 'types[1][]')); + $this->assertEquals(['sub-array', 'sub-array2'], Html::getAttributeValue($model, 'types[2][]')); + $this->assertEquals('sub-array2', Html::getAttributeValue($model, 'types[2][1]')); + $this->assertEquals(null, Html::getAttributeValue($model, 'types[3]')); + } } class HtmlTestModel extends Model { public $name; + public $types; public $description; public function rules() From c9f500b3ed198812fc75d6278640481bdac0b751 Mon Sep 17 00:00:00 2001 From: SilverFire - Dmitry Naumenko Date: Fri, 5 Aug 2016 17:33:52 +0300 Subject: [PATCH 126/163] Updated CHANGELOG --- framework/CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index ec8369e..4250e05 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -17,6 +17,7 @@ Yii Framework 2 Change Log - Bug #12043: Fixed `yii\helpers\Json::encode()` encodes empty array returned by `JsonSerializable::jsonSerialize()` as object (klimov-paul) - Bug #12045: Added missing `LEVEL_PROFILE` to `yii\log\Logger::getLevelName()` map (Mak-Di) - Bug #10681: Reverted fix of beforeValidate event calling in `yii.activeForm.js` (silverfire) +- Bug #11715: Fixed JS validation when the same model's attribute file input is listed more than once on the same page (uaoleg) - Enh #10583: Do not silence session errors in debug mode (samdark) - Enh #11804: Added `yii\behaviors\AttributeTypecastBehavior` for maintaining of strict ActiveRecord attribute types (klimov-paul) - Enh #12048: Improved message extraction command performance (samdark) From 401cd62a4b19f10cbd615b872358e6b2e1147523 Mon Sep 17 00:00:00 2001 From: Nikola Kovacs Date: Fri, 5 Aug 2016 22:14:59 +0200 Subject: [PATCH 127/163] Fix link in rest-response-formatting.md (#12088) --- docs/guide/rest-response-formatting.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/guide/rest-response-formatting.md b/docs/guide/rest-response-formatting.md index 996cff1..5daa707 100644 --- a/docs/guide/rest-response-formatting.md +++ b/docs/guide/rest-response-formatting.md @@ -85,7 +85,7 @@ response format names which must be supported in [[yii\web\Response::formatters] ## Data Serializing As we have described above, [[yii\rest\Serializer]] is the central piece responsible for converting resource -objects or collections into arrays. It recognizes objects implementing [[yii\base\ArrayableInterface]] as +objects or collections into arrays. It recognizes objects implementing [[yii\base\Arrayable]] as well as [[yii\data\DataProviderInterface]]. The former is mainly implemented by resource objects, while the latter resource collections. From 6268b121573828f7a23bfd04978a498afa59db92 Mon Sep 17 00:00:00 2001 From: Nikola Kovacs Date: Fri, 5 Aug 2016 22:15:42 +0200 Subject: [PATCH 128/163] fix grammar in rest-controllers.md (#12087) --- docs/guide/rest-controllers.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/guide/rest-controllers.md b/docs/guide/rest-controllers.md index 48af81f..5c082b0 100644 --- a/docs/guide/rest-controllers.md +++ b/docs/guide/rest-controllers.md @@ -82,7 +82,7 @@ than adding other filters described above, because the CORS filter has to be app and thus needs a slightly different approach compared to other filters. Also authentication has to be disabled for the [CORS Preflight requests](https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS#Preflighted_requests) so that a browser can safely determine whether a request can be made beforehand without the need for sending -authentication credentials. The follow code shows the code that is needed to add the [[yii\filters\Cors]] filter +authentication credentials. The following shows the code that is needed to add the [[yii\filters\Cors]] filter to an existing controller that extends from [[yii\rest\ActiveController]]: ```php From 08a15925607bbec8fcf142f3ccbaab93d51e08d5 Mon Sep 17 00:00:00 2001 From: Nikola Kovacs Date: Fri, 5 Aug 2016 22:30:05 +0200 Subject: [PATCH 129/163] grammar and style fixes in rest-quick-start (#12086) --- docs/guide/rest-quick-start.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/guide/rest-quick-start.md b/docs/guide/rest-quick-start.md index 04af251..0c130be 100644 --- a/docs/guide/rest-quick-start.md +++ b/docs/guide/rest-quick-start.md @@ -24,7 +24,7 @@ and you have already created the [active record](db-active-record.md) class `app ## Creating a Controller -First, create a [controller](structure-controllers.md) class `app\controllers\UserController` as follows, +First, create a [controller](structure-controllers.md) class `app\controllers\UserController` as follows: ```php namespace app\controllers; @@ -44,7 +44,7 @@ as `app\models\User`, the controller knows which model can be used for fetching ## Configuring URL Rules -Then, modify the configuration about the `urlManager` component in your application configuration: +Then, modify the configuration of the `urlManager` component in your application configuration: ```php 'urlManager' => [ @@ -94,7 +94,7 @@ for accessing the user data. The APIs you have created include: * `OPTIONS /users/123`: show the supported verbs regarding endpoint `/users/123`. > Info: Yii will automatically pluralize controller names for use in endpoints. -> You can configure this using the [[yii\rest\UrlRule::$pluralize]]-property. +> You can configure this using the [[yii\rest\UrlRule::$pluralize]] property. You may access your APIs with the `curl` command like the following, @@ -175,7 +175,7 @@ Content-Type: application/json; charset=UTF-8 > Tip: You may also access your APIs via Web browser by entering the URL `http://localhost/users`. However, you may need some browser plugins to send specific request headers. -As you can see, in the response headers, there are information about the total count, page count, etc. +As you can see, in the response headers, there is information about the total count, page count, etc. There are also links that allow you to navigate to other pages of data. For example, `http://localhost/users?page=2` would give you the next page of the user data. From 7b66a0f52a9eddc4166d6c81879b12f9bc6aab3b Mon Sep 17 00:00:00 2001 From: jaaf Date: Mon, 8 Aug 2016 10:34:49 +0200 Subject: [PATCH 130/163] Documentation translation 3 files corrected, 1 file added (#12094) * Corrections dans concept-aliases.md version fr * Some correction in intro-upgrade-from.md French version * some corrections in start-databases.md French version * added translation of structure-applications.md French version * adding source change in translation of concept-alias.md * adding source change in translation of intro-upgrade-from-v1.md --- docs/guide-fr/concept-aliases.md | 30 +- docs/guide-fr/intro-upgrade-from-v1.md | 147 +++++---- docs/guide-fr/start-databases.md | 40 +-- docs/guide-fr/structure-applications.md | 517 +++++++++++++++++++++++++++++++ docs/guide-fr/structure-entry-scripts.md | 34 +- docs/guide-fr/structure-overview.md | 8 +- 6 files changed, 661 insertions(+), 115 deletions(-) create mode 100644 docs/guide-fr/structure-applications.md diff --git a/docs/guide-fr/concept-aliases.md b/docs/guide-fr/concept-aliases.md index fc20fdd..092c125 100644 --- a/docs/guide-fr/concept-aliases.md +++ b/docs/guide-fr/concept-aliases.md @@ -1,6 +1,7 @@ Les Alias ========= -Les alias sont utilisés pour représenter des chemins de fichier ou des URLs de sorte que vous n'ayez pas à spécifier des chemins ou des URLs explicitement dans votre projet. Un alias doit commencer par le caractère `@` de façon à le différencier des chemins de fichiers habituels et des URLs. Yii dispose déjà d'un nombre important d'alias prédéfinis. Par exemple, l'alias `@yii` représéente le chemin d'installation du framework Yii; `@web` représente l'URL de base pour l'application web courante. +Les alias sont utilisés pour représenter des chemins de fichier ou des URLs de sorte que vous n'ayez pas à spécifier des chemins ou des URLs explicitement dans votre projet. Un alias doit commencer par le caractère `@` de façon à le différencier des chemins de fichiers habituels et des URLs. Les alias définis sans le caractère de tête `@` seront préfixés avec ce caractère `@`. +Yii dispose déjà d'un nombre important d'alias prédéfinis. Par exemple, l'alias `@yii` représente le chemin d'installation du *framework* Yii; `@web` représente l'URL de base pour l'application web courante. @@ -18,15 +19,15 @@ Yii::setAlias('@bar', 'http://www.example.com'); ``` > Note: le chemin de fichier ou l'URL cible de l'alias *ne* doit *pas* nécessairement référencer un fichier ou une ressource existante. -Etant donné un alias défini, il est possible de faire dériver un nouvel alias (sans appeler la commande [[Yii::setAlias()]]) en ajoutant une barre oblique `/` suivi d'un ou de plusieurs segments de chemin de fichier. Les alias définis via la commande [[Yii::setAlias()]] sont des *alias racines*, les alias qui en dérivent sont des *alias dérivés*. Par example, `@foo` est un alias racine, tandis que `@foo/bar/file.php` est un alias dérivé. +Étant donné un alias défini, il est possible de faire dériver un nouvel alias (sans appeler la commande [[Yii::setAlias()]]) en ajoutant une barre oblique `/` suivi d'un ou de plusieurs segments de chemin de fichier. Les alias définis via la commande [[Yii::setAlias()]] sont des *alias racines*, les alias qui en dérivent sont des *alias dérivés*. Par exemple, `@foo` est un alias racine, tandis que `@foo/bar/file.php` est un alias dérivé. -Il est possible de définir une alias en utilisant un autre alias (qu'il soit racine ou dérivé): +Il est possible de définir un alias en utilisant un autre alias (qu'il soit racine ou dérivé): ```php Yii::setAlias('@foobar', '@foo/bar'); ``` -Les alias racines sont habituellement définit pendant l'étape d'[amorçage](runtime-bootstrapping.md). Vous pouvez par exemple appeler la commande [[Yii::setAlias()]] dans le [script d'entrée](structure-entry-scripts.md). Pour plus de commodité, [Application](structure-applications.md) propose une propriété modifiable appelée `aliases` que vous pouvez définir dans la [configuration](concept-configurations.md) de l'application: +Les alias racines sont habituellement définis pendant l'étape d'[amorçage](runtime-bootstrapping.md). Vous pouvez par exemple appeler la commande [[Yii::setAlias()]] dans le [script d'entrée](structure-entry-scripts.md). Pour plus de commodité, l'objet [Application](structure-applications.md) propose une propriété modifiable appelée `aliases` que vous pouvez définir dans la [configuration](concept-configurations.md) de l'application: ```php return [ @@ -49,10 +50,10 @@ echo Yii::getAlias('@bar'); // displays: http://www.example.com echo Yii::getAlias('@foo/bar/file.php'); // displays: /path/to/foo/bar/file.php ``` -Le chemin/URL représenté par un alias dérivé est déterminé en renplaçant la partie alias racine avec son chemain/URL correspondant dans l'alias dérivé. -> Note: La méthode [[Yii::getAlias()]] ne vérifie pas si le chemin/URL obtenu représente un fichier ou une ressource existante. +Le chemin/URL représenté par un alias dérivé est déterminé en remplaçant la partie alias racine avec son chemin/URL correspondant dans l'alias dérivé. +> Note: la méthode [[Yii::getAlias()]] ne vérifie pas si le chemin/URL obtenu représente un fichier ou une ressource existante. -Un alias racine peut également conctenir des barres obliques `/`. La méthode [[Yii::getAlias()]] est suffisement intelligeante pour déterminer quelle part de l'alias est un alias racine et donc détermine correctement le chemin de fichier ou l'url correspondant: +Un alias racine peut également contenir des barres obliques `/`. La méthode [[Yii::getAlias()]] est suffisamment intelligente pour déterminer quelle partie de l'alias est un alias racine et donc déterminer correctement le chemin de fichier ou l'url correspondant: ```php Yii::setAlias('@foo', '/chemin/vers/foo'); @@ -61,7 +62,7 @@ Yii::getAlias('@foo/test/file.php'); // affiche /chemin/vers/foo/test/file.php Yii::getAlias('@foo/bar/file.php'); // affiche /chemin2/bar/file.php ``` -Si `@foo/bar` n'est pas défini comme un alias racine, le dernier exemple affichierait `/chemin/vers/foo/bar/file.php`. +Si `@foo/bar` n'était pas défini comme un alias racine, le dernier exemple afficherait `/chemin/vers/foo/bar/file.php`. Utilisation des alias @@ -76,7 +77,7 @@ $cache = new FileCache([ 'cachePath' => '@runtime/cache', ]); ``` -Merci de porter attention à la documentation de l'API pour vérifier si une propriété ou un paramètre d'une méthode supporte les alias. +Reportez-vous à la documentation de l'API pour vérifier si une propriété ou un paramètre d'une méthode accepte les alias. Alias prédéfinis @@ -86,21 +87,20 @@ Yii définit une série d'alias pour faciliter le référencement des chemins de - `@yii`, le répertoire où se situe le fichier `BaseYii.php` (aussi appelé le répertoire framework). - `@app`, le [[yii\base\Application::basePath|chemin de base]] de l'application courante. - `@runtime`, le [[yii\base\Application::runtimePath|le chemin d'exécution]] de l'application courante. Valeur par défaut: `@app/runtime`. -- `@webroot`, La répertoire web racine de l'application web courante. It is determined based on the directory - containing the [entry script](structure-entry-scripts.md). +- `@webroot`, La répertoire web racine de l'application web courante. Il est déterminé en se basant sur le répertoire contenant le [script d'entrée](structure-entry-scripts.md). - `@web`, l'url de base de l'application courante. Cet alias a la même valeur que la propriété [[yii\web\Request::baseUrl]]. - `@vendor`, le [[yii\base\Application::vendorPath|Le répertoire vendor de Composer]]. Valeur par défaut: `@app/vendor`. - `@bower`, le répertoire racine qui contient [les paquets bower](http://bower.io/). Valeur par défaut: `@vendor/bower`. - `@npm`, le répertoire racine qui contient [les paquets npm](https://www.npmjs.org/). Valeur par défaut: `@vendor/npm`. -L'alias `@yii` est défini quand le fichier `Yii.php`est inclu dans votre [script d'entrée](structure-entry-scripts.md). Le reste des alias sont définit dans le constructeur de l'application au moment ou la [configuration](concept-configurations.md) de cette dernière est appliquée +L'alias `@yii` est défini quand le fichier `Yii.php`est inclus dans votre [script d'entrée](structure-entry-scripts.md). Le reste des alias est défini dans le constructeur de l'application au moment ou la [configuration](concept-configurations.md) de cette dernière est appliquée. Alias d'extension ----------------- -Un alias est automatiquement définit pour chaque [extension](structure-extensions.md) installée via Composer. -Chacun de ces alias est nommé par l'espace de nom (namespace) racine de l'extension tel que déclaré dans son fichier `composer.json`, et chacun pointe sur le répertoire racine du paquet. Par exemple, si vous installez l'extension `yiisoft/yii2-jui`, vous obtiendrez automatiquement un alias `@yii/jui` défini pendant la [phase d'amorçage](runtime-bootstrapping.md), équivalent à +Un alias est automatiquement défini pour chaque [extension](structure-extensions.md) installée via Composer. +Chacun de ces alias est nommé par l'espace de noms (namespace) racine de l'extension tel que déclaré dans son fichier `composer.json`, et chacun pointe sur le répertoire racine du paquet. Par exemple, si vous installez l'extension `yiisoft/yii2-jui`, vous obtenez automatiquement un alias `@yii/jui` défini pendant la [phase d'amorçage](runtime-bootstrapping.md), équivalent à ```php Yii::setAlias('@yii/jui', 'VendorPath/yiisoft/yii2-jui'); -``` \ No newline at end of file +``` diff --git a/docs/guide-fr/intro-upgrade-from-v1.md b/docs/guide-fr/intro-upgrade-from-v1.md index e77e66a..7c555eb 100644 --- a/docs/guide-fr/intro-upgrade-from-v1.md +++ b/docs/guide-fr/intro-upgrade-from-v1.md @@ -5,7 +5,7 @@ Il y a beaucoup de différences entre les versions 1.1 et 2.0 de Yii, le framewo la 2.0. En conséquence, la mise à jour depuis la version 1.1 n'est pas aussi triviale que la mise à jour entre deux versions mineures. Dans ce guide, vous trouverez les principales différences entre les deux versions. -Si vous n'avez pas utilisé Yii 1.1 avant, vous pouvez ignorer cette section et passer directement à la partie +Si vous n'avez pas utilisé Yii 1.1 avant, vous pouvez ignorer cette section et passer directement à la section "[Mise en route] (start-installation.md)". Merci de noter que Yii 2.0 introduit plus de nouvelles fonctionnalités que celles abordées ici. Il est fortement @@ -17,10 +17,10 @@ Installation ------------ Yii 2.0 exploite pleinement [Composer] (https://getcomposer.org/), le gestionnaire de paquet PHP. L'installation -du framework, ainsi que des extensions, sont gérées par Composer. Merci de lire la partie +du framework, ainsi que des extensions, sont gérées par Composer. Reportez-vous à la section [Installer Yii](start-installation.md) pour apprendre comment installer Yii 2.0. Si vous voulez -créer de nouvelles extensions, ou rendre vos extensions existantes 1.1 compatibles 2.0, merci de lire -la partie [Créer des extensions](extend-creating-extensions.md) de ce guide. +créer de nouvelles extensions, ou rendre vos extensions existantes 1.1 compatibles 2.0, reportez-vous à +la section [Créer des extensions](extend-creating-extensions.md) de ce guide. Pré-requis PHP @@ -28,7 +28,7 @@ Pré-requis PHP Yii 2.0 requiert PHP 5.4 ou plus, ce qui est une grosse amélioration par rapport à PHP 5.2 qui était requis pour Yii 1.1. -Par conséquent, il y a beaucoup de différences au niveau du langage pour lesquelles vous devriez prêter attention. +Par conséquent, il y a beaucoup de différences au niveau du langage auxquelles vous devriez prêter attention. Voici un résumé des principaux changements concernant PHP: - [Espaces de noms](http://php.net/manual/fr/language.namespaces.php). @@ -43,7 +43,7 @@ Voici un résumé des principaux changements concernant PHP: d'internationalisation. -Espaces de Noms +Espaces de noms --------------- Le changement le plus évident dans Yii 2.0 est l'utilisation des espaces de noms. La majorité des classes du noyau @@ -61,27 +61,27 @@ Composants et objets Yii 2.0 décompose la classe `CComponent` 1.1 en deux classes: [[yii\base\Object]] et [[yii\base\Component]]. Le classe [[yii\base\Object|Object]] est une classe de base légère qui permet de définir les [Propriétés de l'objet](concept-properties.md) via des accesseurs. La classe [[yii\base\Component|Component]] est une -sous classe de [[yii\base\Object|Object]] et supporte les [Evénements] (concept events.md) et les +sous classe de [[yii\base\Object|Object]] et prend en charge les [Evénements] (concept events.md) et les [Comportements](concept-behaviors.md). Si votre classe n'a pas besoin des événements et des comportements, vous devriez envisager d'utiliser [[yii\base\Object|Object]] comme classe de base. C'est généralement le cas pour les classes qui représentent -une structures de données basique. +une structure de données basique. -Configuration d'Objet +Configuration d'objets --------------------- -La classe [[yii\base\Object|Object]] introduit une manière uniforme pour configurer les objets. Toute sous classe +La classe [[yii\base\Object|Object]] introduit une manière uniforme de configurer les objets. Toute sous-classe de [[yii\base\Object|Object]] doit déclarer son constructeur (si besoin) de la manière suivante afin qu'elle -puisse être configurée correctement: +puisse être configurée correctement : ```php class MyClass extends \yii\base\Object { public function __construct($param1, $param2, $config = []) { - // ... initialisation avant que la configuration soit appliquée + // ... initialisation avant que la configuration ne soit appliquée parent::__construct($config); } @@ -90,7 +90,7 @@ class MyClass extends \yii\base\Object { parent::init(); - // ... initialisation après que la configuration soit appliquée + // ... initialisation après que la configuration est appliquée } } ``` @@ -98,7 +98,7 @@ class MyClass extends \yii\base\Object Dans ce qui précède, le dernier paramètre du constructeur doit être un tableau de configuration qui contient des entrées nom-valeur pour initialiser les propriétés à la fin du constructeur. Vous pouvez remplacer la méthode [[yii\base\Object::init()|init()]] pour le travail d'initialisation qui doit être fait -après que la configuration ait été appliquée. +après que la configuration a été appliquée. En suivant cette convention, vous serez en mesure de créer et de configurer de nouveaux objets en utilisant un tableau de configuration : @@ -111,11 +111,11 @@ $object = Yii::createObject([ ], [$param1, $param2]); ``` -Plus de détails sur les configurations peuvent être trouvés dans la partie -[Configurations d'objet](concept-configurations.md). +Plus de détails sur les configurations peuvent être trouvés dans la section +[Configurations](concept-configurations.md). -Evénements +Événements ---------- Avec Yii 1, les événements étaient créés par la définition d'une méthode `on` (par exemple `onBeforeSave`). Avec Yii 2, @@ -134,7 +134,7 @@ $component->on($eventName, $handler); // Pour détacher le gestionnaire, utilisez : // $component->off($eventName, $handler); ``` -Il y a de nombreuses améliorations dans la gestion des événements. Pour plus de détails, merci de lire la partie [Evénements](concept-events.md). +Il y a de nombreuses améliorations dans la gestion des événements. Pour plus de détails, reportez-vous à la section [Evénements](concept-events.md). Alias @@ -146,14 +146,14 @@ Par exemple, l'alias `@yii` fait référence au répertoire d'installation de Yi supportés dans la plupart du code de Yii. Par exemple, [[yii\caching\FileCache::cachePath]] peut prendre à la fois un alias et un chemin de répertoire normal. -Un alias est aussi étroitement liée aux espaces de noms des classes. Il est recommandé de définir -un alias pour chaque espace de nom racine, ce qui vous permet d'utiliser le chargeur automatique de classe de Yii sans +Un alias est aussi étroitement lié aux espaces de noms des classes. Il est recommandé de définir +un alias pour chaque espace de noms racine, ce qui vous permet d'utiliser le chargeur automatique de classe de Yii sans sans devoir en faire d'avantage. Par exemple, vu que `@yii` fait référence au dossier d'installation de Yii, une classe comme `yii\web\Request` peut être chargée automatiquement. Si vous utilisez une librairie tierce, telle que Zend Framework, vous pouvez définir un alias de chemin `@Zend` qui fera référence au dossier d'installation de Zend Framework. Une fois que vous avez fait cela, Yii sera aussi en mesure de charger automatiquement une classe de ce framework. -Pour en savoir plus, consultez la partie [Alias](concept-aliases.md). +Pour en savoir plus, consultez la section [Alias](concept-aliases.md). Vues @@ -164,16 +164,16 @@ contrôleur ou widget. Au lieu de cela, `$this` correspond maintenant à un obje introduit dans la version 2.0. L'objet *vue* est de type [[yii\web\View]], et représente la partie vue du modèle MVC. Si vous souhaitez accéder au contrôleur ou widget dans une vue, vous pouvez utiliser `$this->context`. -Pour afficher une vue depuis une autre vue, utilisez `$this->render()`, et non `$this->renderPartial()`. Le résultat retourné par la méthode `render()` doit être explictement envoyé à la sortie, en effet `render()` retournera la vue au lieu de l'afficher. Par exemple : +Pour afficher une vue depuis une autre vue, utilisez `$this->render()`, et non `$this->renderPartial()`. Le résultat retourné par la méthode `render()` doit être explicitement envoyé à la sortie, en effet `render()` retournera la vue au lieu de l'afficher. Par exemple : ```php echo $this->render('_item', ['item' => $item]); ``` -Outre l'utilisation de PHP comme langage principal de gabarit, Yii 2.0 supporte également -deux moteurs de gabarit populaires : Smarty et Twig. Le moteur de gabarit Prado n'est plus supporté. +Outre l'utilisation de PHP comme langage principal de gabarit, Yii 2.0 prend également en charge +deux moteurs de gabarit populaires : Smarty et Twig. Le moteur de gabarit Prado n'est plus pris en charge. Pour utiliser ces moteurs de gabarit, vous devez configurer le composant `view` de l'application en définissant la propriété -[[yii\base\View::$renderers|View::$renderers]]. Merci de lire la partie [Moteur de gabarit](tutorial-template-engines.md) pour en savoir plus. +[[yii\base\View::$renderers|View::$renderers]]. Reportez-vous à la section [Moteur de gabarit](tutorial-template-engines.md) pour en savoir plus. Modèles @@ -183,7 +183,7 @@ Yii 2.0 utilise la classe [[yii\base\Model]] comme modèle de base, similaire à La classe `CFormModel` a été supprimée. Vous pouvez, à la place, étendre la classe [[yii\base\Model]] afin de créer une classe modèle pour un formulaire. Yii 2.0 introduit une nouvelle méthode appelée [[yii\base\Model::scenarios()|scenarios()]] pour déclarer -les scénarios pris en charge, et indiquer dans quel scénario un attribut doit être validé, peut être considéré comme sûr ou non, etc. Par exemple: +les scénarios pris en charge, indiquer dans quel scénario un attribut doit être validé et si cet attribut peut être considéré comme sûr ou non, etc. Par exemple: ```php public function scenarios() @@ -196,21 +196,21 @@ public function scenarios() ``` Dans ce qui précède, deux scénarios sont déclarés: `backend` et `frontend`. Pour le scénario `backend` les -propriétés `email` et `role` sont sûres et peuvent être affectées massivement. Pour le scénario `frontend`, -`email` peut être affectée massivement tandis que `role` ne peut pas. `email` et `rôle` doivent être validées en utilisant des règles. +attribut `email` et `role` sont sûrs et peuvent être affectés massivement. Pour le scénario `frontend`, +`email` peut être affecté massivement tandis que `role` ne le peut pas. `email` et `rôle` doivent être validées en utilisant des règles. La méthode [[yii\base\Model::rules()|rules()]] est toujours utilisée pour déclarer les règles de validation. Remarque : suite à l'introduction de la méthode [[yii\base\Model::scenarios()|scenarios()]], le validateur `unsafe` n'as plus de raison d'être. Dans la plupart des cas, vous n'avez pas besoin de surcharger la méthode [[yii\base\Model::scenarios()|scenarios()]] lorsque les scénarios existants sont déclarés via la méthode [[yii\base\Model::rules()|rules()]], et il n'y a pas besoin de déclarer de propriétés `unsafe`. -Pour en savoir plus sur les modèles, merci de lire la partie [Modèles](structure-models.md). +Pour en savoir plus sur les modèles, reportez-vous à la section [Modèles](structure-models.md). Contrôleurs ----------- -Yii 2.0 utilise la classe [[yii\web\Controller]] comme classe de base des contrôleurs, similaire à la classe `CWebController` dans la version Yii 1.1. +Yii 2.0 utilise la classe [[yii\web\Controller]] comme classe de base des contrôleurs, similaire à la classe `CController` dans la version Yii 1.1. [[yii\base\Action]] est la classe de base pour les actions. L'impact le plus évident de ces changements sur votre code est qu'une action de contrôleur doit retourner le contenu @@ -228,7 +228,7 @@ public function actionView($id) } ``` -Merci de lire la partie [Contrôleurs](structure-controllers.md) pour plus de détails. +Reportez-vous à la section [Contrôleurs](structure-controllers.md) pour plus de détails. Widgets @@ -236,7 +236,7 @@ Widgets Yii 2.0 utilise la classe [[yii\base\Widget]] comme classe de base pour les widgets, similaire à la classe `CWidget` de Yii 1.1. -Pour avoir un meilleur support du framework dans les EDI, Yii2 introduit une nouvelle syntaxe pour utiliser les widgets. Les methodes statiques +Pour avoir une meilleure prise en charge du framework dans les EDI, Yii2 introduit une nouvelle syntaxe pour utiliser les widgets. Les méthodes statiques [[yii\base\Widget::begin()|begin()]], [[yii\base\Widget::end()|end()]], et [[yii\base\Widget::widget()|widget()]] ont été créées et sont utilisables comme suit : @@ -256,7 +256,7 @@ $form = ActiveForm::begin([ ActiveForm::end(); ``` -Merci de lire la partie [Widgets](structure-widgets.md) pour en savoir plus. +Reportez-vous à la section [Widgets](structure-widgets.md) pour en savoir plus. Thèmes @@ -271,7 +271,7 @@ de fichier de vue à un chemin de fichier de vue thématisée. Par exemple, si l En outre, il n'y a plus de composant `CThemeManager`. A la place, `theme` est une propriété configurable du composant `view` de l'application. -Merci de lire la partie [Thématisation](tutorial-theming.md) pour plus de détails. +Reportez-vous à la section [Thématisation](tutorial-theming.md) pour plus de détails. Applications en ligne de commande @@ -287,26 +287,26 @@ les options déclarées dans la méthode [[yii\console\Controller::options()]]. Yii 2.0 prend en charge la génération automatique d'aide à partir des blocs de commentaire. -Merci de lire la partie [Commandes console](tutorial-console.md) pour plus de détails. +Reportez-vous à la section [Commandes console](tutorial-console.md) pour plus de détails. I18N ---- -Yii 2.0 supprime les fonctionnalités internes de formattage de dates et nombres, en faveur du [module PHP PECL intl] (http://pecl.php.net/package/intl). +Yii 2.0 supprime les fonctionnalités internes de formatage des dates et des nombres, en faveur du [module PHP PECL intl] (http://pecl.php.net/package/intl). -La traduction de message est désormais effectuée via le composant d'application `i18n`. +La traduction des messages est désormais effectuée via le composant d'application `i18n`. Ce composant gère un ensemble de sources de messages, ce qui vous permet d'utiliser différentes sources de messages en fonction de catégories. -Merci de lire la partie [Internationalisation](tutorial-i18n.md) pour plus de détails. +Reportez-vous à la section [Internationalisation](tutorial-i18n.md) pour plus de détails. Filtres d'action ---------------- Les filtres d'action sont maintenant implémentés comme des comportements. Pour définir un nouveau filtre personnalisé, étendez la classe [[yii\base\ActionFilter]]. Pour utiliser un filtre, déclarez le -comme un comportement du contrôleur. Par exemple, pour utilser le filtre [[yii\filters\AccessControl]], vous aurez le code suivant dans le contrôleur : +comme un comportement du contrôleur. Par exemple, pour utiliser le filtre [[yii\filters\AccessControl]], vous aurez le code suivant dans le contrôleur : ```php public function behaviors() @@ -322,26 +322,26 @@ public function behaviors() } ``` -Merci de lire la partie [Filtres](structure-filters.md) pour plus de détails. +Reportez-vous à la section [Filtres](structure-filters.md) pour plus de détails. Ressources ---------- -Yii 2.0 introduit un nouveau concept de packet de ressources (*asset bundle*) qui remplace le concept de gestionnaire de ressources (*asset manager*) de la version 1.1. +Yii 2.0 introduit un nouveau concept de paquet de ressources (*asset bundle*) qui remplace le concept de gestionnaire de ressources (*asset manager*) de la version 1.1. -Un packet de ressources est une collection de fichiers (par exemple : fichier JavaScript, CSS, image, etc.) +Un paquet de ressources est une collection de fichiers (par exemple : fichier JavaScript, CSS, image, etc.) dans un dossier. Chaque paquet est représenté par une classe étendant [[yii\web\AssetBundle]]. -En *enregistrant* un packet via [[yii\web\AssetBundle::register()]], vous rendez les ressources du packet accessibles via le Web. Contrairement à Yii 1.1, la page *enregistrant* le paquet +En *enregistrant* un paquet de ressources via [[yii\web\AssetBundle::register()]], vous rendez les ressources du paquet accessibles via le Web. Contrairement à Yii 1.1, la page *enregistrant* le paquet contiendra automatiquement les références vers les fichiers déclarés dans le paquet. -Merci de lire la partie [Assets](structure-assets.md) pour plus de détails. +Reportez-vous à la section [Assets](structure-assets.md) pour plus de détails. Assistants ---------- -Yii 2.0 introduit de nombreuses assistants couramment utilisés, sous la forme de classes statiques, y compris : +Yii 2.0 introduit de nombreux assistants couramment utilisés, sous la forme de classes statiques, y compris : * [[yii\helpers\Html]] * [[yii\helpers\ArrayHelper]] @@ -349,7 +349,7 @@ Yii 2.0 introduit de nombreuses assistants couramment utilisés, sous la forme d * [[yii\helpers\FileHelper]] * [[yii\helpers\Json]] -Merci de lire la partie [Assistants](helper-overview.md) pour plus de détails. +Reportez-vous à la section [Assistants](helper-overview.md) pour plus de détails. Formulaires @@ -370,7 +370,7 @@ En utilisant des champs, vous pouvez construire un formulaire plus proprement qu ``` -Merci de lire la partie [Créer des formulaires](input-forms.md) pour plus de détails. +Reportez-vous à la section [Créer des formulaires](input-forms.md) pour plus de détails. Constructeur de requête @@ -394,7 +394,7 @@ $rows = $command->queryAll(); De plus, ces méthodes de construction de requête peuvent également être utilisées lorsque vous travaillez avec [Active Record](db-active-record.md). -Merci de lire la partie [Constructeur de requête](db-query-builder.md) pour plus de détails. +Reportez-vous à la section [Constructeur de requête](db-query-builder.md) pour plus de détails. Active Record @@ -443,14 +443,14 @@ primaires des enregistrements principaux. Au lieu de retourner des objets [[yii\db\ActiveRecord|ActiveRecord]], vous pouvez utiliser la méthode [[yii\db\ActiveQuery::asArray()|asArray()]] lors de la construction d'une requête pour renvoyer un grand nombre -d'enregistrements. Ainsi le résultat retourné sera sous forme de tableaux, ce qui peut réduire considérablement le temps de calcul nécessaire et la mémoire dans le cas d'un grand nombre d'enregistrements. Par exemple: +d'enregistrements. Ainsi le résultat sera retourné sous forme de tableaux, ce qui peut réduire considérablement le temps de calcul et la mémoire nécessaires dans le cas d'un grand nombre d'enregistrements. Par exemple: ```php $customers = Customer::find()->asArray()->all(); ``` -Un autre changement est que vous ne pouvez plus définir les valeurs par défaut des attributs en utilisant des propriétés -publiques. Si vous avez besoin, vous devez utiliser la méthode `init` de la classe de votre modèle. +Un autre changement fait que vous ne pouvez plus définir les valeurs par défaut des attributs en utilisant des propriétés +publiques. Si vous en avez besoin, vous devez utiliser la méthode `init` de la classe de votre modèle. ```php public function init() @@ -465,25 +465,52 @@ la version 2.0. Notez que lorsque vous ajoutez des paramètres au constructeur, la méthode [[yii\db\ActiveRecord::instantiate()]]. Il y a beaucoup d'autres modifications et améliorations à Active Record. -Merci de lire la partie [Active Record](db-active-record.md) pour en savoir plus. +Reportez-vous à la section [Active Record](db-active-record.md) pour en savoir plus. +Comportement des Enregistrements actifs) +--------------------------------------------------------- +Dans la version 2.0, nous avons la classe de base des *behaviors* (comportements) `CActiveRecordBehavior`. Si vous voulez créer une classe de comportement d'enregistrement actif (Active Record), vous devez étendre directement la classe `yii\base\Behavior`. Si la classe de comportement doit réagir à certains événements du propriétaire, vous devez redéfinir les méthodes `events()` comme suit : + +```php +namespace app\components; + +use yii\db\ActiveRecord; +use yii\base\Behavior; + +class MyBehavior extends Behavior +{ + // ... + + public function events() + { + return [ + ActiveRecord::EVENT_BEFORE_VALIDATE => 'beforeValidate', + ]; + } + + public function beforeValidate($event) + { + // ... + } +} +``` User et IdentityInterface ------------------------- -La classe `CWebUser` 1.1 est maintenant remplacé par [[yii\web\User]], et il n'y a plus de classe `CUserIdentity`. +La classe `CWebUser` 1.1 est maintenant remplacée par [[yii\web\User]], et il n'y a plus de classe `CUserIdentity`. Au lieu de cela, vous devez implémenter [[yii\web\IdentityInterface]] qui est beaucoup plus simple à utiliser. -Le modèle d'application avancé fournit un exemple. +Le modèle de projet avancé fournit un exemple. -Merci de lire les parties [Authentification](security-authentication.md), [Authorisation](security-authorization.md), et -[Modèle application avancée](tutorial-advanced-app.md) pour en savoir plus. +Reportez-vous aux sections [Authentification](security-authentication.md), [Authorisation](security-authorization.md), et +[Modèle de projet avancé](tutorial-advanced-app.md) pour en savoir plus. Gestion des URL --------------- La gestion des URL dans Yii 2 est similaire à celle disponible dans la version 1.1. Une amélioration majeure est que la -gestion des URL supporte désormais les paramètres optionnels. Par exemple, si vous avez une règle déclarée comme suit, +gestion des URL prend désormais en charge les paramètres optionnels. Par exemple, si vous avez une règle déclarée comme suit, cela fera correspondre `post/popular` et `post/1/popular`. Dans la version 1.1, il fallait utiliser deux règles pour atteindre le même objectif. @@ -495,11 +522,13 @@ atteindre le même objectif. ] ``` -Merci de lire la partie [Gestion des URL](url.md) pour en savoir plus. +Reportez-vous à la section [Documentation de la gestion des URL](runtime-routing.md) pour en savoir plus. + +Un changement important dans la convention de nommage pour les routes est que les noms utilisant la *casse en dos de chameau* des contrôleurs et des actions utilisent désormais uniquement des mots en bas de casse séparés par des tirets, p. ex. l'identifiant du contrôleur Reportez-vous à la section traitant des [Identifiants de contrôleur](structure-controllers.md#controller-ids) et [Identifiants d'action](structure-controllers.md#action-ids) pour plus de détails. Utiliser Yii 1.1 et 2.x ensemble -------------------------------- -Si vous avez du code Yii 1.1 que vous souhaitez réutiliser avec Yii 2, merci de lire la partie [Utiliser Yii 1.1 et 2.0 ensemble](extend-using-v1-v2.md). +Si vous avez du code Yii 1.1 que vous souhaitez réutiliser avec Yii 2, reportez-vous à la section [Utiliser Yii 1.1 et 2.0 ensemble](tutorial-yii-integration.md). diff --git a/docs/guide-fr/start-databases.md b/docs/guide-fr/start-databases.md index d8f181c..6b6b31e 100644 --- a/docs/guide-fr/start-databases.md +++ b/docs/guide-fr/start-databases.md @@ -1,9 +1,9 @@ Travailler avec les bases de données ====================== -Cette section décrira comment créer une nouvelle page qui affiche des données pays récupérées dans une table de base +Cette section décrit comment créer une nouvelle page qui affiche des données pays récupérées dans une table de base de données nommée `country`. Pour ce faire, vous allez configurer une connexion à une base de données, créer une -classe [Active Record](db-active-record.md), et définir une [action](structure-controllers.md), et créer une +classe [Active Record](db-active-record.md), définir une [action](structure-controllers.md), et créer une [vue](structure-views.md). Au long de ce tutoriel, vous apprendrez comment : @@ -27,7 +27,7 @@ Vous pouvez créer une base de données SQLite, MySQL, PostgreSQL, MSSQL ou Orac applications de base de données. Par simplicité, nous supposerons que vous utilisez MySQL dans les descriptions qui suivent. -Next, create a table named `country` in the base de données, and insert some sample data. You may run the following SQL statements to do so: +Créez maintenant une table nommée `country` dans la base de données et insérez-y quelques données exemples. Vous pouvez exécuter l'instruction SQL suivante pour le faire : ```sql CREATE TABLE `country` ( @@ -48,12 +48,12 @@ INSERT INTO `country` VALUES ('RU','Russia',146519759); INSERT INTO `country` VALUES ('US','United States',322976000); ``` -A ce niveau, vous avez une base de données appelée `yii2basic`, et dedans, une table `country` comportant trois colonnes, contenant dix lignes de données. +Vous avez désormais une base de données appelée `yii2basic` conmprenant une table `country` comportant trois colonnes et contenant dix lignes de données. Configurer une Connexion à la BDD --------------------------- -Avant de continuer, assurons nous que vous avez installé à la fois l'extension PHP +Avant de continuer, vérifiez que vous avez installé à la fois l'extension PHP [PDO](http://www.php.net/manual/fr/book.pdo.php) et le pilote PDO pour la base de données que vous utilisez (c'est à dire `pdo_mysql` pour MySQL). C'est une exigence de base si votre application utilise une base de données relationnelle. @@ -80,15 +80,15 @@ dans la base de données sous-jacente. On peut accéder à connexion à la BDD configurée ci-dessus depuis le code de l'application vial'expression `Yii::$app->db`. -> Info: Le fichier `config/db.php` sera inclus par la configuration principale de l'application `config/web.php`, +> Info: le fichier `config/db.php` sera inclus par la configuration principale de l'application `config/web.php`, qui spécifie comment l'instante d'[application](structure-applications.md) doit être initialisée. - Pour plus d'informations, merci de vous référer à la section [Configurations](concept-configurations.md). + Pour plus d'informations, reportez-vous à la section [Configurations](concept-configurations.md). Créer un Active Record ------------------------- -Pour représenter et aller chercher des données dans la table `country`, créez une classe dérivée d'[Active Record](db-active-record.md) appelée `Country`, et enregistrez la dans le fichier `models/Country.php`. +Pour représenter et aller chercher des données dans la table `country`, créez une classe dérivée d'[Active Record](db-active-record.md) appelée `Country`, et enregistrez-la dans le fichier `models/Country.php`. ```php Info: Si aucune correspondance directe ne peut être faite à partir du nom de la classe, vous pouvez outrepasser la méthode [[yii\db\ActiveRecord::tableName()]] pour spécifier explicitement un nom de table. +> Info: si aucune correspondance directe ne peut être faite à partir du nom de la classe, vous pouvez outrepasser la méthode [[yii\db\ActiveRecord::tableName()]] pour spécifier explicitement un nom de table. A l'aide de la classe `Country`, vous pouvez facilement manipuler les données de la table `country`, comme dans les bribes suivantes : @@ -137,7 +137,7 @@ Créer une Action Pour exposer les données pays aux utilisateurs, vous devez créer une action. Plutôt que de placer la nouvelle action dans le contrôleur `site`, comme vous l'avez fait dans les sections précédentes, il est plus cohérent de créer un -nouveau contrôleur spécifiquement pour toutes les actions liées aux données pays. Nommez ce contrôleur +nouveau contrôleur spécifique à toutes les actions liées aux données pays. Nommez ce contrôleur `CountryController`, et créez-y une action `index`, comme suit. ```php @@ -182,7 +182,7 @@ Pour limiter le nombre de pays retournés par chaque requête, la requête est p * Il ajuste les clauses `offset` et `limit` de la déclaration SQL représentée par la requête afin qu'elle en retourne qu'une page de données à la fois (au plus 5 colonnes par page). -* Il est utilisé dans la vue pour afficher un pagineur qui consiste en une liste de boutons de page, comme nous +* Il est utilisé dans la vue pour afficher un sélecteur de pages qui consiste en une liste de boutons de page, comme nous l'expliquerons dans la prochaine sous-section. A la fin du code, l'action `index` effectue le rendu d'une vue nommée `index`, et lui transmet les données pays ainsi que les informations de pagination. @@ -213,16 +213,16 @@ use yii\widgets\LinkPager; $pagination]) ?> ``` -La vue a deux sections relatives à l'affichage des données pays. Dans la première partie, les données pays fournies -est parcourue et rendue sous forme de liste non ordonnée HTML. +La vue comprend deux sections relatives à l'affichage des données pays. Dans la première partie, les données pays fournies +sont parcourues et rendues sous forme de liste non ordonnée HTML. Dans la deuxième partie, un widget [[yii\widgets\LinkPager]] est rendu en utilisant les informations de pagination transmises par l'action. -Le widget `LinkPager` affiche une liste de boutons de pages. Le fait de cliquer sur l'un deux rafraichit les données pays dans la page correspondante. +Le widget `LinkPager` affiche une liste de boutons de page. Le fait de cliquer sur l'un deux rafraichit les données pays dans la page correspondante. Essayer ------------- -Pour voir comment tout le code ci-dessus fonctionne, utilisez votre navigateur pour accéder à l'URL suivant : +Pour voir comment tout le code ci-dessus fonctionne, pointez votre navigateur sur l'URL suivante : ``` http://hostname/index.php?r=country/index @@ -230,7 +230,7 @@ http://hostname/index.php?r=country/index ![Liste de Pays](images/start-country-list.png) -Au début, vous verrez une page affichant cinq pays. En dessous des pays, vous verrez un pagineur avec quatre boutons. +Au début, vous verrez une page affichant cinq pays. En dessous des pays, vous verrez un sélecteur de pages avec quatre boutons. Si vous cliquez sur le bouton "2", vous verrez la page afficher cinq autres pays de la base de données : la deuxième page d'enregistrements. Observez plus attentivement et vous noterez que l'URL dans le navigateur devient @@ -243,7 +243,7 @@ En coulisse, [[yii\data\Pagination|Pagination]] fournit toutes les fonctionnalit * Au départ, [[yii\data\Pagination|Pagination]] représente la première page, qui reflète la requête SELECT de country avec la clause `LIMIT 5 OFFSET 0`. Il en résulte que les cinq premiers pays seront trouvés et affichés. -* Le widget [[yii\widgets\LinkPager|LinkPager]] effectue le rendu des boutons de pages en utilisant les URLs créés par +* Le widget [[yii\widgets\LinkPager|LinkPager]] effectue le rendu des boutons de pages en utilisant les URLs créées par [[yii\data\Pagination::createUrl()|Pagination]]. Les URLs contiendront le paramètre de requête `page`, qui représente les différents numéros de pages. * Si vous cliquez sur le bouton de page "2", une nouvelle requête pour la route `country/index` sera déclenchée et @@ -257,7 +257,7 @@ Résumé ------- Dans cette section, vous avez appris comment travailler avec une base de données. Vous avez également appris comment -chercher et afficher des données dans des pages avec l'aide de [[yii\data\Pagination]] et [[yii\widgets\LinkPager]]. +chercher et afficher des données dans des pages avec l'aide de [[yii\data\Pagination]] et de [[yii\widgets\LinkPager]]. Dans la prochaine section, vous apprendrez comment utiliser le puissant outil de génération de code, appelé [Gii](tool-gii.md), pour vous aider à implémenter rapidement des fonctionnalités communément requises, telles que les diff --git a/docs/guide-fr/structure-applications.md b/docs/guide-fr/structure-applications.md new file mode 100644 index 0000000..6100ac7 --- /dev/null +++ b/docs/guide-fr/structure-applications.md @@ -0,0 +1,517 @@ +Applications +============ + +Les Applications sont des objets qui gouvernent la structure d'ensemble et le cycle de vie des systèmes mettant en œuvre Yii. +Chacun des systèmes mettant en œuvre Yii contient un objet *Application* unique qui est créé par le [Script d'entrée](structure-entry-scripts.md) et est globalement accessible à l'aide de l'expression `\Yii::$app`. + + +> Info: selon le contexte, lorsque nous utilisons le terme « application », cela peut signifier soit un objet *Application*, soit un système mettant en œuvre Yii. + +Il existe deux types d'application : [[yii\web\Application|les applications Web]] et +[[yii\console\Application|les applications de console]]. Comme leur nom l'indique, les premières prennent en charge des requêtes Web tandis que les deuxièmes prennent en charge des requêtes de la console. + + +## Configurations d'application + +Losqu'un [script d'entrée](structure-entry-scripts.md) crée une application, il charge une [configuration](concept-configurations.md) et l'applique à cette application de la manière suivante : + +```php +require(__DIR__ . '/../vendor/autoload.php'); +require(__DIR__ . '/../vendor/yiisoft/yii2/Yii.php'); + +// charger la configuration de l'application +$config = require(__DIR__ . '/../config/web.php'); + +// instancier et configurer l'application +(new yii\web\Application($config))->run(); +``` + +Tout comme les [configurations](concept-configurations.md) habituelles, les configurations d'application spécifient comment initialiser les propriétés des objets *Application*. Comme les configurations d'application sont souvent très complexes, elles sont ordinairement conservées dans des [fichiers de configuration](concept-configurations.md#configuration-files), +tels que le fichier `web.php` de l'exemple précédent. + + +## Propriétés des applications + +Il y a de nombreuses propriétés importantes des applications que vous devez spécifier dans les configurations d'application. +Ces propriétés décrivent l'environnement dans lequel ces applications sont exécutées. Par exemple, les applications doivent savoir comment charger les [contrôleurs](structure-controllers.md), où ranger les fichiers temporaires, etc. Nous allons passer en revue ces propriétés. + + +### Propriétés requises + +Dans toute application, vous devez au moins spécifier deux propriétés :: [[yii\base\Application::id|id]] et [[yii\base\Application::basePath|basePath]]. + + +#### [[yii\base\Application::id|id]] + +La propriété [[yii\base\Application::id|id]] spécifie un identifiant unique qui distingue une application des autres. On l'utilise principalement dans des instructions. Bien que cela ne soit pas une exigence, l'utilisation des seuls caractères alphanumériques, pour spécifier cet identifiant, est recommandée pour assurer une meilleure interopérabilité. + + +#### [[yii\base\Application::basePath|basePath]] + +La propriété [[yii\base\Application::basePath|basePath]] spécifie le dossier racine d'une application. Il s'agit du dossier qui contient tout le code source protégé d'une application mettant en œuvre Yii. Dans ce dossier, on trouve généralement des sous-dossiers tels que `models`, `views` et`controllers`, qui contiennent le code source correspondant au modèle de conception MVC. + +Vous pouvez configurer la propriété [[yii\base\Application::basePath|basePath]] en utilisant un chemin de dossier +ou un [alias de chemin](concept-aliases.md). Dans les deux cas, le dossier correspondant doit exister, + sinon une exception est levée. Le chemin doit être normalisé à l'aide de la fonction `realpath()`. + +La propriété [[yii\base\Application::basePath|basePath]] est souvent utilisée pour dériver d'autres chemins importants +(p. ex. le chemin runtime ). À cette fin, un alias nommé `@app` est prédéfini pour représenter ce chemin. +Les chemins dérivés peuvent être formés à l'aide de cet alias (p. ex. `@app/runtime` pour faire référence au dossier `runtime`). + + +### Propriétés importantes + +Les propriétés décrites dans cette sous-section doivent souvent être spécifiées car elles différent à travers les différentes applications. + + +#### [[yii\base\Application::aliases|alias]] + +Cette propriété vous permet de définir un jeu d' [alias](concept-aliases.md) sous forme de tableau associatif. +Les clés du tableau représentent les noms des alias, tandis que les valeurs représentent la définition des chemins. +Par exemple : + +```php +[ + 'aliases' => [ + '@name1' => 'chemin/vers/dossier1', + '@name2' => 'chemin/vers/dossier2', + ], +] +``` + +Cette propriété est mise à votre disposition pour vous éviter d'avoir à définir les alias par programme en appelant la méthode [[Yii::setAlias()]]. + + +#### [[yii\base\Application::bootstrap|bootstrap (amorçage)]] + +Cette propriété est très utile. Elle vous permet de spécifier un tableau de composants qui devraient être exécutés lors du [[yii\base\Application::bootstrap()|processus d'amorçage]]. +Par exemple, si vous désirez utiliser un [module](structure-modules.md) pour personnaliser les [règles d'URL](runtime-routing.md), +vous pouvez indiquer son identifiant (ID) en tant qu'élément de cette propriété. + +Chacun des composants listés dans cette propriété peut être spécifié sous une des formes suivantes : + +- un identifiant (ID) de composant d'application comme vous le spécifieriez via [components](#components), +- un identifiant (ID) de module comme vous le spécifieriez via [modules](#modules), +- un nom de classe, +- un tableau de configuration, +- une fonction anonyme qui crée et retourne un composant. + +Par exemple: + +```php +[ + 'bootstrap' => [ + // un identifiant de composant d'application ou de module + 'demo', + + // un nom de classe + 'app\components\Profiler', + + // un tableau de configuration + [ + 'class' => 'app\components\Profiler', + 'level' => 3, + ], + + // une fonction anonyme + function () { + return new app\components\Profiler(); + } + ], +] +``` + +> Info: si un identifiant (ID) de module est identique à celui d'un composant d'application, le composant d'application est utilisé lors du processus de démarrage. Si vous désirez utiliser le module, vous pouvez le spécifier via une fonction anonyme comme le montre l'exemple suivant : +> +> ```php +> [ +> function () { +> return Yii::$app->getModule('user'); +> }, +> ] +> ``` + + +Los du processus d'amorçage, chaque composant est instancié. Si la classe du composant implémente [[yii\base\BootstrapInterface]], sa méthode [[yii\base\BootstrapInterface::bootstrap()|bootstrap()]] est également appelée. + +Un autre exemple pratique se trouve dans la configuration de l'application du [Modèle du projet Basic](start-installation.md), +où les modules `debug` et `gii` sont configurés en tant que composants d'amorçage lorsque l'application est dans l'environnement de développement. + +```php +if (YII_ENV_DEV) { + // réglages de configuration pour l'environnement 'dev' + $config['bootstrap'][] = 'debug'; + $config['modules']['debug'] = 'yii\debug\Module'; + + $config['bootstrap'][] = 'gii'; + $config['modules']['gii'] = 'yii\gii\Module'; +} +``` + +> Note: placer trop de composants dans `bootstrap` dégrade la performance de votre application car, à chaque requête, le même jeu de composants doit être exécuté. C'est pourquoi vous devez utiliser les composants de démarrage avec discernement. + + +#### [[yii\web\Application::catchAll|catchAll (ramasse tout)]] + +Cette propriété est prise en charge par les [[yii\web\Application|applications Web]] uniquement. Elle spécifie une +[action de contrôleur](structure-controllers.md) qui prend en charge toutes les requêtes de l'utilisateur. Cela est essentiellement utilisé lorsque l'application est dans le mode maintenance et doit prendre en charge toutes les requêtes avec une action unique. +La configuration est un tableau dont le premier élément spécifie la route de l'action. Le reste des éléments du tableau (paires clé-valeur) spécifie les paramètres à associer à l'action. Par exemple : + +```php +[ + 'catchAll' => [ + 'offline/notice', + 'param1' => 'valeur1', + 'param2' => 'valeur2', + ], +] +``` + +> Info: le panneau de débogage dans l'environnement de développement ne fonctionne pas lorsque cette propriété est activée. + +#### [[yii\base\Application::components|components (composants)]] + +Il s'agit de la seule plus importante propriété. Elle vous permet d'enregistrer par leur nom une liste de composants appelés [composants d'application](structure-application-components.md) que vous pouvez utiliser partout ailleurs. Par exemple : + +```php +[ + 'components' => [ + 'cache' => [ + 'class' => 'yii\caching\FileCache', + ], + 'user' => [ + 'identityClass' => 'app\models\User', + 'enableAutoLogin' => true, + ], + ], +] +``` + +Chaque composant d'application est spécifié sous la forme d'un couple clé-valeur dans le tableau. La clé représente l'identifiant (ID) du composant, tandis que la valeur représente le nom de la classe du composant ou un tableau de [configuration](concept-configurations.md). + +Vous pouvez enregistrer n'importe quel composant dans une application, et vous pouvez ensuite y accéder globalement via l'expression `\Yii::$app->componentID`. + +Reportez-vous à la section [Composants d'application](structure-application-components.md) pour plus de détails. + + +#### [[yii\base\Application::controllerMap|controllerMap (cartographie des contrôleurs)]] + +Cette propriété vous permet de faire correspondre un identifiant (ID) de contrôleur avec une classe de contrôleur arbitraire. Par défaut, Yii fait correspondre un identifiant de contrôleur avec une classe de contrôleur selon une [convention](#controllerNamespace) (p. ex. l'identifiant `post` correspond à `app\controllers\PostController`). En configurant cette propriété, vous passez outre la convention pour les contrôleurs spécifiés. Dans l'exemple qui suit, `account` correspond à +`app\controllers\UserController`, tandis que `article` correspond à `app\controllers\PostController`. + +```php +[ + 'controllerMap' => [ + 'account' => 'app\controllers\UserController', + 'article' => [ + 'class' => 'app\controllers\PostController', + 'enableCsrfValidation' => false, + ], + ], +] +``` + +Les clés du tableau de cette propriété représentent les identifiants des contrôleurs, tandis que les valeurs représentent les noms des classes mises en correspondance ou les tableaux de [configurations](concept-configurations.md). + + +#### [[yii\base\Application::controllerNamespace|controllerNamespace (espaces de noms des contrôleurs]] + +Cette propriété spécifie l'espace de noms par défaut sous lequel les classes des contrôleurs sont situées. Par défaut, il s'agit de +`app\controllers`. Si l'identifiant d'un contrôleur est `post`, par convention le contrôleur correspondant (sans l'espace de noms) est `PostController`, et le nom de classe totalement qualifié est `app\controllers\PostController`. + +Les classes de contrôleur peuvent aussi résider dans des sous-dossiers du dossier correspondant à cet espace de noms. +Par exemple, étant donné un identifiant de contrôleur`admin/post`, le nom de classe de contrôleur totalement qualifié est `app\controllers\admin\PostController`. + +Il est important que la classe de contrôleur totalement qualifiée puisse être [auto-chargée](concept-autoloading.md) et que l'espace de noms réel de votre classe de contrôleur corresponde à la valeur de cette propriété. Autrement, vous obtenez une erreur « Page non trouvée » quand vous accédez à votre application. + +Si vous désirez passer outre la convention décrite précédemment, vous devez configurer la propriété [controllerMap](#controllerMap). + + +#### [[yii\base\Application::language|language (langue)]] + +Cette propriété spécifie la langue dans laquelle l'application présente les contenus aux utilisateurs finaux. +La valeur par défaut de cette propriété est `en`, pour anglais. Vous devez configurer cette propriété si votre application doit prendre en charge plusieurs langues. + +La valeur de cette propriété détermine des aspects variés de l'[internationalisation](tutorial-i18n.md) tels que la traduction des messages, le formatage des dates et des nombres, etc. Par exemple, le widget [[yii\jui\DatePicker]] utilise la valeur de cette propriété pour déterminer dans quelle langue le calendrier doit être affiché et comment les dates doivent être formatées. + +La spécification de la langue par une [étiquette IETF d'identification de langue ](http://en.wikipedia.org/wiki/IETF_language_tag) est recommandée. Par exemple, `en` signifie anglais, tandis que `en-US` signifie anglais (États-Unis).. + +Pour plus d'informations sur cette propriété, reportez-vous à la section [Internationalisation](tutorial-i18n.md). + + +#### [[yii\base\Application::modules|modules]] + +Cette propriété spécifie les [modules](structure-modules.md) que comprend l'application. + +Cette propriété accepte un tableau de classes de module ou de tableaux de [configurations](concept-configurations.md) dans lequel les clés sont les identifiants (ID) des modules. Par exemple : + +```php +[ + 'modules' => [ + // un module "booking" (réservations) spécifié par sa classe + 'booking' => 'app\modules\booking\BookingModule', + + // un module "comment" (commentaires) spécifié par un tableau de configuration + 'comment' => [ + 'class' => 'app\modules\comment\CommentModule', + 'db' => 'db', + ], + ], +] +``` + +Reportez-vous à la section [Modules](structure-modules.md) pour des informations complémentaires. + + +#### [[yii\base\Application::name|name (nom]] + +Cette propriété spécifie le nom de l'application qui est présenté à l'utilisateur final. Contrairement à la propriété +[[yii\base\Application::id|id]] qui ne peut prendre qu'une valeur unique, la valeur de cette propriété, qui n'intervient que pour l'affichage, n'a pas besoin d'être unique. +Vous n'avez pas besoin de configurer cette propriété si vous ne l'utilisez pas dans votre code. + + +#### [[yii\base\Application::params|params (paramètres)]] + +Cette propriété spécifie un tableau de paramètres de l'application accessibles globalement. Plutôt que de parsemer votre code des mêmes nombres et chaînes de caractères formulées `en dur`, une bonne pratique consiste à les définir une fois pour toute sous forme de paramètres et à utiliser ces paramètres ici et là, ce qui évite, si vous devez en modifier la valeur, d'intervenir en de multiples endroits de votre code. À titre d'exemple, vous pouvez définir la taille des vignettes d'images en tant que paramètre de la façon suivante : + +```php +[ + 'params' => [ + 'thumbnail.size' => [128, 128], + ], +] +``` + +puis dans votre code, là où vous devez utiliser cette taille, procéder de la façon suivante : + +```php +$size = \Yii::$app->params['thumbnail.size']; +$width = \Yii::$app->params['thumbnail.size'][0]; +``` + +Plus tard, si vous changez d'avis à propos de la taille de ces vignettes, il vous suffit de modifier la valeur du paramètre dans la configuration de l'application sans avoir à toucher à votre code. + +#### [[yii\base\Application::sourceLanguage|sourceLanguage (langue source)]] + +Cette propriété spécifie la langue dans laquelle l'application est écrite. La valeur par défaut est `'en-US'`, +pour (anglais — États-Unis). Vous devriez configurer cette propriété si les textes dans votre code ne sont pas en anglais US. + +Comme pour la propriété [language (langue)](#language), vous devez configurer cette propriété à l'aide d'une [étiquette IETF d'identification de langue](http://en.wikipedia.org/wiki/IETF_language_tag). Par exemple, `en` signifie `anglais`, +tandis que `en-US` signifie for `anglais-États-Unis`). + +Pour plus d'informations sur cette propriété, reportez-vous à la section [Internationalisation](tutorial-i18n.md). + + +#### [[yii\base\Application::timeZone|timeZone (fuseau horaire)]] + +Cette propriété est fournie comme une manière alternative de définir le fuseau horaire par défaut au moment de l'exécution du script PHP. +En configurant cette propriété, vous ne faites essentiellement qu'appeler la fonction PHP +[date_default_timezone_set()](http://php.net/manual/en/function.date-default-timezone-set.php). Par exemple : + +```php +[ + 'timeZone' => 'America/Los_Angeles', +] +``` + + +#### [[yii\base\Application::version|version]] + +Cette propriété spécifie la version de l'application. Sa valeur par défaut est `'1.0'`. Il n'est pas nécessaire que vous définissiez cette propriété si vous ne l'utilisez pas dans votre code. + + +### Propriétés utiles + +Les propriétés décrites dans cette sous-section ne sont en général pas spécifiées car leur valeur par défaut dérive de conventions ordinaires. Néanmoins, vous pouvez les spécifier pour outrepasser les conventions. + + +#### [[yii\base\Application::charset|charset (jeu de caractères)]] + +Cette propriété spécifie le jeu de caractères que l'application utilise. La valeur par défaut est `'UTF-8'`, qui devrait être gardée telle quelle dans la plupart des applications sauf si vous travaillez avec un système ancien qui utilise de nombreuses données non Unicode. + + +#### [[yii\base\Application::defaultRoute|defaultRoute (route par défaut) ]] + +Cette propriété spécifie la [route](runtime-routing.md) qu'une application devrait utiliser lorsqu'une requête n'en spécifie aucune. La route peut être constituée à partir d'un identifiant de module, d'un identifiant de contrôleur et/ou d'un identifiant d'action. Par exemple, `help`, `post/create` ou `admin/post/create`. Si un identifiant d'action n'est pas fourni, cette propriété prend la valeur par défaut spécifiée dans [[yii\base\Controller::defaultAction]] + +Pour les [[yii\web\Application|applications Web]], la valeur par défaut de cette propriété est `'site'`, ce qui donne le contrôleur +`SiteController` et son action par défaut est utilisée. En conséquence, si vous accédez à l'application sans spécifier de route, vous aboutissez à ce que retourne l'action `app\controllers\SiteController::actionIndex()`. + +Pour les [[yii\console\Application|applications de console]], la valeur par défaut est `'help'` (aide), ce qui conduit à +[[yii\console\controllers\HelpController::actionIndex()]]. Par conséquent, si vous exécutez la commande `yii` sans lui fournir d'argument, l'application affiche l'information d'aide. + + + +#### [[yii\base\Application::extensions|extensions]] + +Cette propriété spécifie la liste des [extensions](structure-extensions.md) installées et utilisées par l'application. +Par défaut, elle reçoit le tableau retourné par le fichier `@vendor/yiisoft/extensions.php`. Le fichier `extensions.php` est généré et maintenu automatiquement lorsque vous faites appel à [Composer](https://getcomposer.org) pour installer des extensions. Ainsi, dans la plupart des cas, vous n'avez pas besoin de spécifier cette propriété. + +Dans le cas particulier où vous souhaitez maintenir les extensions à la main, vous pouvez configurer cette propriété de la manière suivante : + + +```php +[ + 'extensions' => [ + [ + 'name' => 'extension name', //nom de l'extension + 'version' => 'version number',//numéro de version + 'bootstrap' => 'BootstrapClassName', // facultatif, peut aussi être un tableau de configuration + 'alias' => [ // facultatif + '@alias1' => 'vers/chemin1', + '@alias2' => 'vers/chemin2', + ], + ], + + // ... configuration d'autres extensions similaires à ce qui précède ... + + ], +] +``` + +Comme vous pouvez le constater, la propriété reçoit un tableau de spécifications d'extension. Chacune des extensions est spécifiée par un tableau constitué du +nom (`name`) et de la `version` de l'extension. Si une extension doit être exécutée durant le processus d'[amorçage](runtime-bootstrapping.md), un élément `bootstrap` doit être spécifié par un nom de classe d'amorçage (`bootstrap`) ou un tableau de [configuration](concept-configurations.md). Une extension peut aussi définir quelques [alias](concept-aliases.md). + + +#### [[yii\base\Application::layout|layout (disposition de page)]] + +Cette propriété spécifie le nom de la disposition de page par défaut (`layout`) qui doit être utilisée lors du rendu d'une [vue](structure-views.md). La valeur par défaut est `'main'`, ce qui signifie que le fichier de disposition de page `main.php` sous le chemin [layout path](#layoutPath) est utilisé. +Si, à la fois, le chemin de la disposition de page [layout path](#layoutPath) et le chemin de la vue [view path](#viewPath) prennent leur valeur par défaut, le fichier de disposition de page par défaut peut être représenté par l'alias `@app/views/layouts/main.php`. + +Vous pouvez définir cette propriété à la valeur `false` pour désactiver la disposition de page par défaut, bien que cela se fasse rarement. + + +#### [[yii\base\Application::layoutPath|layoutPath (chemin de la disposition de page)]] + +Cette propriété spécifie le chemin du dossier où rechercher les fichiers de disposition de page. La valeur par défaut `layouts` correspond à un sous-dossier de [view path](#viewPath). Si [view path](#viewPath) prend sa valeur par défaut, le chemin de la disposition de page par défaut peut être représenté par l'alias `@app/views/layouts`. + +Vous pouvez le définir comme un dossier ou un [alias](concept-aliases.md) de chemin. + + +#### [[yii\base\Application::runtimePath|runtimePath (chemin du dossier d'exécution)]] + +Cette propriété spécifie le chemin du dossier où les fichiers temporaires, tels que les journaux et les fichiers de cache, sont placés. La valeur par défaut est `@app/runtime`. + +Vous pouvez configurer cette propriété comme un dossier ou un [alias](concept-aliases.md) de chemin. Notez que le dossier d'exécution `runtimePath` doit être accessible en écriture par le processus qui exécute l'application et rendu inaccessible aux utilisateurs finaux, parce que les fichiers temporaires qu'il contient peuvent contenir des informations sensibles. + +Pour simplifier l'accès à ce chemin, Yii a prédéfini un alias de chemin nommé `@runtime`. + + +#### [[yii\base\Application::viewPath|viewPath (chemin des vues)]] + +Cette propriété spécifie le dossier racine des fichiers de vues. La valeur par défaut est le dossier représenté par l'alias `@app/views`. Vous pouvez le définir sous forme de dossier ou comme un [alias](concept-aliases.md) de chemin. + + +#### [[yii\base\Application::vendorPath|vendorPath (chemin des vendeurs)]] + +Cette propriété spécifie le dossier des vendeurs gérés par [Composer](https://getcomposer.org). Il contient toutes les bibliothèques de tierces parties utilisées par l'application, y compris le *framework* Yii. La valeur par défaut est le dossier représenté par `@app/vendor`. + +Vous pouvez configurer cette propriété comme un dossier ou un [alias](concept-aliases.md) de chemin. Lorsque vous modifiez cette propriété, assurez-vous d'ajuster la configuration de Composer en conséquence. + +Pour simplifier l'accès à ce chemin, Yii a prédéfini un alias de chemin nommé `@vendor`. + + +#### [[yii\console\Application::enableCoreCommands|enableCoreCommands (activer les commandes du noyau)]] + +Cette propriété est prise en charge par les [[yii\console\Application|applications de console]] uniquement. Elle spécifie si les commandes du noyau de la version de Yii sont activées ou pas. La valeur par défaut est `true` (vrai). + + +## Événements d'application + +Une application déclenche plusieurs événements tout au long de son cycle de vie pour prendre en compte une requête. Vous pouvez attacher des gestionnaires d'événement à ces événements dans la configuration de l'application de la manière suivante : + +```php +[ + 'on beforeRequest' => function ($event) { + // ... + }, +] +``` + +L'utilisation de la syntaxe `on eventName` (on Non d'événement) est décrite dans la section [Configurations](concept-configurations.md#configuration-format). + +En alternative, vous pouvez attacher les gestionnaires d'événement lors du [processus d'amorçage](runtime-bootstrapping.md) après que l'objet Application a été instancié. Par exemple : + +```php +\Yii::$app->on(\yii\base\Application::EVENT_BEFORE_REQUEST, function ($event) { + // ... +}); +``` + +### [[yii\base\Application::EVENT_BEFORE_REQUEST|EVENT_BEFORE_REQUEST]] + +Cette événement est déclenché *avant* que l'application ne prenne la requête en charge. Le nom réel de l'événement est `beforeRequest`. + +Lorsque cet événement est déclenché, l'objet Application a été configuré et initialisé. C'est donc un bon endroit pour insérer votre code personnalisé via le mécanisme événementiel pour intercepter le processus de prise en charge de la requête. Par exemple, dans le gestionnaire d'événement, vous pouvez définir dynamiquement la propriété [[yii\base\Application::language (langue)]] en fonction de certains paramètres. + + +### [[yii\base\Application::EVENT_AFTER_REQUEST|EVENT_AFTER_REQUEST]] + +Cet événement est déclenché *après* que l'application a fini de prendre la requête en charge mais *avant* que la réponse ne soit envoyée. Le nom réel de l'événement est `afterRequest`. + +Lorsque cet événement est déclenché, la prise en charge de la requête est terminée et vous pouvez profiter de cette opportunité pour effectuer quelques post-traitements de la requête et personnaliser la réponse. + +Notez que le composant [[yii\web\Response|response (réponse)]] déclenche également quelques événements tandis qu'il envoie la réponse au navigateur. Ces événements sont déclenchés *après* cet événement. + +### [[yii\base\Application::EVENT_BEFORE_ACTION|EVENT_BEFORE_ACTION]] + +Cet événement est déclenché *avant* d'exécuter toute [action de contrôleur](structure-controllers.md). +Le nom réel de l'événement est `beforeAction`. +Le paramètre de l'événement est une instance de [[yii\base\ActionEvent]]. Un gestionnaire d'événement peut définir la propriété [[yii\base\ActionEvent::isValid (est valide)]] à `false` pour arrêter l'exécution de l'action. +Par exemple: + +```php +[ + 'on beforeAction' => function ($event) { + if (some condition) { + $event->isValid = false; + } else { + } + }, +] +``` + +Notez que le même événement `beforeAction` est également déclenché par les [modules](structure-modules.md) +et les [contrôleurs](structure-controllers.md).L'objet *Application* est le premier à déclencher cet événement, suivis des modules (s'il en existe) et, pour finir, des contrôleurs. Si un gestionnaire d'événement défini la propriété [[yii\base\ActionEvent::isValid]] à `false`, tous les événements qui devraient suivre ne sont PAS déclenchés. + +### [[yii\base\Application::EVENT_AFTER_ACTION|EVENT_AFTER_ACTION]] + +Cet événement est déclenché *après* que chacune des [actions de contrôleur](structure-controllers.md) a été exécutée. +Le paramètre de l'événement est [[yii\base\ActionEvent]]. Un gestionnaire d'événement peut accéder au résultat de l'action et le modifier via la propriété [[yii\base\ActionEvent::result]]. +Par exemple: + +```php +[ + 'on afterAction' => function ($event) { + if (some condition) { + // modify $event->result + } else { + } + }, +] +``` + +Notez que le même événement `afterAction` est également déclenché par les [modules](structure-modules.md) +et les [contrôleurs](structure-controllers.md). Ces objets déclenchent ces événements dans l'ordre inverse de celui des événements déclenchés par `beforeAction`. En clair, les contrôleurs sont les premiers objets à déclencher cet événement, suivis des modules (s'il en existe) et, finalement, de l'application. + + +## Cycle de vie d'une application + +![Application Lifecycle](images/application-lifecycle.png) + +Lorsqu'un [script d'entrée](structure-entry-scripts.md) est exécuté pour prendre en compte une requête, une application entame le cycle de vie suivant : + +1. Le script d'entrée charge la configuration de l'application sous forme de tableau. +2. Le script d'entrée crée un nouvel objet *Application* : + * Sa méthode [[yii\base\Application::preInit()|preInit()]] est appelée pour configurer quelques propriétés de haute priorité de cette application, comme [[yii\base\Application::basePath|basePath]]. + * Il enregistre [[yii\base\Application::errorHandler|le gestionnaire d'erreurs]]. + * Il configure les propriétés de l'application. + * Sa méthode [[yii\base\Application::init()|init()]] est appelée qui appelle ensuite la méthode + [[yii\base\Application::bootstrap()|bootstrap()]] pour exécuter les composants du processus d'amorçage. +3. Le script d'entrée appelle la méthode [[yii\base\Application::run()]] pour exécuter l'application qui : + * déclenche l'événement [[yii\base\Application::EVENT_BEFORE_REQUEST|EVENT_BEFORE_REQUEST]] ; + * prend en charge la requête: résout la requête en une [route](runtime-routing.md) et ses paramètres associés ; + * crée le module, le contrôleur et l'action spécifiés par la route et exécute l'action ; + * déclenche l'événement [[yii\base\Application::EVENT_AFTER_REQUEST|EVENT_AFTER_REQUEST]] ; + * renvoie la réponse au navigateur. +4. Le script d'entrée reçoit l'état de sortie de l'exécution de l'application et complète le processus de prise en charge de la requête. diff --git a/docs/guide-fr/structure-entry-scripts.md b/docs/guide-fr/structure-entry-scripts.md index 03972e9..001f727 100644 --- a/docs/guide-fr/structure-entry-scripts.md +++ b/docs/guide-fr/structure-entry-scripts.md @@ -1,22 +1,22 @@ Scripts d'entrée ============= -Les scripts d'entrée sont la première chaîne dans le processus de d'amorçage de l'application. Une application (qu'elle -soit une application Web ou une application console) a un unique script de démarrage. Les utilisateurs font des -requêtes au scripts de démarrage qui instancient des instances d'application et leur transmettent les requêtes. +Le script d'entrée est le premier rencontré dans le processus d'amorçage de l'application. Une application (qu'elle +soit une application Web ou une application console) a un unique script d'entrée. Les utilisateurs font des +requêtes au script d'entrée qui instancie un objet *Application* et lui transmet les requêtes. -Les scripts d'entrée pour application Web doivent être placés dans des dossiers accessibles par le Web pour que les +Les scripts d'entrée des applications Web doivent être placés dans des dossiers accessibles par le Web pour que les utilisateurs puissent y accéder. Ils sont souvent nommés `index.php`, mais peuvent également avoir tout autre nom, du moment que les serveurs Web peuvent les trouver. -Les scripts d'entrée pour les applications console sont généralement placés dans le [répertoire de base](structure-applications.md) +Les scripts d'entrée des applications console sont généralement placés dans le [répertoire de base](structure-applications.md) des applications et sont nommés `yii` (avec le suffixe `.php`). Ils doivent être rendus exécutables afin que les utilisateurs puissent lancer des applications console grâce à la commande `./yii [arguments] [options]`. -Les scipts de démarrage effectuent principalement les tâches suivantes : +Les scipts d'entrée effectuent principalement les tâches suivantes : * Définir des constantes globales; -* Enregistrer l'[autoloader Composer](https://getcomposer.org/doc/01-basic-usage.md#autoloading); +* Enregistrer l'[chargeur automatique Composer](https://getcomposer.org/doc/01-basic-usage.md#autoloading); * Inclure le fichier de classe de [[Yii]]; * Charger la configuration de l'application; * Créer et configurer une instance d'[application](structure-applications.md); @@ -25,7 +25,7 @@ Les scipts de démarrage effectuent principalement les tâches suivantes : ## Applications Web -Ce qui suit est le code du script de démarrage du [Modèle Basique d'Application Web](start-installation.md). +Ce qui suit est le code du script d'entrée du [Modèle Basique d'Application Web](start-installation.md). ```php -Les scripts de démarrage sont l'endroit idéal pour définir des constantes globales. Yii supporte les trois constantes suivantes : +Les scripts d'entrée sont l'endroit idéal pour définir des constantes globales. Yii prend en charge les trois constantes suivantes : * `YII_DEBUG` : spécifie si une application tourne en mode de débogage. Si elle est en mode de débogage, une - application loguera plus d'informations, et révélera des piles d'appels d'erreurs détaillées si des exceptions - sont lancées. C'est pour cette raison que le mode de débogage doit être utilisé principalement pendant la phase - de développement. La valeur par défaut de `YII_DEBUG` est faux. -* `YII_ENV` : spécifie sur quel environnement l'application est en train de tourner. Cela a été décrit plus en détails + application enregistrera des journaux plus détaillés, et révélera des piles d'appels d'erreurs détaillées si des exceptions + sont levées. C'est pour cette raison que le mode de débogage doit être utilisé principalement pendant la phase + de développement. La valeur par défaut de `YII_DEBUG` est `false` (faux). +* `YII_ENV` : spécifie dans quel environnement l'application est en train de tourner. Cela est décrit plus en détails dans la section [Configurations](concept-configurations.md#environment-constants). La valeur par défaut de `YII_ENV` - est `'prod'`, ce qui signifie que l'application tourne en environnement de production. + est `'prod'`, ce qui signifie que l'application tourne dans l'environnement de production. * `YII_ENABLE_ERROR_HANDLER` : spécifie si le gestionnaire d'erreurs fourni par Yii doit être activé. La valeur par - défaut de cette constantes est vrai. + défaut de cette constante est `true` (vrai). -Quand on définit une constant, on utilise souvent le code suivant : +Quand on définit une constante, on utilise souvent le code suivant : ```php defined('YII_DEBUG') or define('YII_DEBUG', true); @@ -109,5 +109,5 @@ if (!defined('YII_DEBUG')) { Clairement, le premier est plus succinct et plus aisé à comprendre. -Les définitions de constantes doit être faite au tout début d'un script de démarrage pour qu'elles puissent prendre +Les définitions de constantes doit être faites au tout début d'un script d'entrée pour qu'elles puissent prendre effet quand d'autres fichiers PHP sont inclus. diff --git a/docs/guide-fr/structure-overview.md b/docs/guide-fr/structure-overview.md index 142b805..04aaaba 100644 --- a/docs/guide-fr/structure-overview.md +++ b/docs/guide-fr/structure-overview.md @@ -1,7 +1,7 @@ Vue d'ensemble ======== -Les applications Yii sont organisées suivant le patron de conception +Les applications Yii sont organisées suivant le modèle de conception [model-view-controller (MVC)](http://wikipedia.org/wiki/Model-view-controller). Les [Modèles](structure-models.md) représentent les données, la logique métier et les règles; les [vues](structure-views.md) sont les représentations visuelles des modèles, et les [contrôleurs](structure-controllers.md) prennent une entrée et la convertissent en @@ -9,14 +9,14 @@ commandes pour les [modèles](structure-models.md) et les [vues](structure-views En plus du MVC, les applications Yii ont les entités suivantes : -* [scripts de démarrage](structure-entry-scripts.md): ce sont des scripts PHP qui sont directement accessibles aux - utilisateurs. Ils sont responsables du démarrage d'un cycle de gestion de requête. +* [scripts d'entrée](structure-entry-scripts.md): ce sont des scripts PHP qui sont directement accessibles aux + utilisateurs. Ils sont responsables de l'amorçage d'un cycle de gestion de requête. * [applications](structure-applications.md): ce sont des objets globalement accessibles qui gèrent les composants d'application et les coordonnent pour satisfaire des requêtes. * [composants d'application](structure-application-components.md): ce sont des objets enregistrés avec des applications et qui fournissent différents services pour satisfaire des requêtes. * [modules](structure-modules.md): ce sont des paquets auto-contenus qui contiennent du MVC complet. Une application peut - être organisée en termes de multiples modules. + être organisée en de multiples modules. * [filtres](structure-filters.md): ils représentent du code qui doit être invoqué avant et après la gestion effective de chaque requête par des contrôleurs. * [widgets](structure-widgets.md): ce sont des objets qui peuvent être intégrés dans des [vues](structure-views.md). Ils From 10ba47d841407f3eca1849e6f1724efa5ac70e01 Mon Sep 17 00:00:00 2001 From: Carsten Brandt Date: Mon, 8 Aug 2016 10:39:28 +0200 Subject: [PATCH 131/163] fixed docs in ActiveField --- framework/widgets/ActiveField.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/widgets/ActiveField.php b/framework/widgets/ActiveField.php index 9995755..39465bd 100644 --- a/framework/widgets/ActiveField.php +++ b/framework/widgets/ActiveField.php @@ -481,7 +481,7 @@ class ActiveField extends Component * If you set a custom `id` for the input element, you may need to adjust the [[$selectors]] accordingly. * * @param boolean $enclosedByLabel whether to enclose the radio within the label. - * If true, the method will still use [[template]] to layout the checkbox and the error message + * If true, the method will still use [[template]] to layout the radio button and the error message * except that the radio is enclosed by the label tag. * @return $this the field object itself */ From 85d89e489311e20c626bcb90129c0c86978fcee4 Mon Sep 17 00:00:00 2001 From: Carsten Brandt Date: Mon, 8 Aug 2016 10:47:34 +0200 Subject: [PATCH 132/163] fixed mysql defaul integer display width on unsigned pk fixes #11541 --- framework/CHANGELOG.md | 1 + framework/db/mysql/QueryBuilder.php | 2 +- tests/framework/db/QueryBuilderTest.php | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index 4250e05..5996173 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -18,6 +18,7 @@ Yii Framework 2 Change Log - Bug #12045: Added missing `LEVEL_PROFILE` to `yii\log\Logger::getLevelName()` map (Mak-Di) - Bug #10681: Reverted fix of beforeValidate event calling in `yii.activeForm.js` (silverfire) - Bug #11715: Fixed JS validation when the same model's attribute file input is listed more than once on the same page (uaoleg) +- Bug #11541: Fixed default MySQL integer display width for unsigned primary key (h311ion, rob006, cebe) - Enh #10583: Do not silence session errors in debug mode (samdark) - Enh #11804: Added `yii\behaviors\AttributeTypecastBehavior` for maintaining of strict ActiveRecord attribute types (klimov-paul) - Enh #12048: Improved message extraction command performance (samdark) diff --git a/framework/db/mysql/QueryBuilder.php b/framework/db/mysql/QueryBuilder.php index 065c461..98e0bea 100644 --- a/framework/db/mysql/QueryBuilder.php +++ b/framework/db/mysql/QueryBuilder.php @@ -24,7 +24,7 @@ class QueryBuilder extends \yii\db\QueryBuilder */ public $typeMap = [ Schema::TYPE_PK => 'int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY', - Schema::TYPE_UPK => 'int(11) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY', + Schema::TYPE_UPK => 'int(10) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY', Schema::TYPE_BIGPK => 'bigint(20) NOT NULL AUTO_INCREMENT PRIMARY KEY', Schema::TYPE_UBIGPK => 'bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY', Schema::TYPE_CHAR => 'char(1)', diff --git a/tests/framework/db/QueryBuilderTest.php b/tests/framework/db/QueryBuilderTest.php index 238d76e..b40074b 100644 --- a/tests/framework/db/QueryBuilderTest.php +++ b/tests/framework/db/QueryBuilderTest.php @@ -892,7 +892,7 @@ abstract class QueryBuilderTest extends DatabaseTestCase Schema::TYPE_UPK, $this->primaryKey()->unsigned(), [ - 'mysql' => 'int(11) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY', + 'mysql' => 'int(10) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY', 'postgres' => 'serial NOT NULL PRIMARY KEY', 'sqlite' => 'integer UNSIGNED PRIMARY KEY AUTOINCREMENT NOT NULL', ], From b119b99a665ebf2de82c8f8a2af6f05116fc7d85 Mon Sep 17 00:00:00 2001 From: Dmitriy Makarov Date: Mon, 8 Aug 2016 11:50:13 +0300 Subject: [PATCH 133/163] Added missing verb "to be" (#12097) * Added missing verb "to be" * Typo fix --- docs/guide/helper-html.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/guide/helper-html.md b/docs/guide/helper-html.md index 5382755..357d6b2 100644 --- a/docs/guide/helper-html.md +++ b/docs/guide/helper-html.md @@ -328,7 +328,7 @@ echo Html::getAttributeName('dates[0]'); ## Styles and Scripts -There two methods to generate tags wrapping embedded styles and scripts: +There are two methods to generate tags wrapping embedded styles and scripts: ```php @@ -386,7 +386,7 @@ The first argument is the title. It's not encoded so if you're using data got fr `Html::encode()`. Second argument is what will be in `href` of ` From 2450430a3bb0a145d2d01aee320dbb30f8ba38b5 Mon Sep 17 00:00:00 2001 From: Dmitriy Makarov Date: Mon, 8 Aug 2016 11:54:50 +0300 Subject: [PATCH 134/163] Fix typo [skip ci] (#12103) --- docs/guide/intro-upgrade-from-v1.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/guide/intro-upgrade-from-v1.md b/docs/guide/intro-upgrade-from-v1.md index 9f32584..6cb6f12 100644 --- a/docs/guide/intro-upgrade-from-v1.md +++ b/docs/guide/intro-upgrade-from-v1.md @@ -471,7 +471,7 @@ Active Record Behaviors In 2.0, we have dropped the base behavior class `CActiveRecordBehavior`. If you want to create an Active Record Behavior, you will have to extend directly from `yii\base\Behavior`. If the behavior class needs to respond to some events -of the owner, you have to override the `events()` method like the following, +of the owner, you have to override the `events()` method like the following: ```php namespace app\components; From 144d78ebb46874cd229f5c13ac3ca7ce3d59f1f2 Mon Sep 17 00:00:00 2001 From: Carsten Brandt Date: Mon, 8 Aug 2016 11:53:52 +0200 Subject: [PATCH 135/163] Revert "fixed mysql defaul integer display width on unsigned pk" This reverts commit 85d89e489311e20c626bcb90129c0c86978fcee4 because it is a breaking change. see #11541 --- framework/CHANGELOG.md | 1 - framework/db/mysql/QueryBuilder.php | 2 +- tests/framework/db/QueryBuilderTest.php | 2 +- 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index 5996173..4250e05 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -18,7 +18,6 @@ Yii Framework 2 Change Log - Bug #12045: Added missing `LEVEL_PROFILE` to `yii\log\Logger::getLevelName()` map (Mak-Di) - Bug #10681: Reverted fix of beforeValidate event calling in `yii.activeForm.js` (silverfire) - Bug #11715: Fixed JS validation when the same model's attribute file input is listed more than once on the same page (uaoleg) -- Bug #11541: Fixed default MySQL integer display width for unsigned primary key (h311ion, rob006, cebe) - Enh #10583: Do not silence session errors in debug mode (samdark) - Enh #11804: Added `yii\behaviors\AttributeTypecastBehavior` for maintaining of strict ActiveRecord attribute types (klimov-paul) - Enh #12048: Improved message extraction command performance (samdark) diff --git a/framework/db/mysql/QueryBuilder.php b/framework/db/mysql/QueryBuilder.php index 98e0bea..065c461 100644 --- a/framework/db/mysql/QueryBuilder.php +++ b/framework/db/mysql/QueryBuilder.php @@ -24,7 +24,7 @@ class QueryBuilder extends \yii\db\QueryBuilder */ public $typeMap = [ Schema::TYPE_PK => 'int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY', - Schema::TYPE_UPK => 'int(10) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY', + Schema::TYPE_UPK => 'int(11) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY', Schema::TYPE_BIGPK => 'bigint(20) NOT NULL AUTO_INCREMENT PRIMARY KEY', Schema::TYPE_UBIGPK => 'bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY', Schema::TYPE_CHAR => 'char(1)', diff --git a/tests/framework/db/QueryBuilderTest.php b/tests/framework/db/QueryBuilderTest.php index b40074b..238d76e 100644 --- a/tests/framework/db/QueryBuilderTest.php +++ b/tests/framework/db/QueryBuilderTest.php @@ -892,7 +892,7 @@ abstract class QueryBuilderTest extends DatabaseTestCase Schema::TYPE_UPK, $this->primaryKey()->unsigned(), [ - 'mysql' => 'int(10) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY', + 'mysql' => 'int(11) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY', 'postgres' => 'serial NOT NULL PRIMARY KEY', 'sqlite' => 'integer UNSIGNED PRIMARY KEY AUTOINCREMENT NOT NULL', ], From 10806a65a40b4a790d601bfa898ef22d858ea0be Mon Sep 17 00:00:00 2001 From: Carsten Brandt Date: Mon, 8 Aug 2016 13:14:22 +0200 Subject: [PATCH 136/163] validate input in REST serializer fixes #12107 --- framework/CHANGELOG.md | 2 + framework/rest/Serializer.php | 4 +- tests/framework/rest/SerializerTest.php | 148 ++++++++++++++++++++++++++++++++ 3 files changed, 152 insertions(+), 2 deletions(-) create mode 100644 tests/framework/rest/SerializerTest.php diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index 4250e05..42d0a4e 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -28,6 +28,8 @@ Yii Framework 2 Change Log - Bug #12053: `./yii migrate/create` was generating wrong code when using `bigPrimaryKey` (VojtechH, samdark) - Bug #11907: Fixed `yii\helpers\Console::getScreenSize()` on Windows was giving out width and height swapped (Spell6inder, samdark, cebe) - Bug #11973: Fixed `yii\helpers\BaseHtml::getAttributeValue()` to work with `items[]` notation correctly (silverfire) +- Bug #12107: Fixed REST Serializer to validate input for 'expand' and 'fields' parameter, which crashed on array input (njspok, cebe) + 2.0.9 July 11, 2016 ------------------- diff --git a/framework/rest/Serializer.php b/framework/rest/Serializer.php index 3208e0d..4f70235 100644 --- a/framework/rest/Serializer.php +++ b/framework/rest/Serializer.php @@ -159,8 +159,8 @@ class Serializer extends Component $expand = $this->request->get($this->expandParam); return [ - preg_split('/\s*,\s*/', $fields, -1, PREG_SPLIT_NO_EMPTY), - preg_split('/\s*,\s*/', $expand, -1, PREG_SPLIT_NO_EMPTY), + is_string($fields) ? preg_split('/\s*,\s*/', $fields, -1, PREG_SPLIT_NO_EMPTY) : [], + is_string($expand) ? preg_split('/\s*,\s*/', $expand, -1, PREG_SPLIT_NO_EMPTY) : [], ]; } diff --git a/tests/framework/rest/SerializerTest.php b/tests/framework/rest/SerializerTest.php new file mode 100644 index 0000000..ce5d7c3 --- /dev/null +++ b/tests/framework/rest/SerializerTest.php @@ -0,0 +1,148 @@ +mockApplication([ + 'components' => [ + 'request' => [ + 'scriptUrl' => '/index.php', + ], + ], + + ], 'yii\web\Application'); + + TestModel::$fields = ['field1', 'field2']; + TestModel::$extraFields = []; + } + + public function testSerializeModelErrors() + { + // TODO + } + + public function testSerializeModelData() + { + $serializer = new Serializer(); + $model = new TestModel(); + + $this->assertSame([ + 'field1' => 'test', + 'field2' => 2, + ], $serializer->serialize($model)); + + TestModel::$fields = ['field1']; + TestModel::$extraFields = []; + + $this->assertSame([ + 'field1' => 'test', + ], $serializer->serialize($model)); + + TestModel::$fields = ['field1']; + TestModel::$extraFields = ['field2']; + + $this->assertSame([ + 'field1' => 'test', + ], $serializer->serialize($model)); + } + + public function testExpand() + { + $serializer = new Serializer(); + $model = new TestModel(); + + TestModel::$fields = ['field1', 'field2']; + TestModel::$extraFields = ['extraField1']; + + $this->assertSame([ + 'field1' => 'test', + 'field2' => 2, + ], $serializer->serialize($model)); + + \Yii::$app->request->setQueryParams(['expand' => 'extraField1']); + $this->assertSame([ + 'field1' => 'test', + 'field2' => 2, + 'extraField1' => 'testExtra', + ], $serializer->serialize($model)); + + \Yii::$app->request->setQueryParams(['expand' => 'extraField1,extraField2']); + $this->assertSame([ + 'field1' => 'test', + 'field2' => 2, + 'extraField1' => 'testExtra', + ], $serializer->serialize($model)); + + \Yii::$app->request->setQueryParams(['expand' => 'field1,extraField2']); + $this->assertSame([ + 'field1' => 'test', + 'field2' => 2, + ], $serializer->serialize($model)); + } + + /** + * https://github.com/yiisoft/yii2/issues/12107 + */ + public function testExpandInvalidInput() + { + $serializer = new Serializer(); + $model = new TestModel(); + + \Yii::$app->request->setQueryParams(['expand' => ['field1,extraField2']]); + $this->assertSame([ + 'field1' => 'test', + 'field2' => 2, + ], $serializer->serialize($model)); + + \Yii::$app->request->setQueryParams(['fields' => ['field1,extraField2']]); + $this->assertSame([ + 'field1' => 'test', + 'field2' => 2, + ], $serializer->serialize($model)); + + \Yii::$app->request->setQueryParams(['fields' => ['field1,extraField2'], 'expand' => ['field1,extraField2']]); + $this->assertSame([ + 'field1' => 'test', + 'field2' => 2, + ], $serializer->serialize($model)); + } + + public function testSerializeDataProvider() + { + // TODO + } + + +} + +class TestModel extends Model +{ + public static $fields = ['field1', 'field2']; + public static $extraFields = []; + + public $field1 = 'test'; + public $field2 = 2; + public $extraField1 = 'testExtra'; + public $extraField2 = 42; + + public function fields() + { + return static::$fields; + } + + public function extraFields() + { + return static::$extraFields; + } +} \ No newline at end of file From 552ad141b66d63e1fbe245941e702ff7f5a1ec78 Mon Sep 17 00:00:00 2001 From: Dmitriy Makarov Date: Mon, 8 Aug 2016 14:20:22 +0300 Subject: [PATCH 137/163] Added SyslogTarget tests of the following methods: (#12093) - export - formatMessage --- tests/framework/log/SyslogTargetTest.php | 208 +++++++++++++++++++++++++++++++ 1 file changed, 208 insertions(+) create mode 100644 tests/framework/log/SyslogTargetTest.php diff --git a/tests/framework/log/SyslogTargetTest.php b/tests/framework/log/SyslogTargetTest.php new file mode 100644 index 0000000..a1bbf52 --- /dev/null +++ b/tests/framework/log/SyslogTargetTest.php @@ -0,0 +1,208 @@ + + */ + +namespace yii\log { + + function openlog() { + \yiiunit\framework\log\SyslogTargetTest::openlog(func_get_args()); + } + + function syslog() { + \yiiunit\framework\log\SyslogTargetTest::syslog(func_get_args()); + } + + function closelog() { + \yiiunit\framework\log\SyslogTargetTest::closelog(func_get_args()); + } +} + +namespace yiiunit\framework\log { + + use PHPUnit_Framework_MockObject_MockObject; + use yii\helpers\VarDumper; + use yiiunit\TestCase; + use yii\log\Logger; + + /** + * Class SyslogTargetTest + * + * @package yiiunit\framework\log + * @group log + */ + class SyslogTargetTest extends TestCase + { + /** + * Array of static functions + * + * @var array + */ + static $functions = []; + + /** + * @var PHPUnit_Framework_MockObject_MockObject + */ + protected $syslogTarget; + + /** + * Set up syslogTarget as the mock object + */ + protected function setUp() + { + $this->syslogTarget = $this->getMock('yii\\log\\SyslogTarget', ['getMessagePrefix']); + } + + /** + * @covers yii\log\SyslogTarget::export() + */ + public function testExport() + { + $identity = 'identity string'; + $facility = 'facility string'; + $messages = [ + ['info message', Logger::LEVEL_INFO], + ['error message', Logger::LEVEL_ERROR], + ['warning message', Logger::LEVEL_WARNING], + ['trace message', Logger::LEVEL_TRACE], + ['profile message', Logger::LEVEL_PROFILE], + ['profile begin message', Logger::LEVEL_PROFILE_BEGIN], + ['profile end message', Logger::LEVEL_PROFILE_END], + ]; + $syslogTarget = $this + ->getMock('yii\\log\\SyslogTarget', ['openlog', 'syslog', 'formatMessage', 'closelog']); + + $syslogTarget->identity = $identity; + $syslogTarget->facility = $facility; + $syslogTarget->messages = $messages; + + $syslogTarget->expects($this->once()) + ->method('openlog') + ->with( + $this->equalTo($identity), + $this->equalTo(LOG_ODELAY | LOG_PID), + $this->equalTo($facility) + ); + + $syslogTarget->expects($this->exactly(7)) + ->method('formatMessage') + ->withConsecutive( + [$this->equalTo($messages[0])], + [$this->equalTo($messages[1])], + [$this->equalTo($messages[2])], + [$this->equalTo($messages[3])], + [$this->equalTo($messages[4])], + [$this->equalTo($messages[5])], + [$this->equalTo($messages[6])] + )->willReturnMap([ + [$messages[0], 'formatted message 1'], + [$messages[1], 'formatted message 2'], + [$messages[2], 'formatted message 3'], + [$messages[3], 'formatted message 4'], + [$messages[4], 'formatted message 5'], + [$messages[5], 'formatted message 6'], + [$messages[6], 'formatted message 7'], + ]); + + $syslogTarget->expects($this->exactly(7)) + ->method('syslog') + ->withConsecutive( + [$this->equalTo(LOG_INFO), $this->equalTo('formatted message 1')], + [$this->equalTo(LOG_ERR), $this->equalTo('formatted message 2')], + [$this->equalTo(LOG_WARNING), $this->equalTo('formatted message 3')], + [$this->equalTo(LOG_DEBUG), $this->equalTo('formatted message 4')], + [$this->equalTo(LOG_DEBUG), $this->equalTo('formatted message 5')], + [$this->equalTo(LOG_DEBUG), $this->equalTo('formatted message 6')], + [$this->equalTo(LOG_DEBUG), $this->equalTo('formatted message 7')] + ); + + $syslogTarget->expects($this->once())->method('closelog'); + + static::$functions['openlog'] = function ($arguments) use ($syslogTarget) { + $this->assertCount(3, $arguments); + list($identity, $option, $facility) = $arguments; + $syslogTarget->openlog($identity, $option, $facility); + }; + + static::$functions['syslog'] = function ($arguments) use ($syslogTarget) { + $this->assertCount(2, $arguments); + list($priority, $message) = $arguments; + $syslogTarget->syslog($priority, $message); + }; + + static::$functions['closelog'] = function ($arguments) use ($syslogTarget) { + $this->assertCount(0, $arguments); + $syslogTarget->closelog(); + }; + + $syslogTarget->export(); + } + + /** + * @param $name + * @param $arguments + * @return mixed + */ + public static function __callStatic($name, $arguments) { + if (isset(static::$functions[$name]) && is_callable(static::$functions[$name])) { + $arguments = isset($arguments[0]) ? $arguments[0] : $arguments; + return forward_static_call(static::$functions[$name], $arguments); + } + static::fail("Function '$name' has not implemented yet!"); + } + + /** + * @covers yii\log\SyslogTarget::formatMessage() + */ + public function testFormatMessageWhereTextIsString() + { + $message = ['text', Logger::LEVEL_INFO, 'category', 'timestamp']; + + $this->syslogTarget + ->expects($this->once()) + ->method('getMessagePrefix') + ->with($this->equalTo($message)) + ->willReturn('some prefix'); + + $result = $this->syslogTarget->formatMessage($message); + $this->assertEquals('some prefix[info][category] text', $result); + } + + /** + * @covers yii\log\SyslogTarget::formatMessage() + */ + public function testFormatMessageWhereTextIsException() + { + $exception = new \Exception('exception text'); + $message = [$exception, Logger::LEVEL_INFO, 'category', 'timestamp']; + + $this->syslogTarget + ->expects($this->once()) + ->method('getMessagePrefix') + ->with($this->equalTo($message)) + ->willReturn('some prefix'); + + $result = $this->syslogTarget->formatMessage($message); + $this->assertEquals('some prefix[info][category] ' . (string) $exception, $result); + } + + /** + * @covers yii\log\SyslogTarget::formatMessage() + */ + public function testFormatMessageWhereTextIsNotStringAndNotThrowable() + { + $text = new \stdClass(); + $text->var = 'some text'; + $message = [$text, Logger::LEVEL_ERROR, 'category', 'timestamp']; + + $this->syslogTarget + ->expects($this->once()) + ->method('getMessagePrefix') + ->with($this->equalTo($message)) + ->willReturn('some prefix'); + + $result = $this->syslogTarget->formatMessage($message); + $this->assertEquals('some prefix[error][category] ' . VarDumper::export($text), $result); + } + } +} From ef0658726fc4f6c5a5aaaff0d4bcede4f5e52942 Mon Sep 17 00:00:00 2001 From: Carsten Brandt Date: Mon, 8 Aug 2016 13:34:57 +0200 Subject: [PATCH 138/163] Revert "Revert "fixed mysql defaul integer display width on unsigned pk"" This reverts commit 144d78ebb46874cd229f5c13ac3ca7ce3d59f1f2. fixes #11541 --- framework/CHANGELOG.md | 1 + framework/db/mysql/QueryBuilder.php | 2 +- tests/framework/db/QueryBuilderTest.php | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index 42d0a4e..8a0ce3e 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -18,6 +18,7 @@ Yii Framework 2 Change Log - Bug #12045: Added missing `LEVEL_PROFILE` to `yii\log\Logger::getLevelName()` map (Mak-Di) - Bug #10681: Reverted fix of beforeValidate event calling in `yii.activeForm.js` (silverfire) - Bug #11715: Fixed JS validation when the same model's attribute file input is listed more than once on the same page (uaoleg) +- Bug #11541: Fixed default MySQL integer display width for unsigned primary key (h311ion, rob006, cebe) - Enh #10583: Do not silence session errors in debug mode (samdark) - Enh #11804: Added `yii\behaviors\AttributeTypecastBehavior` for maintaining of strict ActiveRecord attribute types (klimov-paul) - Enh #12048: Improved message extraction command performance (samdark) diff --git a/framework/db/mysql/QueryBuilder.php b/framework/db/mysql/QueryBuilder.php index 065c461..98e0bea 100644 --- a/framework/db/mysql/QueryBuilder.php +++ b/framework/db/mysql/QueryBuilder.php @@ -24,7 +24,7 @@ class QueryBuilder extends \yii\db\QueryBuilder */ public $typeMap = [ Schema::TYPE_PK => 'int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY', - Schema::TYPE_UPK => 'int(11) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY', + Schema::TYPE_UPK => 'int(10) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY', Schema::TYPE_BIGPK => 'bigint(20) NOT NULL AUTO_INCREMENT PRIMARY KEY', Schema::TYPE_UBIGPK => 'bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY', Schema::TYPE_CHAR => 'char(1)', diff --git a/tests/framework/db/QueryBuilderTest.php b/tests/framework/db/QueryBuilderTest.php index 238d76e..b40074b 100644 --- a/tests/framework/db/QueryBuilderTest.php +++ b/tests/framework/db/QueryBuilderTest.php @@ -892,7 +892,7 @@ abstract class QueryBuilderTest extends DatabaseTestCase Schema::TYPE_UPK, $this->primaryKey()->unsigned(), [ - 'mysql' => 'int(11) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY', + 'mysql' => 'int(10) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY', 'postgres' => 'serial NOT NULL PRIMARY KEY', 'sqlite' => 'integer UNSIGNED PRIMARY KEY AUTOINCREMENT NOT NULL', ], From bbbb98626fab6019843181c490f794db3b4900b9 Mon Sep 17 00:00:00 2001 From: Sergey Makinen Date: Mon, 8 Aug 2016 23:58:39 +0300 Subject: [PATCH 139/163] HttpCache no longer returns 304 HTTP code when callbacks return null (#12099) --- framework/CHANGELOG.md | 1 + framework/filters/HttpCache.php | 18 +++++++++++------- tests/framework/filters/HttpCacheTest.php | 10 +++++++++- 3 files changed, 21 insertions(+), 8 deletions(-) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index 8a0ce3e..48f5334 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -26,6 +26,7 @@ Yii Framework 2 Change Log - Enh #11979: Added `yii\mutex\OracleMutex` which implements mutex "lock" mechanism via Oracle locks (zlakomanoff) - Enh #12082: Used `jQuery.on(` instead of event method to ensure forwards compatibility (newerton) - Enh #12028: Add -h|--help option to console command to display help information (pana1990) +- Enh #12099: HttpCache no longer returns 304 HTTP code when callbacks return null (sergeymakinen) - Bug #12053: `./yii migrate/create` was generating wrong code when using `bigPrimaryKey` (VojtechH, samdark) - Bug #11907: Fixed `yii\helpers\Console::getScreenSize()` on Windows was giving out width and height swapped (Spell6inder, samdark, cebe) - Bug #11973: Fixed `yii\helpers\BaseHtml::getAttributeValue()` to work with `items[]` notation correctly (silverfire) diff --git a/framework/filters/HttpCache.php b/framework/filters/HttpCache.php index 8df842f..072df0d 100644 --- a/framework/filters/HttpCache.php +++ b/framework/filters/HttpCache.php @@ -130,7 +130,9 @@ class HttpCache extends ActionFilter } if ($this->etagSeed !== null) { $seed = call_user_func($this->etagSeed, $action, $this->params); - $etag = $this->generateEtag($seed); + if ($seed !== null) { + $etag = $this->generateEtag($seed); + } } $this->sendCacheControlHeader(); @@ -140,20 +142,22 @@ class HttpCache extends ActionFilter $response->getHeaders()->set('Etag', $etag); } - if ($this->validateCache($lastModified, $etag)) { + $cacheValid = $this->validateCache($lastModified, $etag); + // https://tools.ietf.org/html/rfc7232#section-4.1 + if ($lastModified !== null && (!$cacheValid || ($cacheValid && $etag === null))) { + $response->getHeaders()->set('Last-Modified', gmdate('D, d M Y H:i:s', $lastModified) . ' GMT'); + } + if ($cacheValid) { $response->setStatusCode(304); return false; } - if ($lastModified !== null) { - $response->getHeaders()->set('Last-Modified', gmdate('D, d M Y H:i:s', $lastModified) . ' GMT'); - } - return true; } /** * Validates if the HTTP cache contains valid content. + * If both Last-Modified and ETag are null, returns false. * @param integer $lastModified the calculated Last-Modified value in terms of a UNIX timestamp. * If null, the Last-Modified header will not be validated. * @param string $etag the calculated ETag value. If null, the ETag header will not be validated. @@ -168,7 +172,7 @@ class HttpCache extends ActionFilter } elseif (isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])) { return $lastModified !== null && @strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) >= $lastModified; } else { - return $etag === null && $lastModified === null; + return false; } } diff --git a/tests/framework/filters/HttpCacheTest.php b/tests/framework/filters/HttpCacheTest.php index ecd354d..c2234d7 100644 --- a/tests/framework/filters/HttpCacheTest.php +++ b/tests/framework/filters/HttpCacheTest.php @@ -38,7 +38,7 @@ class HttpCacheTest extends \yiiunit\TestCase $method->setAccessible(true); unset($_SERVER['HTTP_IF_MODIFIED_SINCE'], $_SERVER['HTTP_IF_NONE_MATCH']); - $this->assertTrue($method->invoke($httpCache, null, null)); + $this->assertFalse($method->invoke($httpCache, null, null)); $this->assertFalse($method->invoke($httpCache, 0, null)); $this->assertFalse($method->invoke($httpCache, 0, '"foo"')); @@ -65,6 +65,14 @@ class HttpCacheTest extends \yiiunit\TestCase { $httpCache = new HttpCache; $httpCache->weakEtag = false; + + $httpCache->etagSeed = function($action, $params) { + return null; + }; + $httpCache->beforeAction(null); + $response = Yii::$app->getResponse(); + $this->assertFalse($response->getHeaders()->offsetExists('ETag')); + $httpCache->etagSeed = function($action, $params) { return ''; }; From 777a1528f59613d09ccba10ada4e9b72ed8ee233 Mon Sep 17 00:00:00 2001 From: didgugan Date: Tue, 9 Aug 2016 00:39:47 +0300 Subject: [PATCH 140/163] Fixed typo in Russian translation [skip ci] --- docs/guide-ru/structure-applications.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/guide-ru/structure-applications.md b/docs/guide-ru/structure-applications.md index 37bf9ec..12e9ddb 100644 --- a/docs/guide-ru/structure-applications.md +++ b/docs/guide-ru/structure-applications.md @@ -589,7 +589,7 @@ $width = \Yii::$app->params['thumbnail.size'][0]; Когда [входной скрипт](structure-entry-scripts.md) выполняется для обработки запроса, приложение будет развиваться согласно следующему жизненному циклу: -1. Входной скрипт загружает конфигурацию приложения в качества массива; +1. Входной скрипт загружает конфигурацию приложения в качестве массива; 2. Входной скрипт создаёт новый объект приложения: * Вызывается метод [[yii\base\Application::preInit()|preInit()]], который настраивает некоторые жизненно важные свойства приложения, такие как [[yii\base\Application::basePath|basePath]]; From aacc70d9c80201888c72d6ec4160586ba3fa3660 Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Tue, 9 Aug 2016 00:44:00 +0300 Subject: [PATCH 141/163] Fixes #12113: Adjusted controllers guide as suggested --- docs/guide/structure-controllers.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/guide/structure-controllers.md b/docs/guide/structure-controllers.md index 8bb6697..ee5fb8a 100644 --- a/docs/guide/structure-controllers.md +++ b/docs/guide/structure-controllers.md @@ -57,8 +57,8 @@ according to the requested model ID; If the model is loaded successfully, it wil a [view](structure-views.md) named `view`. Otherwise, it will throw an exception. In the `create` action (defined by the `actionCreate()` method), the code is similar. It first tries to populate -the [model](structure-models.md) using the request data and save the model. If both succeed it will redirect -the browser to the `view` action with the ID of the newly created model. Otherwise it will display +a new instance of the [model](structure-models.md) using the request data and save the model. If both succeed it +will redirect the browser to the `view` action with the ID of the newly created model. Otherwise it will display the `create` view through which users can provide the needed input. From c52053de77d8fe0dc08032b0eaa375bd7eb90893 Mon Sep 17 00:00:00 2001 From: jaaf Date: Mon, 8 Aug 2016 23:51:10 +0200 Subject: [PATCH 142/163] Adding 2 French translations (tutorial-i18n.md and structure-application-components.md) [skip ci] (#12112) --- docs/guide-fr/structure-application-components.md | 97 ++++ docs/guide-fr/tutorial-i18n.md | 655 ++++++++++++++++++++++ 2 files changed, 752 insertions(+) create mode 100644 docs/guide-fr/structure-application-components.md create mode 100644 docs/guide-fr/tutorial-i18n.md diff --git a/docs/guide-fr/structure-application-components.md b/docs/guide-fr/structure-application-components.md new file mode 100644 index 0000000..0ac3e72 --- /dev/null +++ b/docs/guide-fr/structure-application-components.md @@ -0,0 +1,97 @@ +Composants d'application +====================== +Les applications sont des [(localisateurs de services (service locators)](concept-service-locator.md). Elles hébergent un jeu composants appelés « composants d'application » qui procurent différents services pour la prise en charge des requêtes. Par exemple, le composant `urlManager` (gestionnaire d'url) est chargé de router les requêtes Web vers les contrôleurs appropriés ; le composant `db` (base de données) fournit les services relatifs à la base de données ; et ainsi de suite. + +Chaque composant d'application possède un identifiant unique qui le distingue des autres composants d'application de la même application. Vous pouvez accéder à un composant d'application via l'expression : + +```php +\Yii::$app->componentID +``` + +Par exemple, vous pouvez utiliser `\Yii::$app->db` pour obtenir la [[yii\db\Connection|connexion à la base de données]], et `\Yii::$app->cache` pour accéder au [[yii\caching\Cache|cache primaire]] enregistré dans l'application. + +Un composant d'application est créé la première fois qu'on veut y accéder en utilisant l'expression ci-dessus. Les accès ultérieurs retournent la même instance du composant. + +Les composants d'application peuvent être n'importe quel objet. Vous pouvez les enregistrer en configurant la propriété [[yii\base\Application::components]] dans la [configuration de l'application](structure-applications.md#application-configurations). + +Par exemple, + +```php +[ + 'components' => [ + // enregistre le composant "cache" à partir du nom de classe + 'cache' => 'yii\caching\ApcCache', + + // enregistre le composant "db" à l'aide d'un tableau de configuration + 'db' => [ + 'class' => 'yii\db\Connection', + 'dsn' => 'mysql:host=localhost;dbname=demo', + 'username' => 'root', + 'password' => '', + ], + + // enregistre le composant "search" en utilisant une fonction anonyme + 'search' => function () { + return new app\components\SolrService; + }, + ], +] +``` + +> Info: bien que vous puissiez enregistrer autant de composants d'application que vous le désirez, vous devriez le faire avec discernement. Les composants d'application sont comme les variables globales, une utilisation trop importante de composants d'application est susceptible de rendre votre code plus difficile à tester et à maintenir. Dans beaucoup de cas, vous pouvez simplement créer un composant localement et l'utiliser lorsque vous en avez besoin. + + +## Composants du processus d'amorçage + +Comme il a été dit plus haut, un composant d'application n'est instancié que lorsqu'on y accède pour la première fois. S'il n'est pas du tout accédé dans le traitement de la requête, il n'est pas instancié. Parfois, vous désirez peut être instancier un composant d'application pour chacune des requêtes, même s'il n'est pas explicitement accédé. +Pour cela, vous pouvez lister son identifiant (ID) dans la propriété [[yii\base\Application::bootstrap|bootstrap]] de l'application. + +Par exemple, la configuration d'application suivante garantit que le composant `log` est toujours chargé. + +```php +[ + 'bootstrap' => [ + 'log', + ], + 'components' => [ + 'log' => [ + // configuration pour le composant "log" + ], + ], +] +``` + +## Composants d'application du noyau + +Yii définit un jeu de composants d'application dit *core application components* (composants d'application du noyau ou du cœur) avec des identifiants fixés et des configurations par défaut. Par exemple, le composant [[yii\web\Application::request|request (requête)]] est utilisé pour collecter les informations sur une requête utilisateur et la résoudre en une [route](runtime-routing.md); le composant [[yii\base\Application::db|db (base de données)]] représente une connexion à une base de données à l'aide de laquelle vous pouvez effectuer des requêtes de base de données. C'est à l'aide des ces composants d'application du noyau que les applications Yii sont en mesure de prendre en charge les requêtes des utilisateurs. + +Vous trouverez ci-après la liste des composants d'application prédéfinis du noyau. Vous pouvez les configurer et les personnaliser comme tout composant d'application. Lorsque vous configurez une composant d'application du noyau, vous n'avez pas besoin de spécifier sa classe, celle par défaut est utilisée. + + +* [[yii\web\AssetManager|assetManager (gestionnaire de ressources]]: gère les paquets de ressources et la publication des ressources. + Reportez-vous à la section [Gestion des ressources](structure-assets.md) pour plus de détails. +* [[yii\db\Connection|db (base de données)]]: représente une connexion à une base de données à l'aide de laquelle vous pouvez effectuer des requêtes de base de données. + Notez que lorsque vous configurez ce composant, vous devez spécifier la classe de composant tout comme les autres propriétés de composant, telle que [[yii\db\Connection::dsn]]. + Reportez-vous à la section [Objets d'accès aux données](db-dao.md) pour plus de détails. +* [[yii\base\Application::errorHandler|errorHandler (gestionnaire d'erreurs) ]]: gère les erreurs PHP et les exceptions. + Reportez-vous à la section [Gestion des erreurs](runtime-handling-errors.md) pour plus de détails. +* [[yii\i18n\Formatter|formatter ]]: formate les données lorsqu'elles sont présentées à l'utilisateur final. Par exemple, un nombre peut être affiché avec un séparateur de milliers, une date affichée dans un format long, etc. + Reportez-vous à la section [Formatage des données](output-formatting.md) pour plus de détails. +* [[yii\i18n\I18N|i18n]]: prend en charge la traduction et le formatage des messages. + Reportez-vous à la section [Internationalisation](tutorial-i18n.md) pour plus de détails. +* [[yii\log\Dispatcher|log]]: gère les journaux cibles. + Reportez-vous à la section [Journaux](runtime-logging.md) pour plus de détails. +* [[yii\swiftmailer\Mailer|mail]]: prend en charge la composition et l'envoi des courriels. + Reportez-vous à la section [Mailing](tutorial-mailing.md) pour plus de détails. +* [[yii\base\Application::response|response]]: représente la réponse qui est adressée à l'utilisateur final. + Reportez-vous à la section [Réponses](runtime-responses.md) pour plus de détails. +* [[yii\base\Application::request|request]]: représente la requête reçue de l'utilisateur final. + Reportez-vous à la section [Requests](runtime-requests.md) pour plus de détails. +* [[yii\web\Session|session]]: représente les informations de session. Ce composant n'est disponible que dans les [[yii\web\Application|applications Web]]. + Reportez-vous à la section [Sessions et Cookies](runtime-sessions-cookies.md) pour plus de détails. +* [[yii\web\UrlManager|urlManager (gestionnaire d'url)]]: prend en charge l'analyse des URL et leur création. + Reportez-vous à la section [Analyse et création d'URL](runtime-routing.md) pour plus de détails. +* [[yii\web\User|user]]: représente les informations d'authentification de l'utilisateur. Ce composant n'est disponible que dans les [[yii\web\Application|applications Web]]. + Reportez-vous à la section [Authentification](security-authentication.md) pour plus de détails. +* [[yii\web\View|view]]: prend en charge le rendu des vues. + Reportez-vous à la section [Vues](structure-views.md) pour plus de détails. diff --git a/docs/guide-fr/tutorial-i18n.md b/docs/guide-fr/tutorial-i18n.md new file mode 100644 index 0000000..228a422 --- /dev/null +++ b/docs/guide-fr/tutorial-i18n.md @@ -0,0 +1,655 @@ +Internationalisation +==================== + +Le terme *Internationalisation* (I18N) fait référence au processus de conception d'une application logicielle qui permet son adaptation à diverses langues et régions sans intervenir dans le code. Pour des applications Web, la chose est particulièrement importante puisque celle-ci peut concerner des utilisateurs potentiels répartis sur toute la surface de la terre. Yii met à votre disposition tout un arsenal de fonctionnalités qui prennent en charge la traduction des messages et des vues, ainsi que le formatage des nombres et des dates. + + +## Locale et Langue + +Une *locale* est un jeu de paramètres qui définissent la langue de l'utilisateur, son pays et des préférences spéciales que celui-ci désire voir dans l'interface utilisateur. + +Elle est généralement identifiée par un identifiant (ID), lui-même constitué par un identifiant de langue et un identifiant de région. Par exemple, l'identifiant `en-US` représente la locale *anglais* pour la langue et *États-Unis* pour la région. + +Pour assurer la cohérence, tous les identifiants utilisés par les application Yii doivent être présentés sous leur forme canonique `ll-CC`, où `ll` est un code à 2 ou 3 lettres pour la langue conforme à la norme [ISO-639](http://www.loc.gov/standards/iso639-2/) et `CC` est un code à deux lettres pour le pays conforme à la norme [ISO-3166](http://www.iso.org/iso/en/prods-services/iso3166ma/02iso-3166-code-lists/list-en1.html). +Pour plus de détails sur les locales, reportez-vous à la [documentation du projet ICU](http://userguide.icu-project.org/locale#TOC-The-Locale-Concept). + +Dans Yii, nous utilisons souvent le mot « langue » pour faire référence à la locale. + +Une application Yii utilise deux langues : la [[yii\base\Application::$sourceLanguage|langue source ]] et la [[yii\base\Application::$language|langue cible]]. La première fait référence à la langue dans laquelle les messages sont rédigés dans le code source, tandis que la deuxième est celle qui est utilisée pour présenter les textes à l'utilisateur final. +Pour l'essentiel, le service appelé *message translation service*(service de traduction des messages) assure la traduction d'un message textuel de la langue source vers la langue cible. + +Vous pouvez configurer les langues de l'application dans la configuration de la manière suivante : + + +```php +return [ + // définit la langue cible comme étant le français-France + 'language' => 'fr-FR', + + // définit la langue source comme étant l'anglais États-Unis + 'sourceLanguage' => 'en-US', + + ...... +]; +``` + +La valeur par défaut pour la [[yii\base\Application::$sourceLanguage|langue source]] est `en-US`, qui signifie « anglais États-Unis ». Il est recommandé de conserver cette valeur sans la changer car il est généralement plus facile de trouver des gens capables de traduire de l'anglais vers d'autres langues que d'une langue non anglaise vers une autre langue. + +Il est souvent nécessaire de définir la [[yii\base\Application::$language|langue cible]] de façon dynamique en se basant sur différents facteurs tels que, par exemple, les préférences linguistiques de l'utilisateur final. Au lieu de la définir dans la configuration de l'application vous pouvez utiliser l'instruction suivante pour changer la langue cible : + +```php +// modifier la langue cible pour qu'elle soit français-FRANCE +\Yii::$app->language = 'fr-FR'; +``` + +> Tip: si votre langue source change selon les différentes parties de votre code, vous pouvez modifier la valeur de la langue source localement comme c'est expliqué dans la section suivante. + +## Traduction des messages + +Le service de traduction des messages traduit un message textuel d'une langue (généralement la [[yii\base\Application::$sourceLanguage|langue source]]) vers une autre langue (généralement la [[yii\base\Application::$language|langue cible]]). Il effectue la traduction en recherchant le message à traduire dans une source de messages qui stocke les messages originaux et les messages traduits. +Si le message est trouvé, le message traduit correspondant est renvoyé ; dans le cas contraire, le message original est renvoyé sans traduction. + +Pour utiliser le service de traduction des messages, vous devez principalement effectuer les opérations suivantes : + +* Envelopper le message textuel à traduire dans un appel à la méthode [[Yii::t()]] ; +* Configurer une ou plusieurs sources de messages dans lesquelles le service de traduction des messages peut rechercher des traductions ; +* Confier aux traducteurs le soin de traduire les messages et de les stocker dans les sources de messages. + +La méthode [[Yii::t()]] peut être utilisée comme le montre l'exemple suivant : + +```php +echo \Yii::t('app', 'This is a string to translate!'); +``` + +où le deuxième paramètre fait référence au message textuel à traduire, tandis que le premier paramètre fait référence au nom de la catégorie à laquelle le message appartient. + +La méthode [[Yii::t()]] appelle la méthode `translate` du [composant d'application](structure-application-components.md) `i18n` pour assurer le travail réel de traduction. Le composant peut être configuré dans la configuration de l'application de la manière suivante : + +```php +'components' => [ + // ... + 'i18n' => [ + 'translations' => [ + 'app*' => [ + 'class' => 'yii\i18n\PhpMessageSource', + //'basePath' => '@app/messages', + //'sourceLanguage' => 'en-US', + 'fileMap' => [ + 'app' => 'app.php', + 'app/error' => 'error.php', + ], + ], + ], + ], +], +``` + +Dans le code qui précède, une source de messages prise en charge par [[yii\i18n\PhpMessageSource]] est configurée. Le motif `app*` indique que toutes les catégories de messages dont les noms commencent par `app` doivent être traduites en utilisant cette source de messages. La classe [[yii\i18n\PhpMessageSource]] utilise des fichiers PHP pour stocker les traductions de messages. Chacun des fichiers PHP correspond aux messages d'une même catégorie. Par défaut, le nom du fichier doit être celui de la catégorie. Néanmoins, vous pouvez configurer [[yii\i18n\PhpMessageSource::fileMap|fileMap (cartographie de fichiers)]] pour faire correspondre une catégorie à un fichier PHP dont le nom obéit à une autre approche de nommage. Dans l'exemple qui précède, la catégorie `app/error` correspond au fichier PHP `@app/messages/fr-FR/error.php` (en supposant que `fr-FR` est la langue cible). Sans cette configuration, la catégorie correspondrait à `@app/messages/fr-FR/app/error.php`. + +En plus de la possibilité de stocker les messages dans des fichiers PHP, vous pouvez aussi utiliser les sources de messages suivantes pour stocker vos traductions sous une autre forme : + +- [[yii\i18n\GettextMessageSource]] utilise des fichiers GNU Gettext, MO ou PO pour maintenir les messages traduits. +- [[yii\i18n\DbMessageSource]] utilise une base de donnée pour stocker les messages traduits. + + +## Format des messages + +Lorsque vous traduisez un message, vous pouvez inclure dans le messages des « valeurs à remplacer » qui seront remplacées dynamiquement en fonction de la valeur d'un paramètre. Vous pouvez même utiliser une syntaxe spéciale des « valeurs à remplacer » pour que les valeurs de remplacement soient formatées en fonction de la langue cible. +Dans cette sous-section, nous allons décrire différentes manières de formater un message. + +### Valeurs à remplacer des message + +Dans un message à traduire, vous pouvez inclure une ou plusieurs « valeurs à remplacer » pour qu'elles puissent être remplacées par les valeurs données. En spécifiant différents jeux de valeurs, vous pouvez faire varier le message dynamiquement. Dans l'exemple qui suit, la valeur à remplacer `{username}` du message `'Hello, {username}!'` sera remplacée par `'Alexander'` et `'Qiang'`, respectivement. + +```php +$username = 'Alexander'; +// affiche un message traduit en remplaçant {username} par "Alexander" +echo \Yii::t('app', 'Hello, {username}!', [ + 'username' => $username, +]); + +$username = 'Qiang'; +// affiche un message traduit en remplaçant {username} par "Qiang" +echo \Yii::t('app', 'Hello, {username}!', [ + 'username' => $username, +]); +``` + +Lorsque le traducteur traduit un message contenant une valeur à remplacer, il doit laisser la valeur à remplacer telle quelle. Cela tient au fait que les valeurs à remplacer seront remplacées par les valeurs réelles au moment de l'appel de `Yii::t()` pour traduire le message. + +Dans un même message, vous pouvez utiliser, soit des « valeurs à remplacer nommées », soit des « valeurs à remplacer positionnelles », mais pas les deux types. + +L'exemple précédent montre comment utiliser des valeurs à remplacer nommées, c'est à dire, des valeurs à remplacer écrites sous la forme `{nom}`, et pour lesquelles vous fournissez un tableau associatif dont les clés sont les noms des valeurs à remplacer (sans les accolades) et les valeurs, les valeurs de remplacement. + +Les valeurs à remplacer positionnelles utilisent une suite d'entiers démarrant de zéro en tant que noms de valeurs à remplacer qui seront remplacées par les valeurs de remplacement, fournies sous forme d'un tableau, en fonction de leur position dans le tableau lors de l'appel de la méthode `Yii::t()`. Dans l'exemple suivant, les valeurs à remplacer positionnelles `{0}`, `{1}` et `{2}` seront remplacées respectivement par les valeurs de `$price`, `$count` et `$subtotal`. + +```php +$price = 100; +$count = 2; +$subtotal = 200; +echo \Yii::t('app', 'Price: {0}, Count: {1}, Subtotal: {2}', [$price, $count, $subtotal]); +``` + +Dans le cas d'une seule valeur à remplacer, la valeur de remplacement peut être donnée sans la placer dans un tableau : + +```php +echo \Yii::t('app', 'Price: {0}', $price); +``` + +> Tip: dans la plupart des cas, vous devriez utiliser des valeurs à remplacer nommées, parce que les noms permettent aux traducteurs de +> mieux comprendre le sens des messages qu'ils doivent traduire. + + +### Formatage des valeurs de remplacement + +Vous pouvez spécifier des règles de formatage additionnelles dans les valeurs à remplacer qui seront appliquées aux valeurs de remplacement. Dans l'exemple suivant, la valeur de remplacement *price* est traitée comme un nombre et formatée comme une valeur monétaire : + +```php +$price = 100; +echo \Yii::t('app', 'Price: {0,number,currency}', $price); +``` + +> Note: le formatage des valeurs de remplacement nécessite l'installation de [extension intl de PHP](http://www.php.net/manual/en/intro.intl.php). + +Vous pouvez utiliser, soit la forme raccourcie, soit la forme complète pour spécifier une valeur à remplacer avec un format : +``` +forme raccourcie : {name,type} +forme complète : {name,type,style} +``` + +> Note: si vous avez besoin des caractères spéciaux tels que `{`, `}`, `'`, `#`, entourez-les de `'`: +> +```php +echo Yii::t('app', "Example of string with ''-escaped characters'': '{' '}' '{test}' {count,plural,other{''count'' value is # '#{}'}}", ['count' => 3]); +``` + +Le format complet est décrit dans la [documentation ICU](http://icu-project.org/apiref/icu4c/classMessageFormat.html). + +Dans ce qui suit, nous allons présenter quelques usages courants. + + + +#### Nombres + +La valeur de remplacement est traitée comme un nombre. Par exemple, + +```php +$sum = 42; +echo \Yii::t('app', 'Balance: {0,number}', $sum); +``` + +Vous pouvez spécifier un style facultatif pour la valeur de remplacement `integer` (entier), `currency` (valeur monétaire), ou `percent` (pourcentage) : + +```php +$sum = 42; +echo \Yii::t('app', 'Balance: {0,number,currency}', $sum); +``` + +Vous pouvez aussi spécifier un motif personnalisé pour formater le nombre. Par exemple, + +```php +$sum = 42; +echo \Yii::t('app', 'Balance: {0,number,,000,000000}', $sum); +``` + +Les caractères à utiliser dans les formats personnalisés sont présentés dans le document [ICU API reference](http://icu-project.org/apiref/icu4c/classicu_1_1DecimalFormat.html) à la section "Special Pattern Characters" (Caractères pour motifs spéciaux). + + +La valeur de remplacement est toujours formatée en fonction de la locale cible c'est à dire que vous ne pouvez pas modifier les séparateurs de milliers et de décimales, les symboles monétaires, etc. sans modifier la locale de traduction. Si vous devez personnaliser ces éléments vous pouvez utiliser [[yii\i18n\Formatter::asDecimal()]] et [[yii\i18n\Formatter::asCurrency()]]. + +#### Date + +La valeur de remplacement doit être formatée comme une date. Par exemple, + +```php +echo \Yii::t('app', 'Today is {0,date}', time()); +``` + +Vous pouvez spécifier des styles facultatifs pour la valeur de remplacement comme `short` (court), `medium` (moyen), `long` (long) ou `full` (complet) : + +```php +echo \Yii::t('app', 'Today is {0,date,short}', time()); +``` + +Vous pouvez aussi spécifier un motif personnalisé pour formater la date : + +```php +echo \Yii::t('app', 'Today is {0,date,yyyy-MM-dd}', time()); +``` + +Voir [Formatting reference](http://icu-project.org/apiref/icu4c/classicu_1_1SimpleDateFormat.html). + + +#### Heure + +La valeur de remplacement doit être formatée comme une heure (au sens large heure minute seconde). Par exemple, + +```php +echo \Yii::t('app', 'It is {0,time}', time()); +``` + +Vous pouvez spécifier des styles facultatifs pour la valeur de remplacement comme `short` (court), `medium` (moyen), `long` (long) ou `full` (complet) : + +```php +echo \Yii::t('app', 'It is {0,time,short}', time()); +``` + +Vous pouvez aussi spécifier un motif personnalisé pour formater l'heure : + +```php +echo \Yii::t('app', 'It is {0,date,HH:mm}', time()); +``` + +Voir [Formatting reference](http://icu-project.org/apiref/icu4c/classicu_1_1SimpleDateFormat.html). + + +#### Prononciation + +La valeur de remplacement doit être traitée comme un nombre et formatée comme une prononciation. Par exemple, + +```php +// produit "42 is spelled as forty-two" +echo \Yii::t('app', '{n,number} is spelled as {n,spellout}', ['n' => 42]); +``` + +Par défaut le nombre est épelé en tant que cardinal. Cela peut être modifié : + +```php +// produit "I am forty-seventh agent" +echo \Yii::t('app', 'I am {n,spellout,%spellout-ordinal} agent', ['n' => 47]); +``` + +Notez qu'il ne doit pas y avoir d'espace après `spellout,` et avant `%`. + +Pour trouver une liste des options disponibles pour votre locale, reportez-vous à +"Numbering schemas, Spellout" à [http://intl.rmcreative.ru/](http://intl.rmcreative.ru/). + +#### Nombre ordinal + +La valeur de remplacement doit être traitée comme un nombre et formatée comme un nombre ordinal. Par exemple, + +```php +// produit "You are the 42nd visitor here!" (vous êtes le 42e visiteur ici !) +echo \Yii::t('app', 'You are the {n,ordinal} visitor here!', ['n' => 42]); +``` + +Les nombres ordinaux acceptent plus de formats pour des langues telles que l'espagnol : + +```php +// produit 471ª +echo \Yii::t('app', '{n,ordinal,%digits-ordinal-feminine}', ['n' => 471]); +``` + +Notez qu'il ne doit pas y avoir d'espace après `ordinal,` et avant `%`. + +Pour trouver une liste des options disponibles pour votre locale, reportez-vous à +"Numbering schemas, Ordinal" à [http://intl.rmcreative.ru/](http://intl.rmcreative.ru/). + +#### Durée + +La valeur de remplacement doit être traitée comme un nombre de secondes et formatée comme une durée. Par exemple, + +```php +// produit "You are here for 47 sec. already!" (Vous êtes ici depuis 47sec. déjà !) +echo \Yii::t('app', 'You are here for {n,duration} already!', ['n' => 47]); +``` + +La durée accepte d'autres formats : + +```php +// produit 130:53:47 +echo \Yii::t('app', '{n,duration,%in-numerals}', ['n' => 471227]); +``` + +Notez qu'il ne doit pas y avoir d'espace après `duration,` et avant `%`. + +Pour trouver une liste des options disponibles pour votre locale, reportez-vous à +"Numbering schemas, Duration" à [http://intl.rmcreative.ru/](http://intl.rmcreative.ru/). + +#### Pluriel + +Les langues diffèrent dans leur manière de marquer le pluriel. Yii fournit un moyen pratique pour traduire les messages dans différentes formes de pluriel qui fonctionne même pour des règles très complexes. Au lieu de s'occuper des règles d'inflexion directement, il est suffisant de fournir la traductions des mots infléchis dans certaines situations seulement. Par exemple, + +```php +// Lorsque $n = 0, produit "There are no cats!" +// Losque $n = 1, produit "There is one cat!" +// Lorsque $n = 42, produit "There are 42 cats!" +echo \Yii::t('app', 'There {n,plural,=0{are no cats} =1{is one cat} other{are # cats}}!', ['n' => $n]); +``` + +Dans les arguments des règles de pluralisation ci-dessus, `=` signifie valeur exacte. Ainsi `=0` signifie exactement zéro, `=1` signifie exactement un. `other` signifie n'importe quelle autre valeur. `#` est remplacé par la valeur de `n` formatée selon la langue cible. + +Les formes du pluriel peuvent être très compliquées dans certaines langues. Dans l'exemple ci-après en russe, `=1` correspond exactement à `n = 1` +tandis que `one` correspond à `21` ou `101`: + +``` +Здесь {n,plural,=0{котов нет} =1{есть один кот} one{# кот} few{# кота} many{# котов} other{# кота}}! +``` + +Ces noms d'arguments spéciaux tels que `other`, `few`, `many` et autres varient en fonction de la langue. Pour savoir lesquels utiliser pour une locale particulière, reportez-vous aux "Plural Rules, Cardinal" à [http://intl.rmcreative.ru/](http://intl.rmcreative.ru/). +En alternative, vous pouvez vous reporter aux [rules reference at unicode.org](http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html). + +> Note: le message en russe ci-dessus est principalement utilisé comme message traduit, pas comme message source, sauf si vous définissez la [[yii\base\Application::$sourceLanguage|langue source]] de votre application comme étant `ru-RU` et traduisez à partir du russe. +> +> Lorsqu'une traduction n'est pas trouvée pour un message source spécifié dans un appel de `Yii::t()`, les règles du pluriel pour la +> [[yii\base\Application::$sourceLanguage|langue source]] seront appliquées au message source. +Il existe un paramètre `offset` dans le cas où la chaîne est de la forme suivante : + +```php +$likeCount = 2; +echo Yii::t('app', 'You {likeCount,plural, + offset: 1 + =0{did not like this} + =1{liked this} + one{and one other person liked this} + other{and # others liked this} +}', [ + 'likeCount' => $likeCount +]); + +// You and one other person liked this +``` + +#### Sélection ordinale + +L'argument `selectordinal` pour une valeur à remplacer numérique a pour but de choisir une chaîne de caractères basée sur les règles linguistiques de la locale cible pour les ordinaux. Ainsi,  + +```php +$n = 3; +echo Yii::t('app', 'You are the {n,selectordinal,one{#st} two{#nd} few{#rd} other{#th}} visitor', ['n' => $n]); +``` +//Produit pour l'anglais : +//You are the 3rd visitor + +//Traduction en russe, +'You are the {n,selectordinal,one{#st} two{#nd} few{#rd} other{#th}} visitor' => 'Вы {n,selectordinal,other{#-й}} посетитель', + +//Traduit en russe produit : +//Вы 3-й посетитель + +//Traduction en français +'You are the {n,selectordinal,one{#st} two{#nd} few{#rd} other{#th}} visitor' => 'Vous êtes le {n,selectordinal,one{#er} other{#e}} visiteur' + +//Traduit en français produit : +//Vous êtes le 3e visiteur +``` + +Le format est assez proche de celui utilisé pour le pluriel. Pour connaître quels arguments utiliser pour une locale particulière, reportez-vous aux "Plural Rules, Ordinal" à [http://intl.rmcreative.ru/](http://intl.rmcreative.ru/). +En alternative, vous pouvez vous reporter aux [rules reference at unicode.org](http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html). + +#### Sélection + +Vous pouvez utiliser l'argument `select` dans une valeur à remplacer pour choisir une phrase en fonction de la valeur de remplacement. Par exemple, + +```php +// Peut produire "Snoopy is a dog and it loves Yii!" +echo \Yii::t('app', '{name} is a {gender} and {gender,select,female{she} male{he} other{it}} loves Yii!', [ + 'name' => 'Snoopy', + 'gender' => 'dog', +]); +``` +Dans l'expression qui précède, `female` et `male` sont des valeurs possibles de l'argument, tandis que `other` prend en compte les valeurs qui ne sont ni l'une ni l'autre des ces valeurs. Derrière chacune des valeurs possibles de l'argument, vous devez spécifier un segment de phrase en l'entourant d'accolades. + + + +### Spécification des sources de messages par défaut + +Vous pouvez spécifier les sources de messages par défaut qui seront utilisées comme solution de repli pour les catégories qui ne correspondent à aucune des catégories configurées. +Cette source de message doit être marquée par un caractère générique `*`. Pour cela ajoutez les lignes suivantes dans la configuration de l'application : + +```php +//configure i18n component + +'i18n' => [ + 'translations' => [ + '*' => [ + 'class' => 'yii\i18n\PhpMessageSource' + ], + ], +], +``` +Désormais, vous pouvez utiliser une catégorie sans la configurer, ce qui est un comportement identique à celui de Yii 1.1. Les messages pour cette catégorie proviendront d'une source de messages par défaut située dans le dossier `basePath` c.-à-d. `@app/messages`: + + +```php +echo Yii::t('not_specified_category', 'message from unspecified category'); +``` + +Le message sera chargé depuis `@app/messages//not_specified_category.php`. + +### Traduction des messages d'un module + +Si vous voulez traduire les messages d'un module et éviter d'avoir un unique fichier de traduction pour tous les messages, vous pouvez procéder comme suit : + +```php +registerTranslations(); + } + + public function registerTranslations() + { + Yii::$app->i18n->translations['modules/users/*'] = [ + 'class' => 'yii\i18n\PhpMessageSource', + 'sourceLanguage' => 'en-US', + 'basePath' => '@app/modules/users/messages', + 'fileMap' => [ + 'modules/users/validation' => 'validation.php', + 'modules/users/form' => 'form.php', + ... + ], + ]; + } + + public static function t($category, $message, $params = [], $language = null) + { + return Yii::t('modules/users/' . $category, $message, $params, $language); + } + +} +``` + +Dans l'exemple précédent, nous utilisons le caractère générique pour la correspondance puis nous filtrons chacune des catégories par fichier requis. Au lieu d'utiliser `fileMap`, vous pouvez utiliser la convention de mise en correspondance du fichier de même nom. + +Désormais, vous pouvez utiliser `Module::t('validation', 'your custom validation message')` ou `Module::t('form', 'some form label')` directement. + +### Traduction des messages de widgets + +La règle applicable aux modules présentée ci-dessus s'applique également aux widgets, par exemple : + +```php +registerTranslations(); + } + + public function registerTranslations() + { + $i18n = Yii::$app->i18n; + $i18n->translations['widgets/menu/*'] = [ + 'class' => 'yii\i18n\PhpMessageSource', + 'sourceLanguage' => 'en-US', + 'basePath' => '@app/widgets/menu/messages', + 'fileMap' => [ + 'widgets/menu/messages' => 'messages.php', + ], + ]; + } + + public function run() + { + echo $this->render('index'); + } + + public static function t($category, $message, $params = [], $language = null) + { + return Yii::t('widgets/menu/' . $category, $message, $params, $language); + } + +} +``` + +Au lieu d'utiliser `fileMap`, vous pouvez utiliser la convention de mise en correspondance du fichier de même nom. +Désormais, vous pouvez utiliser `Menu::t('messages', 'new messages {messages}', ['{messages}' => 10])` directement. + +> Note: pour les widgets, vous pouvez aussi utiliser les vues i18n, en y appliquant les mêmes règles que celles applicables aux contrôleurs. + + +### Traduction des messages du framework + +Yii est fourni avec les traductions par défaut des messages d'erreurs de validation et quelques autres chaînes. Ces messages sont tous dans la catégorie `yii`. Parfois, vous souhaitez corriger la traduction par défaut des messages du framework pour votre application. Pour le faire, configurez le [composant d'application](structure-application-components.md) `i18n` comme indiqué ci-après : + +```php +'i18n' => [ + 'translations' => [ + 'yii' => [ + 'class' => 'yii\i18n\PhpMessageSource', + 'sourceLanguage' => 'en-US', + 'basePath' => '@app/messages' + ], + ], +], +``` + +Vous pouvez désormais placer vos traductions corrigées dans `@app/messages//yii.php`. + +### Gestion des traductions manquantes + +Même si la traduction n'est pas trouvée dans la source de traductions, Yii affiche le contenu du message demandé. Un tel comportement est très pratique tant que le message est une phrase valide. Néanmoins, quelques fois, cela ne suffit pas. Vous pouvez désirer faire quelque traitement de la situation, au moment où le message apparaît manquant. Vous pouvez utiliser pour cela l'événement [[yii\i18n\MessageSource::EVENT_MISSING_TRANSLATION|missingTranslation (traduction manquante)]] de [[yii\i18n\MessageSource]]. + +Par exemple, vous désirez peut-être marquer toutes les traductions manquantes par quelque chose de voyant, de manière à les repérer facilement dans la page. Vous devez d'abord configurer un gestionnaire d'événement. Cela peut se faire dans la configuration de l'application : + +```php +'components' => [ + // ... + 'i18n' => [ + 'translations' => [ + 'app*' => [ + 'class' => 'yii\i18n\PhpMessageSource', + 'fileMap' => [ + 'app' => 'app.php', + 'app/error' => 'error.php', + ], + 'on missingTranslation' => ['app\components\TranslationEventHandler', 'handleMissingTranslation'] + ], + ], + ], +], +``` + +Vous devez ensuite implémenter votre gestionnaire d'événement : + +```php +translatedMessage = "@MISSING: {$event->category}.{$event->message} FOR LANGUAGE {$event->language} @"; + } +} +``` + +Si [[yii\i18n\MissingTranslationEvent::translatedMessage]] est défini par le gestionnaire d'événement, il sera affiché en tant que résultat de la traduction. + +> Note: chacune des sources de messages gère ses traductions manquantes séparément. Si vous avez recours à plusieurs sources de messages et que vous voulez qu'elles gèrent les messages manquants de la même manière, vous devez assigner le gestionnaire d'événement correspondant à chacune d'entre-elles. + + +### Utilisation de la commande `message` + +Les traductions peuvent être stockées dans des [[yii\i18n\PhpMessageSource|fichiers php]], des [[yii\i18n\GettextMessageSource|fichiers .po ]] ou dans une [[yii\i18n\DbMessageSource|bases de données]]. Reportez-vous aux classes spécifiques pour connaître les options supplémentaires. + +En premier lieu, vous devez créer un fichier de configuration. Décidez de son emplacement et exécutez la commande suivante : + + +```bash +./yii message/config-template path/to/config.php +``` + +Ouvrez le fichier ainsi créé et ajustez-en les paramètres pour qu'ils répondent à vos besoins. Portez-une attention particulière à : + +* `languages`: un tableau des langues dans lesquelles votre application doit être traduite  ; +* `messagePath`: le chemin du dossier où doivent être placés les fichiers de messages, qui doit correspondre le paramètre `basePath` de `i18n` dans la configuration de l'application. + +Vous pouvez également utiliser la commande './yii message/config' pour générer dynamiquement le fichier de configuration avec les options spécifiées via le ligne de commande. Par exemple, vous pouvez définir `languages` et `messagePath` comme indiqué ci-dessous : + + +```bash +./yii message/config --languages=de,ja --messagePath=messages path/to/config.php +``` + +Pour connaître toutes les options utilisables, exécutez la commande : + +```bash +./yii help message/config +``` + +Une fois que vous en avez terminé avec la configuration, vous pouvez finalement extraire vos messages par la commande : + +```bash +./yii message path/to/config.php +``` + +Vous pouvez aussi utiliser des options pour changer dynamiquement les paramètres d'extraction. + +Vous trouverez alors vos fichiers de traduction (si vous avez choisi les traductions basées sur des fichiers) dans votre dossier `messagePath`. + + +## Traduction des vues + +Plutôt que de traduire des textes de messages individuels, vous pouvez parfois désirer traduire le script d'une vue tout entier. Pour cela, contentez-vous de traduire la vue et de la sauvegarder dans un sous-dossier dont le nom est le code de la langue cible. Par exemple, si vous avez traduit le script de la vue `views/site/index.php` et que la langue cible est `fr-FR`, vous devez sauvegarder la traduction dans `views/site/fr-FR/index.php`. Désormais, à chaque fois que vous appellerez [[yii\base\View::renderFile()]] ou toute méthode qui invoque cette méthode (p. ex. [[yii\base\Controller::render()]]) pour rendre la vue, `views/site/index.php`, ce sera la vue `views/site/fr-FR/index.php` qui sera rendue à sa place. + +> Note: si la [[yii\base\Application::$language|langue cible]] est identique à la [[yii\base\Application::$sourceLanguage|langue source]] +> la vue originale sera rendue sans tenir compte de l'existence de la vue traduite. + + +## Formatage des dates et des nombres + +Reportez-vous à la section [Formatage des données](output-formatting.md) pour les détails. + + +## Configuration de l'environnement PHP + +Yii utilise l'[extension intl de PHP](http://php.net/manual/en/book.intl.php) pour fournir la plupart de ses fonctionnalités d'internationalisation, telles que le formatage des dates et des nombres de la classe [[yii\i18n\Formatter]] et le formatage des messages de la classe [[yii\i18n\MessageFormatter]]. +Les deux classes fournissent un mécanisme de remplacement lorsque l'extension `intl` n'est pas installée. Néanmoins, l'implémentation du mécanisme de remplacement ne fonctionne bien que quand la langue cible est l'anglais. C'est pourquoi, il est fortement recommandé d'installer `intl` quand c'est nécessaire. +L'[extension intl de PHP](http://php.net/manual/en/book.intl.php) est basée sur la [bibliothèque ICU](http://site.icu-project.org/) qui fournit la base de connaissances et les règles de formatage pour les différentes locales. Des versions différentes d'ICU peuvent conduire à des formatages différents des dates et des nombres. Pour être sûr que votre site Web donne les même résultats dans tous les environnements, il est recommandé d'installer la même version de l'extension `intl` (et par conséquent la même version d'ICU) dans tous les environnements. + +Pour savoir quelle version d'ICU est utilisée par PHP, vous pouvez exécuter le script suivant, qui vous restitue la version de PHP et d'ICU en cours d'utilisation. + +```php + pour obtenir une liste complète des versions d'ICU disponibles. Notez que le numérotage des versions a changé après la version 4.8 (p. ex., ICU 4.8, ICU 49, ICU 50, etc.) + +En outre, les informations dans la base de donnée des fuseaux horaires fournie par la bibliothèque ICU peuvent être surannées. Reportez-vous au [manuel d'ICU](http://userguide.icu-project.org/datetime/timezone#TOC-Updating-the-Time-Zone-Data) pour les détails sur la manière de mettre la base de données des fuseaux horaires à jour. Bien que la base de données des fuseaux horaires d'ICU soit utilisée pour le formatage, celle de PHP peut aussi être d'actualité. Vous pouvez la mettre à jour en installant la dernière version du [paquet `timezonedb` de pecl](http://pecl.php.net/package/timezonedb). From 9acd5fdc17a0aad4405c2226c7f568b2995df952 Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Tue, 9 Aug 2016 00:56:47 +0300 Subject: [PATCH 143/163] Fixes #12098: Adjusted wording in i18n guide --- docs/guide/tutorial-i18n.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/docs/guide/tutorial-i18n.md b/docs/guide/tutorial-i18n.md index 94274b1..9e31a7b 100644 --- a/docs/guide/tutorial-i18n.md +++ b/docs/guide/tutorial-i18n.md @@ -434,10 +434,11 @@ do not match either one of them. Following each possible parameter value, you sh it in a pair of curly brackets. -### Specifying default translation +### Specifying default message source -You can specify default translations that will be used as a fallback for categories that don't match any other translation. -This translation should be marked with `*`. In order to do it add the following to the application config: +You can specify default message source that will be used as a fallback for category that don't match any +configured category. You can do that by configuring a wildcard category `*`. In order to do that, add the following +to the application config: ```php //configure i18n component From 457abe8939b0d1b7b41c33c4c335d7d6b8ae83a6 Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Tue, 9 Aug 2016 01:49:23 +0300 Subject: [PATCH 144/163] Fixes #12085: Fixed session destruction sequence --- framework/web/Session.php | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/framework/web/Session.php b/framework/web/Session.php index df9e7fb..459ecd1 100644 --- a/framework/web/Session.php +++ b/framework/web/Session.php @@ -193,10 +193,13 @@ class Session extends Component implements \IteratorAggregate, \ArrayAccess, \Co public function destroy() { if ($this->getIsActive()) { - YII_DEBUG ? session_unset() : @session_unset(); $sessionId = session_id(); - YII_DEBUG ? session_destroy() : @session_destroy(); - YII_DEBUG ? session_id($sessionId) : @session_id($sessionId); + session_write_close(); + session_id($sessionId); + session_start(); + session_unset(); + session_destroy(); + session_id($sessionId); } } From 0ae73251eeb2c2750b56ab96549b75397952a3af Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Tue, 9 Aug 2016 02:31:08 +0300 Subject: [PATCH 145/163] Fixed tests --- framework/web/Session.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/framework/web/Session.php b/framework/web/Session.php index 459ecd1..15cae76 100644 --- a/framework/web/Session.php +++ b/framework/web/Session.php @@ -194,12 +194,12 @@ class Session extends Component implements \IteratorAggregate, \ArrayAccess, \Co { if ($this->getIsActive()) { $sessionId = session_id(); - session_write_close(); - session_id($sessionId); - session_start(); + $this->close(); + $this->setId($sessionId); + $this->open(); session_unset(); session_destroy(); - session_id($sessionId); + $this->setId($sessionId); } } From de58cd28154f64d61d57d6b37debd9e471e55fe8 Mon Sep 17 00:00:00 2001 From: jaaf Date: Tue, 9 Aug 2016 10:12:31 +0200 Subject: [PATCH 146/163] Adding French translation for structure-controllers.md [skip ci] (#12119) * Corrections dans concept-aliases.md version fr * Some correction in intro-upgrade-from.md French version * some corrections in start-databases.md French version * added translation of structure-applications.md French version * adding source change in translation of concept-alias.md * adding source change in translation of intro-upgrade-from-v1.md * adding French translation of structure-controllers.md [skip ci] --- docs/guide-fr/structure-controllers.md | 364 +++++++++++++++++++++++++++++++++ 1 file changed, 364 insertions(+) create mode 100644 docs/guide-fr/structure-controllers.md diff --git a/docs/guide-fr/structure-controllers.md b/docs/guide-fr/structure-controllers.md new file mode 100644 index 0000000..70d5d50 --- /dev/null +++ b/docs/guide-fr/structure-controllers.md @@ -0,0 +1,364 @@ +Contrôleurs +=========== + +Les contrôleurs font partie du modèle d'architecture [MVC](http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller) (Modèle Vue Contrôleur). Ce sont des objets dont la classe étend [[yii\base\Controller]]. Ils sont chargés de traiter les requêtes et de générer les réponses. En particulier, après que l'objet [applications](structure-applications.md) leur a passé le contrôle, ils analysent les données de la requête entrante, les transmettent aux [modèles](structure-models.md), injectent le résultat des modèles dans les [vues](structure-views.md) et, pour finir, génèrent les réponses sortantes. + + +## Actions + +Les contrôleurs sont constitués d'*actions* qui sont les unités les plus élémentaires dont l'utilisateur final peut demander l'exécution. Un contrôleur comprend une ou plusieurs actions. + +L'exemple qui suit présente un contrôleur `post` avec deux actions : `view` et `create`: + +```php +namespace app\controllers; + +use Yii; +use app\models\Post; +use yii\web\Controller; +use yii\web\NotFoundHttpException; + +class PostController extends Controller +{ + public function actionView($id) + { + $model = Post::findOne($id); + if ($model === null) { + throw new NotFoundHttpException; + } + + return $this->render('view', [ + 'model' => $model, + ]); + } + + public function actionCreate() + { + $model = new Post; + + if ($model->load(Yii::$app->request->post()) && $model->save()) { + return $this->redirect(['view', 'id' => $model->id]); + } else { + return $this->render('create', [ + 'model' => $model, + ]); + } + } +} +``` + +Dans l'action `view` (définie par la méthode `actionView()`), le code commence par charger le [modèle](structure-models.md) en fonction de l'identifiant (ID) du modèle requis. Si le chargement du modèle réussit, l'action l'affiche en utilisant une [vue](structure-views.md) nommée `view`. Autrement, elle lève une exception. + +Dans l'action `create` (définie par le méthode `actionCreate()`), le code est similaire. Elle commence par essayer de peupler une nouvelle instance du[modèle](structure-models.md) avec les données de la requête et sauvegarde le modèle. Si les deux opérations réussissent, elle redirige le navigateur vers l'action `view` en lui passant l'identifiant (ID) du nouveau modèle. Autrement, elle affiche la vue `create` dans laquelle l'utilisateur pour saisir les entrées requises. + + +## Routes + +L'utilisateur final demande l'exécution des actions via ce qu'on appelle des *routes*. Une route est une chaîne de caractères constituée des parties suivantes : + +* un identifiant (ID) de module : cette partie n'est présente que si le contrôleur appartient à un [module](structure-modules.md) qui n'est pas en soi une application ; +* un [identifiant de contrôleur](#controller-ids): une chaîne de caractères qui distingue le contrôleur des autres contrôleurs de la même application — ou du même module si le contrôleur appartient à un module) ;; +* un [identifiant d'action](#action-ids): une chaîne de caractères qui distingue cette action des autres actions du même contrôleur. + +Les routes se présentent dans le format suivant : + +``` +identifiant_de_contrôleur/identifiant_d_action +``` + +ou dans le format suivant si le contrôleur appartient à un module : + +```php +identifiant_de_module/identifiant_de_contrôleur/identifiant_d_action +``` + +Ainsi si un utilisateur requiert l'URL `http://hostname/index.php?r=site/index`, l'action `index` dans le contrôleur `site` sera exécutée. Pour plus de détails sur la façon dont les routes sont résolues, reportez-vous à la section [Routage et génération d'URL](runtime-routing.md). + + +## Création des contrôleurs + +Dans les [[yii\web\Application|applications Web]], les contrôleur doivent étendre la classe [[yii\web\Controller]] ou ses classes enfants. De façon similaire, dans les [[yii\console\Application|applications de console]], les contrôleurs doivent étendre la classe[[yii\console\Controller]] ou ses classes enfants. Le code qui suit définit un contrôleur nommé `site` : + +```php +namespace app\controllers; + +use yii\web\Controller; + +class SiteController extends Controller +{ +} +``` + + +### Identifiant des contrôleurs + +Généralement, un contrôleur est conçu pour gérer les requêtes concernant un type particulier de ressource. Pour cette raison, l'identifiant d'un contrôleur est souvent un nom faisant référence au type de ressources que ce contrôleur gère. +Par exemple, vous pouvez utiliser `article` comme identifiant d'un contrôleur qui gère des données d'articles. + +Par défaut, l'identifiant d'un contrôleur ne peut contenir que les caractères suivants : lettres de l'alphabet anglais en bas de casse, chiffres, tiret bas, trait d'union et barre oblique de division. Par exemple, `article` et `post-comment` sont tous deux des identifiants de contrôleur valides, tandis que `article?`, `PostComment` et `admin\post` ne le sont pas. +Un identifiant de contrôleur peut aussi contenir un préfixe de sous-dossier. Par exemple `admin/article` représente un contrôleur `article` dans le dossier `admin` dans l'[[yii\base\Application::controllerNamespace|espace de noms du contrôleur]]. +Les caractères valides pour le préfixe des sous-dossiers incluent : les lettres de l'alphabet anglais dans les deux casses, les chiffres, le tiret bas et la barre oblique de division, parmi lesquels les barres obliques de division sont utilisés comme séparateurs pour les sous-dossiers à plusieurs niveaux (p. ex. `panels/admin`). + +### Nommage des classes de contrôleur + +Les noms de classe de contrôleur peut être dérivés de l'identifiant du contrôleur selon la procédure suivante : + +1. Mettre la première lettre de chacun des mots séparés par des trait d'union en capitale. Notez que si l'identifiant du contrôleur contient certaines barres obliques, cette règle ne s'applique qu'à la partie après la dernière barre oblique dans l'identifiant. +2. Retirer les traits d'union et remplacer toute barre oblique de division par une barre oblique inversée. +3. Ajouter le suffixe `Controller`. +4. Préfixer avec l'[[yii\base\Application::controllerNamespace|espace de noms du contrôleur]]. + +Ci-après sont présentés quelques exemples en supposant que l'[[yii\base\Application::controllerNamespace|espace de noms du contrôleur]] prend la valeur par défaut, soit `app\controllers`: + +* `article` donne `app\controllers\ArticleController`; +* `post-comment` donne `app\controllers\PostCommentController`; +* `admin/post-comment` donne `app\controllers\admin\PostCommentController`; +* `adminPanels/post-comment` donne `app\controllers\adminPanels\PostCommentController`. + +Les classes de contrôleur doivent être [auto-chargeables](concept-autoloading.md). Pour cette raison, dans les exemples qui précèdent, la classe de contrôleur `article` doit être sauvegardée dans le fichier dont l'[alias](concept-aliases.md) est `@app/controllers/ArticleController.php`; tandis que la classe de contrôleur `admin/post-comment` doit se trouver dans `@app/controllers/admin/PostCommentController.php`. + +> Info: dans le dernier exemple, `admin/post-comment` montre comment placer un contrôleur dans un sous-dossier de l'[[yii\base\Application::controllerNamespace|espace de noms du contrôleur]]. Cela est utile lorsque vous voulez organiser vos contrôleurs en plusieurs catégories et que vous ne voulez pas utiliser de [modules](structure-modules.md). + + +### Cartographie des contrôleurs + +Vous pouvez configurer [[yii\base\Application::controllerMap|controller map (cartographie des contrôleurs)]] pour outrepasser les contraintes concernant les identifiants de contrôleur et les noms de classe décrites plus haut. Cela est principalement utile lorsque vous utilisez des contrôleurs de tierces parties et que vous n'avez aucun contrôle sur le nommage de leur classe. +Vous pouvez configurer [[yii\base\Application::controllerMap|controller map]] dans la [configuration de l'application](structure-applications.md#application-configurations). Par exemple : + +```php +[ + 'controllerMap' => [ + // declares "account" controller using a class name + 'account' => 'app\controllers\UserController', + + // declares "article" controller using a configuration array + 'article' => [ + 'class' => 'app\controllers\PostController', + 'enableCsrfValidation' => false, + ], + ], +] +``` + + +### Contrôleur par défaut + +Chaque application possède un contrôleur par défaut spécifié via la propriété [[yii\base\Application::defaultRoute]]. Lorsqu'une requête ne précise aucune [route](#routes), c'est la route spécifiée par cette propriété qui est utilisée. Pour les [[yii\web\Application|applications Web]], sa valeur est `'site'`, tandis que pour les [[yii\console\Application|applications de console]], c'est `help`. Par conséquent, si une URL est de la forme `http://hostname/index.php`, c'est le contrôleur `site` qui prend la requête en charge. + +Vous pouvez changer de contrôleur par défaut en utilisant la [configuration d'application](structure-applications.md#application-configurations) suivante : + +```php +[ + 'defaultRoute' => 'main', +] +``` + + +## Création d'actions + +Créer des actions est aussi simple que de définir ce qu'on appelle des *méthodes d'action* dans une classe de contrôleur. Une méthode d'action est une méthode *publique* dont le nom commence par le mot `action`. La valeur retournée par une méthode d'action représente les données de la réponse à envoyer à l'utilisateur final. Le code qui suit définit deux actions, `index` et `hello-world`: + +```php +namespace app\controllers; + +use yii\web\Controller; + +class SiteController extends Controller +{ + public function actionIndex() + { + return $this->render('index'); + } + + public function actionHelloWorld() + { + return 'Hello World'; + } +} +``` + + +### Identifiants d'action + +Une action est souvent conçue pour effectuer une manipulation particulière d'une ressource. Pour cette raison, les identifiants d'action sont habituellement des verbes comme `view` (voir), `update` (mettre à jour), etc. + +Par défaut, les identifiants d'action ne doivent contenir rien d'autre que les caractères suivants : les lettres de l'alphabet anglais en bas de casse, les chiffres, le tiret bas et le trait d'union. (Vous pouvez utiliser le trait d'union pour séparer les mots). Par exemple : +`view`, `update2`, et `comment-post` sont des identifiants d'action valides, tandis que `view?` et `Update` ne le sont pas. + +Vous pouvez créer des actions sous deux formes : les actions en ligne (*inline*) et les actions autonomes (*standalone*). Une action en ligne est définie en tant que méthode dans un contrôleur, alors qu'une action autonome est une classe qui étend la classe [[yii\base\Action]] ou une des ses classes filles. La définition d'une action en ligne requiert moins d'efforts est est souvent préférée lorsqu'il n'y a pas d'intention de réutiliser cette action. Par contre, les actions autonomes sont essentiellement créées pour être utilisées dans différents contrôleurs ou pour être redistribuées dans des [extensions](structure-extensions.md). + + +### Actions en ligne + +Les actions en ligne sont les actions qui sont définies en terme de méthodes d'action comme nous l'avons décrit plus haut. + +Les noms des méthodes d'action sont dérivés des identifiants d'action selon la procédure suivante : + +1. Mettre la première lettre de chaque mot de l'identifiant en capitale. +2. Supprimer les traits d'union. +3. Préfixer le tout par le mot `action`. + +Par exemple, `index` donne `actionIndex`, et `hello-world` donne `actionHelloWorld`. + +> Note: les noms des méthodes d'action sont *sensibles à la casse*. Si vous avez une méthode nommée `ActionIndex`, elle ne sera pas considérée comme étant une méthode d'action et, par conséquent, la requête de l'action `index` aboutira à une exception. Notez également que les méthodes d'action doivent être publiques. Une méthode privée ou protégée ne définit PAS une action en ligne. + + +Les actions en ligne sont les actions les plus communément définies parce qu'elle ne requièrent que peu d'efforts pour leur création. Néanmoins, si vous envisagez de réutiliser la même action en différents endroits, ou si vous voulez redistribuer cette action, vous devriez envisager de la définir en tant qu'*action autonome*. + + +### Actions autonomes + +Les actions autonomes sont définies comme des classes d'action qui étendent la classe [[yii\base\Action]] ou une de ses classes filles. +Par exemple, dans les versions de Yii, il y a [[yii\web\ViewAction]] et [[yii\web\ErrorAction]], qui sont toutes les deux des actions autonomes. + +Pour utiliser une action autonome, vous devez la déclarer dans la *cartographie des actions* en redéfinissant les méthodes de la classe [[yii\base\Controller::actions()]] dans la classe de votre contrôleur de la manière suivante : + +```php +public function actions() +{ + return [ + // déclare une action "error" en utilisant un nom de classe + 'error' => 'yii\web\ErrorAction', + + // déclare une action "view" action en utilisant un tableau de configuration + 'view' => [ + 'class' => 'yii\web\ViewAction', + 'viewPrefix' => '', + ], + ]; +} +``` + +Comme vous pouvez l'observer, les méthodes `actions()` doivent retourner un tableau dont les clés sont les identifiants d'action et les valeurs le nom de la classe d'action correspondant ou des tableaux de [configuration](concept-configurations.md). Contrairement aux actions en ligne, les identifiants d'action autonomes peuvent comprendre n'importe quels caractères du moment qu'ils sont déclarés dans la méthode `actions()`. + +Pour créer une classe d'action autonome, vous devez étendre la classe [[yii\base\Action]] ou une de ses classes filles, et implémenter une méthode publique nommée `run()`. Le rôle de la méthode `run()` est similaire à celui d'une méthode d'action. Par exemple : + +```php + + +Le valeur de retour d'une méthode d'action, ou celle de la méthode `run()` d'une action autonome, représente le résultat de l'action correspondante. + +La valeur de retour peut être un objet [response](runtime-responses.md) qui sera transmis à l'utilisateur final en tant que réponse. + +* Pour les [[yii\web\Application|applications Web]], la valeur de retour peut également être des données arbitraires qui seront assignées à l'objet [[yii\web\Response::data]] et converties ensuite en une chaîne de caractères représentant le corps de la réponse. +* Pour les [[yii\console\Application|applications de console]], la valeur de retour peut aussi être un entier représentant l'[[yii\console\Response::exitStatus|état de sortie]] de l'exécution de la commande. + +Dans les exemples ci-dessus, les valeurs de retour des actions sont toutes des chaînes de caractères qui seront traitées comme le corps de la réponse envoyée à l'utilisateur final. Les exemples qui suivent montrent comment une action peut rediriger le navigateur vers une nouvelle URL en retournant un objet *response* (parce que la méthode [[yii\web\Controller::redirect()|redirect()]] retourne un objet *response*) : + +```php +public function actionForward() +{ + // redirect the user browser to http://example.com + return $this->redirect('http://example.com'); +} +``` + +### Paramètres d'action + +Les méthodes d'action pour les actions en ligne et la méthode `run()` d'une action autonome acceptent des paramètres appelés *paramètres d'action*. Leurs valeurs sont tirées des requêtes. Pour les [[yii\web\Application|applications Web]], la valeur de chacun des paramètres d'action est obtenue de la méthode `$_GET` en utilisant le nom du paramètre en tant que clé. Pour les [[yii\console\Application|applications de console]], les valeurs des paramètres correspondent aux argument de la commande. +Dans d'exemple qui suit, l'action `view` (une action en ligne) déclare deux paramètres : `$id` et `$version`. + +```php +namespace app\controllers; + +use yii\web\Controller; + +class PostController extends Controller +{ + public function actionView($id, $version = null) + { + // ... + } +} +``` + +En fonction de la requête, les paramètres de l'action seront établis comme suit : + +* `http://hostname/index.php?r=post/view&id=123`: le paramètre `$id` reçoit la valeur `'123'`, tandis que le paramètre `$version` reste *null* (sa valeur par défaut) car la requête ne contient aucun paramètre `version`. +* `http://hostname/index.php?r=post/view&id=123&version=2`: les paramètres `$id` et `$version` reçoivent les valeurs `'123'` et `'2'`, respectivement. +* `http://hostname/index.php?r=post/view`: une exception [[yii\web\BadRequestHttpException]] est levée car le paramètre obligatoire `$id` n'est pas fourni par la requête. +* `http://hostname/index.php?r=post/view&id[]=123`: une exception [[yii\web\BadRequestHttpException]] est levée car le paramètre `$id` reçoit, de manière inattendue, un tableau (`['123']`). + +Si vous voulez que votre paramètre d'action accepte un tableau, il faut, dans la définition de la méthode, faire allusion à son type, avec `array`, comme ceci : + +```php +public function actionView(array $id, $version = null) +{ + // ... +} +``` + +Désormais, si la requête est `http://hostname/index.php?r=post/view&id[]=123`, paramètre `$id` accepte la valeur `['123']`. Si la requête est `http://hostname/index.php?r=post/view&id=123`, le paramètre `$id` accepte également la valeur transmise par la requête parce que les valeurs scalaires sont automatiquement convertie en tableau (*array*). + +Les exemples qui précèdent montrent essentiellement comment les paramètres d'action fonctionnent dans les applications Web. Pour les applications de console, reportez-vous à la section [Commandes de console](tutorial-console.md) pour plus de détails. + + +### Action par défaut + +Chaque contrôleur dispose d'une action par défaut spécifiée par la propriété [[yii\base\Controller::defaultAction]]. +Lorsqu'une [route](#routes) ne contient que l'identifiant du contrôleur, cela implique que l'action par défaut de ce contrôleur est requise. + +Par défaut, l'action par défaut est définie comme étant `index`. Si vous désirez changer cette valeur par défaut, contentez-vous de redéfinir cette propriété dans la classe du contrôleur, comme indiqué ci-après : + +```php +namespace app\controllers; + +use yii\web\Controller; + +class SiteController extends Controller +{ + public $defaultAction = 'home'; + + public function actionHome() + { + return $this->render('home'); + } +} +``` + + +## Cycle de vie d'un contrôleur + +Lors du traitement d'une requête, une [application](structure-applications.md) crée un contrôleur en se basant sur la [route](#routes) requise. Le contrôleur entame alors le cycle de vie suivant pour satisfaire la requête : + +1. La méthode [[yii\base\Controller::init()]] est appelée après que le contrôleur est créé et configuré. +2. Le contrôleur crée un objet *action* en se basant sur l'identifiant d'action de la requête : + * Si l'identifiant de l'action n'est pas spécifié, l'[[yii\base\Controller::defaultAction|identifiant de l'action par défaut]] est utilisé. + * Si l'identifiant de l'action est trouvé dans la [yii\base\Controller::actions()|cartographie des actions]], une action autonome est créée. + * Si l'identifiant de l'action est trouvé et qu'il correspond à une méthode d'action, une action en ligne est créée. + * Dans les autres cas, une exception [[yii\base\InvalidRouteException]] est levée. +3. Le contrôleur appelle consécutivement la méthode `beforeAction()` de l'application, celle du module (si module si le contrôleur appartient à un module) et celle du contrôleur. + * Si l'un des appels retourne *false*, les appels aux méthodes `beforeAction()` qui devraient suivre ne sont pas effectués et l'exécution de l'action est annulée. + * Par défaut, chacun des appels à la méthode `beforeAction()` déclenche un événement `beforeAction` auquel vous pouvez attacher un gestionnaire d'événement. +4. Le contrôleur exécute l'action. + * Les paramètres de l'action sont analysés et définis à partir des données transmises par la requête. +5. Le contrôleur appelle successivement la méthode `afterAction()` du contrôleur, du module (si le contrôleur appartient à un module) et de l'application. + * Par défaut, chacun des appels à la méthode `afterAction()` déclenche un événement `afterAction` auquel vous pouvez attacher un gestionnaire d'événement. +6. L'application assigne le résultat de l'action à l'objet [response](runtime-responses.md). + + +## Meilleures pratiques + +Dans une application bien conçue, les contrôleurs sont souvent très légers avec des actions qui ne contiennent que peu de code. Si votre contrôleur est plutôt compliqué, cela traduit la nécessité de remanier le code pour en déplacer certaines parties dans d'autres classes. + +Voici quelques meilleures pratiques spécifiques. Les contrôleurs : +* peuvent accéder aux données de la [requête](runtime-requests.md) ; +* peuvent appeler les méthodes des [modèles](structure-models.md) et des autres composants de service avec les données de la requête ; +* peuvent utiliser des [vues](structure-views.md) pour composer leurs réponses ; +* ne devraient PAS traiter les données de la requête — cela devrait être fait dans la [couche modèle](structure-models.md) ; +* devraient éviter d'encapsuler du code HTML ou tout autre code relatif à la présentation — cela est plus avantageusement fait dans les [vues](structure-views.md). From 9bd7b4f9207b35a68e2460e69ca93319c44ca966 Mon Sep 17 00:00:00 2001 From: jaaf Date: Tue, 9 Aug 2016 14:16:43 +0200 Subject: [PATCH 147/163] Typos in French structure-controllers.md [skip ci] (#12124) --- docs/guide-fr/structure-controllers.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/docs/guide-fr/structure-controllers.md b/docs/guide-fr/structure-controllers.md index 70d5d50..c4d4919 100644 --- a/docs/guide-fr/structure-controllers.md +++ b/docs/guide-fr/structure-controllers.md @@ -1,7 +1,7 @@ Contrôleurs =========== -Les contrôleurs font partie du modèle d'architecture [MVC](http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller) (Modèle Vue Contrôleur). Ce sont des objets dont la classe étend [[yii\base\Controller]]. Ils sont chargés de traiter les requêtes et de générer les réponses. En particulier, après que l'objet [applications](structure-applications.md) leur a passé le contrôle, ils analysent les données de la requête entrante, les transmettent aux [modèles](structure-models.md), injectent le résultat des modèles dans les [vues](structure-views.md) et, pour finir, génèrent les réponses sortantes. +Les contrôleurs font partie du modèle d'architecture [MVC](http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller) (Modèle Vue Contrôleur). Ce sont des objets dont la classe étend [[yii\base\Controller]]. Ils sont chargés de traiter les requêtes et de générer les réponses. En particulier, après que l'objet [application](structure-applications.md) leur a passé le contrôle, ils analysent les données de la requête entrante, les transmettent aux [modèles](structure-models.md), injectent le résultat des modèles dans les [vues](structure-views.md) et, pour finir, génèrent les réponses sortantes. ## Actions @@ -49,7 +49,7 @@ class PostController extends Controller Dans l'action `view` (définie par la méthode `actionView()`), le code commence par charger le [modèle](structure-models.md) en fonction de l'identifiant (ID) du modèle requis. Si le chargement du modèle réussit, l'action l'affiche en utilisant une [vue](structure-views.md) nommée `view`. Autrement, elle lève une exception. -Dans l'action `create` (définie par le méthode `actionCreate()`), le code est similaire. Elle commence par essayer de peupler une nouvelle instance du[modèle](structure-models.md) avec les données de la requête et sauvegarde le modèle. Si les deux opérations réussissent, elle redirige le navigateur vers l'action `view` en lui passant l'identifiant (ID) du nouveau modèle. Autrement, elle affiche la vue `create` dans laquelle l'utilisateur pour saisir les entrées requises. +Dans l'action `create` (définie par le méthode `actionCreate()`), le code est similaire. Elle commence par essayer de peupler une nouvelle instance du [modèle](structure-models.md) avec les données de la requête et sauvegarde le modèle. Si les deux opérations réussissent, elle redirige le navigateur vers l'action `view` en lui passant l'identifiant (ID) du nouveau modèle. Autrement, elle affiche la vue `create` dans laquelle l'utilisateur peut saisir les entrées requises. ## Routes @@ -57,8 +57,8 @@ Dans l'action `create` (définie par le méthode `actionCreate()`), le code est L'utilisateur final demande l'exécution des actions via ce qu'on appelle des *routes*. Une route est une chaîne de caractères constituée des parties suivantes : * un identifiant (ID) de module : cette partie n'est présente que si le contrôleur appartient à un [module](structure-modules.md) qui n'est pas en soi une application ; -* un [identifiant de contrôleur](#controller-ids): une chaîne de caractères qui distingue le contrôleur des autres contrôleurs de la même application — ou du même module si le contrôleur appartient à un module) ;; -* un [identifiant d'action](#action-ids): une chaîne de caractères qui distingue cette action des autres actions du même contrôleur. +* un [identifiant de contrôleur](#controller-ids) : une chaîne de caractères qui distingue le contrôleur des autres contrôleurs de la même application — ou du même module si le contrôleur appartient à un module ; +* un [identifiant d'action](#action-ids) : une chaîne de caractères qui distingue cette action des autres actions du même contrôleur. Les routes se présentent dans le format suivant : @@ -77,7 +77,7 @@ Ainsi si un utilisateur requiert l'URL `http://hostname/index.php?r=site/index`, ## Création des contrôleurs -Dans les [[yii\web\Application|applications Web]], les contrôleur doivent étendre la classe [[yii\web\Controller]] ou ses classes enfants. De façon similaire, dans les [[yii\console\Application|applications de console]], les contrôleurs doivent étendre la classe[[yii\console\Controller]] ou ses classes enfants. Le code qui suit définit un contrôleur nommé `site` : +Dans les [[yii\web\Application|applications Web]], les contrôleur doivent étendre la classe [[yii\web\Controller]] ou ses classes filles. De façon similaire, dans les [[yii\console\Application|applications de console]], les contrôleurs doivent étendre la classe [[yii\console\Controller]] ou ses classes filles. Le code qui suit définit un contrôleur nommé `site` : ```php namespace app\controllers; @@ -97,7 +97,7 @@ Par exemple, vous pouvez utiliser `article` comme identifiant d'un contrôleur q Par défaut, l'identifiant d'un contrôleur ne peut contenir que les caractères suivants : lettres de l'alphabet anglais en bas de casse, chiffres, tiret bas, trait d'union et barre oblique de division. Par exemple, `article` et `post-comment` sont tous deux des identifiants de contrôleur valides, tandis que `article?`, `PostComment` et `admin\post` ne le sont pas. Un identifiant de contrôleur peut aussi contenir un préfixe de sous-dossier. Par exemple `admin/article` représente un contrôleur `article` dans le dossier `admin` dans l'[[yii\base\Application::controllerNamespace|espace de noms du contrôleur]]. -Les caractères valides pour le préfixe des sous-dossiers incluent : les lettres de l'alphabet anglais dans les deux casses, les chiffres, le tiret bas et la barre oblique de division, parmi lesquels les barres obliques de division sont utilisés comme séparateurs pour les sous-dossiers à plusieurs niveaux (p. ex. `panels/admin`). +Les caractères valides pour le préfixe des sous-dossiers incluent : les lettres de l'alphabet anglais dans les deux casses, les chiffres, le tiret bas et la barre oblique de division, parmi lesquels les barres obliques de division sont utilisées comme séparateurs pour les sous-dossiers à plusieurs niveaux (p. ex. `panels/admin`). ### Nommage des classes de contrôleur @@ -182,10 +182,10 @@ class SiteController extends Controller Une action est souvent conçue pour effectuer une manipulation particulière d'une ressource. Pour cette raison, les identifiants d'action sont habituellement des verbes comme `view` (voir), `update` (mettre à jour), etc. -Par défaut, les identifiants d'action ne doivent contenir rien d'autre que les caractères suivants : les lettres de l'alphabet anglais en bas de casse, les chiffres, le tiret bas et le trait d'union. (Vous pouvez utiliser le trait d'union pour séparer les mots). Par exemple : +Par défaut, les identifiants d'action ne doivent contenir rien d'autre que les caractères suivants : les lettres de l'alphabet anglais en bas de casse, les chiffres, le tiret bas et le trait d'union. Vous pouvez utiliser le trait d'union pour séparer les mots. Par exemple : `view`, `update2`, et `comment-post` sont des identifiants d'action valides, tandis que `view?` et `Update` ne le sont pas. -Vous pouvez créer des actions sous deux formes : les actions en ligne (*inline*) et les actions autonomes (*standalone*). Une action en ligne est définie en tant que méthode dans un contrôleur, alors qu'une action autonome est une classe qui étend la classe [[yii\base\Action]] ou une des ses classes filles. La définition d'une action en ligne requiert moins d'efforts est est souvent préférée lorsqu'il n'y a pas d'intention de réutiliser cette action. Par contre, les actions autonomes sont essentiellement créées pour être utilisées dans différents contrôleurs ou pour être redistribuées dans des [extensions](structure-extensions.md). +Vous pouvez créer des actions sous deux formes : les actions en ligne (*inline*) et les actions autonomes (*standalone*). Une action en ligne est définie en tant que méthode dans un contrôleur, alors qu'une action autonome est une classe qui étend la classe [[yii\base\Action]] ou une des ses classes filles. La définition d'une action en ligne requiert moins d'efforts et est souvent préférée lorsqu'il n'y a pas d'intention de réutiliser cette action. Par contre, les actions autonomes sont essentiellement créées pour être utilisées dans différents contrôleurs ou pour être redistribuées dans des [extensions](structure-extensions.md). ### Actions en ligne @@ -303,7 +303,7 @@ public function actionView(array $id, $version = null) } ``` -Désormais, si la requête est `http://hostname/index.php?r=post/view&id[]=123`, paramètre `$id` accepte la valeur `['123']`. Si la requête est `http://hostname/index.php?r=post/view&id=123`, le paramètre `$id` accepte également la valeur transmise par la requête parce que les valeurs scalaires sont automatiquement convertie en tableau (*array*). +Désormais, si la requête est `http://hostname/index.php?r=post/view&id[]=123`, le paramètre `$id` accepte la valeur `['123']`. Si la requête est `http://hostname/index.php?r=post/view&id=123`, le paramètre `$id` accepte également la valeur transmise par la requête parce que les valeurs scalaires sont automatiquement convertie en tableau (*array*). Les exemples qui précèdent montrent essentiellement comment les paramètres d'action fonctionnent dans les applications Web. Pour les applications de console, reportez-vous à la section [Commandes de console](tutorial-console.md) pour plus de détails. From afc298c6efbd07b3568b65c55cb9a3886a1c65f6 Mon Sep 17 00:00:00 2001 From: Sergey Makinen Date: Tue, 9 Aug 2016 17:03:57 +0400 Subject: [PATCH 148/163] Fixed HttpCache was sending an empty Pragma header (#12100) (#12123) --- framework/CHANGELOG.md | 1 + framework/filters/HttpCache.php | 1 - tests/framework/filters/HttpCacheTest.php | 12 ++++++++++++ 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index 48f5334..2d75c1e 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -30,6 +30,7 @@ Yii Framework 2 Change Log - Bug #12053: `./yii migrate/create` was generating wrong code when using `bigPrimaryKey` (VojtechH, samdark) - Bug #11907: Fixed `yii\helpers\Console::getScreenSize()` on Windows was giving out width and height swapped (Spell6inder, samdark, cebe) - Bug #11973: Fixed `yii\helpers\BaseHtml::getAttributeValue()` to work with `items[]` notation correctly (silverfire) +- Bug #12100: Fixed `yii\filters\HttpCache` was sending an empty Pragma header (sergeymakinen) - Bug #12107: Fixed REST Serializer to validate input for 'expand' and 'fields' parameter, which crashed on array input (njspok, cebe) diff --git a/framework/filters/HttpCache.php b/framework/filters/HttpCache.php index 072df0d..590611c 100644 --- a/framework/filters/HttpCache.php +++ b/framework/filters/HttpCache.php @@ -193,7 +193,6 @@ class HttpCache extends ActionFilter } $headers = Yii::$app->getResponse()->getHeaders(); - $headers->set('Pragma'); if ($this->cacheControlHeader !== null) { $headers->set('Cache-Control', $this->cacheControlHeader); diff --git a/tests/framework/filters/HttpCacheTest.php b/tests/framework/filters/HttpCacheTest.php index c2234d7..791e209 100644 --- a/tests/framework/filters/HttpCacheTest.php +++ b/tests/framework/filters/HttpCacheTest.php @@ -28,6 +28,18 @@ class HttpCacheTest extends \yiiunit\TestCase $this->assertTrue($httpCache->beforeAction(null)); } + public function testEmptyPragma() + { + $httpCache = new HttpCache; + $httpCache->etagSeed = function($action, $params) { + return ''; + }; + $httpCache->beforeAction(null); + $response = Yii::$app->getResponse(); + $this->assertFalse($response->getHeaders()->offsetExists('Pragma')); + $this->assertFalse($response->getHeaders()->get('Pragma') === ''); + } + /** * @covers yii\filters\HttpCache::validateCache */ From 81479ff0858c607261ca5f0c9eb5fa6398605cd3 Mon Sep 17 00:00:00 2001 From: Dmitriy Makarov Date: Wed, 10 Aug 2016 12:50:57 +0300 Subject: [PATCH 149/163] Added Dispatcher tests of the following methods: (#12127) * Added Dispatcher tests of the following methods: - getTraceLevel() - setTraceLevel() - getFlushInterval() - setFlushInterval() - dispatch() - init() * [Fix] Added the 'mocking' flag --- tests/framework/log/DispatcherTest.php | 285 +++++++++++++++++++++++++++------ tests/framework/log/LoggerTest.php | 4 +- 2 files changed, 240 insertions(+), 49 deletions(-) diff --git a/tests/framework/log/DispatcherTest.php b/tests/framework/log/DispatcherTest.php index a16ede9..ac915a8 100644 --- a/tests/framework/log/DispatcherTest.php +++ b/tests/framework/log/DispatcherTest.php @@ -3,69 +3,260 @@ * @author Carsten Brandt */ -namespace yiiunit\framework\log; +namespace yii\log { + function microtime($get_as_float) { + if (\yiiunit\framework\log\DispatcherTest::$microtimeIsMocked) { + return \yiiunit\framework\log\DispatcherTest::microtime(func_get_args()); + } else { + return \microtime($get_as_float); + } + } +} -use yii\log\Dispatcher; -use yii\log\Logger; -use Yii; -use yiiunit\TestCase; +namespace yiiunit\framework\log { -/** - * @group log - */ -class DispatcherTest extends TestCase -{ + use yii\base\UserException; + use yii\log\Dispatcher; + use yii\log\Logger; + use Yii; + use yiiunit\TestCase; - public function testConfigureLogger() + /** + * @group log + */ + class DispatcherTest extends TestCase { - $dispatcher = new Dispatcher(); - $this->assertSame(Yii::getLogger(), $dispatcher->getLogger()); + /** + * @var Logger + */ + protected $logger; + + /** + * @var Dispatcher + */ + protected $dispatcher; + + /** + * @var bool + */ + static $microtimeIsMocked = false; + + /** + * Array of static functions + * + * @var array + */ + static $functions = []; + + protected function setUp() + { + static::$microtimeIsMocked = false; + $this->dispatcher = new Dispatcher(); + $this->logger = new Logger(); + } + public function testConfigureLogger() + { + $dispatcher = new Dispatcher(); + $this->assertSame(Yii::getLogger(), $dispatcher->getLogger()); - $logger = new Logger(); - $dispatcher = new Dispatcher([ - 'logger' => $logger, - ]); - $this->assertSame($logger, $dispatcher->getLogger()); + $logger = new Logger(); + $dispatcher = new Dispatcher([ + 'logger' => $logger, + ]); + $this->assertSame($logger, $dispatcher->getLogger()); - $dispatcher = new Dispatcher([ - 'logger' => 'yii\log\Logger', - ]); - $this->assertInstanceOf('yii\log\Logger', $dispatcher->getLogger()); - $this->assertEquals(0, $dispatcher->getLogger()->traceLevel); + $dispatcher = new Dispatcher([ + 'logger' => 'yii\log\Logger', + ]); + $this->assertInstanceOf('yii\log\Logger', $dispatcher->getLogger()); + $this->assertEquals(0, $dispatcher->getLogger()->traceLevel); - $dispatcher = new Dispatcher([ - 'logger' => [ + + $dispatcher = new Dispatcher([ + 'logger' => [ + 'class' => 'yii\log\Logger', + 'traceLevel' => 42, + ], + ]); + $this->assertInstanceOf('yii\log\Logger', $dispatcher->getLogger()); + $this->assertEquals(42, $dispatcher->getLogger()->traceLevel); + } + + /** + * @covers yii\log\Dispatcher::setLogger() + */ + public function testSetLogger() + { + $this->dispatcher->setLogger($this->logger); + $this->assertSame($this->logger, $this->dispatcher->getLogger()); + + $this->dispatcher->setLogger('yii\log\Logger'); + $this->assertInstanceOf('yii\log\Logger', $this->dispatcher->getLogger()); + $this->assertEquals(0, $this->dispatcher->getLogger()->traceLevel); + + $this->dispatcher->setLogger([ 'class' => 'yii\log\Logger', 'traceLevel' => 42, - ], - ]); - $this->assertInstanceOf('yii\log\Logger', $dispatcher->getLogger()); - $this->assertEquals(42, $dispatcher->getLogger()->traceLevel); - } + ]); + $this->assertInstanceOf('yii\log\Logger', $this->dispatcher->getLogger()); + $this->assertEquals(42, $this->dispatcher->getLogger()->traceLevel); + } - public function testSetLogger() - { - $dispatcher = new Dispatcher(); - $this->assertSame(Yii::getLogger(), $dispatcher->getLogger()); + /** + * @covers yii\log\Dispatcher::getTraceLevel() + */ + public function testGetTraceLevel() + { + $this->logger->traceLevel = 123; + $this->dispatcher->setLogger($this->logger); + $this->assertEquals(123, $this->dispatcher->getTraceLevel()); + } - $logger = new Logger(); - $dispatcher->setLogger($logger); - $this->assertSame($logger, $dispatcher->getLogger()); + /** + * @covers yii\log\Dispatcher::setTraceLevel() + */ + public function testSetTraceLevel() + { + $this->dispatcher->setLogger($this->logger); + $this->dispatcher->setTraceLevel(123); + $this->assertEquals(123, $this->logger->traceLevel); + } - $dispatcher->setLogger('yii\log\Logger'); - $this->assertInstanceOf('yii\log\Logger', $dispatcher->getLogger()); - $this->assertEquals(0, $dispatcher->getLogger()->traceLevel); + /** + * @covers yii\log\Dispatcher::getFlushInterval() + */ + public function testGetFlushInterval() + { + $this->logger->flushInterval = 99; + $this->dispatcher->setLogger($this->logger); + $this->assertEquals(99, $this->dispatcher->getFlushInterval()); + } + /** + * @covers yii\log\Dispatcher::setFlushInterval() + */ + public function testSetFlushInterval() + { + $this->dispatcher->setLogger($this->logger); + $this->dispatcher->setFlushInterval(99); + $this->assertEquals(99, $this->logger->flushInterval); + } - $dispatcher->setLogger([ - 'class' => 'yii\log\Logger', - 'traceLevel' => 42, - ]); - $this->assertInstanceOf('yii\log\Logger', $dispatcher->getLogger()); - $this->assertEquals(42, $dispatcher->getLogger()->traceLevel); - } + /** + * @covers yii\log\Dispatcher::dispatch() + */ + public function testDispatchWithDisabledTarget() + { + $target = $this->getMockBuilder('yii\\log\\Target') + ->setMethods(['collect']) + ->getMockForAbstractClass(); + $target->expects($this->never())->method($this->anything()); + $target->enabled = false; + + $dispatcher = new Dispatcher(['targets' => ['fakeTarget' => $target]]); + $dispatcher->dispatch('messages', true); + } + + /** + * @covers yii\log\Dispatcher::dispatch() + */ + public function testDispatchWithSuccessTargetCollect() + { + $target = $this->getMockBuilder('yii\\log\\Target') + ->setMethods(['collect']) + ->getMockForAbstractClass(); + + $target->expects($this->once()) + ->method('collect') + ->with( + $this->equalTo('messages'), + $this->equalTo(true) + ); + + $dispatcher = new Dispatcher(['targets' => ['fakeTarget' => $target]]); + $dispatcher->dispatch('messages', true); + } + + /** + * @covers yii\log\Dispatcher::dispatch() + */ + public function testDispatchWithFakeTarget2ThrowExceptionWhenCollect() + { + static::$microtimeIsMocked = true; + $target1 = $this->getMockBuilder('yii\\log\\Target') + ->setMethods(['collect']) + ->getMockForAbstractClass(); + + $target2 = $this->getMockBuilder('yii\\log\\Target') + ->setMethods(['collect']) + ->getMockForAbstractClass(); + + $target1->expects($this->exactly(2)) + ->method('collect') + ->withConsecutive( + [$this->equalTo('messages'), $this->equalTo(true)], + [ + [[ + 'Unable to send log via '.get_class($target1).': Exception: some error', + Logger::LEVEL_WARNING, + 'yii\log\Dispatcher::dispatch', + 'time data', + [], + ]], + true + ] + ); + + $target2->expects($this->once()) + ->method('collect') + ->with( + $this->equalTo('messages'), + $this->equalTo(true) + )->will($this->throwException(new UserException('some error'))); + + $dispatcher = new Dispatcher(['targets' => ['fakeTarget1' => $target1, 'fakeTarget2' => $target2]]); + + static::$functions['microtime'] = function ($arguments) { + $this->assertEquals([true], $arguments); + return 'time data'; + }; + + $dispatcher->dispatch('messages', true); + } + + /** + * @covers yii\log\Dispatcher::init() + */ + public function testInitWithCreateTargetObject() + { + $dispatcher = new Dispatcher( + [ + 'targets' => [ + 'syslog' => [ + 'class' => 'yii\log\SyslogTarget' + ] + ] + ] + ); + + $this->assertEquals($dispatcher->targets['syslog'], Yii::createObject('yii\log\SyslogTarget')); + } + + /** + * @param $name + * @param $arguments + * @return mixed + */ + public static function __callStatic($name, $arguments) { + if (isset(static::$functions[$name]) && is_callable(static::$functions[$name])) { + $arguments = isset($arguments[0]) ? $arguments[0] : $arguments; + return forward_static_call(static::$functions[$name], $arguments); + } + static::fail("Function '$name' has not implemented yet!"); + } + } } diff --git a/tests/framework/log/LoggerTest.php b/tests/framework/log/LoggerTest.php index 7ecd5d9..c6230df 100644 --- a/tests/framework/log/LoggerTest.php +++ b/tests/framework/log/LoggerTest.php @@ -228,9 +228,9 @@ class LoggerTest extends TestCase */ public function testGetElapsedTime() { - $timeBefore = microtime(true) - YII_BEGIN_TIME; + $timeBefore = \microtime(true) - YII_BEGIN_TIME; $actual = $this->logger->getElapsedTime(); - $timeAfter = microtime(true) - YII_BEGIN_TIME; + $timeAfter = \microtime(true) - YII_BEGIN_TIME; $this->assertGreaterThan($timeBefore, $actual); $this->assertLessThan($timeAfter, $actual); From ae4e7637885b3341d1555e7a1a7519f5aef8e154 Mon Sep 17 00:00:00 2001 From: Nils Date: Wed, 10 Aug 2016 14:46:23 +0300 Subject: [PATCH 150/163] Fixed multiple mistakes in messages in Latvian (#12131) [skip ci] MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change from international "fails" to localized "datne"; positive expression formats for value validation errors; fixed invalid use of "sekojošiem" replacing with "šādiem"; fixed singular and plural forms of the word "simbols"; clarified meaning of "virknei" by prefixing it with "simbolu"; fixed other minor spelling mistakes. --- framework/messages/lv/yii.php | 68 +++++++++++++++++++++---------------------- 1 file changed, 34 insertions(+), 34 deletions(-) diff --git a/framework/messages/lv/yii.php b/framework/messages/lv/yii.php index f7e3060..d436569 100644 --- a/framework/messages/lv/yii.php +++ b/framework/messages/lv/yii.php @@ -40,42 +40,42 @@ return [ '{nFormatted} {n, plural, =1{tebibyte} other{tebibytes}}' => '{nFormatted} tebi{n, plural, zero{baitu} one{baits} other{baiti}}', '{nFormatted} {n, plural, =1{terabyte} other{terabytes}}' => '{nFormatted} tera{n, plural, zero{baitu} one{baits} other{baiti}}', '(not set)' => '(nav uzstādīts)', - 'An internal server error occurred.' => 'Notika servera iekšēja kļūda.', - 'Are you sure you want to delete this item?' => 'Vai jūs esat pārliecināti, ka vēlaties nodzēst šo elementu?', + 'An internal server error occurred.' => 'Notika servera iekšējā kļūda.', + 'Are you sure you want to delete this item?' => 'Vai jūs esat pārliecināti, ka vēlaties dzēst šo vienumu?', 'Delete' => 'Dzēst', 'Error' => 'Kļūda', - 'File upload failed.' => 'Neizdevās augšupielādēt failu.', + 'File upload failed.' => 'Neizdevās augšupielādēt datni.', 'Home' => 'Galvenā', 'Invalid data received for parameter "{param}".' => 'Tika saņemta nepareiza vērtība parametram "{param}".', 'Login Required' => 'Nepieciešama autorizācija.', - 'Missing required arguments: {params}' => 'Trūkst nepieciešamos argumentus: {params}', - 'Missing required parameters: {params}' => 'Trūkst nepieciešamos parametrus: {params}', + 'Missing required arguments: {params}' => 'Trūkst nepieciešamie argumenti: {params}', + 'Missing required parameters: {params}' => 'Trūkst nepieciešamie parametri: {params}', 'No' => 'Nē', 'No help for unknown command "{command}".' => 'Palīdzība nezināmai komandai "{command}" nav pieejama.', 'No help for unknown sub-command "{command}".' => 'Palīdzība nezināmai sub-komandai "{command}" nav pieejama', - 'No results found.' => 'Nekas nav atrasts.', - 'Only files with these MIME types are allowed: {mimeTypes}.' => 'Ir atļauts augšupielādēt failus tikai ar sekojošiem MIME-tipiem: {mimeTypes}.', - 'Only files with these extensions are allowed: {extensions}.' => 'Ir atļauts augšupielādēt failus tikai ar sekojošiem paplašinājumiem: {extensions}.', - 'Page not found.' => 'Pieprasīta lapa netika atrasta.', - 'Please fix the following errors:' => 'Nepieciešams izlabot sekojošas kļūdas:', - 'Please upload a file.' => 'Lūdzu, augšupielādiet failu.', + 'No results found.' => 'Nekas netika atrasts.', + 'Only files with these MIME types are allowed: {mimeTypes}.' => 'Ir atļauts augšupielādēt datnes tikai ar šādiem MIME-tipiem: {mimeTypes}.', + 'Only files with these extensions are allowed: {extensions}.' => 'Ir atļauts augšupielādēt datnes tikai ar šādiem paplašinājumiem: {extensions}.', + 'Page not found.' => 'Pieprasītā lapa netika atrasta.', + 'Please fix the following errors:' => 'Nepieciešams izlabot šādas kļūdas:', + 'Please upload a file.' => 'Lūdzu, augšupielādēt datni.', 'Showing {begin, number}-{end, number} of {totalCount, number} {totalCount, plural, one{item} other{items}}.' => 'Tiek rādīti ieraksti {begin, number}-{end, number} no {totalCount, number}.', - 'The file "{file}" is not an image.' => 'Fails „{file}” nav uzskatīts par attēlu.', - 'The file "{file}" is too big. Its size cannot exceed {formattedLimit}.' => 'Fails „{file}” pārsniedz pieļaujamo ierobežojumu. Izmēram nedrīkst pārsniegt {formattedLimit}.', - 'The file "{file}" is too small. Its size cannot be smaller than {formattedLimit}.' => 'Fails „{file}” ir pārāk mazs. Izmēram ir jābūt vairāk par {formattedLimit}.', - 'The format of {attribute} is invalid.' => 'Vērtībai „{attribute}” ir nepareizs formāts.', - 'The image "{file}" is too large. The height cannot be larger than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'Attēls „{file}” ir pārāk liels. Augstumam ir jābūt mazākam par {limit, number} {limit, plural, one{pikseļi} other{pikseļiem}}.', - 'The image "{file}" is too large. The width cannot be larger than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'Attēls „{file}” ir pārāk liels. Platumam ir jābūt mazākam par {limit, number} {limit, plural, one{pikseļi} other{pikseļiem}}.', - 'The image "{file}" is too small. The height cannot be smaller than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'Attēls „{file}” ir pārāk mazs. Augstumam ir jābūt lielākam par {limit, number} {limit, plural, one{pikseļi} other{pikseļiem}}.', - 'The image "{file}" is too small. The width cannot be smaller than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'Attēls „{file}” ir pārāk mazs. Platumam ir jābūt lielākam par {limit, number} {limit, plural, one{pikseļi} other{pikseļiem}}.', - 'The requested view "{name}" was not found.' => 'Pieprasīts priekšstata fails „{name}” nav atrasts.', + 'The file "{file}" is not an image.' => 'Saņemtā „{file}” datne nav attēls.', + 'The file "{file}" is too big. Its size cannot exceed {formattedLimit}.' => 'Saņemtās „{file}” datnes izmērs pārsniedz pieļaujamo ierobežojumu {formattedLimit} apmērā.', + 'The file "{file}" is too small. Its size cannot be smaller than {formattedLimit}.' => 'Saņemtās „{file}” datnes izmērs ir pārāk maza, tai ir jābūt vismaz {formattedLimit} apmērā.', + 'The format of {attribute} is invalid.' => '„{attribute}” vertības formāts ir nepareizs.', + 'The image "{file}" is too large. The height cannot be larger than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'Attēls „{file}” ir pārāk liels. Augstumam ir jābūt mazākam par {limit, number} {limit, plural, one{pikseli} other{pikseļiem}}.', + 'The image "{file}" is too large. The width cannot be larger than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'Attēls „{file}” ir pārāk liels. Platumam ir jābūt mazākam par {limit, number} {limit, plural, one{pikseli} other{pikseļiem}}.', + 'The image "{file}" is too small. The height cannot be smaller than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'Attēls „{file}” ir pārāk mazs. Augstumam ir jābūt lielākam par {limit, number} {limit, plural, one{pikseli} other{pikseļiem}}.', + 'The image "{file}" is too small. The width cannot be smaller than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'Attēls „{file}” ir pārāk mazs. Platumam ir jābūt lielākam par {limit, number} {limit, plural, one{pikseli} other{pikseļiem}}.', + 'The requested view "{name}" was not found.' => 'Pieprasītā skata datne „{name}” netika atrasta.', 'The verification code is incorrect.' => 'Nepareizs pārbaudes kods.', 'Total {count, number} {count, plural, one{item} other{items}}.' => 'Kopā {count, number} {count, plural, zero{ierakstu} one{ieraksts} other{ieraksti}}.', - 'Unable to verify your data submission.' => 'Neizdevās pārbaudīt nosūtītos datus.', + 'Unable to verify your data submission.' => 'Neizdevās apstiprināt saņemtos datus.', 'Unknown command "{command}".' => 'Nezināma komanda "{command}".', - 'Unknown option: --{name}' => 'Nezināma opcija: --{name}', + 'Unknown option: --{name}' => 'Nezināma izvēle: --{name}', 'Update' => 'Labot', - 'View' => 'Skatīties', + 'View' => 'Apskatīt', 'Yes' => 'Jā', 'You are not allowed to perform this action.' => 'Jūs neesat autorizēts veikt šo darbību.', 'You can upload at most {limit, number} {limit, plural, one{file} other{files}}.' => 'Jūs nevarat augšupielādēt vairāk par {limit, number} {limit, plural, one{failu} other{failiem}}.', @@ -85,28 +85,28 @@ return [ 'in {delta, plural, =1{a second} other{# seconds}}' => 'pēc {delta, plural, =1{sekundes} one{#. sekundes} other{#. sekundēm}}', 'in {delta, plural, =1{a year} other{# years}}' => 'pēc {delta, plural, =1{gada} one{#. gada} other{#. gadām}}', 'in {delta, plural, =1{an hour} other{# hours}}' => 'pēc {delta, plural, =1{stundas} one{#. stundas} other{#. stundām}}', - 'the input value' => 'ievadīta vērtība', + 'the input value' => 'ievadītā vērtība', '{attribute} "{value}" has already been taken.' => '{attribute} „{value}” jau ir aizņemts.', '{attribute} cannot be blank.' => 'Ir jāaizpilda „{attribute}”.', '{attribute} is invalid.' => '„{attribute}” vērtība ir nepareiza.', - '{attribute} is not a valid URL.' => '„{attribute}” vērtība netiek uzskatīta par pareizu URL.', - '{attribute} is not a valid email address.' => '„{attribute}” vērtība netiek uzskatīta par pareizu e-pasta adresi.', + '{attribute} is not a valid URL.' => '„{attribute}” vērtība nav pareiza URL formātā.', + '{attribute} is not a valid email address.' => '„{attribute}” vērtība nav pareizas e-pasta adreses formātā.', '{attribute} must be "{requiredValue}".' => '„{attribute}” vērtībai ir jābūt vienādai ar „{requiredValue}”.', '{attribute} must be a number.' => '„{attribute}” vērtībai ir jābūt skaitlim.', - '{attribute} must be a string.' => '„{attribute}” vērtībai ir jābūt virknei.', + '{attribute} must be a string.' => '„{attribute}” vērtībai ir jābūt simbolu virknei.', '{attribute} must be an integer.' => '„{attribute}” vērtībai ir jābūt veselam skaitlim.', '{attribute} must be either "{true}" or "{false}".' => '„{attribute}” vērtībai ir jābūt „{true}” vai „{false}”.', '{attribute} must be greater than "{compareValueOrAttribute}".' => '„{attribute}” vērtībai ir jābūt lielākai par „{compareValueOrAttribute}” vērtību.', '{attribute} must be greater than or equal to "{compareValueOrAttribute}".' => '„{attribute}” vērtībai ir jābūt lielākai vai vienādai ar „{compareValueOrAttribute}” vērtību.', '{attribute} must be less than "{compareValueOrAttribute}".' => '„{attribute}” vērtībai ir jābūt mazākai par „{compareValueOrAttribute}” vērtību.', '{attribute} must be less than or equal to "{compareValueOrAttribute}".' => '„{attribute}” vērtībai ir jābūt mazākai vai vienādai ar „{compareValueOrAttribute}” vērtību.', - '{attribute} must be no greater than {max}.' => '„{attribute}” vērtībai nedrīkst pārsniegt {max}.', - '{attribute} must be no less than {min}.' => '„{attribute}” vērtībai ir jāpārsniedz {min}.', - '{attribute} must be equal to "{compareValueOrAttribute}".' => '„{attribute}” vērtībai jābūt vienādai ar „{compareValueOrAttribute}”.', - '{attribute} must not be equal to "{compareValueOrAttribute}".' => '„{attribute}” vērtībai nedrīkst būt vienādai ar „{compareValueOrAttribute}”.', - '{attribute} should contain at least {min, number} {min, plural, one{character} other{characters}}.' => '„{attribute}” vērtībai ir jāietver vismaz {min, number} {min, plural, one{simbolu} other{simbolus}}.', - '{attribute} should contain at most {max, number} {max, plural, one{character} other{characters}}.' => '„{attribute}” vērtībai ir jāietver ne vairāk par {max, number} {max, plural, one{simbolu} other{simbolus}}.', - '{attribute} should contain {length, number} {length, plural, one{character} other{characters}}.' => '„{attribute}” vērtībai ir jāietver {length, number} {length, plural, one{simbolu} other{simbolus}}.', + '{attribute} must be no greater than {max}.' => '„{attribute}” vērtībai ir jābūt mazākai par {max}.', + '{attribute} must be no less than {min}.' => '„{attribute}” vērtībai ir jābūt lielākai par {min}.', + '{attribute} must be equal to "{compareValueOrAttribute}".' => '„{attribute}” vērtībai ir jābūt vienādai ar „{compareValueOrAttribute}”.', + '{attribute} must not be equal to "{compareValueOrAttribute}".' => '„{attribute}” vērtība nedrīkst būt vienāda ar „{compareValueOrAttribute}” vērtību.', + '{attribute} should contain at least {min, number} {min, plural, one{character} other{characters}}.' => '„{attribute}” vērtībai ir jābūt garākai par {min, number} {min, plural, one{simbolu} other{simboliem}}.', + '{attribute} should contain at most {max, number} {max, plural, one{character} other{characters}}.' => '„{attribute}” vērtībai ir jābūt īsākai par {max, number} {max, plural, one{simbolu} other{simboliem}}.', + '{attribute} should contain {length, number} {length, plural, one{character} other{characters}}.' => '„{attribute}” vērtībai ir jāsastāv no {length, number} {length, plural, one{simbola} other{simboliem}}.', '{delta, plural, =1{a day} other{# days}} ago' => '{delta, plural, =1{diena} zero{# dienas} one{#. diena} other{#. dienas}} atpakaļ', '{delta, plural, =1{a minute} other{# minutes}} ago' => '{delta, plural, =1{minūte} zero{# minūtes} one{#. minūte} other{#. minūtes}} atpakaļ', '{delta, plural, =1{a month} other{# months}} ago' => '{delta, plural, =1{mēness} zero{# mēnešu} one{#. mēness} other{#. mēnešu}} atpakaļ', From 957e4daa8e08d0f1c650b7e3c4658b68ef725c5c Mon Sep 17 00:00:00 2001 From: jaaf Date: Wed, 10 Aug 2016 15:21:47 +0200 Subject: [PATCH 151/163] Adding French translation of structure-models.md [skip ci] (#12132) * Corrections dans concept-aliases.md version fr * Some correction in intro-upgrade-from.md French version * some corrections in start-databases.md French version * added translation of structure-applications.md French version * adding source change in translation of concept-alias.md * adding source change in translation of intro-upgrade-from-v1.md * a few typos --- docs/guide-fr/structure-models.md | 430 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 430 insertions(+) create mode 100644 docs/guide-fr/structure-models.md diff --git a/docs/guide-fr/structure-models.md b/docs/guide-fr/structure-models.md new file mode 100644 index 0000000..f375bd5 --- /dev/null +++ b/docs/guide-fr/structure-models.md @@ -0,0 +1,430 @@ +Modèles +======= + +Les modèles font partie du modèle d'architecture [MVC](http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller) (Modèle Vue Contrôleur). +Ces objets représentent les données à traiter, les règles et la logique de traitement. + +Vous pouvez créer des classes de modèle en étendant la classe [[yii\base\Model]] ou ses classe filles. La classe de base [[yii\base\Model]] prend en charge des fonctionnalités nombreuses et utiles : + +* Les [attributs](#attributes) : ils représentent les données à traiter et peuvent être accédés comme des propriétés habituelles d'objets ou des éléments de tableaux. +* Les étiquettes d'[attribut](#attribute-labels) : elles spécifient les étiquettes pour l'affichage des attributs. +* L'[assignation massive](#massive-assignment) : elle permet l'assignation de multiples attributs en une seule étape. +* Les [règles de validation](#validation-rules) : elles garantissent la validité des données saisies en s'appuyant sur des règles de validation déclarées. +* L'[exportation des données](#data-exporting) : elle permet au modèle de données d'être exporté sous forme de tableaux dans des formats personnalisables. + +La classe `Model` est également la classe de base pour des modèles plus évolués, comme la classe class [Active Record (enregistrement actif)](db-active-record.md). Reportez-vous à la documentation ad hoc pour plus de détails sur ces modèles évolués. + +> Info: vous n'êtes pas forcé de baser vos classes de modèle sur la classe [[yii\base\Model]]. Néanmoins, comme il y a de nombreux composants de Yii conçus pour prendre en charge la classe [[yii\base\Model]], il est généralement préférable de baser vos modèles sur cette classe. + + +## Attributs + +Les modèles représentent les données de l'application en termes d'attributs. Chaque attribut est comme un propriété publiquement accessible d'un modèle. La méthode [[yii\base\Model::attributes()]] spécifie quels attributs une classe de modèle possède. + +Vous pouvez accéder à un attribut comme vous accédez à une propriété d'un objet ordinaire : + +```php +$model = new \app\models\ContactForm; + +// "name" is an attribute of ContactForm +$model->name = 'example'; +echo $model->name; +``` + +Vous pouvez également accéder aux attributs comme aux éléments d'un tableau, grâce à la prise en charge de [ArrayAccess](http://php.net/manual/en/class.arrayaccess.php) et [ArrayIterator](http://php.net/manual/en/class.arrayiterator.php) +par la classe [[yii\base\Model]]: + +```php +$model = new \app\models\ContactForm; + +// accès aux attributs comme à des éléments de tableau +$model['name'] = 'example'; +echo $model['name']; + +// itération sur les attributs +foreach ($model as $name => $value) { + echo "$name: $value\n"; +} +``` + + +### Definition d'attributs + +Par défaut, si votre classe de modèle étend directement la classe [[yii\base\Model]], toutes ses variables membres *non statiques et publiques* sont des attributs. Par exemple, la classe de modèle `ContactForm` ci-dessous possède quatre attributs : `name`, `email`, +`subject` et `body`. Le modèle `ContactForm` est utilisé pour représenter les données saisies dans un formulaire HTML. + +```php +namespace app\models; + +use yii\base\Model; + +class ContactForm extends Model +{ + public $name; + public $email; + public $subject; + public $body; +} +``` + + +Vous pouvez redéfinir la méthode [[yii\base\Model::attributes()]] pour spécifier les attributs d'une autre manière. La méthode devrait retourner le nom des attributs d'un modèle. Par exemple, [[yii\db\ActiveRecord]] fait cela en retournant le nom des colonnes de la base de données associée en tant que noms d'attribut. Notez que vous pouvez aussi avoir besoin de redéfinir les méthodes magiques telles que `__get()` et `__set()` afin que les attributs puissent être accédés comme les propriétés d'un objet ordinaire. + + +### Étiquettes d'attribut + +Lors de l'affichage de la valeur d'un attribut ou lors de la saisie d'une entrée pour une telle valeur, il est souvent nécessaire d'afficher une étiquette associée à l'attribut. Par exemple, étant donné l'attribut nommé `firstName` (prénom), vous pouvez utiliser une étiquette de la forme `First Name` qui est plus conviviale lorsqu'elle est présentée à l'utilisateur final dans un formulaire ou dans un message d'erreur. + +Vous pouvez obtenir l'étiquette d'un attribut en appelant la méthode [[yii\base\Model::getAttributeLabel()]]. Par exemple : + +```php +$model = new \app\models\ContactForm; + +// displays "Name" +echo $model->getAttributeLabel('name'); +``` + +Par défaut, les étiquettes d'attribut sont automatiquement générées à partir des noms d'attribut. La génération est faite en appelant la méthode [[yii\base\Model::generateAttributeLabel()]]. Cette méthode transforme un nom de variable avec une casse en dos de chameau en de multiples mots, chacun commençant par une capitale. Par exemple, `username` donne `Username` et `firstName` donne `First Name`. + +Si vous ne voulez pas utiliser les étiquettes à génération automatique, vous pouvez redéfinir la méthode [[yii\base\Model::attributeLabels()]] pour déclarer explicitement les étiquettes d'attribut. Par exemple : + +```php +namespace app\models; + +use yii\base\Model; + +class ContactForm extends Model +{ + public $name; + public $email; + public $subject; + public $body; + + public function attributeLabels() + { + return [ + 'name' => 'Nom', + 'email' => 'Adresse de courriel', + 'subject' => 'Subjet', + 'body' => 'Contenu', + ]; + } +} +``` + +Pour les application prenant en charge de multiples langues, vous désirez certainement traduire les étiquettes d'attribut. Cela peut être fait dans la méthode [[yii\base\Model::attributeLabels()|attributeLabels()]] également, en procédant comme ceci : + +```php +public function attributeLabels() +{ + return [ + 'name' => \Yii::t('app', 'Your name'), + 'email' => \Yii::t('app', 'Your email address'), + 'subject' => \Yii::t('app', 'Subject'), + 'body' => \Yii::t('app', 'Content'), + ]; +} +``` + +Vous pouvez même définir les étiquettes en fonction de conditions. Par exemple, en fonction du [scénario](#scenarios) dans lequel le modèle est utilisé, vous pouvez retourner des étiquettes différentes pour le même attribut. + +> Info: strictement parlant, les étiquettes d'attribut font partie des [vues](structure-views.md). Mais la déclaration d'étiquettes dans les modèles est souvent très pratique et conduit à un code propre et réutilisable. + + +## Scénarios + +Un modèle peut être utilisé dans différents *scénarios*. Par exemple, un modèle `User` (utilisateur) peut être utilisé pour collecter les données d'un utilisateur, mais il peut aussi être utilisé à des fins d'enregistrement d'enregistrement de l'utilisateur. Dans différents scénarios, un modèle peut utiliser des règles de traitement et une logique différente. Par exemple, `email` peut être nécessaire lors de l'enregistrement de l'utilisateur mais pas utilisé lors de sa connexion. + +Un modèle utilise la propriété [[yii\base\Model::scenario]] pour conserver un trace du scénario dans lequel il est utilisé. + +Par défaut, un modèle prend en charge un unique scénario nommé `default`. Le code qui suit montre deux manières de définir le scénario d'un modèle : + +```php +// le scénario est défini comme une propriété +$model = new User; +$model->scenario = User::SCENARIO_LOGIN; + +// le scénario est défini via une configuration +$model = new User(['scenario' => User::SCENARIO_LOGIN]); +``` + +Par défaut, les scénarios pris en charge par un modèle sont détérminés par les [règles de validation](#validation-rules) déclarées dans le modèle. Néanmoins, vous pouvez personnaliser ce comportement en redéfinissant la méthode [[yii\base\Model::scenarios()]], de la manière suivante : + +```php +namespace app\models; + +use yii\db\ActiveRecord; + +class User extends ActiveRecord +{ + const SCENARIO_LOGIN = 'login'; + const SCENARIO_REGISTER = 'register'; + + public function scenarios() + { + return [ + self::SCENARIO_LOGIN => ['username', 'password'], + self::SCENARIO_REGISTER => ['username', 'email', 'password'], + ]; + } +} +``` + +> Info: dans ce qui précède et dans l'exemple qui suit, les classes de modèle étendent la classe [[yii\db\ActiveRecord]] parce que l'utilisation de multiples scénarios intervient ordinairement dans les classes [Active Record](db-active-record.md). + +La méthode `scenarios()` retourne un tableau dont les clés sont les noms de scénario et les valeurs les *attributs actifs* correspondants. Les attributs actifs peuvent être [assignés massivement](#massive-assignment) et doivent respecter des règles de [validation](#validation-rules). Dans l'exemple ci-dessus, les attributs `username` et `password` sont actifs dans le scénario `login`, tandis que dans le scénario `register` , `email` est, en plus de `username` et`password`, également actif. + +La mise en œuvre par défaut des `scenarios()` retourne tous les scénarios trouvés dans la méthode de déclaration des règles de validation [[yii\base\Model::rules()]]. Lors de la redéfinition des `scenarios()`, si vous désirez introduire de nouveaux scénarios en plus des scénarios par défaut, vous pouvez utiliser un code similaire à celui qui suit : + +```php +namespace app\models; + +use yii\db\ActiveRecord; + +class User extends ActiveRecord +{ + const SCENARIO_LOGIN = 'login'; + const SCENARIO_REGISTER = 'register'; + + public function scenarios() + { + $scenarios = parent::scenarios(); + $scenarios[self::SCENARIO_LOGIN] = ['username', 'password']; + $scenarios[self::SCENARIO_REGISTER] = ['username', 'email', 'password']; + return $scenarios; + } +} +``` +La fonctionnalité *scénarios* est d'abord utilisée pour la [validation](#validation-rules) et dans l'[assignation massive des attributs](#massive-assignment). Vous pouvez, cependant l'utiliser à d'autres fins. Par exemple, vous pouvez déclarer des [étiquettes d'attribut](#attribute-labels) différemment en vous basant sur le scénario courant. + + +## Règles de validation + +Losque les données pour un modèle sont reçues de l'utilisateur final, elles doivent être validées pour être sûr qu'elles respectent certaines règles (appelées *règles de validation*). Par exemple, étant donné un modèle pour un formulaire de contact (`ContactForm`), vous voulez vous assurer qu'aucun des attributs n'est vide et que l'attribut `email` contient une adresse de courriel valide. Si les valeurs pour certains attributs ne respectent pas les règles de validation, les messages d'erreur appropriés doivent être affichés pour aider l'utilisateur à corriger les erreurs. + +Vous pouvez faire appel à la méthode [[yii\base\Model::validate()]] pour valider les données reçues. La méthode utilise les règles de validation déclarées dans [[yii\base\Model::rules()]] pour valider chacun des attributs concernés. Si aucune erreur n'est trouvée, elle retourne `true` (vrai). Autrement, les erreurs sont stockées dans la propriété [[yii\base\Model::errors]] et la méthode retourne `false` (faux). Par exemple : + +```php +$model = new \app\models\ContactForm; + +// définit les attributs du modèle avec les entrées de l'utilisateur final +$model->attributes = \Yii::$app->request->post('ContactForm'); + +if ($model->validate()) { + // toutes les entrées sont valides +} else { + // la validation a échoué : le tableau $errors contient les messages d'erreur + $errors = $model->errors; +} +``` + + +Pour déclarer des règles de validation associées à un modèle, redéfinissez la méthode [[yii\base\Model::rules()]] en retournant les règles que le modèle doit respecter. L'exemple suivant montre les règles de validation déclarées pour le modèle *formulaire de contact `ContactForm` : + +```php +public function rules() +{ + return [ + // the name, email, subject and body attributes are required + [['name', 'email', 'subject', 'body'], 'required'], + + // the email attribute should be a valid email address + ['email', 'email'], + ]; +} +``` + +Une règle peut être utilisée pour valider un ou plusieurs attributs, et un attribut peut être validé par une ou plusieurs règles. Reportez-vous à la section [validation des entrées](input-validation.md) pour plus de détails sur la manière de déclarer les règles de validation. + +Parfois, vous désirez qu'une règle ne soit applicable que dans certains [scénarios](#scenarios). Pour cela, vous pouvez spécifier la propriété `on` d'une règle, comme ci-dessous : + +```php +public function rules() +{ + return [ + // username, email et password sont tous requis dans le scénario "register" + [['username', 'email', 'password'], 'required', 'on' => self::SCENARIO_REGISTER], + + // username et password sont requis dans le scénario "login" + [['username', 'password'], 'required', 'on' => self::SCENARIO_LOGIN], + ]; +} +``` + +Si vous ne spécifiez pas la propriété `on`, la règle sera appliquée dans tous les scénarios. Une règle est dite *règle active* si elle s'applique au scénario courant [[yii\base\Model::scenario|scenario]]. + +Un attribut n'est validé que si, et seulement si, c'est un attribut actif déclaré dans `scenarios()` et s'il est associé à une ou plusieurs règles actives déclarées dans `rules()`. + + +## Assignation massive + +L'assignation massive est une façon pratique de peupler un modèle avec les entrées de l'utilisateur final en utilisant une seule ligne de code . Elle peuple les attributs d'un modèle en assignant directement les données d'entrée à la propriété [[yii\base\Model::$attributes]]. Les deux extraits de code suivants sont équivalent. Ils tentent tous deux d'assigner les données du formulaire soumis par l'utilisateur final aux attributs du modèle `ContactForm`. En clair, le premier qui utilise l'assignation massive, est plus propre et moins sujet aux erreurs que le second : + +```php +$model = new \app\models\ContactForm; +$model->attributes = \Yii::$app->request->post('ContactForm'); +``` + +```php +$model = new \app\models\ContactForm; +$data = \Yii::$app->request->post('ContactForm', []); +$model->name = isset($data['name']) ? $data['name'] : null; +$model->email = isset($data['email']) ? $data['email'] : null; +$model->subject = isset($data['subject']) ? $data['subject'] : null; +$model->body = isset($data['body']) ? $data['body'] : null; +``` + + +### Attributs sûr + +L'assignation massive ne s'applique qu'aux attributs dits *attributs sûrs* qui sont les attributs listés dans la méthode [[yii\base\Model::scenarios()]] pour le [yii\base\Model::scenario|scénario]] courant d'un modèle. +Par exemple, si le modèle `User` contient la déclaration de scénarios suivante, alors, lorsque le scénario courant est `login`, seuls les attributs `username` et `password` peuvent être massivement assignés. Tout autre attribut n'est pas touché par l'assignation massive. + +```php +public function scenarios() +{ + return [ + self::SCENARIO_LOGIN => ['username', 'password'], + self::SCENARIO_REGISTER => ['username', 'email', 'password'], + ]; +} +``` + +> Info: la raison pour laquelle l'assignation massive ne s'applique qu'aux attributs sûrs est de vous permettre de contrôler quels attributs peuvent être modifiés par les données envoyées par l'utilisateur final. Par exemple, si le modèle `User` possède un attribut `permission` qui détermine les permissions accordées à l'utilisateur, vous préférez certainement que cet attribut ne puisse être modifié que par un administrateur via l'interface d'administration seulement. + +Comme la mise en œuvre par défaut de la méthode [[yii\base\Model::scenarios()]] retourne tous les scénarios et tous les attributs trouvés dans la méthode [[yii\base\Model::rules()]], si vous ne redéfinissez pas cette méthode, cela signifie qu'un attribut est *sûr* tant qu'il apparaît dans une des règles de validation actives. + +Pour cette raison, un validateur spécial dont l'alias est `safe` est fourni pour vous permettre de déclarer un attribut *safe* sans réellement le valider. Par exemple, les règles suivantes déclarent que `title` +et `description` sont tous deux des attributs sûrs. + +```php +public function rules() +{ + return [ + [['title', 'description'], 'safe'], + ]; +} +``` + + +### Attributs non sûr + +Comme c'est expliqué plus haut, la méthode [[yii\base\Model::scenarios()]] remplit deux objectifs : déterminer quels attributs doivent être validés, et déterminer quels attributs sont *sûrs*. Dans certains cas, vous désirez valider un attribut sans le marquer comme *sûr*. Vous pouvez le faire en préfixant son nom par un point d'exclamation `!` lorsque vous le déclarez dans la méthode `scenarios()`, comme c'est fait pour l'attribut `secret` dans le code suivant : + +```php +public function scenarios() +{ + return [ + self::SCENARIO_LOGIN => ['username', 'password', '!secret'], + ]; +} +``` + +Losque le modèle est dans le scénario `login`, les trois attributs sont validés. Néanmoins, seuls les attributs `username` +et `password` peuvent être massivement assignés. Pour assigner une valeur d'entrée à l'attribut `secret`, vous devez le faire explicitement, comme montré ci-dessous : + +```php +$model->secret = $secret; +``` + +La même chose peut être faite dans la méthode `rules()` : + +```php +public function rules() +{ + return [ + [['username', 'password', '!secret'], 'required', 'on' => 'login'] + ]; +} +``` + +Dans ce cas, les attributs `username`, `password` et `secret` sont requis, mais `secret` doit être assigné explicitement. + +## Exportation de données + +On a souvent besoin d'exporter les modèles dans différents formats. Par exemple, vous désirez peut-être convertir une collection de modèles dans le format JSON ou dans le format Excel. Le processus d'exportation peut être décomposé en deux étapes indépendantes. Dans la première étape, les modèles sont convertis en tableaux. Dans la deuxième étape, les tableaux sont convertis dans les formats cibles. Vous pouvez vous concentrer uniquement sur la première étape, parce que la seconde peut être accomplie par des formateurs génériques de données, tels que [[yii\web\JsonResponseFormatter]]. + +La manière la plus simple de convertir un modèle en tableau est d'utiliser la propriété [[yii\base\Model::$attributes]]. Par exemple : + +```php +$post = \app\models\Post::findOne(100); +$array = $post->attributes; +``` + +Par défaut, la propriété [[yii\base\Model::$attributes]] retourne les valeurs de *tous* les attributs déclarés dans la méthode [[yii\base\Model::attributes()]]. + +Une manière plus souple et plus puissante de convertir un modèle en tableau est d'utiliser la méthode [[yii\base\Model::toArray()]]. Son comportement par défaut est de retourner la même chose que la propriété [[yii\base\Model::$attributes]]. Néanmoins, elle vous permet de choisir quelles données, appelées *champs*, doivent être placées dans le tableau résultant et comment elles doivent être formatées. En fait, c'est la manière par défaut pour exporter les modèles dans le développement d'un service Web respectant totalement l'achitecture REST, telle que décrite à la section [Formatage de la réponse](rest-response-formatting.md). + + +### Champs + +Un champ n'est rien d'autre qu'un élément nommé du tableau qui est obtenu en appelant la méthode [[yii\base\Model::toArray()]] d'un modèle. + +Par défaut, les noms de champ sont équivalents aux noms d'attribut. Cependant, vous pouvez changer ce comportement en redéfinissant la méthode [[yii\base\Model::fields()|fields()]] et/ou la méthode [[yii\base\Model::extraFields()|extraFields()]]. Ces deux méthodes doivent retourner une liste de définitions de champ. Les champs définis par `fields()` sont des champs par défaut, ce qui signifie que `toArray()` retourne ces champs par défaut. La méthode `extraFields()` définit des champs additionnels disponibles qui peuvent également être retournés par `toArray()` du moment que vous les spécifiez via le paramètre `$expand`. Par exemple, le code suivant retourne tous les champs définis dans la méthode `fields()` ainsi que les champs `prettyName` et `fullAddress`, s'ils sont définis dans `extraFields()`. + +```php +$array = $model->toArray([], ['prettyName', 'fullAddress']); +``` + +Vous pouvez redéfinir la méthode `fields()` pour ajouter, retirer, renommer ou redéfinir des champs. La valeur de retour de la méthode `fields()` doit être un tableau associatif. Les clés du tableau sont les noms des champs et les valeurs sont les définitions de champ correspondantes qui peuvent être, soit des noms d'attribut/propriété, soit des fonctions anonymes retournant les valeurs de champ correspondantes. Dans le cas particulier où un nom de champ est identique à celui du nom d'attribut qui le définit, vous pouvez omettre la clé du tableau. Par exemple : + +```php +// liste explicitiement chaque champ ; à utiliser de préférence quand vous voulez être sûr +// que les changements dans votre table de base de données ou dans les attributs de votre modèle +// ne créent pas de changement dans vos champs (pour conserver la rétro-compatibilité de l'API). +public function fields() + +{ + return [ + // le nom du champ est identique à celui de l'attribut + 'id', + + // le nom du champ est "email", le nom d'attribut correspondant est "email_address" + 'email' => 'email_address', + + // le nom du champ est "name", sa valeur est définie par une fonction PHP de rappel + 'name' => function () { + return $this->first_name . ' ' . $this->last_name; + }, + ]; +} + +// filtre quelques champs ; à utiliser de préférence quand vous voulez hériter de l'implémentation du parent +// et mettre quelques champs sensibles en liste noire. +public function fields() +{ + $fields = parent::fields(); + + // retire les champs contenant des informations sensibles + unset($fields['auth_key'], $fields['password_hash'], $fields['password_reset_token']); + + return $fields; +} +``` + +> Warning: étant donné que, par défaut, tous les attributs d'un modèle sont inclus dans le tableau exporté, +> vous devez vous assurer que vos données ne contiennent pas d'information sensible. +> Si de telles informations existent, vous devriez redéfinir la méthode `fields()` pour les filtrer. +> Dans l'exemple ci-dessus, nous avons choisi d'exclure `auth_key`, `auth_key`, `password_hash` et `password_reset_token`. + + +## Meilleures pratiques + +Les modèles sont les endroits centraux pour représenter les données de l'application, les règles et la logique. Ils doivent souvent être réutilisés à différents endroits. Dans une application bien conçue, les modèles sont généralement plus volumineux que les [contrôleurs](structure-controllers.md). + +En résumé, voici les caractéristiques essentielles des modèles : + +* Ils peuvent contenir des attributs pour représenter les données de l'application. +* Ils peuvent contenir des règles de validation pour garantir la validité et l'intégrité des données. +* Ils peuvent contenir des méthodes assurant le traitement logique des données de l'application. +* Ils ne devraient PAS accéder directement à la requête, à la session ou à n'importe quelle autre donnée environnementale. Ces données doivent être injectées dans les modèles par les [contrôleurs](structure-controllers.md). +* Ils devraient éviter d'inclure du code HTML ou tout autre code relatif à la présentation — cela est fait de manière plus avantageuse dans les [vues](structure-views.md). +* Il faut éviter d'avoir trop de [scénarios](#scenarios) dans un même modèle. + +Vous pouvez ordinairement considérer cette dernière recommandation lorsque vous développez des systèmes importants et complexes. Dans ces systèmes, les modèles pourraient être très volumineux parce que, étant utilisés dans de nombreux endroits, ils doivent contenir de nombreux jeux de règles et de traitement logiques. Cela se termine le plus souvent en cauchemar pour la maintenance du code du modèle parce que le moindre changement de code est susceptible d'avoir de l'effet en de nombreux endroits. Pour rendre le modèle plus maintenable, vous pouvez adopter la stratégie suivante : + +* Définir un jeu de classes de base du modèle qui sont partagées par différentes [applications](structure-applications.md) ou + [modules](structure-modules.md). Ces classes de modèles devraient contenir un jeu minimal de règles et de logique qui sont communes à tous les usages. +* Dans chacune des [applications](structure-applications.md) ou [modules](structure-modules.md) qui utilise un modèle, définir une classe de modèle concrète en étendant la classe de base de modèle correspondante. Les classes de modèles concrètes devraient contenir certaines règles et logiques spécifiques à cette application ou à ce module. + +Par exemple, dans le [Modèle avancé de projet](https://github.com/yiisoft/yii2-app-advanced/blob/master/docs/guide/README.md), vous pouvez définir une classe de modèle de base `common\models\Post`. Puis, pour l'application « interface utilisateur » (*frontend*) vous pouvez définir une classe de base concrète `frontend\models\Post` qui étend la classe `common\models\Post`. De manière similaire, pour l'application « interface d'administration » (*backend*) vous pouvez définir une classe `backend\models\Post`. Avec cette stratégie, vous êtes sûr que le code de `frontend\models\Post` est seulement spécifique à l'application « interface utilisateur », et si vous y faite un changement, vous n'avez à vous soucier de savoir si cela à une influence sur l'application « interface d'administration ». From 575c5e5bf4e3e94a2dce157c102ed99df35ac850 Mon Sep 17 00:00:00 2001 From: Dmitriy Makarov Date: Thu, 11 Aug 2016 11:48:08 +0300 Subject: [PATCH 152/163] Fix typo [skip ci] (#12138) --- docs/guide/tutorial-performance-tuning.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/guide/tutorial-performance-tuning.md b/docs/guide/tutorial-performance-tuning.md index abbf10c..6afe5ab 100644 --- a/docs/guide/tutorial-performance-tuning.md +++ b/docs/guide/tutorial-performance-tuning.md @@ -138,7 +138,7 @@ If you have [Redis](http://redis.io/) on your server, it is highly recommended y ## Optimizing Databases -Execute DB queries and fetching data from databases is often the main performance bottleneck in +Executing DB queries and fetching data from databases are often the main performance bottleneck in a Web application. Although using [data caching](caching-data.md) techniques may alleviate the performance hit, it does not fully solve the problem. When the database contains enormous amounts of data and the cached data is invalid, fetching the latest data could be prohibitively expensive without proper database and query design. From dbab3239a1ca16c823c8cd9a91b322b68e69b677 Mon Sep 17 00:00:00 2001 From: Dmitriy Makarov Date: Thu, 11 Aug 2016 11:49:03 +0300 Subject: [PATCH 153/163] Fix typo [skip ci] (#12136) --- docs/guide/caching-data.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/guide/caching-data.md b/docs/guide/caching-data.md index 38095c4..7721dbe 100644 --- a/docs/guide/caching-data.md +++ b/docs/guide/caching-data.md @@ -227,7 +227,7 @@ $cache->set($key, $data, 30, $dependency); // The cache will check if the data has expired. // It will also check if the associated dependency was changed. -// It will return false if any of these conditions is met. +// It will return false if any of these conditions are met. $data = $cache->get($key); ``` From 2cea33561f520f8da6d7dd7c2549eef1dbfc0d73 Mon Sep 17 00:00:00 2001 From: jaaf Date: Fri, 12 Aug 2016 01:25:26 +0200 Subject: [PATCH 154/163] Adding French translation of structure-views.md [skip ci] (#12142) * Corrections dans concept-aliases.md version fr * Some correction in intro-upgrade-from.md French version * some corrections in start-databases.md French version * added translation of structure-applications.md French version * adding source change in translation of concept-alias.md * adding source change in translation of intro-upgrade-from-v1.md * adding French translation of structure-views.md [skip ci] * typos [skip ci] --- docs/guide-fr/structure-views.md | 588 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 588 insertions(+) create mode 100644 docs/guide-fr/structure-views.md diff --git a/docs/guide-fr/structure-views.md b/docs/guide-fr/structure-views.md new file mode 100644 index 0000000..3711547 --- /dev/null +++ b/docs/guide-fr/structure-views.md @@ -0,0 +1,588 @@ +Vues +===== + +Les vues font partie du modèle d'architecture [MVC](http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller) (Modèle Vue Contrôleur). +Elles sont chargées de présenter les données à l'utilisateur final. Dans une application Web, les vues sont ordinairement créées en termes de *modèles de vue* qui sont des script PHP contenant principalement du code HTML et du code PHP relatif à la présentation. + +Elles sont gérées par le [[yii\web\View|view]] [composant application](structure-application-components.md) qui fournit des méthodes d'usage courant pour faciliter la composition des vues et leur rendu. Par souci de simplicité, nous appellerons *vues* les modèles de vue et les fichiers de modèle de vue. + + +## Création des vues + +Comme nous l'avons dit ci-dessus, une vue n'est rien d'autre qu'un script PHP incluant du code HTML et du code PHP. Le script ci-dessous correspond à la vue d'un formulaire de connexion. Comme vous pouvez le voir le code PHP est utilisé pour générer le contenu dynamique, dont par exemple le titre de la page et le formulaire, tandis que le code HTML les organise en une page présentable. + +```php +title = 'Login'; +?> +

title) ?>

+ +

Veuillez remplir les champs suivants pour vous connecter:

+ + + field($model, 'username') ?> + field($model, 'password')->passwordInput() ?> + + +``` + +À l'intérieur d'une vue, vous avez accès à `$this` qui fait référence au [[yii\web\View|composant view (vue)]] responsable de le gestion et du rendu de ce modèle de vue. + +En plus de `$this`, il peut aussi y avoir d'autres variables prédéfinies dans une vue, telles que `$model` dans l'exemple précédent. Ces variables représentent les données qui sont *poussées* dans la vue par les [contrôleurs](structure-controllers.md) ou par d'autres objets qui déclenche le [rendu d'une vue](#rendering-views). + +> Tip: les variables prédéfinies sont listées dans un bloc de commentaires au début d'une vue de manière à être reconnues par les EDI. C'est également une bonne manière de documenter vos vues. + + +### Sécurité + +Lors de la création de vues qui génèrent des pages HTML, il est important que vous encodiez et/ou filtriez les données en provenance de l'utilisateur final avant des les présenter. Autrement, votre application serait sujette aux [attaques par injection de scripts (*cross-site scripting*)](http://en.wikipedia.org/wiki/Cross-site_scripting). + +Pour afficher du texte simple, commencez par l'encoder en appelant la méthode [[yii\helpers\Html::encode()]]. Par exemple, le code suivant encode le nom d'utilisateur (*username*) avant de l'afficher : + +```php + + +
+ name) ?> +
+``` + +Pour afficher un contenu HTML, utilisez l'objet [[yii\helpers\HtmlPurifier]] pour d'abord en filtrer le contenu. Par exemple, le code suivant filtre le contenu de la variable *post* avant de l'afficher : + + +```php + + +
+ text) ?> +
+``` + +> Tip: bien que l'objet HTMLPurifier effectue un excellent travail en rendant vos sorties sûres, il n'est pas rapide. Vous devriez envisager de mettre le résultat en [cache](caching-overview.md) lorsque votre application requiert une performance élevée. + + +### Organisation des vues + +Comme les [contrôleurs](structure-controllers.md) et les [modèles](structure-models.md), il existe certaines conventions pour organiser les vues. + +* Pour les vues rendues par un contrôleur, elles devraient être placées par défaut dans le dossier `@app/views/ControllerID` où `ControllerID` doit être remplacé par l'[identifiant du contrôleur](structure-controllers.md#routes). Par exemple, si la classe du contrôleur est `PostController`, le dossier est `@app/views/post`; si c'est `PostCommentController` le dossier est `@app/views/post-comment`. Dans le cas où le contrôleur appartient à un module, le dossier s'appelle `views/ControllerID` et se trouve dans le [[yii\base\Module::basePath|dossier racine du module]]. +* Pour les vues rendues dans un [widget (objet graphique)](structure-widgets.md), elles devraient être placées par défaut dans le dossier `WidgetPath/views` où `WidgetPath` est le dossier contenant le fichier de la classe du widget. +* Pour les vues rendues par d'autres objets, il est recommandé d'adopter une convention similaire à celle utilisée pour les *widgets*. + +Vous pouvez personnaliser ces dossiers par défaut en redéfinissant la méthode [[yii\base\ViewContextInterface::getViewPath()]] des contrôleurs ou des *widgets*. + + +## Rendu des vues + +Vous pouvez rendre les vues dans des [contrôleurs](structure-controllers.md), des [widgets](structure-widgets.md), ou dans d'autres endroits en appelant les méthodes de rendu des vues. Ces méthodes partagent un signature similaire comme montré ci-dessous : +``` +/** + * @param string $view nom de la vue ou chemin du fichier, selon la méthode réelle de rendu + * @param array $params les données injectées dans la vue + * @return string le résultat du rendu + */ +methodName($view, $params = []) +``` + + +### Rendu des vues dans des contrôleurs + +Dans les [contrôleurs](structure-controllers.md), vous pouvez appeler la méthode de contrôleur suivante pour rendre une vue : + +* [[yii\base\Controller::render()|render()]]: rend une [vue nommée](#named-views) et applique une [disposition](#layouts) + au résultat du rendu. +* [[yii\base\Controller::renderPartial()|renderPartial()]]: rend une [vue nommée](#named-views) sans disposition. +* [[yii\web\Controller::renderAjax()|renderAjax()]]: rend une [vue nommée ](#named-views) sans disposition et injecte tous les scripts et fichiers JS/CSS enregistrés. Cette méthode est ordinairement utilisée en réponse à une requête Web AJAX. +* [[yii\base\Controller::renderFile()|renderFile()]]: rend une vue spécifiée en terme de chemin ou d'[alias](concept-aliases.md) de fichier de vue. +* [[yii\base\Controller::renderContent()|renderContent()]]: rend un chaîne statique en l'injectant dans la [disposition](#layouts) courante. Cette méthode est disponible depuis la version 2.0.1. + +Par exemple : + +```php +namespace app\controllers; + +use Yii; +use app\models\Post; +use yii\web\Controller; +use yii\web\NotFoundHttpException; + +class PostController extends Controller +{ + public function actionView($id) + { + $model = Post::findOne($id); + if ($model === null) { + throw new NotFoundHttpException; + } + + // rend une vue nommée "view" et lui applique une disposition de page + return $this->render('view', [ + 'model' => $model, + ]); + } +} +``` + + +### Rendu des vues dans les *widgets* + +Dans les [*widgets*](structure-widgets.md), vous pouvez appeler les méthodes suivantes de la classe widget pour rendre une vue : + +* [[yii\base\Widget::render()|render()]]: rend une [vue nommée](#named-views). +* [[yii\base\Widget::renderFile()|renderFile()]]: rend une vue spécifiée en terme de chemin ou d'[alias](concept-aliases.md) de fichier de vue. + +Par exemple : + +```php +namespace app\components; + +use yii\base\Widget; +use yii\helpers\Html; + +class ListWidget extends Widget +{ + public $items = []; + + public function run() + { + // rend une vue nommée "list" + return $this->render('list', [ + 'items' => $this->items, + ]); + } +} +``` + + +### Rendu des vues dans des vues + +Vous pouvez rendre une vue dans une autre vue en appelant les méthodes suivantes du [[yii\base\View|composant view]]: + +* [[yii\base\View::render()|render()]]: rend une [vue nommée](#named-views). +* [[yii\web\View::renderAjax()|renderAjax()]]: rend une [vue nommée](#named-views) et injecte tous les fichiers et scripts JS/CSS enregistrés. On l'utilise ordinairement en réponse à une réquête Web AJAX. +* [[yii\base\View::renderFile()|renderFile()]]: rend une vue spécifiée en terme de chemin ou d'[alias](concept-aliases.md) de fichier de vue. + +Par exemple, le code suivant dans une vue, rend le fichier de vue `_overview.php` qui se trouve dans le même dossier que la vue courante. Rappelez-vous que `$this` dans une vue fait référence au composant [[yii\base\View|view]] : + +```php +render('_overview') ?> +``` + + +### Rendu de vues en d'autres endroits + +Dans n'importe quel endroit, vous pouvez accéder au composant d'application [[yii\base\View|view]] à l'aide de l'expression `Yii::$app->view` et ensuite appeler une de ses méthodes mentionnées plus haut pour rendre une vue. Par exemple : + +```php +// displays the view file "@app/views/site/license.php" +echo \Yii::$app->view->renderFile('@app/views/site/license.php'); +``` + + +### Vues nommées + +Lorsque vous rendez une vue, vous pouvez spécifier la vue en utilisant soit un nom de vue, soit un chemin/alias de fichier de vue. Dans la plupart des cas, vous utilisez le nom car il est plus concis et plus souple. Nous appelons les vues spécifiées par leur nom, des *vues nommées*. + +Un nom de vue est résolu en le chemin de fichier correspondant en appliquant les règles suivantes : + +* Un nom de vue peut omettre l'extension du nom de fichier. Dans ce cas, `.php` est utilisé par défaut en tant qu'extension. Par exemple, le nom de vue `about` correspond au nom de fichier `about.php`. +* Si le nom de vue commence par une double barre de division `//`, le chemin de fichier correspondant est `@app/views/ViewName` où `ViewName` est le nom de la vue. Dans ce cas la vue est recherchée dans le dossier [[yii\base\Application::viewPath|chemin des vues de l'application]]. Par exemple, `//site/about` est résolu en `@app/views/site/about.php`. +* Si le nom de la vue commence par une unique barre de division `/`, le chemin de fichier de la vue est formé en préfixant le nom de vue avec [[yii\base\Module::viewPath|chemin des vues]] du [module](structure-modules.md) actif courant . Si aucun module n'est actif, `@app/views/ViewName` — où `ViewName` est le nom de la vue — est utilisé. Par exemple, `/user/create` est résolu en `@app/modules/user/views/user/create.php`, si le module actif courant est `user` et en `@app/views/user/create.php`si aucun module n'est actif. +* Si la vue est rendue avec un [[yii\base\View::context|contexte]] et que le contexte implémente [[yii\base\ViewContextInterface]],le chemin de fichier de vue est formé en préfixant le nom de vue avec le [[yii\base\ViewContextInterface::getViewPath()|chemin des vues]] du contexte. Cela s'applique principalement aux vues rendues dans des contrôleurs et dans des *widgets*. Par exemple, `about` est résolu en `@app/views/site/about.php` si le contexte est le contrôleur `SiteController`. +* Si une vue est rendue dans une autre vue, le dossier contenant le nom de la nouvelle vue est préfixé avec le chemin du dossier contenant l'autre vue. Par exemple, la vue `item` est résolue en `@app/views/post/item.php` lorsqu'elle est rendue dans `@app/views/post/index.php`. + +Selon les règles précédentes, l'appel de `$this->render('view')` dans le contrôleur `app\controllers\PostController` rend réellement le fichier de vue `@app/views/post/view.php`, tandis que l'appel de `$this->render('_overview')` dans cette vue rend le fichier de vue `@app/views/post/_overview.php`. + + +### Accès aux données dans les vues + +Il existe deux approches pour accéder aux données à l'intérieur d'une vue : *pousser* et *tirer*. + +En passant les données en tant que second paramètre des méthodes de rendu de vues, vous utilisez la méthode *pousser*. Les données doivent être présentées sous forme de tableau clé-valeur. Lorsque la vue est rendue, la fonction PHP `extract()` est appelée sur ce tableau pour que le tableau soit restitué sous forme de variables dans la vue. Par exemple, le code suivant de rendu d'une vue dans un contrôleur *pousse* deux variables dans la vue `report` : + +`$foo = 1` et `$bar = 2`. + +```php +echo $this->render('report', [ + 'foo' => 1, + 'bar' => 2, +]); +``` + +L'approche *tirer* retrouve les données de manière plus active à partir du [[yii\base\View|composant view]] ou à partir d'autres objets accessibles dans les vues (p. ex. `Yii::$app`). En utilisant le code exemple qui suit, vous pouvez, dans une vue, obtenir l'objet contrôleur `$this->context`. Et, en conséquence, il vous est possible d'accéder à n'importe quelle propriété ou méthode du contrôleur, comme la propriété `id` du contrôleur : + +```php +The controller ID is: context->id ?> +``` + +L'approche *pousser* est en général le moyen préféré d'accéder aux données dans les vues, parce qu'elle rend les vues moins dépendantes des objets de contexte. Son revers, et que vous devez construire le tableau de données à chaque fois, ce qui peut devenir ennuyeux et sujet aux erreurs si la vue est rendue en divers endroits. + +### Partage de données entre vues + +Le [[yii\base\View|composant view ]] dispose de la propriété [[yii\base\View::params|params]] que vous pouvez utiliser pour partager des données entre vues. + +Par exempe, dans une vue `about` (à propos), vous pouvez avoir le code suivant qui spécifie le segment courant du *fil d'Ariane*. + +```php +$this->params['breadcrumbs'][] = 'About Us'; +``` + +Ainsi, dans le fichier de la [disposition](#layouts), qui est également une vue, vous pouvez afficher le *fil d'Ariane* en utilisant les données passées par [[yii\base\View::params|params]] : + +```php + isset($this->params['breadcrumbs']) ? $this->params['breadcrumbs'] : [], +]) ?> +``` + + +## Dispositions + +Les dispositions (*layouts*) sont des types spéciaux de vues qui représentent les parties communes de multiples vues. Par exemple, les pages de la plupart des applications Web partagent le même entête et le même pied de page. Bien que vous puissiez répéter le même entête et le même pied de page dans chacune des vues, il est préférable de le faire une fois dans une disposition et d'inclure le résultat du rendu d'une vue de contenu à l'endroit approprié de la disposition. + + +### Création de dispositions + +Parce que les dispositions sont aussi des vues, elles peuvent être créées de manière similaire aux vues ordinaires. Par défaut, les dispositions sont stockées dans le dossier `@app/views/layouts`. Les dispositions utilisées dans un [module](structure-modules.md) doivent être stockées dans le dossier `views/layouts` du [[yii\base\Module::basePath|dossier racine du module]]. Vous pouvez personnaliser le dossier par défaut des dispositions en configurant la propriété [[yii\base\Module::layoutPath]] de l'application ou du module. + +L'exemple qui suit montre à quoi ressemble une disposition. Notez que dans un but illustratif, nous avons grandement simplifié le code à l'intérieur de cette disposition. En pratique, vous désirerez ajouter à ce code plus de contenu, comme des balises head, un menu principal, etc. + +```php + +beginPage() ?> + + + + + + <?= Html::encode($this->title) ?> + head() ?> + + +beginBody() ?> +
My Company
+ +
© 2014 by My Company
+endBody() ?> + + +endPage() ?> +``` + +Comme vous pouvez le voir, la disposition génère les balises HTML qui sont communes à toutes les pages. Dans la section `` la disposition rend la variable `$content` qui représente le résultat de rendu d'une vue de contenu qui est poussée dans la disposition par l'appel à la fonction [[yii\base\Controller::render()]]. + +La plupart des dispositions devraient appeler les méthodes suivantes, comme illustré dans l'exemple précédent. Ces méthodes déclenchent essentiellement des événements concernant le processus de rendu de manière à ce que des balises et des scripts enregistrés dans d'autres endroits puissent être injectés à l'endroit où ces méthodes sont appelées. + +- [[yii\base\View::beginPage()|beginPage()]]: cette méthode doit être appelée au tout début de la disposition. Elle déclenche l'événement [[yii\base\View::EVENT_BEGIN_PAGE|EVENT_BEGIN_PAGE]] qui signale le début d'une page. +- [[yii\base\View::endPage()|endPage()]]: cette méthode doit être appelée à la fin de la disposition. Elle déclenche l'événement [[yii\base\View::EVENT_END_PAGE|EVENT_END_PAGE]] qui signale la fin d'une page. +- [[yii\web\View::head()|head()]]: cette méthode doit être appelée dans la section `` d'une page HTML. Elle génère une valeur à remplacer qui sera remplacée par le code d'entête HTML (p. ex. des balises liens, des balises meta, etc.) lorsqu'une page termine son processus de rendu. +- [[yii\web\View::beginBody()|beginBody()]]: cette méthode doit être appelée au début de la section ``. Elle déclenche l'événement [[yii\web\View::EVENT_BEGIN_BODY|EVENT_BEGIN_BODY]] et génère une valeur à remplacer qui sera remplacée par le code HTML enregistré (p. ex. Javascript) dont la cible est le début du corps de la page. +- [[yii\web\View::endBody()|endBody()]]: cette méthode doit être appelée à la fin de la section ``. Elle déclenche l'événement [[yii\web\View::EVENT_END_BODY|EVENT_END_BODY]] et génère une valeur à remplacer qui sera remplacée par le code HTML enregistré (p. ex. Javascript) dont la cible est la fin du corps de la page. + +### Accès aux données dans les dispositions + +Dans une disposition, vous avez accès à deux variables prédéfinies : `$this` et `$content`. La première fait référence au composant [[yii\base\View|view]], comme dans les vues ordinaires, tandis que la seconde contient le résultat de rendu d'une vue de contenu qui est rendue par l'appel de la méthode [[yii\base\Controller::render()|render()]] dans un contrôleur. + +Si vous voulez accéder à d'autres données dans les dispositions, vous devez utiliser l'approche *tirer* comme c'est expliqué à la sous-section [Accès aux données dans les vues](#accessing-data-in-views). Si vous voulez passer des données d'une vue de contenu à une disposition, vous pouvez utiliser la méthode décrite à la sous-section [Partage de données entre vues](#sharing-data-among-views). + + +### Utilisation des dispositions + +Comme c'est décrit à la sous-section [Rendu des vues dans les contrôleurs](#rendering-in-controllers), lorsque vous rendez une vue en appelant la méthode [[yii\base\Controller::render()|render()]] dans un contrôleur, une disposition est appliquée au résultat du rendu. Par défaut, la disposition `@app/views/layouts/main.php` est utilisée. + +Vous pouvez utiliser une disposition différente en configurant soit [[yii\base\Application::layout]], soit [[yii\base\Controller::layout]]. La première gouverne la disposition utilisée par tous les contrôleurs, tandis que la deuxième redéfinit la première pour les contrôleurs individuels. Par exemple, le code suivant fait que le contrôleur `post` utilise `@app/views/layouts/post.php` en tant qu disposition lorsqu'il rend ses vues. Les autres contrôleurs, en supposant que leur propriété `layout` n'est pas modifiée, continuent d'utiliser la disposition par défaut `@app/views/layouts/main.php`. + +```php +namespace app\controllers; + +use yii\web\Controller; + +class PostController extends Controller +{ + public $layout = 'post'; + + // ... +} +``` + +Pour les contrôleurs appartenant à un module ,vous pouvez également configurer la propriété [[yii\base\Module::layout|layout]] pour utiliser une disposition particulière pour ces contrôleurs. + +Comme la propriété `layout` peut être configurée à différents niveaux (contrôleurs, modules, application), en arrière plan, Yii opère en deux étapes pour déterminer quel est le fichier de disposition réel qui doit être utilisé pour un contrôleur donné. + +Dans la première étape, il détermine la valeurs de la disposition et le module du contexte : + +- Si la propriété [[yii\base\Controller::layout]] du contrôleur n'est pas nulle, il l'utilise en tant que valeur de disposition et le [[yii\base\Controller::module|module]] du contrôleur en tant que module du contexte. +- Si la propriété [[yii\base\Controller::layout|layout]] est nulle, il cherche, à travers tous les modules ancêtres (y compris l'application elle-même) du contrôleur, le premier module dont la propriété [[yii\base\Module::layout|layout]] n'est pas nulle. Il utilise alors ce module et la valeur de sa [[yii\base\Module::layout|disposition]] comme module du contexte et valeur de disposition, respectivement. Si un tel module n'est pas trouvé, cela signifie qu'aucune disposition n'est appliquée. + +Dans la seconde étape, il détermine le fichier de disposition réel en fonction de la valeur de disposition et du module du contexte déterminés dans la première étape. La valeur de disposition peut être : + +- Un alias de chemin (p. ex. `@app/views/layouts/main`). +- Un chemin absolu (p. ex. `/main`): la valeur de disposition commence par une barre oblique de division. Le fichier réel de disposition est recherché dans le [[yii\base\Application::layoutPath|chemin des disposition (*layoutPath*)]] (par défaut `@app/views/layouts`). +- Un chemin relatif (p. ex. `main`): le fichier réel de disposition est recherché dans le [[yii\base\Module::layoutPath|chemin des dispositions (*layoutPath*)]] du module du contexte (par défaut`views/layouts`) dans le [[yii\base\Module::basePath|dossier racine du module]]. +- La valeur booléenne `false`: aucune disposition n'est appliquée. + +Si la valeur de disposition ne contient pas d'extension de fichier, l'extension par défaut `.php` est utilisée. + + +### Dispositions imbriquées + +Parfois, vous désirez imbriquer une disposition dans une autre. Par exemple, dans les différentes sections d'un site Web, vous voulez utiliser des dispositions différentes, bien que ces dispositions partagent la même disposition de base qui génère la structure d'ensemble des pages HTML5. Vous pouvez réaliser cela en appelant la méthode [[yii\base\View::beginContent()|beginContent()]] et la méthode +[[yii\base\View::endContent()|endContent()]] dans les dispositions filles comme illustré ci-après : +```php +beginContent('@app/views/layouts/base.php'); ?> + +...contenu de la disposition fille ici... + +endContent(); ?> +``` + +Comme on le voit ci-dessus, le contenu de la disposition fille doit être situé entre les appels des méthodes [[yii\base\View::beginContent()|beginContent()]] et [[yii\base\View::endContent()|endContent()]]. Le paramètre passé à la méthode [[yii\base\View::beginContent()|beginContent()]] spécifie quelle est la disposition parente. Ce peut être un fichier de disposition ou un alias. En utilisant l'approche ci-dessus, vous pouvez imbriquer des dispositions sur plusieurs niveaux. + + + +### Utilisation des blocs + +Les blocs vous permettent de spécifier le contenu de la vue à un endroit et l'afficher ailleurs. Ils sont souvent utilisés conjointement avec les dispositions. Par exemple, vous pouvez définir un bloc dans une vue de contenu et l'afficher dans la disposition. + +Pour définir un bloc, il faut appeler les méthodes [[yii\base\View::beginBlock()|beginBlock()]] et [[yii\base\View::endBlock()|endBlock()]]. Vous pouvez accéder au bloc via son identifiant avec `$view->blocks[$blockID]`, où `$blockID` représente l'identifiant unique que vous assignez au bloc lorsque vous le définissez. + +L'exemple suivant montre comment utiliser les blocs pour personnaliser des parties spécifiques dans la disposition d'une vue de contenu. + +Tout d'abord, dans une vue de contenu, définissez un ou de multiples blocs : + +```php +... + +beginBlock('block1'); ?> + +...contenu de block1... + +endBlock(); ?> + +... + +beginBlock('block3'); ?> + +...contenu de block3... + +endBlock(); ?> +``` + +Ensuite, dans la vue de la disposition, rendez les blocs s'ils sont disponibles, ou affichez un contenu par défaut si le bloc n'est pas défini. + +```php +... +blocks['block1'])): ?> + blocks['block1'] ?> + + ... contenu par défaut de block1 ... + + +... + +blocks['block2'])): ?> + blocks['block2'] ?> + + ... contenu par défaut de block2 ... + + +... + +blocks['block3'])): ?> + blocks['block3'] ?> + + ... contenu par défaut de block3 ... + +... +``` + + +## Utilisation des composants view + +Les composants [[yii\base\View|view]] fournissent de nombreuses fonctionnalités relatives aux vues. Bien que vous puissiez créer des composants *view* en créant des instances de la classe [[yii\base\View]] ou de ses classes filles, dans la plupart des cas, vous utilisez principalement le composant d'application `view` . Vous pouvez configurer ce composant dans les [configuration d'application](structure-applications.md#application-configurations), comme l'illustre l'exemple qui suit : + +```php +[ + // ... + 'components' => [ + 'view' => [ + 'class' => 'app\components\View', + ], + // ... + ], +] +``` + +Les composants View fournissent les fonctionnalités utiles suivantes relatives aux vues, chacune décrite en détails dans une section séparée : + +* [gestion des thèmes](output-theming.md): vous permet des développer et de changer les thèmes pour votre site Web. +* [mise en cache de fragments](caching-fragment.md): vous permet de mettre en cache un fragment de votre page Web. +* [gestion des scripts client](output-client-scripts.md): prend en charge l'enregistrement et le rendu de code CSS et JavaScript. +* [gestion de paquets de ressources](structure-assets.md): prend en charge l'enregistrement et le rendu de [paquets de ressources](structure-assets.md). +* [moteurs de modèle alternatif](tutorial-template-engines.md): vous permet d'utiliser d'autres moteur de modèles tels que [Twig](http://twig.sensiolabs.org/) et [Smarty](http://www.smarty.net/). + +Vous pouvez aussi utiliser les fonctionnalités suivantes qui, bien que mineures, sont néanmoins utiles, pour développer vos pages Web. + + +### Définition du titre des pages + +Chaque page Web doit avoir un titre. Normalement la balise titre est affichée dans une [disposition](#layouts). Cependant, en pratique, le titre est souvent détérminé dans les vues de contenu plutôt que dans les dispositions. Pour résoudre ce problème,[[yii\web\View]] met à votre disposition la propriété [[yii\web\View::title|title]] qui vous permet de passer l'information de titre de la vue de contenu à la disposition. + +Pour utiliser cette fonctionnalité, dans chacune des vues de contenu, vous pouvez définir le titre de la page de la manière suivante : +```php +title = 'Le titre de ma page'; +?> +``` + +Ensuite dans la disposition, assurez-vous qui vous avez placé le code suivant dans la section `` : + +```php +<?= Html::encode($this->title) ?> +``` + + +### Enregistrement des balises meta + +Généralement, les pages Web, ont besoin de générer des balises meta variées dont ont besoin diverses parties. Comme le titre des pages, les balises meta apparaissent dans la section `` et sont généralement générées dans les dispositions. + +Si vous désirez spécifier quelles balises meta générer dans les vues de contenu, vous pouvez appeler [[yii\web\View::registerMetaTag()]] dans une vue de contenu comme illustrer ci-après : + +```php +registerMetaTag(['name' => 'keywords', 'content' => 'yii, framework, php']); +?> +``` + +Le code ci-dessus enregistre une balise meta "mot clé" dans le composant view. La balise meta enregistrée est rendue après que le rendu de la disposition est terminé. Le code HTML suivant est généré et inséré à l'endroit où vous appelez [[yii\web\View::head()]] dans la disposition : + +```php + +``` + +Notez que si vous appelez [[yii\web\View::registerMetaTag()]] à de multiples reprises, elle enregistrera de multiples balises meta, que les balises soient les mêmes ou pas. + +Pour garantir qu'il n'y a qu'une instance d'un type de balise meta, vous pouvez spécifier une clé en tant que deuxième paramètre lors de l'appel de la méthode. +Par exemple, le code suivant, enregistre deux balises meta « description ». Cependant, seule la seconde sera rendue. +F + +```php +$this->registerMetaTag(['name' => 'description', 'content' => 'This is my cool website made with Yii!'], 'description'); +$this->registerMetaTag(['name' => 'description', 'content' => 'This website is about funny raccoons.'], 'description'); +``` + + +### Enregistrement de balises liens + +Comme les [balises meta](#registering-meta-tags), les balises liens sont utiles dans de nombreux cas, comme la personnalisation de favicon, le pointage sur les flux RSS ou la délégation d'OpenID à un autre serveur. Vous pouvez travailler avec les balises liens comme avec les balises meta en utilisant [[yii\web\View::registerLinkTag()]]. Par exemple, dans une vue de contenu, vous pouvez enregistrer une balise lien de la manière suivante : + +```php +$this->registerLinkTag([ + 'title' => 'Live News for Yii', + 'rel' => 'alternate', + 'type' => 'application/rss+xml', + 'href' => 'http://www.yiiframework.com/rss.xml/', +]); +``` + +Le code suivant produit le résultat suivant : + +```html + +``` + +Comme avec [[yii\web\View::registerMetaTag()|registerMetaTag()]], vous pouvez spécifier un clé lors de l'appel de [[yii\web\View::registerLinkTag()|registerLinkTag()]] pour éviter de générer des liens identiques. + + +## Événements de vues + +Les [[yii\base\View|composants View ]] déclenchent plusieurs événements durant le processus de rendu des vues. Vous pouvez répondre à ces événements pour injecter du contenu dans des vues ou traiter les résultats du rendu avant leur transmission à l'utilisateur final. + +- [[yii\base\View::EVENT_BEFORE_RENDER|EVENT_BEFORE_RENDER]]: déclenché au début du rendu d'un fichier dans un contrôleur. Les gestionnaires de cet événement peuvent définir [[yii\base\ViewEvent::isValid]] à `false` (faux) pour arrêter le processus de rendu. +- [[yii\base\View::EVENT_AFTER_RENDER|EVENT_AFTER_RENDER]]: déclenché après le rendu d'un fichier par appel de [[yii\base\View::afterRender()]]. Les gestionnaires de cet événement peuvent obtenir le résultat du rendu via [[yii\base\ViewEvent::output]] et peuvent modifier cette propriété pour modifier le résultat du rendu. +- [[yii\base\View::EVENT_BEGIN_PAGE|EVENT_BEGIN_PAGE]]: déclenché par l'appel de [[yii\base\View::beginPage()]] dans une disposition. +- [[yii\base\View::EVENT_END_PAGE|EVENT_END_PAGE]]: déclenché par l'appel de [[yii\base\View::endPage()]] dans une disposition. +- [[yii\web\View::EVENT_BEGIN_BODY|EVENT_BEGIN_BODY]]: déclenché par l'appel de [[yii\web\View::beginBody()]] dans une disposition. +- [[yii\web\View::EVENT_END_BODY|EVENT_END_BODY]]: déclenché par l'appel de [[yii\web\View::endBody()]] dans une disposition. + +Par exemple, le code suivant injecte la date courante à la fin du corps de la page. + +```php +\Yii::$app->view->on(View::EVENT_END_BODY, function () { + echo date('Y-m-d'); +}); +``` + + +## Rendu des pages statiques + +Les pages statiques font références aux pages dont le contenu principal est essentiellement statique sans recours à des données dynamiques poussées par les contrôleurs. + +Vous pouvez renvoyer des pages statiques en plaçant leur code dans des vues, et en utilisant un code similaire à ce qui suit dans un contrôleur : + +```php +public function actionAbout() +{ + return $this->render('about'); +} +``` + +Si un site Web contient beaucoup de pages statiques, ce serait très ennuyeux de répéter un code similaire de nombreuses fois. Pour résoudre ce problème, vous pouvez introduire une [action autonome](structure-controllers.md#standalone-actions) appelée [[yii\web\ViewAction]] dans un contrôleur. Par exemple : + +```php +namespace app\controllers; + +use yii\web\Controller; + +class SiteController extends Controller +{ + public function actions() + { + return [ + 'page' => [ + 'class' => 'yii\web\ViewAction', + ], + ]; + } +} +``` +Maintenant, si vous créez une vue nommée `about` dans le dossier `@app/views/site/pages`, vous pourrez afficher cette vue via l'URL suivante : +``` +http://localhost/index.php?r=site%2Fpage&view=about +``` + +Le paramètre `view` de la méthode `GET` dit à [[yii\web\ViewAction]] quelle est la vue requise. L'action recherche alors cette vue dans le dossier `@app/views/site/pages`. Vous pouvez configurer la propriété [[yii\web\ViewAction::viewPrefix]] pour changer le dossier dans lequel la vue est recherchée. + + +## Meilleures pratiques + +Les vues sont chargées de présenter les modèles dans le format désiré par l'utilisateur final. En général : + +* Elles devraient essentiellement contenir du code relatif à la présentation, tel que le code HTML, du code PHP simple pour parcourir, formater et rendre les données. +* Elles ne devraient pas contenir de code qui effectue des requêtes de base de données. Un tel code devrait être placé dans les modèles. +* Elles devraient éviter d'accéder directement aux données de la requête, telles que `$_GET`, `$_POST`. C'est le rôle des contrôleurs. Si les données de la requête sont nécessaires, elles devraient être poussées dans les vues par les contrôleurs. +* Elles peuvent lire les propriétés des modèles, mais ne devraient pas les modifier. + +Pour rendre les vues plus gérables, évitez de créer des vues qui sont trop complexes ou qui contiennent trop de code redondant. Vous pouvez utiliser les techniques suivantes pour atteindre cet but : + +* Utiliser des [dispositions](#layouts) pour représenter les sections communes de présentation (p. ex. l'entête de page, le pied de page). +* Diviser une vue complexe en plusieurs vues plus réduites. Les vues plus réduites peuvent être rendue et assemblées dans une plus grande en utilisant les méthodes de rendu que nous avons décrites. +* Créer et utiliser des [widgets](structure-widgets.md) en tant que blocs de construction des vues. +* Créer et utiliser des classes d'aide pour transformer et formater les données dans les vues. + From 143f9070af42bff3b86255c6c18931cf3d732c2a Mon Sep 17 00:00:00 2001 From: Klimov Paul Date: Fri, 12 Aug 2016 11:43:31 +0300 Subject: [PATCH 155/163] Fixed `yii\db\BaseActiveRecord::updateAttributes()` change `isNewRecord` state for the new model --- framework/CHANGELOG.md | 1 + framework/db/BaseActiveRecord.php | 2 +- tests/framework/db/ActiveRecordTest.php | 18 ++++++++++++++++++ 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index 2d75c1e..05e1c81 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -19,6 +19,7 @@ Yii Framework 2 Change Log - Bug #10681: Reverted fix of beforeValidate event calling in `yii.activeForm.js` (silverfire) - Bug #11715: Fixed JS validation when the same model's attribute file input is listed more than once on the same page (uaoleg) - Bug #11541: Fixed default MySQL integer display width for unsigned primary key (h311ion, rob006, cebe) +- Bug #12143: Fixed `yii\db\BaseActiveRecord::updateAttributes()` change `isNewRecord` state for the new model (klimov-paul) - Enh #10583: Do not silence session errors in debug mode (samdark) - Enh #11804: Added `yii\behaviors\AttributeTypecastBehavior` for maintaining of strict ActiveRecord attribute types (klimov-paul) - Enh #12048: Improved message extraction command performance (samdark) diff --git a/framework/db/BaseActiveRecord.php b/framework/db/BaseActiveRecord.php index da9601d..72758a3 100644 --- a/framework/db/BaseActiveRecord.php +++ b/framework/db/BaseActiveRecord.php @@ -689,7 +689,7 @@ abstract class BaseActiveRecord extends Model implements ActiveRecordInterface } $values = $this->getDirtyAttributes($attrs); - if (empty($values)) { + if (empty($values) || $this->getIsNewRecord()) { return 0; } diff --git a/tests/framework/db/ActiveRecordTest.php b/tests/framework/db/ActiveRecordTest.php index b1d5780..7cf2682 100644 --- a/tests/framework/db/ActiveRecordTest.php +++ b/tests/framework/db/ActiveRecordTest.php @@ -1275,4 +1275,22 @@ abstract class ActiveRecordTest extends DatabaseTestCase $order->link('orderItems3', $orderItem); $this->assertTrue(isset($order->orderItems3['1_3'])); } + + public function testUpdateAttributes() + { + $order = Order::findOne(1); + $newTotal = 978; + $this->assertSame(1, $order->updateAttributes(['total' => $newTotal])); + $this->assertEquals($newTotal, $order->total); + $order = Order::findOne(1); + $this->assertEquals($newTotal, $order->total); + + // @see https://github.com/yiisoft/yii2/issues/12143 + $newOrder = new Order(); + $this->assertTrue($newOrder->getIsNewRecord()); + $newTotal = 200; + $this->assertSame(0, $newOrder->updateAttributes(['total' => $newTotal])); + $this->assertTrue($newOrder->getIsNewRecord()); + $this->assertEquals($newTotal, $newOrder->total); + } } From 84124bec4f58aa0ff32ede8fcddc8eeb848b3c0b Mon Sep 17 00:00:00 2001 From: Nikola Kovacs Date: Fri, 12 Aug 2016 16:55:43 +0200 Subject: [PATCH 156/163] Fix grammar in migration template docblocks. (#12148) Fix typo in test file's name. --- framework/views/createTableMigration.php | 2 +- framework/views/dropTableMigration.php | 2 +- .../data/console/migrate_create/create_fields.php | 2 +- .../console/migrate_create/create_foreign_key.php | 2 +- tests/data/console/migrate_create/create_id_pk.php | 2 +- .../data/console/migrate_create/create_prefix.php | 2 +- .../create_products_from_store_table.php | 2 +- tests/data/console/migrate_create/create_test.php | 2 +- .../console/migrate_create/create_title_pk.php | 2 +- .../create_title_with_comma_default_values.php | 35 ++++++++++++++++++++++ .../create_titlte_with_comma_default_values.php | 35 ---------------------- tests/data/console/migrate_create/drop_fields.php | 2 +- .../drop_products_from_store_table.php | 2 +- tests/data/console/migrate_create/drop_test.php | 2 +- .../data/console/migrate_create/junction_test.php | 2 +- .../controllers/MigrateControllerTestTrait.php | 2 +- 16 files changed, 49 insertions(+), 49 deletions(-) create mode 100644 tests/data/console/migrate_create/create_title_with_comma_default_values.php delete mode 100644 tests/data/console/migrate_create/create_titlte_with_comma_default_values.php diff --git a/framework/views/createTableMigration.php b/framework/views/createTableMigration.php index a4a6f29..e757eb0 100644 --- a/framework/views/createTableMigration.php +++ b/framework/views/createTableMigration.php @@ -14,7 +14,7 @@ echo "`. + * Handles the creation of table ``. render('_foreignTables', [ 'foreignKeys' => $foreignKeys, ]) ?> diff --git a/framework/views/dropTableMigration.php b/framework/views/dropTableMigration.php index ebaa7dc..4758b0d 100644 --- a/framework/views/dropTableMigration.php +++ b/framework/views/dropTableMigration.php @@ -13,7 +13,7 @@ echo "`. + * Handles the dropping of table ``. render('_foreignTables', [ 'foreignKeys' => $foreignKeys, ]) ?> diff --git a/tests/data/console/migrate_create/create_fields.php b/tests/data/console/migrate_create/create_fields.php index b18a5dd..a616927 100644 --- a/tests/data/console/migrate_create/create_fields.php +++ b/tests/data/console/migrate_create/create_fields.php @@ -6,7 +6,7 @@ return <<createTable('test', [ + 'id' => \$this->primaryKey(), + 'title' => \$this->string(10)->notNull()->unique()->defaultValue(",te,st"), + 'body' => \$this->text()->notNull()->defaultValue(",test"), + 'test' => \$this->custom(11,2,"s")->notNull(), + ]); + } + + /** + * @inheritdoc + */ + public function down() + { + \$this->dropTable('test'); + } +} + +CODE; diff --git a/tests/data/console/migrate_create/create_titlte_with_comma_default_values.php b/tests/data/console/migrate_create/create_titlte_with_comma_default_values.php deleted file mode 100644 index bda50fd..0000000 --- a/tests/data/console/migrate_create/create_titlte_with_comma_default_values.php +++ /dev/null @@ -1,35 +0,0 @@ -createTable('test', [ - 'id' => \$this->primaryKey(), - 'title' => \$this->string(10)->notNull()->unique()->defaultValue(",te,st"), - 'body' => \$this->text()->notNull()->defaultValue(",test"), - 'test' => \$this->custom(11,2,"s")->notNull(), - ]); - } - - /** - * @inheritdoc - */ - public function down() - { - \$this->dropTable('test'); - } -} - -CODE; diff --git a/tests/data/console/migrate_create/drop_fields.php b/tests/data/console/migrate_create/drop_fields.php index 5e2fb10..ffa106d 100644 --- a/tests/data/console/migrate_create/drop_fields.php +++ b/tests/data/console/migrate_create/drop_fields.php @@ -6,7 +6,7 @@ return <<assertCommandCreatedFile('create_products_from_store_table', 'create_products_from_store_table'); // @see https://github.com/yiisoft/yii2/issues/11461 - $this->assertCommandCreatedFile('create_titlte_with_comma_default_values', 'create_test_table', [ + $this->assertCommandCreatedFile('create_title_with_comma_default_values', 'create_test_table', [ 'fields' => 'title:string(10):notNull:unique:defaultValue(",te,st"), body:text:notNull:defaultValue(",test"), test:custom(11,2,"s"):notNull', From 95f625135153f82fbd427dfe1c5211e0f636857b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aleksandar=20Beli=C4=87?= Date: Fri, 12 Aug 2016 19:04:44 +0200 Subject: [PATCH 157/163] Serbian translation typos fixed (#12149) [skip ci] * Serbian translation typos fixed. * Serbian translation added to git commands --- docs/internals-sr-Latn/automation.md | 5 ++- docs/internals-sr-Latn/git-workflow.md | 50 +++++++++++++------------- docs/internals-sr-Latn/report-an-issue.md | 2 +- docs/internals-sr-Latn/translation-workflow.md | 6 ++-- 4 files changed, 33 insertions(+), 30 deletions(-) diff --git a/docs/internals-sr-Latn/automation.md b/docs/internals-sr-Latn/automation.md index cefbc62..197c125 100644 --- a/docs/internals-sr-Latn/automation.md +++ b/docs/internals-sr-Latn/automation.md @@ -12,4 +12,7 @@ Postoje taskovi koji se rade automatski kada radite sa Yii frejmvorkom: - Ispravljanje stila pisanja koda i ostalih sitnijih problema u phpdoc komentarima. Pokrenite `./build/build php-doc/fix` kako bi ih ispravili. Proverite izmene pre njihovog komitovanja zato što se mogu desiti neželjene promene zato što komanda nije idealna. - Možete koristiti `git add -p` kako bi pregledali izmene. \ No newline at end of file + Možete koristiti `git add -p` kako bi pregledali izmene. + +- Ažuriranje Mime Type Magic fajla (`framework/helpers/mimeTypes.php`) iz Apache HTTPd repozitorijuma. + Pokrenite `./build/build mime-type` kako bi ažurirali falj. diff --git a/docs/internals-sr-Latn/git-workflow.md b/docs/internals-sr-Latn/git-workflow.md index 7cd93e5..4b4a740 100644 --- a/docs/internals-sr-Latn/git-workflow.md +++ b/docs/internals-sr-Latn/git-workflow.md @@ -12,7 +12,7 @@ Pripremite vaše razvojno okruženje Sledeći koraci će napraviti razvojno okruženje za Yii, koje možete koristiti kako bi radili na baznom kodu Yii frejmvorka. Ovi se koraci trebaju uraditi samo jednom. -### 1. [Forkujte](http://help.github.com/fork-a-repo/) Yii repozitorijum na GitHub-u i klonirajte vaš fork na vešem razvojnom okruženju +### 1. [Forkujte](http://help.github.com/fork-a-repo/) Yii repozitorijum na GitHub-u i klonirajte vaš fork na vašem razvojnom okruženju ``` git clone git@github.com:VASE-GITHUB-KORISNICKO-IME/yii2.git @@ -34,8 +34,8 @@ git remote add upstream git://github.com/yiisoft/yii2.git Sledeći koraci nisu neophodni ako želite da radite samo na prevodima i dokumentaciji. - pokrenite `composer update` kako bi instalirali neophodne pakete (podrazumeva se da imate [composer instaliran globalno](https://getcomposer.org/doc/00-intro.md#globally)). -- pokrenite `php build/build dev/app basic` kako bi klonirali "basic" aplikaciju i instalirali composer neophonde pakete "basic" aplikacije. - Ova komanda će instlirati spoljne composer pakete i ulinkovati yii2 repozitorujum sa trenutnim preuzetim repozitorijumom, tako da imate samo jednu instancu celog instaliranog koda. +- pokrenite `php build/build dev/app basic` kako bi klonirali "basic" aplikaciju i instalirali composer neophodne pakete "basic" aplikacije. + Ova komanda će instalirati spoljne composer pakete i ulinkovati yii2 repozitorujum sa trenutnim preuzetim repozitorijumom, tako da imate samo jednu instancu celog instaliranog koda. Ponovite postupak za "advanced" aplikaciju ako je potrebno, pokretanjem: `php build/build dev/app advanced`. @@ -47,9 +47,9 @@ Sledeći koraci su neobavezni. ### Unit testovi -Možete izvršiti unit testove pokretanjem `phpunit` unutr root direktorijuma repozitorijuma. Ako nemate phpunit instaliran globalno možete pokrenuti `php vendor/bin/phpunit` umesto toga. +Možete izvršiti unit testove pokretanjem `phpunit` unutar root direktorijuma repozitorijuma. Ako nemate phpunit instaliran globalno možete pokrenuti `php vendor/bin/phpunit` umesto toga. -Neki testovi zahtevaju dodatne baze podataka da budu postavljene i podešene. Možete napraviti `tests/data/config.local.php` fajl kako bi pregazili podešavanja koja su definisana unutar `tests/data/config.php` fajla. +Neki testovi zahtevaju dodatne baze podataka da budu postavljene i podešene. Možete napraviti `tests/data/config.local.php` fajl kako bi pregazili podešavanja koja su definisana unutar `tests/data/config.php` fajla. Možete ograničiti testove na grupu testova na kojima radite, na primer, da pokrenete testove za samo validaciju i redis koristite `phpunit --group=validators,redis`. Listu dostupnih grupa možete dobiti pokretanjem `phpunit --list-groups`. @@ -64,7 +64,7 @@ php build/build dev/ext gde je `` ime ekstenzije, na primer `redis`. Ako želite da testirate ekstenziju u jednom od aplikacijskih šablona, samo dodajte repozitorijum u `composer.json` aplikacije kao što bi to radili normalno, na primer dodali bi `"yiisoft/yii2-redis": "*"` unutar`require` sekcije za "basic" aplikaciju. -Pokretanjem `php build/build dev/app basic` ćete instalirati ekstenziju i njene neophonde pakete i ulinkovaće se `extensions/redis` direktorijum kako ne bi radili u vendor direktorijumu nego u yii2 repozitorijumu direktno. +Pokretanjem `php build/build dev/app basic` ćete instalirati ekstenziju i njene neophodne pakete i ulinkovaće se `extensions/redis` direktorijum kako ne bi radili u vendor direktorijumu nego u yii2 repozitorijumu direktno. Rad na bagovima i poboljšanjima @@ -74,10 +74,10 @@ Pošto je razvojno okruženje spremno kako je objašnjeno iznad možete započet ### 1. Postarajte se da je problem prijavljen za bug na kom radite ako zahteva značajniji rad na ispravljanju -Sve nove funkcionalnosti i bugovi bi trebali imati povezanu temu koju bi koristili kao jedinstvenu tačku za diskusiju i dokumentaciju. Bacite pogled na postojeću listu koja ima temu koja se poklapa sa onim na čemu bi želeli da radite. Ako pronađete da tema već postoji u listi, onda ostavite komentar na toj temi u kome iskažite da želite da radite na tome. Ako ne pronađete postojeću temu/problem koja se poklapa sa onim na čemu bi želeli da radite, molimo da [postavite temu/prijavite problem](report-an-issue.md) ili napravite pull zahtev direktno ako nije komplikovano rešenje. Na ovaj način, tim će moći da pogleda vaše rešenje i uputi vas sa dodatno. +Sve nove funkcionalnosti i bugovi bi trebali imati povezanu temu koju bi koristili kao jedinstvenu tačku za diskusiju i dokumentaciju. Bacite pogled na postojeću listu koja ima temu koja se poklapa sa onim na čemu bi želeli da radite. Ako pronađete da tema već postoji u listi, onda ostavite komentar na toj temi u kome iskažite da želite da radite na tome. Ako ne pronađete postojeću temu/problem koja se poklapa sa onim na čemu bi želeli da radite, molimo da [postavite temu/prijavite problem](report-an-issue.md) ili napravite pull zahtev direktno ako nije komplikovano rešenje. Na ovaj način, tim će moći da pogleda vaše rešenje i dodatno vas uputi. -> Za site izmene ili dokumentacijske probleme ili za jednostavnije probleme, nije potrebno praviti posebnu temu, pull zahtev je više nego dovoljan u ovom slučaju. +> Za sitne izmene ili dokumentacijske probleme ili za jednostavnije probleme, nije potrebno praviti posebnu temu, pull zahtev je više nego dovoljan u ovom slučaju. ### 2. Dohvatite poslednji kod sa glavne Yii grane @@ -95,7 +95,7 @@ Svako posebno rešenje baga ili izmena bi trebala da se nalazi u svojoj posebnoj ``` git checkout upstream/master -git checkout -b 999-name-of-your-branch-goes-here +git checkout -b 999-IME-VASE-GRANE ``` ### 4. Bacite se na posao, napišite vaš kod @@ -103,19 +103,19 @@ git checkout -b 999-name-of-your-branch-goes-here Potrudite se da funkcioniše :) Unit testovi su uvek dobrodošli. Testiranje i dobro pokriven kod značajno pojednostavljuje proveru koda. -Neuspeli unit testovi kao opis teme su takođe prihvataju. +Neuspeli unit testovi kao opis teme se takođe prihvataju. ### 5. Izmenite CHANGELOG -Izmenite CHANGELOG fajl kako bi uključili vašu izmenu, trebali bi uneti je na vrhu fajla ispod "Work in progress" naslova, linija u CHNAGELOG fajlu bi trebalo da izgleda nešto nalik sledećem: +Izmenite CHANGELOG fajl kako bi uključili vašu izmenu, trebali bi je uneti na vrhu fajla ispod "Work in progress" naslova, linija u CHNAGELOG fajlu bi trebalo da izgleda nešto nalik sledećem: ``` -Bug #999: a description of the bug fix (Your Name) -Enh #999: a description of the enhancement (Your Name) +Bug #999: opis vaše ispravke (vaše ime) +Enh #999: opis vašeg poboljšanja (vaše ime) ``` -`#999` je broj teme na koju se `Bug` ili `Enh`odnosi. -CHANGELOG no trebao biti grupisan po tipu (`Bug`,`Enh`) i sortiran po broju teme. +`#999` je broj teme na koju se `Bug` ili `Enh` odnosi. +CHANGELOG bi trebao biti grupisan po tipu (`Bug`,`Enh`) i sortiran po broju teme. Za veoma male izmene, na primer, greške u tekstu, izmene na dokumentaciji, nije potrebno menjati CHANGELOG. @@ -129,10 +129,10 @@ git add path/to/my/file.php Možete koristit `-p` opciju kako bi izabrali izmene koje želite da komitujete. -Komitujte vaše izmene sa opisnom porukom komita. Potrudite se napomente broj teme sa `#XXX` kako bi GitHub automatski ulinkovao vaš komit sa temom: +Komitujte vaše izmene sa opisnom porukom komita. Potrudite se da napomente broj teme sa `#XXX` kako bi GitHub automatski ulinkovao vaš komit sa temom: ``` -git commit -m "A brief description of this change which fixes #999 goes here" +git commit -m "Ovde napišite kratak opis promene koja ispravlja #999" ``` ### 7. Preuzmite poslednji Yii kod sa upstream-a u vašu granu @@ -146,7 +146,7 @@ Ovo nas osigurava da imamo poslednji kod u vašoj lokalnoj grani pre nego naprav ### 8. Nakon razrešenih svih konflikata, postavite vaš kod na GitHub ``` -git push -u origin 999-name-of-your-branch-goes-here +git push -u origin 999-IME-VASE-GRANE ``` Parametar `-u` će osigurati da će vaša grana moći da šalje pull i push zahteve sa GitHub grane. To znači da ako pozovete `git push` sledeći put će znati gde treba kod da se pošalje. Ovo je korisno ako budete hteli da kasnije dodate više komitova u jednom pull zahtevu. @@ -167,8 +167,8 @@ Nakom što je vaš kod ili prihvaćen ili odbijen možete obrisati vaše grane n ``` git checkout master -git branch -D 999-name-of-your-branch-goes-here -git push origin --delete 999-name-of-your-branch-goes-here +git branch -D 999-IME-VASE-GRANE +git push origin --delete 999-IME-VASE-GRANE ``` ### Napomena: @@ -180,24 +180,24 @@ Kako bi rano otkrili regresije u Yii kodu prilikom svake integracije na GitHub-u * osvežava dokumentaciju, * menja samo fiksne stringove (npr. izmene u prevodu) -Na ovaj način će travi započinjati testiranje samo izmena koje nisu prvenstveno pokrivene testovima. +Na ovaj način će Travis započinjati testiranje samo izmena koje nisu prvenstveno pokrivene testovima. ### Pregled komandi (za napredne saradnike) ``` -git clone git@github.com:YOUR-GITHUB-USERNAME/yii2.git +git clone git@github.com:VASE-GITHUB-KORISNICKO-IME/yii2.git git remote add upstream git://github.com/yiisoft/yii2.git ``` ``` git fetch upstream git checkout upstream/master -git checkout -b 999-name-of-your-branch-goes-here +git checkout -b 999-IME-VASE-GRANE /* bacite se na posao, izmenite changelog ako je potrebno */ git add path/to/my/file.php -git commit -m "A brief description of this change which fixes #999 goes here" +git commit -m "Ovde napišite kratak opis promene koja ispravlja #999" git pull upstream master -git push -u origin 999-name-of-your-branch-goes-here +git push -u origin 999-IME-VASE-GRANE ``` diff --git a/docs/internals-sr-Latn/report-an-issue.md b/docs/internals-sr-Latn/report-an-issue.md index 2bd0b0f..0f334ee 100644 --- a/docs/internals-sr-Latn/report-an-issue.md +++ b/docs/internals-sr-Latn/report-an-issue.md @@ -1,4 +1,4 @@ -Prijavite Problem +Prijavite problem ================= Molimo da ispratite smernice ispod kada prijavljujete problem kako bi vaš problem bio što pre razrešen: diff --git a/docs/internals-sr-Latn/translation-workflow.md b/docs/internals-sr-Latn/translation-workflow.md index bc18072..16b20aa 100644 --- a/docs/internals-sr-Latn/translation-workflow.md +++ b/docs/internals-sr-Latn/translation-workflow.md @@ -19,12 +19,12 @@ Da bi započeli rad sa prevodom poruka potrebno je da: Kako bi vaš prevod bio ažuran možete pokrenuti komandu `yii message/extract messages/config.php` još jednom. Ona će automatski ponovo izvući poruke ostavljajući nepromenjene netaknutim. -U fajlu za prevođenje svaki element niza predstavlja prevod (verdnost) poruke (ključ). Ako je vrednost prazna, poruka se smatra neprevedenom. Poruke koje više ne trebaju prevod će imati svoje prevode zatvorene između para '@@' znaka. Poruke se mogu koristiti i formatu za množinu. Pogledajte [i18n sekciju uputstva](../guide-sr-Latn/tutorial-i18n.md) za više informacija. +U fajlu za prevođenje svaki element niza predstavlja prevod (vrednost) poruke (ključ). Ako je vrednost prazna, poruka se smatra neprevedenom. Poruke koje više ne trebaju prevod će imati svoje prevode zatvorene između para '@@' znaka. Poruke se mogu koristiti i u formatu za množinu. Pogledajte [i18n sekciju uputstva](../guide-sr-Latn/tutorial-i18n.md) za više informacija. Dokumentacija ------------- -Stavite prevode dokumentacije unuta `docs/-` gde `` je originalno ime dokumentacije kao što je `guide` ili `internals`, a `` je jezički kod od dokumentacije jezika u koji se prevodi. Za Rusko uputstvo prevodi se nalaze u `docs/guide-ru`. +Stavite prevode dokumentacije unutar `docs/-` gde `` je originalno ime dokumentacije kao što je `guide` ili `internals`, a `` je jezički kod od dokumentacije jezika na koji se prevodi. Za rusko uputstvo prevodi se nalaze u `docs/guide-ru`. Nakon što je inicijalni posao završen možete dobiti šta je promenjeno nakon poslednjeg prevoda fajla korišćenjem specijalne komande unutar `build` direktorijuma: @@ -32,4 +32,4 @@ Nakon što je inicijalni posao završen možete dobiti šta je promenjeno nakon php build translation "../docs/guide" "../docs/guide-ru" "Russian guide translation report" > report_guide_ru.html ``` -Ako se bude bunio u vezi composer-a, izvršite `composer install` u samom root-u direktorijuma. \ No newline at end of file +Ako se bude bunio u vezi composer-a, izvršite `composer install` u samom root-u direktorijumu. \ No newline at end of file From dc8f6e81959a7f37398e24fd75e50ac4a7322bca Mon Sep 17 00:00:00 2001 From: Dmitriy Makarov Date: Fri, 12 Aug 2016 23:24:54 +0300 Subject: [PATCH 158/163] Added EmailTarget tests of the following methods: (#12150) - init() - export() --- tests/framework/log/EmailTargetTest.php | 132 ++++++++++++++++++++++++++++++++ 1 file changed, 132 insertions(+) create mode 100644 tests/framework/log/EmailTargetTest.php diff --git a/tests/framework/log/EmailTargetTest.php b/tests/framework/log/EmailTargetTest.php new file mode 100644 index 0000000..26897aa --- /dev/null +++ b/tests/framework/log/EmailTargetTest.php @@ -0,0 +1,132 @@ + + */ + +namespace yiiunit\framework\log; + +use yii\log\EmailTarget; +use yiiunit\TestCase; + +/** + * Class EmailTargetTest + * @package yiiunit\framework\log + * @group log + */ +class EmailTargetTest extends TestCase +{ + /** + * @var PHPUnit_Framework_MockObject_MockObject + */ + protected $mailer; + + /** + * Set up mailer + */ + protected function setUp() + { + parent::setUp(); + $this->mailer = $this->getMockBuilder('yii\\mail\\BaseMailer') + ->setMethods(['compose']) + ->getMockForAbstractClass(); + } + + /** + * @covers yii\log\EmailTarget::init() + */ + public function testInitWithOptionTo() + { + new EmailTarget(['mailer' => $this->mailer, 'message'=> ['to' => 'developer1@example.com']]); + } + + /** + * @covers yii\log\EmailTarget::init() + * @expectedException \yii\base\InvalidConfigException + * @expectedExceptionMessage The "to" option must be set for EmailTarget::message. + */ + public function testInitWithoutOptionTo() + { + new EmailTarget(['mailer' => $this->mailer]); + } + + /** + * @covers yii\log\EmailTarget::export() + * @covers yii\log\EmailTarget::composeMessage() + */ + public function testExportWithSubject() + { + $message1 = ['A very looooooooooooooooooooooooooooooooooooooooooooooooooooooooooong message 1']; + $message2 = ['A very looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong message 2']; + $messages = [$message1, $message2]; + $textBody = wordwrap(implode("\n", [$message1[0], $message2[0]]), 70); + + $message = $this->getMockBuilder('yii\\mail\\BaseMessage') + ->setMethods(['setTextBody', 'send', 'setSubject']) + ->getMockForAbstractClass(); + + $this->mailer->expects($this->once())->method('compose')->willReturn($message); + + $message->expects($this->once())->method('setTextBody')->with($this->equalTo($textBody)); + $message->expects($this->once())->method('send')->with($this->equalTo($this->mailer)); + $message->expects($this->once())->method('setSubject')->with($this->equalTo('Hello world')); + + $mailTarget = $this->getMock('yii\\log\\EmailTarget', ['formatMessage'], [ + [ + 'mailer' => $this->mailer, + 'message'=> [ + 'to' => 'developer@example.com', + 'subject' => 'Hello world' + ] + ] + ]); + + $mailTarget->messages = $messages; + $mailTarget->expects($this->exactly(2))->method('formatMessage')->willReturnMap( + [ + [$message1, $message1[0]], + [$message2, $message2[0]], + ] + ); + $mailTarget->export(); + } + + /** + * @covers yii\log\EmailTarget::export() + * @covers yii\log\EmailTarget::composeMessage() + */ + public function testExportWithoutSubject() + { + $message1 = ['A veeeeery loooooooooooooooooooooooooooooooooooooooooooooooooooooooong message 3']; + $message2 = ['Message 4']; + $messages = [$message1, $message2]; + $textBody = wordwrap(implode("\n", [$message1[0], $message2[0]]), 70); + + $message = $this->getMockBuilder('yii\\mail\\BaseMessage') + ->setMethods(['setTextBody', 'send', 'setSubject']) + ->getMockForAbstractClass(); + + $this->mailer->expects($this->once())->method('compose')->willReturn($message); + + $message->expects($this->once())->method('setTextBody')->with($this->equalTo($textBody)); + $message->expects($this->once())->method('send')->with($this->equalTo($this->mailer)); + $message->expects($this->once())->method('setSubject')->with($this->equalTo('Application Log')); + + $mailTarget = $this->getMock('yii\\log\\EmailTarget', ['formatMessage'], [ + [ + 'mailer' => $this->mailer, + 'message'=> [ + 'to' => 'developer@example.com', + ] + ] + ]); + + $mailTarget->messages = $messages; + $mailTarget->expects($this->exactly(2))->method('formatMessage')->willReturnMap( + [ + [$message1, $message1[0]], + [$message2, $message2[0]], + ] + ); + $mailTarget->export(); + } +} From 564232b394804b147fccd3eaf4522e313a55bd83 Mon Sep 17 00:00:00 2001 From: Dmitriy Makarov Date: Sat, 13 Aug 2016 12:18:50 +0300 Subject: [PATCH 159/163] Fix typo [skip ci] (#12151) --- docs/guide/structure-assets.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/guide/structure-assets.md b/docs/guide/structure-assets.md index c5b979e..94e85df 100644 --- a/docs/guide/structure-assets.md +++ b/docs/guide/structure-assets.md @@ -488,7 +488,7 @@ A Web page can include many CSS and/or JavaScript files. To reduce the number of download size of these files, a common practice is to combine and compress multiple CSS/JavaScript files into one or very few files, and then include these compressed files instead of the original ones in the Web pages. -> Info: Combining and compressing assets is usually needed when an application is in production mode. +> Info: Combining and compressing assets are usually needed when an application is in production mode. In development mode, using the original CSS/JavaScript files is often more convenient for debugging purposes. In the following, we introduce an approach to combine and compress asset files without the need to modify From 46a41ac8fd0b0154a692e14e0d6988c640f3ba77 Mon Sep 17 00:00:00 2001 From: jaaf Date: Sat, 13 Aug 2016 11:20:41 +0200 Subject: [PATCH 160/163] Adding French translation of structure-modules.md [skip ci] (#12153) * Corrections dans concept-aliases.md version fr * Some correction in intro-upgrade-from.md French version * some corrections in start-databases.md French version * added translation of structure-applications.md French version * adding source change in translation of concept-alias.md * adding source change in translation of intro-upgrade-from-v1.md * adding French translation of structure-modules.md [skip ci] * some typos in French translation of structure-modules.md [skip ci] --- docs/guide-fr/structure-modules.md | 225 +++++++++++++++++++++++++++++ docs/guide/structure-modules.md | 281 ------------------------------------- 2 files changed, 225 insertions(+), 281 deletions(-) create mode 100644 docs/guide-fr/structure-modules.md delete mode 100644 docs/guide/structure-modules.md diff --git a/docs/guide-fr/structure-modules.md b/docs/guide-fr/structure-modules.md new file mode 100644 index 0000000..86f395c --- /dev/null +++ b/docs/guide-fr/structure-modules.md @@ -0,0 +1,225 @@ +Modules +======= + +Les modules sont des unités logicielles auto-suffisantes constituées de [modèles](structure-models.md), [vues](structure-views.md), +[contrôleurs](structure-controllers.md) et autres composants de prise en charge. L'utilisateur final peut accéder aux contrôleurs dans un module lorsqu'il est installé dans une [application](structure-applications.md). Pour ces raisons, les modules sont souvent regardés comme de mini-applications. Les modules diffèrent des [applications](structure-applications.md) par le fait que les modules ne peuvent être déployés seuls et doivent résider dans une application. + +## Création de modules + +Un module est organisé comme un dossier qui est appelé le [[yii\base\Module::basePath|dossier de base (*basePath*)]] du module. Dans ce dossier, se trouvent des sous-dossiers, tels que `controllers`, `models` et `views`, qui contiennent les contrôleurs, les modèles , les vues et d'autres parties de code, juste comme une application. L'exemple suivant présente le contenu d'un module : + +``` +forum/ + Module.php le fichier de classe du module + controllers/ contient les fichiers de classe des contrôleurs + DefaultController.php le fichier de classe de contrôleur par défaut + models/ contient les fichiers de classe des modèles + views/ contient les fichiers de contrôleur, de vue et de disposition + layouts/ contient les fichiers de diposition + default/ contient les fichiers de vues pour le contrôleur par défaut + index.php le fichier de vue index +``` + + +### Classes de module + +Chacun des modules doit avoir une classe unique de module qui étend [[yii\base\Module]]. La classe doit être située directement dans le [[yii\base\Module::basePath|dossier de base]] du module et doit être [auto-chargeable](concept-autoloading.md). Quand un module est accédé, une instance unique de la classe de module correspondante est créée. Comme les [instances d'application](structure-applications.md), les instances de module sont utilisées pour partager des données et des composants. + +L'exemple suivant montre à quoi une classe de module peut ressembler : + +```php +namespace app\modules\forum; + +class Module extends \yii\base\Module +{ + public function init() + { + parent::init(); + + $this->params['foo'] = 'bar'; + // ... other initialization code ... + } +} +``` + +La méthode `init()` contient un code volumineux pour initialiser les propriétés du module. Vous pouvez également les sauvegarder sous forme de [configuration](concept-configurations.md) et charger cette configuration avec le code suivant dans la méthode `init()`: + +```php +public function init() +{ + parent::init(); + // initialise le module à partir de la configuration chargée depuis config.php + \Yii::configure($this, require(__DIR__ . '/config.php')); +} +``` + +où le fichier de configuration `config.php` peut avoir le contenu suivant, similaire à celui d'une [configuration d'application](structure-applications.md#application-configurations). + +```php + [ + // liste des configurations de composant + ], + 'params' => [ + // liste des paramètres + ], +]; +``` + + +### Contrôleurs dans les modules + +Lorsque vous créez des contrôleurs dans un module, une convention est de placer les classes de contrôleur dans le sous-espace de noms `controllers` dans l'espace de noms de la classe du module. Cela signifie également que les fichiers de classe des contrôleur doivent être placés dans le dossier `controllers` dans le [[yii\base\Module::basePath|dossier de base]] du module. Par exemple, pour créer un contrôleur `post` dans le module `forum` présenté dans la section précédente, vous devez déclarer la classe de contrôleur comme ceci : + +```php +namespace app\modules\forum\controllers; + +use yii\web\Controller; + +class PostController extends Controller +{ + // ... +} +``` + +Vous pouvez personnaliser l'espace de noms des classes de contrôleur en configurant la propriété [[yii\base\Module::controllerNamespace]]. Dans le cas où certains contrôleurs sont en dehors de cet espace de noms, vous pouvez les rendre accessibles en configurant la propriété [[yii\base\Module::controllerMap]] comme vous le feriez dans une [application](structure-applications.md#controllerMap). + + +### Vues dans les modules + +Les vues dans les modules doivent être placées dans le dossier `views` du [[yii\base\Module::basePath|dossier de base (*base path*)]] du module. Quant aux vues rendues par un contrôleur du module, elles doivent être placées dans le dossier `views/ControllerID`, où `ControllerID` fait référence à l'[identifiant du contrôleur](structure-controllers.md#routes). Par exemple, si la classe du contrôleur est `PostController`, le dossier doit être `views/post` dans le [[yii\base\Module::basePath|dossier de base]] du module. + +Un module peut spécifier une [disposition](structure-views.md#layouts) qui s'applique aux vues rendues par les contrôleurs du module. La disposition doit être mise dans le dossier `views/layouts` par défaut, et vous devez configurer la propriété [[yii\base\Module::layout]] pour qu'elle pointe sur le nom de la disposition. Si vous ne configurez pas la propriété `layout` c'est la disposition de l'application qui est utilisée à sa place. + + +### Commande de console dans les modules + +Votre module peut aussi déclarer des commandes, qui sont accessibles via le mode [Console](tutorial-console.md). + +Afin que l'utilitaire de ligne de commande reconnaisse vos commandes, vous devez changer la propriété [[yii\base\Module::controllerNamespace (espace de noms du contrôleur)]] lorsque Yii est exécuté en mode console, et le diriger sur votre espace de noms de commandes. + +Une manière de réaliser cela est de tester le type d'instance de l'application Yii dans la méthode `init` du module : + +```php +public function init() +{ + parent::init(); + if (Yii::$app instanceof \yii\console\Application) { + $this->controllerNamespace = 'app\modules\forum\commands'; + } +} +``` + +Vos commandes seront disponibles en ligne de commande en utilisant la route suivante : + +``` +yii // +``` + +## Utilisation des modules + +Pour utiliser un module dans une application, il vous suffit de configurer l'application en listant le module dans la propriété [[yii\base\Application::modules|modules]] de l'application. Le code qui suit dans la [configuration de l'application](structure-applications.md#application-configurations) permet l'utilisation du module `forum` : + +```php +[ + 'modules' => [ + 'forum' => [ + 'class' => 'app\modules\forum\Module', + // ... autres éléments de configuration pour le module ... + ], + ], +] +``` + +La propriété [[yii\base\Application::modules|modules]] accepte un tableau de configurations de module. Chaque clé du tableau représente un *identifiant de module* qui distingue ce module parmi les autres modules de l'application, et la valeur correspondante est une [configuration](concept-configurations.md) pour la création du module. + + +### Routes + +Les [routes](structure-controllers.md#routes) sont utilisées pour accéder aux contrôleurs d'un module comme elles le sont pour accéder aux contrôleurs d'une application. Une route pour un contrôleur d'un module doit commencer par l'identifiant du module, suivi de l'[identifiant du contrôleur](structure-controllers.md#controller-ids) et de [identifiant de l'action](structure-controllers.md#action-ids). Par exemple, si une application utilise un module nommé `forum`, alors la route `forum/post/index` représente l'action `index` du contrôleur `post` du module. Si la route ne contient que l'identifiant du module, alors la propriété [[yii\base\Module::defaultRoute]], dont la valeur par défaut est `default`, détermine quel contrôleur/action utiliser. Cela signifie que la route `forum` représente le contrôleur `default` dans le module `forum`. + + +### Accès aux modules + +Dans un module, souvent, il arrive que vous ayez besoin d'une instance de la [classe du module](#module-classes) de façon à pouvoir accéder à l'identifiant du module, à ses paramètres, à ses composants, etc. Vous pouvez le faire en utilisant l'instruction suivante : + +```php +$module = MyModuleClass::getInstance(); +``` + +dans laquelle `MyModuleClass` fait référence au nom de la classe du module qui vous intéresse. La méthode `getInstance()` retourne l'instance de la classe du module actuellement requis. Si le module n'est pas requis, la méthode retourne `null`. Notez que vous n'avez pas besoin de créer manuellement une nouvelle instance de la classe du module parce que celle-ci serait différente de celle créée par Yii en réponse à la requête. + +> Info: lors du développement d'un module, vous ne devez pas supposer que le module va utiliser un identifiant fixe. Cela tient au fait qu'un module peut être associé à un identifiant arbitraire lorsqu'il est utilisé dans une application ou dans un autre module. Pour obtenir l'identifiant du module, vous devez utiliser l'approche ci-dessus pour obtenir d'abord une instance du module, puis obtenir l'identifiant via `$module->id`. + +Vous pouvez aussi accéder à l'instance d'un module en utilisant les approches suivantes : + +```php +// obtenir le module fils dont l'identifiant est "forum" +$module = \Yii::$app->getModule('forum'); + +// obtenir le module auquel le contrôleur actuellement requis appartient +$module = \Yii::$app->controller->module; +``` + +La première approche n'est utile que lorsque vous connaissez l'identifiant du module, tandis que la seconde est meilleure lorsque vous connaissez le contrôleur actuellement requis. + +Une fois que vous disposez de l'instance du module, vous pouvez accéder aux paramètres et aux composants enregistrés avec le module. Par exemple : + +```php +$maxPostCount = $module->params['maxPostCount']; +``` + + +### Modules faisant partie du processus d'amorçage + +Il se peut que certains modules doivent être exécutés pour chacune des requêtes. Le module [[yii\debug\Module|debug]] en est un exemple. Pour que des modules soit exécutés pour chaque requête, vous devez les lister dans la propriété [[yii\base\Application::bootstrap|bootstrap]] de l'application. + +Par exemple, la configuration d'application suivante garantit que le module `debug` est chargé à chaque requête : + +```php +[ + 'bootstrap' => [ + 'debug', + ], + + 'modules' => [ + 'debug' => 'yii\debug\Module', + ], +] +``` + + +## Modules imbriqués + +Les modules peuvent être imbriqués sur un nombre illimité de niveaux. C'est à dire qu'un module pour contenir un autre module qui contient lui-même un autre module. Nous parlons alors de *module parent* pour le module englobant, et de *module enfant* pour le module contenu. Les modules enfants doivent être déclarés dans la propriété [[yii\base\Module::modules|modules]] de leur module parent. Par exemple : + +```php +namespace app\modules\forum; + +class Module extends \yii\base\Module +{ + public function init() + { + parent::init(); + + $this->modules = [ + 'admin' => [ + // Vous devriez envisager l'utilisation d'un espace de noms plus court ici ! + 'class' => 'app\modules\forum\modules\admin\Module', + ], + ]; + } +} +``` + +La route vers un contrôleur inclus dans un module doit inclure les identifiants de tous ses modules ancêtres. Par exemple, la route `forum/admin/dashboard/index` représente l'action `index` du contrôleur `dashboard` dans le module `admin` qui est un module enfant du module `forum`. + +> Info: la méthode [[yii\base\Module::getModule()|getModule()]] ne retourne que le module enfant appartenant directement à son parent. La propriété [[yii\base\Application::loadedModules]] tient à jour une liste des modules chargés, y compris les enfant directs et les enfants des générations suivantes, indexée par le nom de classe. + + +## Meilleures pratiques + +L'utilisation des modules est préférable dans les grosses applications dont les fonctionnalités peuvent être réparties en plusieurs groupes, consistant chacun en un jeu de fonctionnalités liées d'assez près. Chacune de ces fonctionnalités peut être conçue comme un module développé et maintenu par un développeur ou une équipe spécifique. + +Les modules sont aussi un bon moyen de réutiliser du code au niveau des groupes de fonctionnalités. Quelques fonctionnalité d'usage courant, telles que la gestion des utilisateurs, la gestion des commentaires, etc. peuvent être développées en tant que modules ce qui facilite leur réutilisation dans les projets suivants. diff --git a/docs/guide/structure-modules.md b/docs/guide/structure-modules.md deleted file mode 100644 index 2abeaeb..0000000 --- a/docs/guide/structure-modules.md +++ /dev/null @@ -1,281 +0,0 @@ -Modules -======= - -Modules are self-contained software units that consist of [models](structure-models.md), [views](structure-views.md), -[controllers](structure-controllers.md), and other supporting components. End users can access the controllers -of a module when it is installed in [application](structure-applications.md). For these reasons, modules are -often viewed as mini-applications. Modules differ from [applications](structure-applications.md) in that -modules cannot be deployed alone and must reside within applications. - - -## Creating Modules - -A module is organized as a directory which is called the [[yii\base\Module::basePath|base path]] of the module. -Within the directory, there are sub-directories, such as `controllers`, `models`, `views`, which hold controllers, -models, views, and other code, just like in an application. The following example shows the content within a module: - -``` -forum/ - Module.php the module class file - controllers/ containing controller class files - DefaultController.php the default controller class file - models/ containing model class files - views/ containing controller view and layout files - layouts/ containing layout view files - default/ containing view files for DefaultController - index.php the index view file -``` - - -### Module Classes - -Each module should have a unique module class which extends from [[yii\base\Module]]. The class should be located -directly under the module's [[yii\base\Module::basePath|base path]] and should be [autoloadable](concept-autoloading.md). -When a module is being accessed, a single instance of the corresponding module class will be created. -Like [application instances](structure-applications.md), module instances are used to share data and components -for code within modules. - -The following is an example how a module class may look like: - -```php -namespace app\modules\forum; - -class Module extends \yii\base\Module -{ - public function init() - { - parent::init(); - - $this->params['foo'] = 'bar'; - // ... other initialization code ... - } -} -``` - -If the `init()` method contains a lot of code initializing the module's properties, you may also save them in terms -of a [configuration](concept-configurations.md) and load it with the following code in `init()`: - -```php -public function init() -{ - parent::init(); - // initialize the module with the configuration loaded from config.php - \Yii::configure($this, require(__DIR__ . '/config.php')); -} -``` - -where the configuration file `config.php` may contain the following content, similar to that in an -[application configuration](structure-applications.md#application-configurations). - -```php - [ - // list of component configurations - ], - 'params' => [ - // list of parameters - ], -]; -``` - - -### Controllers in Modules - -When creating controllers in a module, a convention is to put the controller classes under the `controllers` -sub-namespace of the namespace of the module class. This also means the controller class files should be -put in the `controllers` directory within the module's [[yii\base\Module::basePath|base path]]. -For example, to create a `post` controller in the `forum` module shown in the last subsection, you should -declare the controller class like the following: - -```php -namespace app\modules\forum\controllers; - -use yii\web\Controller; - -class PostController extends Controller -{ - // ... -} -``` - -You may customize the namespace of controller classes by configuring the [[yii\base\Module::controllerNamespace]] -property. In case some of the controllers are outside of this namespace, you may make them accessible -by configuring the [[yii\base\Module::controllerMap]] property, similar to [what you do in an application](structure-applications.md#controllerMap). - - -### Views in Modules - -Views in a module should be put in the `views` directory within the module's [[yii\base\Module::basePath|base path]]. -For views rendered by a controller in the module, they should be put under the directory `views/ControllerID`, -where `ControllerID` refers to the [controller ID](structure-controllers.md#routes). For example, if -the controller class is `PostController`, the directory would be `views/post` within the module's -[[yii\base\Module::basePath|base path]]. - -A module can specify a [layout](structure-views.md#layouts) that is applied to the views rendered by the module's -controllers. The layout should be put in the `views/layouts` directory by default, and you should configure -the [[yii\base\Module::layout]] property to point to the layout name. If you do not configure the `layout` property, -the application's layout will be used instead. - - -### Console commands in Modules - -Your module may also declare commands, that will be available through the [Console](tutorial-console.md) mode. - -In order for the command line utility to see your commands, you will need to change the [[yii\base\Module::controllerNamespace]] -property, when Yii is executed in the console mode, and point it to your commands namespace. - -One way to achieve that is to test the instance type of the Yii application in the module's `init` method: - -```php -public function init() -{ - parent::init(); - if (Yii::$app instanceof \yii\console\Application) { - $this->controllerNamespace = 'app\modules\forum\commands'; - } -} -``` - -Your commands will then be available from the command line using the following route: - -``` -yii // -``` - -## Using Modules - -To use a module in an application, simply configure the application by listing the module in -the [[yii\base\Application::modules|modules]] property of the application. The following code in the -[application configuration](structure-applications.md#application-configurations) uses the `forum` module: - -```php -[ - 'modules' => [ - 'forum' => [ - 'class' => 'app\modules\forum\Module', - // ... other configurations for the module ... - ], - ], -] -``` - -The [[yii\base\Application::modules|modules]] property takes an array of module configurations. Each array key -represents a *module ID* which uniquely identifies the module among all modules in the application, and the corresponding -array value is a [configuration](concept-configurations.md) for creating the module. - - -### Routes - -Like accessing controllers in an application, [routes](structure-controllers.md#routes) are used to address -controllers in a module. A route for a controller within a module must begin with the module ID followed by -the [controller ID](structure-controllers.md#controller-ids) and [action ID](structure-controllers.md#action-ids). -For example, if an application uses a module named `forum`, then the route -`forum/post/index` would represent the `index` action of the `post` controller in the module. If the route -only contains the module ID, then the [[yii\base\Module::defaultRoute]] property, which defaults to `default`, -will determine which controller/action should be used. This means a route `forum` would represent the `default` -controller in the `forum` module. - - -### Accessing Modules - -Within a module, you may often need to get the instance of the [module class](#module-classes) so that you can -access the module ID, module parameters, module components, etc. You can do so by using the following statement: - -```php -$module = MyModuleClass::getInstance(); -``` - -where `MyModuleClass` refers to the name of the module class that you are interested in. The `getInstance()` method -will return the currently requested instance of the module class. If the module is not requested, the method will -return null. Note that you do not want to manually create a new instance of the module class because it will be -different from the one created by Yii in response to a request. - -> Info: When developing a module, you should not assume the module will use a fixed ID. This is because a module - can be associated with an arbitrary ID when used in an application or within another module. In order to get - the module ID, you should use the above approach to get the module instance first, and then get the ID via - `$module->id`. - -You may also access the instance of a module using the following approaches: - -```php -// get the child module whose ID is "forum" -$module = \Yii::$app->getModule('forum'); - -// get the module to which the currently requested controller belongs -$module = \Yii::$app->controller->module; -``` - -The first approach is only useful when you know the module ID, while the second approach is best used when you -know about the controllers being requested. - -Once you have the module instance, you can access parameters and components registered with the module. For example, - -```php -$maxPostCount = $module->params['maxPostCount']; -``` - - -### Bootstrapping Modules - -Some modules may need to be run for every request. The [[yii\debug\Module|debug]] module is such an example. -To do so, list the IDs of such modules in the [[yii\base\Application::bootstrap|bootstrap]] property of the application. - -For example, the following application configuration makes sure the `debug` module is always loaded: - -```php -[ - 'bootstrap' => [ - 'debug', - ], - - 'modules' => [ - 'debug' => 'yii\debug\Module', - ], -] -``` - - -## Nested Modules - -Modules can be nested in unlimited levels. That is, a module can contain another module which can contain yet -another module. We call the former *parent module* while the latter *child module*. Child modules must be declared -in the [[yii\base\Module::modules|modules]] property of their parent modules. For example, - -```php -namespace app\modules\forum; - -class Module extends \yii\base\Module -{ - public function init() - { - parent::init(); - - $this->modules = [ - 'admin' => [ - // you should consider using a shorter namespace here! - 'class' => 'app\modules\forum\modules\admin\Module', - ], - ]; - } -} -``` - -For a controller within a nested module, its route should include the IDs of all its ancestor modules. -For example, the route `forum/admin/dashboard/index` represents the `index` action of the `dashboard` controller -in the `admin` module which is a child module of the `forum` module. - -> Info: The [[yii\base\Module::getModule()|getModule()]] method only returns the child module directly belonging -to its parent. The [[yii\base\Application::loadedModules]] property keeps a list of loaded modules, including both -direct children and nested ones, indexed by their class names. - - -## Best Practices - -Modules are best used in large applications whose features can be divided into several groups, each consisting of -a set of closely related features. Each such feature group can be developed as a module which is developed and -maintained by a specific developer or team. - -Modules are also a good way of reusing code at the feature group level. Some commonly used features, such as -user management, comment management, can all be developed in terms of modules so that they can be reused easily -in future projects. From 697f95850ba1db31e103d22a8ecb55a7d1c07688 Mon Sep 17 00:00:00 2001 From: Dmitriy Makarov Date: Sat, 13 Aug 2016 20:08:13 +0300 Subject: [PATCH 161/163] Fix typo [skip ci] (#12157) Remove extra semicolons --- docs/guide/caching-page.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/guide/caching-page.md b/docs/guide/caching-page.md index 5dce61a..1d61ffa 100644 --- a/docs/guide/caching-page.md +++ b/docs/guide/caching-page.md @@ -27,8 +27,8 @@ public function behaviors() } ``` -The above code states that page caching should be used only for the `index` action; the page content should -be cached for at most 60 seconds and should be variated by the current application language; +The above code states that page caching should be used only for the `index` action. The page content should +be cached for at most 60 seconds and should be variated by the current application language and the cached page should be invalidated if the total number of posts is changed. As you can see, page caching is very similar to [fragment caching](caching-fragment.md). They both support options such From b7f91fabb399baed03dca1a42ee09ad9db715be5 Mon Sep 17 00:00:00 2001 From: Dmitriy Makarov Date: Sat, 13 Aug 2016 20:08:36 +0300 Subject: [PATCH 162/163] Fix typo [skip ci] (#12156) Use adverb instead of adjective --- docs/guide/caching-data.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/guide/caching-data.md b/docs/guide/caching-data.md index 7721dbe..548889e 100644 --- a/docs/guide/caching-data.md +++ b/docs/guide/caching-data.md @@ -89,7 +89,7 @@ Yii supports a wide range of cache storage. The following is a summary: the corresponding cache component. In both cases, you may use the same code `Yii::$app->cache->get($key)` to attempt retrieving data from the cache without worrying that `Yii::$app->cache` might be `null`. -* [[yii\caching\FileCache]]: uses standard files to store cached data. This is particular suitable +* [[yii\caching\FileCache]]: uses standard files to store cached data. This is particularly suitable to cache large chunk of data, such as page content. * [[yii\caching\MemCache]]: uses PHP [memcache](http://php.net/manual/en/book.memcache.php) and [memcached](http://php.net/manual/en/book.memcached.php) extensions. This option can be considered as From 623aed72ebd8a698aed391e2177ff49789f0368d Mon Sep 17 00:00:00 2001 From: DumpOfTheVar Date: Sat, 13 Aug 2016 20:09:03 +0300 Subject: [PATCH 163/163] fix misprint in docs (#12155) [skip ci] --- docs/guide/runtime-handling-errors.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/guide/runtime-handling-errors.md b/docs/guide/runtime-handling-errors.md index cea7ed0..e48943b 100644 --- a/docs/guide/runtime-handling-errors.md +++ b/docs/guide/runtime-handling-errors.md @@ -157,7 +157,7 @@ the error action and the error view are already defined for you. ### Customizing Error Response Format The error handler displays errors according to the format setting of the [response](runtime-responses.md). -If the the [[yii\web\Response::format|response format]] is `html`, it will use the error or exception view +If the [[yii\web\Response::format|response format]] is `html`, it will use the error or exception view to display errors, as described in the last subsection. For other response formats, the error handler will assign the array representation of the exception to the [[yii\web\Response::data]] property which will then be converted to different formats accordingly. For example, if the response format is `json`, you may see