From 308ad35285f286ad75810e17b2490760d40c5571 Mon Sep 17 00:00:00 2001 From: Oleksandra Marchenko Date: Mon, 12 Oct 2015 23:05:15 +0300 Subject: [PATCH 001/902] gallery widget --- .../widgets/widget_gallery.md | 161 ++++++++++++++++++ 1 file changed, 161 insertions(+) create mode 100644 guides/v2.0/javascript-dev-guide/widgets/widget_gallery.md diff --git a/guides/v2.0/javascript-dev-guide/widgets/widget_gallery.md b/guides/v2.0/javascript-dev-guide/widgets/widget_gallery.md new file mode 100644 index 00000000000..e471e96cad7 --- /dev/null +++ b/guides/v2.0/javascript-dev-guide/widgets/widget_gallery.md @@ -0,0 +1,161 @@ +--- +layout: default +group: jsdg +subgroup: Widgets +title: Gallery widget +menu_order: 7 +menu_title: Gallery widget +github_link: javascript-dev-guide/widgets/widget_gallery.md +--- + +

Overview

+ +The gallery widget is used to display product photos on product pages. Gallery implements content area with images organized into preview and thumbnails blocks. +In addition, integrated Gallery Magnifier can be used to demonstrate images in 100% scaled size in separate dedicated layer, +or Gallery Fullscreen mode can be used to navigate the entire full sized photo. + +Gallery is displayed consistently across all supported browsers and is responsive - it sizes correctly on mobile devices and desktops. + +The gallery widget source is lib/web/mage/gallery/gallery.js + +The magnifier widget source is lib/web/magnifier/magnify.js. + +

is it a widget as well?

+ +

Initialize the gallery widget

+ +

Options

+ + + +Set width for preview in gallery. +Type: Number, String +Default value: null +Example of the initialization with the width option specified: +$("#element").fotorama({ width: 600}); +$("#element").fotorama({ width: "100%"}); + + + + Set height for preview in gallery. + Type: Number, String + Default value: null + Example of the initialization with the height option specified: + $("#element").fotorama({ height: 400}); + $("#element").fotorama({ height: "50%"}); + + + Set maxwidth for preview in gallery. + Type: Number, String + Default value: 100% + Example of the initialization with the maxwidth option specified: + $("#element").fotorama({ maxwidth: 400}); + $("#element").fotorama({ maxwidth: "50%"}); + + + + Set minwidth for preview in gallery. + Type: Number, String + Default value: null + Example of the initialization with the minwidth option specified: + $("#element").fotorama({ minwidth: 400}); + $("#element").fotorama({ minwidth: "50%"}); + + + Set minheight for preview in gallery. + Type: Number, String + Default value: null + Example of the initialization with the minheight option specified: + $("#element").fotorama({ minheight: 400}); + $("#element").fotorama({ minheight: "50%"}); + + + Set maxheight for preview in gallery. + Type: Number, String + Default value: null + Example of the initialization with the maxheight option specified: + $("#element").fotorama({ maxheight: 400}); + $("#element").fotorama({ maxheight: "50%"}); + + + Make gallery responsive, define width in percents and aspect ratio: + Type: Number, String + Default value: null + Example of the initialization with the ratio option specified: + $("#element").fotorama({ ratio: '4/3'}); + $("#element").fotorama({ ratio: 1.5 }); + $("#element").fotorama({ ratio: 800/600 }); + + + Variation of thumbnails in navigation. Can be 'thumbs', 'dots' or false + Type: String, boolean + Default: 'dots' + + + Set width of thumbnails in navigation + Type: Number, String + Example of the initialization with the thumbwidth option specified: + $("#element").fotorama({ thumbwidth: 90}); + + Set height of thumbnails in navigation + Type: Number, String + Example of the initialization with the thumbheight option specified: + $("#element").fotorama({ thumbheight: 90}); + + + Show the button, which can toggle full screen view of gallery. + Type: boolean + Example of the initialization with the allowfullscreen option specified: + + $("#element").fotorama({ thumbwidth: 90}); + + + If yes text in caption will be visible in preview. + Type: boolean + Example of the initialization with the captions option specified: + $("#element").fotorama({ captions: false}); + + Set number, which number of image will be visible when gallery loaded. + Type: Number + default: 0 + Example of the initialization with the startindex option specified: + $("#element").fotorama({ startindex: 3}); + + Property toggle infinite loop of images in gallery + Type: boolean + default: false + Example of the initialization with the loop option specified: + $("#element").fotorama({ loop: true}); + + + Enable navigation through preview. Preview divided into 3 parts. Click on first part like Previous button. Click on other parts like Next button. + Type: boolean + Example of the initialization with the click option specified: + $("#element").fotorama({ click: false}); + + Enable swipe preview in left and right. + Type: boolean + Example of the initialization with the swipe option specified: + $("#element").fotorama({ swipe: 90}); + + Enable view of caption in preview. Can be for initialized for specific image. Can work globally. + Type: boolean + Example of the initialization with the showcaption option specified: + $("#element").fotorama({ showcaption: 90}); \ No newline at end of file From 18d61f1af9c81a1dec6b99d0327e0b93e216b5e9 Mon Sep 17 00:00:00 2001 From: Oleksandra Marchenko Date: Tue, 13 Oct 2015 01:08:44 +0300 Subject: [PATCH 002/902] gallery widget updates --- .../widgets/widget_gallery.md | 171 ++++++++++-------- 1 file changed, 93 insertions(+), 78 deletions(-) diff --git a/guides/v2.0/javascript-dev-guide/widgets/widget_gallery.md b/guides/v2.0/javascript-dev-guide/widgets/widget_gallery.md index e471e96cad7..14b28b3a8b9 100644 --- a/guides/v2.0/javascript-dev-guide/widgets/widget_gallery.md +++ b/guides/v2.0/javascript-dev-guide/widgets/widget_gallery.md @@ -1,4 +1,4 @@ ---- +---. layout: default group: jsdg subgroup: Widgets @@ -11,6 +11,10 @@ github_link: javascript-dev-guide/widgets/widget_gallery.md

Overview

The gallery widget is used to display product photos on product pages. Gallery implements content area with images organized into preview and thumbnails blocks. + +

Do we need to mention that it uses fotorama?

+

Are the default values of options the same as for fotorama?

+ In addition, integrated Gallery Magnifier can be used to demonstrate images in 100% scaled size in separate dedicated layer, or Gallery Fullscreen mode can be used to navigate the entire full sized photo. @@ -26,34 +30,51 @@ The magnifier widget source is width +
  • allowfullscreen
  • +
  • captions
  • +
  • click
  • height
  • -
  • maxwidth -
  • minwidth - - - - - - - - - - - - +
  • loop
  • +
  • maxheight
  • +
  • maxwidth
  • +
  • minwidth
  • +
  • minheigth
  • +
  • nav
  • +
  • ratio
  • +
  • thumbheight
  • +
  • thumbwidth
  • +
  • startindex
  • +
  • swipe
  • +
  • width
  • - -Set width for preview in gallery. -Type: Number, String -Default value: null -Example of the initialization with the width option specified: -$("#element").fotorama({ width: 600}); -$("#element").fotorama({ width: "100%"}); + +Show the button that toggles full screen view of the gallery. + +**Type**: Boolean + +Example of the initialization with the allowfullscreen option specified: + + $("#element").fotorama({ thumbwidth: 90}); + +

    thumbwidth??

    + + +Defines if the text in caption is visible in preview. - +**Type**: Boolean + +Example of the initialization with the captions option specified: + $("#element").fotorama({ captions: false}); + + + Enable navigation through preview. Preview divided into 3 parts. Click on first part like Previous button. Click on other parts like Next button. + Type: boolean + Example of the initialization with the click option specified: + $("#element").fotorama({ click: false}); + + Set height for preview in gallery. Type: Number, String Default value: null @@ -61,6 +82,13 @@ $("#element").fotorama({ width: "100%"}); $("#element").fotorama({ height: 400}); $("#element").fotorama({ height: "50%"}); + + Property toggle infinite loop of images in gallery + Type: boolean + default: false + Example of the initialization with the loop option specified: + $("#element").fotorama({ loop: true}); + Set maxwidth for preview in gallery. Type: Number, String @@ -69,15 +97,14 @@ $("#element").fotorama({ width: "100%"}); $("#element").fotorama({ maxwidth: 400}); $("#element").fotorama({ maxwidth: "50%"}); - - - Set minwidth for preview in gallery. + + Set maxheight for preview in gallery. Type: Number, String Default value: null - Example of the initialization with the minwidth option specified: - $("#element").fotorama({ minwidth: 400}); - $("#element").fotorama({ minwidth: "50%"}); - + Example of the initialization with the maxheight option specified: + $("#element").fotorama({ maxheight: 400}); + $("#element").fotorama({ maxheight: "50%"}); + Set minheight for preview in gallery. Type: Number, String @@ -86,13 +113,18 @@ $("#element").fotorama({ width: "100%"}); $("#element").fotorama({ minheight: 400}); $("#element").fotorama({ minheight: "50%"}); - - Set maxheight for preview in gallery. + + Set minwidth for preview in gallery. Type: Number, String Default value: null - Example of the initialization with the maxheight option specified: - $("#element").fotorama({ maxheight: 400}); - $("#element").fotorama({ maxheight: "50%"}); + Example of the initialization with the minwidth option specified: + $("#element").fotorama({ minwidth: 400}); + $("#element").fotorama({ minwidth: "50%"}); + + + Variation of thumbnails in navigation. Can be 'thumbs', 'dots' or false + Type: String, boolean + Default: 'dots' Make gallery responsive, define width in percents and aspect ratio: @@ -103,59 +135,42 @@ $("#element").fotorama({ width: "100%"}); $("#element").fotorama({ ratio: 1.5 }); $("#element").fotorama({ ratio: 800/600 }); - - Variation of thumbnails in navigation. Can be 'thumbs', 'dots' or false - Type: String, boolean - Default: 'dots' - - - Set width of thumbnails in navigation - Type: Number, String - Example of the initialization with the thumbwidth option specified: - $("#element").fotorama({ thumbwidth: 90}); - - Set height of thumbnails in navigation - Type: Number, String - Example of the initialization with the thumbheight option specified: - $("#element").fotorama({ thumbheight: 90}); - - - Show the button, which can toggle full screen view of gallery. + + Enable view of caption in preview. Can be for initialized for specific image. Can work globally. Type: boolean - Example of the initialization with the allowfullscreen option specified: - - $("#element").fotorama({ thumbwidth: 90}); + Example of the initialization with the showcaption option specified: + $("#element").fotorama({ showcaption: 90}); - - If yes text in caption will be visible in preview. - Type: boolean - Example of the initialization with the captions option specified: - $("#element").fotorama({ captions: false}); Set number, which number of image will be visible when gallery loaded. Type: Number default: 0 Example of the initialization with the startindex option specified: $("#element").fotorama({ startindex: 3}); - - Property toggle infinite loop of images in gallery - Type: boolean - default: false - Example of the initialization with the loop option specified: - $("#element").fotorama({ loop: true}); - - Enable navigation through preview. Preview divided into 3 parts. Click on first part like Previous button. Click on other parts like Next button. - Type: boolean - Example of the initialization with the click option specified: - $("#element").fotorama({ click: false}); + Enable swipe preview in left and right. Type: boolean Example of the initialization with the swipe option specified: $("#element").fotorama({ swipe: 90}); - - Enable view of caption in preview. Can be for initialized for specific image. Can work globally. - Type: boolean - Example of the initialization with the showcaption option specified: - $("#element").fotorama({ showcaption: 90}); \ No newline at end of file + + + Set width of thumbnails in navigation + Type: Number, String + Example of the initialization with the thumbwidth option specified: + $("#element").fotorama({ thumbwidth: 90}); + + Set height of thumbnails in navigation + Type: Number, String + Example of the initialization with the thumbheight option specified: + $("#element").fotorama({ thumbheight: 90}); + + + +Set width for preview in gallery. +Type: Number, String +Default value: null +Example of the initialization with the width option specified: +$("#element").fotorama({ width: 600}); +$("#element").fotorama({ width: "100%"}); \ No newline at end of file From 9b1a7e278180bff3420b6052b0cb6741856d1ed5 Mon Sep 17 00:00:00 2001 From: Oleksandra Marchenko Date: Tue, 13 Oct 2015 17:33:20 +0300 Subject: [PATCH 003/902] gallery widget --- guides/v2.0/javascript-dev-guide/widgets/widget_gallery.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/guides/v2.0/javascript-dev-guide/widgets/widget_gallery.md b/guides/v2.0/javascript-dev-guide/widgets/widget_gallery.md index 14b28b3a8b9..604fab6d42b 100644 --- a/guides/v2.0/javascript-dev-guide/widgets/widget_gallery.md +++ b/guides/v2.0/javascript-dev-guide/widgets/widget_gallery.md @@ -11,6 +11,7 @@ github_link: javascript-dev-guide/widgets/widget_gallery.md

    Overview

    The gallery widget is used to display product photos on product pages. Gallery implements content area with images organized into preview and thumbnails blocks. +http://fotorama.io/customize/options/

    Do we need to mention that it uses fotorama?

    Are the default values of options the same as for fotorama?

    @@ -61,7 +62,7 @@ Example of the initialization with the allowfullscreen option specified: -Defines if the text in caption is visible in preview. +Defines if the caption is visible. **Type**: Boolean From 8ab18c99383f829fc664f2468c50a79573edcbaa Mon Sep 17 00:00:00 2001 From: Oleksandra Marchenko Date: Tue, 13 Oct 2015 23:35:31 +0300 Subject: [PATCH 004/902] Widget gallery --- .../widgets/jquery-widgets-about.md | 1 + .../widgets/widget_gallery.md | 23 ++++++++++++------- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/guides/v2.0/javascript-dev-guide/widgets/jquery-widgets-about.md b/guides/v2.0/javascript-dev-guide/widgets/jquery-widgets-about.md index 69431cb1069..d8adfd7565f 100644 --- a/guides/v2.0/javascript-dev-guide/widgets/jquery-widgets-about.md +++ b/guides/v2.0/javascript-dev-guide/widgets/jquery-widgets-about.md @@ -21,6 +21,7 @@ This guide discusses the following widgets:
  • Collapsible widget
  • Confirm widget
  • DropdownDialog widget
  • +
  • Gallery widget
  • List widget
  • Loader widget
  • Menu widget
  • diff --git a/guides/v2.0/javascript-dev-guide/widgets/widget_gallery.md b/guides/v2.0/javascript-dev-guide/widgets/widget_gallery.md index 604fab6d42b..d7213b27afb 100644 --- a/guides/v2.0/javascript-dev-guide/widgets/widget_gallery.md +++ b/guides/v2.0/javascript-dev-guide/widgets/widget_gallery.md @@ -1,4 +1,4 @@ ----. +--- layout: default group: jsdg subgroup: Widgets @@ -70,21 +70,28 @@ Example of the initialization with the captions option specified: $("#element").fotorama({ captions: false}); - Enable navigation through preview. Preview divided into 3 parts. Click on first part like Previous button. Click on other parts like Next button. - Type: boolean - Example of the initialization with the click option specified: + +Enable navigation through preview frames by clicking the Next and Previous buttons. + +**Type**: Boolean + +Example of the initialization with the click option specified: $("#element").fotorama({ click: false}); - Set height for preview in gallery. - Type: Number, String - Default value: null + +Height of the preview in gallery. + +**Type**: Number|String + +**Default value**: null Example of the initialization with the height option specified: $("#element").fotorama({ height: 400}); $("#element").fotorama({ height: "50%"}); - Property toggle infinite loop of images in gallery + +Property toggle infinite loop of images in gallery Type: boolean default: false Example of the initialization with the loop option specified: From be370658f726aee9b855c01c17de173b543b12a1 Mon Sep 17 00:00:00 2001 From: Oleksandra Marchenko Date: Wed, 14 Oct 2015 02:10:28 +0300 Subject: [PATCH 005/902] gallery --- .../widgets/widget_gallery.md | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/guides/v2.0/javascript-dev-guide/widgets/widget_gallery.md b/guides/v2.0/javascript-dev-guide/widgets/widget_gallery.md index d7213b27afb..fb2ea3bff65 100644 --- a/guides/v2.0/javascript-dev-guide/widgets/widget_gallery.md +++ b/guides/v2.0/javascript-dev-guide/widgets/widget_gallery.md @@ -10,11 +10,7 @@ github_link: javascript-dev-guide/widgets/widget_gallery.md

    Overview

    -The gallery widget is used to display product photos on product pages. Gallery implements content area with images organized into preview and thumbnails blocks. -http://fotorama.io/customize/options/ - -

    Do we need to mention that it uses fotorama?

    -

    Are the default values of options the same as for fotorama?

    +The gallery widget is used to display product photos on product pages. Gallery implements content area with images organized into preview and thumbnails blocks. It uses the jQuery Fotorama library In addition, integrated Gallery Magnifier can be used to demonstrate images in 100% scaled size in separate dedicated layer, or Gallery Fullscreen mode can be used to navigate the entire full sized photo. @@ -23,7 +19,7 @@ Gallery is displayed consistently across all supported browsers and is responsiv The gallery widget source is lib/web/mage/gallery/gallery.js -The magnifier widget source is lib/web/magnifier/magnify.js. +The gallery magnifier source is lib/web/magnifier/magnify.js.

    is it a widget as well?

    @@ -80,18 +76,15 @@ Example of the initialization with the click option specified: -Height of the preview in gallery. +Height of the preview block in pixels or percents. **Type**: Number|String **Default value**: null - Example of the initialization with the height option specified: - $("#element").fotorama({ height: 400}); - $("#element").fotorama({ height: "50%"}); -Property toggle infinite loop of images in gallery +Define whether images are displayed in a loop. Type: boolean default: false Example of the initialization with the loop option specified: From 943f3b0201e3788fa54e2603854836003ff70608 Mon Sep 17 00:00:00 2001 From: Oleksandra Marchenko Date: Sat, 17 Oct 2015 01:54:04 +0300 Subject: [PATCH 006/902] gallery widget --- .../widgets/widget_gallery.md | 91 ++++++++++++------- 1 file changed, 60 insertions(+), 31 deletions(-) diff --git a/guides/v2.0/javascript-dev-guide/widgets/widget_gallery.md b/guides/v2.0/javascript-dev-guide/widgets/widget_gallery.md index fb2ea3bff65..55bbcef81e2 100644 --- a/guides/v2.0/javascript-dev-guide/widgets/widget_gallery.md +++ b/guides/v2.0/javascript-dev-guide/widgets/widget_gallery.md @@ -85,60 +85,89 @@ Height of the preview block in pixels or percents. Define whether images are displayed in a loop. - Type: boolean - default: false - Example of the initialization with the loop option specified: + +Type: Boolean + +Default: `false` + +Example of the initialization with the loop option specified: $("#element").fotorama({ loop: true}); - Set maxwidth for preview in gallery. - Type: Number, String - Default value: 100% - Example of the initialization with the maxwidth option specified: + +Maximum width of a preview in pixels or percents. + +**Type**: Number, String + +**Default value**: 100% + +Example of the initialization with the maxwidth option specified: $("#element").fotorama({ maxwidth: 400}); $("#element").fotorama({ maxwidth: "50%"}); - - Set maxheight for preview in gallery. - Type: Number, String - Default value: null - Example of the initialization with the maxheight option specified: + + +Maximum width of a preview in pixels or percents. + +**Type**: Number|String + +**Default value**: `null` + +Example of the initialization with the maxheight option specified: $("#element").fotorama({ maxheight: 400}); $("#element").fotorama({ maxheight: "50%"}); - - Set minheight for preview in gallery. - Type: Number, String - Default value: null - Example of the initialization with the minheight option specified: + + +Minimal height of a preview in pixels or percents. + +**Type**: Number|String + +**Default value**: `null` + +Example of the initialization with the minheight option specified: $("#element").fotorama({ minheight: 400}); $("#element").fotorama({ minheight: "50%"}); - - Set minwidth for preview in gallery. + + +Minimal width of the preview in pixels or percents. Type: Number, String Default value: null Example of the initialization with the minwidth option specified: $("#element").fotorama({ minwidth: 400}); $("#element").fotorama({ minwidth: "50%"}); - - Variation of thumbnails in navigation. Can be 'thumbs', 'dots' or false - Type: String, boolean - Default: 'dots' + - - Make gallery responsive, define width in percents and aspect ratio: - Type: Number, String - Default value: null - Example of the initialization with the ratio option specified: +Variation of thumbnails in navigation. + +**Possible values**: + +- `dots`: iPhone-style dots +- `thumbs`: thumbnails +- `false`: nothing + +**Default**: `dots` + + + +Width divided by height. Recommended if you are using percentage width. + +Type: Number|String + +Default value: `null` + +Example of the initialization with the ratio option specified: $("#element").fotorama({ ratio: '4/3'}); $("#element").fotorama({ ratio: 1.5 }); $("#element").fotorama({ ratio: 800/600 }); - - Enable view of caption in preview. Can be for initialized for specific image. Can work globally. - Type: boolean + + +Enable view of caption in preview. Can be for initialized for specific image. Can work globally. + +Type: boolean Example of the initialization with the showcaption option specified: $("#element").fotorama({ showcaption: 90}); From 4f5ba7376f4a0bb09a295fbefe6703f14ec12019 Mon Sep 17 00:00:00 2001 From: Oleksandra Marchenko Date: Tue, 20 Oct 2015 01:09:27 +0300 Subject: [PATCH 007/902] gallery widget --- .../widgets/widget_gallery.md | 79 +++++++++++++------ 1 file changed, 53 insertions(+), 26 deletions(-) diff --git a/guides/v2.0/javascript-dev-guide/widgets/widget_gallery.md b/guides/v2.0/javascript-dev-guide/widgets/widget_gallery.md index 55bbcef81e2..9a56d02fba8 100644 --- a/guides/v2.0/javascript-dev-guide/widgets/widget_gallery.md +++ b/guides/v2.0/javascript-dev-guide/widgets/widget_gallery.md @@ -40,6 +40,7 @@ The gallery magnifier source is ratio
  • thumbheight
  • thumbwidth
  • +
  • showcaption
  • startindex
  • swipe
  • width
  • @@ -132,9 +133,12 @@ Example of the initialization with the minheight option specified: Minimal width of the preview in pixels or percents. - Type: Number, String - Default value: null - Example of the initialization with the minwidth option specified: + +**Type**: Number|String + +**Default value**: `null` + +Example of the initialization with the minwidth option specified: $("#element").fotorama({ minwidth: 400}); $("#element").fotorama({ minwidth: "50%"}); @@ -167,40 +171,63 @@ Example of the initialization with the ratio option specified: Enable view of caption in preview. Can be for initialized for specific image. Can work globally. -Type: boolean - Example of the initialization with the showcaption option specified: +

    What is the difference between showcaptions and caption?

    + +**Type**: Boolean + +Example of the initialization with the showcaption option specified: $("#element").fotorama({ showcaption: 90}); - - Set number, which number of image will be visible when gallery loaded. - Type: Number - default: 0 - Example of the initialization with the startindex option specified: + + +The index number of the image that is displayed once the fotorama is initialized. + +

    Where do we set these numbers

    + +**Type**: Number + +**Default value**: `0` + +Example of the initialization with the startindex option specified: $("#element").fotorama({ startindex: 3}); - - Enable swipe preview in left and right. - Type: boolean - Example of the initialization with the swipe option specified: + + +Moving between preview images by swiping in left and right. + +**Type**: Boolean + +Example of the initialization with the swipe option specified: $("#element").fotorama({ swipe: 90}); - - Set width of thumbnails in navigation - Type: Number, String - Example of the initialization with the thumbwidth option specified: + + +Width of thumbnails. + +**Type**: Number|String + +Example of the initialization with the thumbwidth option specified: $("#element").fotorama({ thumbwidth: 90}); - - Set height of thumbnails in navigation - Type: Number, String - Example of the initialization with the thumbheight option specified: + + + +Height of thumbnails in navigation. + +**Type**: Number|String + +Example of the initialization with the thumbheight option specified: $("#element").fotorama({ thumbheight: 90}); - -Set width for preview in gallery. -Type: Number, String -Default value: null + + +Width of the preview in gallery in pixels or percents. + +**Type**: Number, String + +**Default value**: `null` + Example of the initialization with the width option specified: $("#element").fotorama({ width: 600}); $("#element").fotorama({ width: "100%"}); \ No newline at end of file From 70a17fc544bcad165b23f977e659d725ac334377 Mon Sep 17 00:00:00 2001 From: Oleksandra Marchenko Date: Tue, 20 Oct 2015 01:18:34 +0300 Subject: [PATCH 008/902] gallery widget --- guides/v2.0/javascript-dev-guide/widgets/widget_gallery.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guides/v2.0/javascript-dev-guide/widgets/widget_gallery.md b/guides/v2.0/javascript-dev-guide/widgets/widget_gallery.md index 9a56d02fba8..74fe8ed4ff4 100644 --- a/guides/v2.0/javascript-dev-guide/widgets/widget_gallery.md +++ b/guides/v2.0/javascript-dev-guide/widgets/widget_gallery.md @@ -94,7 +94,7 @@ Default: `false` Example of the initialization with the loop option specified: $("#element").fotorama({ loop: true}); - + Maximum width of a preview in pixels or percents. From a3ba22d1d6c6349bd653cad8ca3f6ffdf761b98e Mon Sep 17 00:00:00 2001 From: Oleksandra Marchenko Date: Wed, 21 Oct 2015 01:46:41 +0300 Subject: [PATCH 009/902] Gallery --- .../widgets/widget_gallery.md | 176 +++++++++++++----- .../widgets/widget_gallery_mg.md | 37 ++++ 2 files changed, 162 insertions(+), 51 deletions(-) create mode 100644 guides/v2.0/javascript-dev-guide/widgets/widget_gallery_mg.md diff --git a/guides/v2.0/javascript-dev-guide/widgets/widget_gallery.md b/guides/v2.0/javascript-dev-guide/widgets/widget_gallery.md index 74fe8ed4ff4..f9900d1da01 100644 --- a/guides/v2.0/javascript-dev-guide/widgets/widget_gallery.md +++ b/guides/v2.0/javascript-dev-guide/widgets/widget_gallery.md @@ -20,12 +20,59 @@ Gallery is displayed consistently across all supported browsers and is responsiv The gallery widget source is lib/web/mage/gallery/gallery.js The gallery magnifier source is lib/web/magnifier/magnify.js. - +

    is it a widget as well?

    -

    Initialize the gallery widget

    +

    Contents

    + +* TOC +{:toc} + +## Initialize the gallery widget {#gallery_init} + + +Example of the gallery initialization in the JS: +{% highlight js %} + +$('#init_element').fotorama({ + thumbwidth: 90, + thumbheight: 60, + width: 600, + height: 400 + +}); + +{% endhighlight %} + +

    Can it be initialized with magnifier in JS? what are the usecases of initialization inside JS and PHTML

    -

    Options

    +When initializing Gallery Widget on HTML element, Magnifier initialization is also available. +

    Is it avaialble if other initialization options are used?

    + +The following is the illustration of initialization of the gallery widget with magnifier. + +{% highlight php %} + + + +{% endhighlight %} + +## Options {#gallery_options}
    • allowfullscreen
    • captions
    • @@ -40,7 +87,7 @@ The gallery magnifier source is ratio
    • thumbheight
    • thumbwidth
    • -
    • showcaption
    • +
    • showcaption
    • startindex
    • swipe
    • width
    • @@ -51,11 +98,6 @@ Show the button that toggles full screen view of the gallery. **Type**: Boolean -Example of the initialization with the allowfullscreen option specified: - - $("#element").fotorama({ thumbwidth: 90}); - -

      thumbwidth??

      @@ -68,28 +110,26 @@ Example of the initialization with the captions option specified: -Enable navigation through preview frames by clicking the Next and Previous buttons. +Enable navigation through preview frames by clicking the Next and Previous buttons. **Type**: Boolean -Example of the initialization with the click option specified: - $("#element").fotorama({ click: false}); Height of the preview block in pixels or percents. -**Type**: Number|String - +**Type**: Number, String + **Default value**: null Define whether images are displayed in a loop. -Type: Boolean +**Type**: Boolean -Default: `false` +**Default value**: `false` Example of the initialization with the loop option specified: $("#element").fotorama({ loop: true}); @@ -102,51 +142,38 @@ Maximum width of a preview in pixels or percents. **Default value**: 100% -Example of the initialization with the maxwidth option specified: - $("#element").fotorama({ maxwidth: 400}); - $("#element").fotorama({ maxwidth: "50%"}); Maximum width of a preview in pixels or percents. -**Type**: Number|String +**Type**: Number, String **Default value**: `null` -Example of the initialization with the maxheight option specified: - $("#element").fotorama({ maxheight: 400}); - $("#element").fotorama({ maxheight: "50%"}); Minimal height of a preview in pixels or percents. -**Type**: Number|String +**Type**: Number, String **Default value**: `null` - -Example of the initialization with the minheight option specified: - $("#element").fotorama({ minheight: 400}); - $("#element").fotorama({ minheight: "50%"}); + Minimal width of the preview in pixels or percents. -**Type**: Number|String +**Type**: Number, String **Default value**: `null` -Example of the initialization with the minwidth option specified: - $("#element").fotorama({ minwidth: 400}); - $("#element").fotorama({ minwidth: "50%"}); - -Variation of thumbnails in navigation. +Variation of thumbnails in navigation. -**Possible values**: +**Possible values**: - `dots`: iPhone-style dots - `thumbs`: thumbnails @@ -158,7 +185,7 @@ Variation of thumbnails in navigation. Width divided by height. Recommended if you are using percentage width. -Type: Number|String +Type: Number, String Default value: `null` @@ -175,9 +202,6 @@ Enable view of caption in preview. Can be for initialized for specific image. Ca **Type**: Boolean -Example of the initialization with the showcaption option specified: - $("#element").fotorama({ showcaption: 90}); - The index number of the image that is displayed once the fotorama is initialized. @@ -185,27 +209,25 @@ The index number of the image that is displayed once the fotorama is initialized

      Where do we set these numbers

      **Type**: Number - -**Default value**: `0` - -Example of the initialization with the startindex option specified: - $("#element").fotorama({ startindex: 3}); +**Default value**: `0` Moving between preview images by swiping in left and right. **Type**: Boolean - + Example of the initialization with the swipe option specified: $("#element").fotorama({ swipe: 90}); +

      It is the second example when "90" is specified for value of Boolean

      + Width of thumbnails. -**Type**: Number|String +**Type**: Number, String Example of the initialization with the thumbwidth option specified: $("#element").fotorama({ thumbwidth: 90}); @@ -214,8 +236,8 @@ Example of the initialization with the thumbwidth option specified: Height of thumbnails in navigation. -**Type**: Number|String - +**Type**: Number, String + Example of the initialization with the thumbheight option specified: $("#element").fotorama({ thumbheight: 90}); @@ -228,6 +250,58 @@ Width of the preview in gallery in pixels or percents. **Default value**: `null` -Example of the initialization with the width option specified: -$("#element").fotorama({ width: 600}); -$("#element").fotorama({ width: "100%"}); \ No newline at end of file +## Methods {#gallery_methods} + + + +Displays next preview image. If loop is enabled in options displays the first image after the last if this function is called. If loop is disabled doesn't update current image if it's the last item in list. + +Example: +next +api.next(); + + prev + DIsplays previous preview image. If loop is enabled in options, displays the last image after the first if this function is called. If loop is disabled doesn't update current image if it's the first item in list. + Example: +prev +api.prev(); + + last + DIsplays the last preview image. + Example: +last +api.last(); + + first + Displays the first preview image. + Example: +first +api.first(); + + seek + Displays image with appropriate count number on preview. Doesn't update preview if argument isn't correct. seek(0) doesn't update preview. seek(1) shows 1'st image. seek(-1) shows last image. If entered number bigger then items number or less then "-(items number)" gallery shows modulo of "items number / number". + Example: +seek +api.seek(1); + + updateData + Updates gallery with new set of items. If argument isn't correct or empty gallery stays in current state. + Example: + +updateData +api.updateData([{ + img: 'image1.jpg', + thumb: 'thumb1.jpg', + caption: 'caption' +}]); + + updateOptions + Updates options of active breakpoint or default gallery options, if there is no active breakpoint. + Example: + +updateOptions +api.updateOptions([{ + nav: 'dots' +}]); diff --git a/guides/v2.0/javascript-dev-guide/widgets/widget_gallery_mg.md b/guides/v2.0/javascript-dev-guide/widgets/widget_gallery_mg.md new file mode 100644 index 00000000000..b66c971c27e --- /dev/null +++ b/guides/v2.0/javascript-dev-guide/widgets/widget_gallery_mg.md @@ -0,0 +1,37 @@ +--- +layout: default +group: jsdg +subgroup: Widgets +title: Gallery widget Magnifier +menu_order: 7 +menu_title: Gallery widget Magnifier +github_link: javascript-dev-guide/widgets/widget_gallery_mg.md +--- + +**Contents** +* TOC +{:toc} + +## Initialize magnifier {#magnifier_init} + +When initializing Gallery Widget on HTML element, Magnifier initialization is also available. Following is the example of Gallery initialization with Magnifier: +Gallery initialization with Magnifier + + +## Options {#magnifier_options} +https://wiki.magento.com/display/JS/How+to+extend+on+Theme+level \ No newline at end of file From 71ed5f3ca424b4145467515ed15a3ae4ff23c78f Mon Sep 17 00:00:00 2001 From: Oleksandra Marchenko Date: Wed, 21 Oct 2015 22:33:25 +0300 Subject: [PATCH 010/902] gallery widget --- .../widgets/widget_gallery.md | 127 ++++++++++++------ 1 file changed, 85 insertions(+), 42 deletions(-) diff --git a/guides/v2.0/javascript-dev-guide/widgets/widget_gallery.md b/guides/v2.0/javascript-dev-guide/widgets/widget_gallery.md index f9900d1da01..f60c6ee5a13 100644 --- a/guides/v2.0/javascript-dev-guide/widgets/widget_gallery.md +++ b/guides/v2.0/javascript-dev-guide/widgets/widget_gallery.md @@ -131,9 +131,6 @@ Define whether images are displayed in a loop. **Default value**: `false` -Example of the initialization with the loop option specified: - $("#element").fotorama({ loop: true}); - Maximum width of a preview in pixels or percents. @@ -250,58 +247,104 @@ Width of the preview in gallery in pixels or percents. **Default value**: `null` -## Methods {#gallery_methods} +## Gallery API {#gallery_api} + +Gallery methods are placed in data storage of the `gallery` object. To initialize the API, on the gallery object, call the `data` method with `gallery` as argument. The illustration follows: + +{% highlight php%} +var api = $(element).data('gallery'); + +//or + +var api = $('[data-gallery-role="gallery"]').data('gallery'); + +{% endhighlight %} + +This method returns JS object that contains api functions. + +

      api functions? wording

      + +To ensure that gallery is fully formed, wrap your code with event handler function and add it to the `gallery:loaded` event: + +

      `gallery:loaded` or `gallery:uploaded`?

      + +{% highlight php %} + + $(element).on('gallery:uploaded', function () { + var api = $(element).data('gallery'); + /* api methods calls */ + }); + +{% endhighlight php%} + +Then to call a method use the following notation: + +{% highlight php %} + api.next(); +{% endhighlight php%} + +Where `next` is the methods name. All available methods are listed in the following paragraph. + +### Methods {#gallery_methods} - -Displays next preview image. If loop is enabled in options displays the first image after the last if this function is called. If loop is disabled doesn't update current image if it's the last item in list. + + +Displays next preview image. If loop is enabled in options, displays the first image after the last. If loop is disabled, then the last image does not get changed. + + + +Displays previous preview image. If loop is enabled in options, displays the last image after the first. If loop is disabled the first image does not get changed. + + + +Displays the last preview image. + + + +Displays the first preview image. + + + +Displays the image with the certain ID. The ID is passed as an argument. + +Doesn't update preview if argument isn't correct. seek(0) doesn't update preview. seek(1) shows 1'st image. seek(-1) shows last image. If entered number bigger then items number or less then "-(items number)" gallery shows modulo of "items number / number". + +

      are these ids?

      +

      what is modulo of "items number / number"?

      + + + +Add new items to the gallery. Example: -next -api.next(); - - prev - DIsplays previous preview image. If loop is enabled in options, displays the last image after the first if this function is called. If loop is disabled doesn't update current image if it's the first item in list. - Example: -prev -api.prev(); - - last - DIsplays the last preview image. - Example: -last -api.last(); - - first - Displays the first preview image. - Example: -first -api.first(); - - seek - Displays image with appropriate count number on preview. Doesn't update preview if argument isn't correct. seek(0) doesn't update preview. seek(1) shows 1'st image. seek(-1) shows last image. If entered number bigger then items number or less then "-(items number)" gallery shows modulo of "items number / number". - Example: -seek -api.seek(1); - - updateData - Updates gallery with new set of items. If argument isn't correct or empty gallery stays in current state. - Example: - -updateData + +{% highlight php %} api.updateData([{ img: 'image1.jpg', thumb: 'thumb1.jpg', caption: 'caption' }]); +{% endhighlight php %} - updateOptions - Updates options of active breakpoint or default gallery options, if there is no active breakpoint. - Example: + +Updates options of active breakpoint or default gallery options, if there is no active breakpoint. + +Example: + +{% highlight php%} -updateOptions api.updateOptions([{ nav: 'dots' }]); + +{% endhighlight %} \ No newline at end of file From 45fe833ba1b111a6dee80c55959483d95fb408dc Mon Sep 17 00:00:00 2001 From: Oleksandra Marchenko Date: Wed, 21 Oct 2015 22:37:32 +0300 Subject: [PATCH 011/902] gallery widget --- guides/v2.0/javascript-dev-guide/widgets/widget_gallery.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/guides/v2.0/javascript-dev-guide/widgets/widget_gallery.md b/guides/v2.0/javascript-dev-guide/widgets/widget_gallery.md index f60c6ee5a13..7756b4ed370 100644 --- a/guides/v2.0/javascript-dev-guide/widgets/widget_gallery.md +++ b/guides/v2.0/javascript-dev-guide/widgets/widget_gallery.md @@ -247,6 +247,9 @@ Width of the preview in gallery in pixels or percents. **Default value**: `null` +## Magnifier options {#gallery_options} +TBD + ## Gallery API {#gallery_api} Gallery methods are placed in data storage of the `gallery` object. To initialize the API, on the gallery object, call the `data` method with `gallery` as argument. The illustration follows: From ffd7eede46e16b8261f3c2aefe6121d4e1d0bde7 Mon Sep 17 00:00:00 2001 From: Dmitry Shevtsov Date: Fri, 25 Dec 2015 16:17:49 +0200 Subject: [PATCH 012/902] MAGEDOC-2409: 'Testing Approach' Chapter - reordered parent sections - added new section Testing approach --- guides/v2.0/mtf/mtf_changelog.md | 2 +- guides/v2.0/mtf/mtf_entities.md | 2 +- guides/v2.0/mtf/mtf_entities/mtf_block.md | 2 +- .../v2.0/mtf/mtf_entities/mtf_constraint.md | 2 +- guides/v2.0/mtf/mtf_entities/mtf_dataset.md | 2 +- .../v2.0/mtf/mtf_entities/mtf_fixture-repo.md | 2 +- guides/v2.0/mtf/mtf_entities/mtf_fixture.md | 2 +- guides/v2.0/mtf/mtf_entities/mtf_handler.md | 2 +- guides/v2.0/mtf/mtf_entities/mtf_page.md | 2 +- .../v2.0/mtf/mtf_entities/mtf_scenariotest.md | 2 +- guides/v2.0/mtf/mtf_entities/mtf_testcase.md | 2 +- .../mtf/mtf_entities/mtf_typified-element.md | 2 +- guides/v2.0/mtf/mtf_installation.md | 2 +- guides/v2.0/mtf/mtf_introduction.md | 2 +- guides/v2.0/mtf/mtf_quickstart.md | 2 +- .../mtf_quickstart/mtf_quickstart_config.md | 2 +- .../mtf_quickstart_environmemt.md | 2 +- .../mtf/mtf_quickstart/mtf_quickstart_logs.md | 2 +- .../mtf_quickstart/mtf_quickstart_runtest.md | 2 +- guides/v2.0/mtf/mtf_test-approach.md | 20 +++++++++++++++++++ guides/v2.0/mtf/mtf_update.md | 2 +- 21 files changed, 40 insertions(+), 20 deletions(-) create mode 100644 guides/v2.0/mtf/mtf_test-approach.md diff --git a/guides/v2.0/mtf/mtf_changelog.md b/guides/v2.0/mtf/mtf_changelog.md index 7e611d91f71..414f42543d8 100644 --- a/guides/v2.0/mtf/mtf_changelog.md +++ b/guides/v2.0/mtf/mtf_changelog.md @@ -1,7 +1,7 @@ --- layout: default group: mtf-guide -subgroup: Z_Changelog +subgroup: 70_Changelog title: Changelog of Magento Testing Framework menu_title: CHANGELOG menu_node: parent diff --git a/guides/v2.0/mtf/mtf_entities.md b/guides/v2.0/mtf/mtf_entities.md index dd4221ba62f..29ec83ea245 100644 --- a/guides/v2.0/mtf/mtf_entities.md +++ b/guides/v2.0/mtf/mtf_entities.md @@ -1,7 +1,7 @@ --- layout: default group: mtf-guide -subgroup: D_Entities +subgroup: 50_Entities title: Magento Testing Framework Entities menu_title: ENTITIES menu_node: parent diff --git a/guides/v2.0/mtf/mtf_entities/mtf_block.md b/guides/v2.0/mtf/mtf_entities/mtf_block.md index ac97f5fa09b..a1ece89b274 100644 --- a/guides/v2.0/mtf/mtf_entities/mtf_block.md +++ b/guides/v2.0/mtf/mtf_entities/mtf_block.md @@ -1,7 +1,7 @@ --- layout: default group: mtf-guide -subgroup: D_Entities +subgroup: 50_Entities title: Entities of the Magento Testing Framework menu_title: Block menu_order: 4 diff --git a/guides/v2.0/mtf/mtf_entities/mtf_constraint.md b/guides/v2.0/mtf/mtf_entities/mtf_constraint.md index 065aa4f9bf9..6e71227b8a4 100644 --- a/guides/v2.0/mtf/mtf_entities/mtf_constraint.md +++ b/guides/v2.0/mtf/mtf_entities/mtf_constraint.md @@ -1,7 +1,7 @@ --- layout: default group: mtf-guide -subgroup: D_Entities +subgroup: 50_Entities title: Entities of the Magento Testing Framework menu_title: Constraint menu_order: 7 diff --git a/guides/v2.0/mtf/mtf_entities/mtf_dataset.md b/guides/v2.0/mtf/mtf_entities/mtf_dataset.md index 50f630141a2..91afefdd063 100644 --- a/guides/v2.0/mtf/mtf_entities/mtf_dataset.md +++ b/guides/v2.0/mtf/mtf_entities/mtf_dataset.md @@ -1,7 +1,7 @@ --- layout: default group: mtf-guide -subgroup: D_Entities +subgroup: 50_Entities title: Entities of the Magento Testing Framework menu_title: Data set menu_order: 8 diff --git a/guides/v2.0/mtf/mtf_entities/mtf_fixture-repo.md b/guides/v2.0/mtf/mtf_entities/mtf_fixture-repo.md index 30bc964c7d3..cfbf599782d 100644 --- a/guides/v2.0/mtf/mtf_entities/mtf_fixture-repo.md +++ b/guides/v2.0/mtf/mtf_entities/mtf_fixture-repo.md @@ -1,7 +1,7 @@ --- layout: default group: mtf-guide -subgroup: D_Entities +subgroup: 50_Entities title: Entities of the Magento Testing Framework menu_title: Fixture Repository menu_order: 2 diff --git a/guides/v2.0/mtf/mtf_entities/mtf_fixture.md b/guides/v2.0/mtf/mtf_entities/mtf_fixture.md index cc79d99cca3..a56cb46270c 100644 --- a/guides/v2.0/mtf/mtf_entities/mtf_fixture.md +++ b/guides/v2.0/mtf/mtf_entities/mtf_fixture.md @@ -1,7 +1,7 @@ --- layout: default group: mtf-guide -subgroup: D_Entities +subgroup: 50_Entities title: Entities of the Magento Testing Framework menu_title: Fixture menu_order: 1 diff --git a/guides/v2.0/mtf/mtf_entities/mtf_handler.md b/guides/v2.0/mtf/mtf_entities/mtf_handler.md index c4e03d3388b..9f77c4efa0b 100644 --- a/guides/v2.0/mtf/mtf_entities/mtf_handler.md +++ b/guides/v2.0/mtf/mtf_entities/mtf_handler.md @@ -1,7 +1,7 @@ --- layout: default group: mtf-guide -subgroup: D_Entities +subgroup: 50_Entities title: Entities of the Magento Testing Framework menu_title: Handler menu_order: 3 diff --git a/guides/v2.0/mtf/mtf_entities/mtf_page.md b/guides/v2.0/mtf/mtf_entities/mtf_page.md index 4ad44140a37..ada2094da5c 100644 --- a/guides/v2.0/mtf/mtf_entities/mtf_page.md +++ b/guides/v2.0/mtf/mtf_entities/mtf_page.md @@ -1,7 +1,7 @@ --- layout: default group: mtf-guide -subgroup: D_Entities +subgroup: 50_Entities title: Entities of the Magento Testing Framework menu_title: Page menu_order: 6 diff --git a/guides/v2.0/mtf/mtf_entities/mtf_scenariotest.md b/guides/v2.0/mtf/mtf_entities/mtf_scenariotest.md index 30b59377a6b..29a7b364cbe 100644 --- a/guides/v2.0/mtf/mtf_entities/mtf_scenariotest.md +++ b/guides/v2.0/mtf/mtf_entities/mtf_scenariotest.md @@ -1,7 +1,7 @@ --- layout: default group: mtf-guide -subgroup: D_Entities +subgroup: 50_Entities title: Entities of the Magento Testing Framework menu_title: Scenario test menu_order: 10 diff --git a/guides/v2.0/mtf/mtf_entities/mtf_testcase.md b/guides/v2.0/mtf/mtf_entities/mtf_testcase.md index 2fbd6c999c3..820130ca82e 100644 --- a/guides/v2.0/mtf/mtf_entities/mtf_testcase.md +++ b/guides/v2.0/mtf/mtf_entities/mtf_testcase.md @@ -1,7 +1,7 @@ --- layout: default group: mtf-guide -subgroup: D_Entities +subgroup: 50_Entities title: Entities of the Magento Testing Framework menu_title: Test case menu_order: 9 diff --git a/guides/v2.0/mtf/mtf_entities/mtf_typified-element.md b/guides/v2.0/mtf/mtf_entities/mtf_typified-element.md index c7493a06da3..b0523e14d2a 100644 --- a/guides/v2.0/mtf/mtf_entities/mtf_typified-element.md +++ b/guides/v2.0/mtf/mtf_entities/mtf_typified-element.md @@ -1,7 +1,7 @@ --- layout: default group: mtf-guide -subgroup: D_Entities +subgroup: 50_Entities title: Entities of the Magento Testing Framework menu_title: Typified element menu_order: 5 diff --git a/guides/v2.0/mtf/mtf_installation.md b/guides/v2.0/mtf/mtf_installation.md index 1f67d406b96..179d8153cd7 100644 --- a/guides/v2.0/mtf/mtf_installation.md +++ b/guides/v2.0/mtf/mtf_installation.md @@ -1,7 +1,7 @@ --- layout: default group: mtf-guide -subgroup: B_Installation +subgroup: 20_Installation title: Installation of the Magento Testing Framework Entities menu_title: INSTALLATION menu_node: parent diff --git a/guides/v2.0/mtf/mtf_introduction.md b/guides/v2.0/mtf/mtf_introduction.md index 175385e332f..511dbe9c5e5 100644 --- a/guides/v2.0/mtf/mtf_introduction.md +++ b/guides/v2.0/mtf/mtf_introduction.md @@ -1,7 +1,7 @@ --- layout: default group: mtf-guide -subgroup: A_Introduction +subgroup: 10_Introduction title: Introduction to Magento Testing Framework menu_title: INTRODUCTION menu_node: parent diff --git a/guides/v2.0/mtf/mtf_quickstart.md b/guides/v2.0/mtf/mtf_quickstart.md index 88d68391e71..a1035b85ea4 100644 --- a/guides/v2.0/mtf/mtf_quickstart.md +++ b/guides/v2.0/mtf/mtf_quickstart.md @@ -1,7 +1,7 @@ --- layout: default group: mtf-guide -subgroup: C_Quickstart +subgroup: 30_Quickstart title: Quick start with the Magento Testing Framework menu_title: QUICK START menu_node: parent diff --git a/guides/v2.0/mtf/mtf_quickstart/mtf_quickstart_config.md b/guides/v2.0/mtf/mtf_quickstart/mtf_quickstart_config.md index 2d0592de986..9cbe7cd1e7d 100644 --- a/guides/v2.0/mtf/mtf_quickstart/mtf_quickstart_config.md +++ b/guides/v2.0/mtf/mtf_quickstart/mtf_quickstart_config.md @@ -1,7 +1,7 @@ --- layout: default group: mtf-guide -subgroup: C_Quickstart +subgroup: 30_Quickstart title: Quick start with the Magento Testing Framework menu_title: Adjust configuration menu_order: 1 diff --git a/guides/v2.0/mtf/mtf_quickstart/mtf_quickstart_environmemt.md b/guides/v2.0/mtf/mtf_quickstart/mtf_quickstart_environmemt.md index 50e3fd5a7fe..b1302994c9d 100644 --- a/guides/v2.0/mtf/mtf_quickstart/mtf_quickstart_environmemt.md +++ b/guides/v2.0/mtf/mtf_quickstart/mtf_quickstart_environmemt.md @@ -1,7 +1,7 @@ --- layout: default group: mtf-guide -subgroup: C_Quickstart +subgroup: 30_Quickstart title: Quick start with the Magento Testing Framework menu_title: Prepare environment for test run menu_order: 2 diff --git a/guides/v2.0/mtf/mtf_quickstart/mtf_quickstart_logs.md b/guides/v2.0/mtf/mtf_quickstart/mtf_quickstart_logs.md index e2210a45f21..0411f51d392 100644 --- a/guides/v2.0/mtf/mtf_quickstart/mtf_quickstart_logs.md +++ b/guides/v2.0/mtf/mtf_quickstart/mtf_quickstart_logs.md @@ -1,7 +1,7 @@ --- layout: default group: mtf-guide -subgroup: C_Quickstart +subgroup: 30_Quickstart title: Quick start with the Magento Testing Framework menu_title: See logs for failed tests menu_order: 4 diff --git a/guides/v2.0/mtf/mtf_quickstart/mtf_quickstart_runtest.md b/guides/v2.0/mtf/mtf_quickstart/mtf_quickstart_runtest.md index 7284883397f..639c8ef6521 100644 --- a/guides/v2.0/mtf/mtf_quickstart/mtf_quickstart_runtest.md +++ b/guides/v2.0/mtf/mtf_quickstart/mtf_quickstart_runtest.md @@ -1,7 +1,7 @@ --- layout: default group: mtf-guide -subgroup: C_Quickstart +subgroup: 30_Quickstart title: Quick start with the Magento Testing Framework menu_title: Test run menu_order: 3 diff --git a/guides/v2.0/mtf/mtf_test-approach.md b/guides/v2.0/mtf/mtf_test-approach.md new file mode 100644 index 00000000000..77b454e978d --- /dev/null +++ b/guides/v2.0/mtf/mtf_test-approach.md @@ -0,0 +1,20 @@ +--- +layout: default +group: mtf-guide +subgroup: 40_Approach +title: Test Approach in the Magento Testing Framework +menu_title: TEST APPROACH +menu_node: parent +github_link: mtf/mtf_test-approach.md +--- + +* TOC +{:toc} + +## Preface + +Functional testing means testing the application to be met business requirements. Functional testing is executed using the functional specifications given by the client or by the design specifications according to use cases. Role of functional testing is to validate a behavior of the application. +Tests are used to cover functionality of a business entity. A goal is to find discrepancies between requirements and product. + + + diff --git a/guides/v2.0/mtf/mtf_update.md b/guides/v2.0/mtf/mtf_update.md index b802bd27aaa..afef4a86268 100644 --- a/guides/v2.0/mtf/mtf_update.md +++ b/guides/v2.0/mtf/mtf_update.md @@ -1,7 +1,7 @@ --- layout: default group: mtf-guide -subgroup: U_Update +subgroup: 60_Update title: Update the Magento Testing Framework menu_title: UPDATE menu_order: 4 From ce9a293d948585b8fe34724e2baa9f45ac84d6a2 Mon Sep 17 00:00:00 2001 From: Oleksandra Marchenko Date: Tue, 12 Jan 2016 18:46:12 +0200 Subject: [PATCH 013/902] Added a file for the Add conten to the existing form topic --- guides/v2.0/howdoi/checkout/checkout_edit_form.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 guides/v2.0/howdoi/checkout/checkout_edit_form.md diff --git a/guides/v2.0/howdoi/checkout/checkout_edit_form.md b/guides/v2.0/howdoi/checkout/checkout_edit_form.md new file mode 100644 index 00000000000..268b263dd91 --- /dev/null +++ b/guides/v2.0/howdoi/checkout/checkout_edit_form.md @@ -0,0 +1,13 @@ +--- +layout: default +group: howdoi +subgroup: checkout +title: Add content to an Existing Form Field on Checkout Page +menu_title: Add Content to an Existing Form Field on Checkout Page +menu_order: 7 +github_link: howdoi/checkout/checkout_edit_form.md +--- + +

      What's in this topic

      + +

      What about adding a new field to the existing form?

      \ No newline at end of file From 0a112f3f2774a449e6fc96c71fc263bcae15ac2f Mon Sep 17 00:00:00 2001 From: Dmitry Shevtsov Date: Mon, 18 Jan 2016 17:12:50 +0200 Subject: [PATCH 014/902] MAGEDOC-2409: [MTF] 'Testing Approach' Chapter - first draft for tech review --- guides/v2.0/mtf/mtf_test-approach.md | 122 ++++++++++++++++++++++++++- 1 file changed, 120 insertions(+), 2 deletions(-) diff --git a/guides/v2.0/mtf/mtf_test-approach.md b/guides/v2.0/mtf/mtf_test-approach.md index 77b454e978d..7cf57b82640 100644 --- a/guides/v2.0/mtf/mtf_test-approach.md +++ b/guides/v2.0/mtf/mtf_test-approach.md @@ -13,8 +13,126 @@ github_link: mtf/mtf_test-approach.md ## Preface -Functional testing means testing the application to be met business requirements. Functional testing is executed using the functional specifications given by the client or by the design specifications according to use cases. Role of functional testing is to validate a behavior of the application. -Tests are used to cover functionality of a business entity. A goal is to find discrepancies between requirements and product. +Magento testing framework works with functional tests only. Functional testing means checking that an application met specified business requirements. These requirements usually are collected in functional specifications that describe expected behaviour of the application. Role of functional testing is to validate this behavior. +Tests are used to cover functionality of a business entity. A goal is to find discrepancies between expected and real behaviour of the product. + Magento already contains functional test in `/dev/tests/functional/tests/app/Magento`. In this guide they are called `out-of-the-box` tests. You can use them to test default Magento functionality. +If you want to extend functionality you can modify existing tests or create your own functional tests using the MTF. + +## Out-of-the-box test +The out-of-the-box tests are the ready to use functional tests developed by Magento. You can find them in the `/dev/tests/functional` directory. + +### Coverage + +Test coverage of the out-of-the-box test depends on a module which it belongs to. The out-of-the-box tests cover basic functionality of Magento application. They test the CRUD functionality for all basic entities. The most important modules are covered better. + +### Usage + +You can use out-of-the-box tests in: + +- Regression testing + - if new changes didn't break functionality + - before release + - for deep testing + +- Sanity testing + - after any changes were made + - test the basic functionality + +- Acceptance testing + - in combination with own tests + - to test new feature: show that feature works and it didn't break any functionality of the Magento application (all other tests passed) + +### How to use + +Step 1. Check the functionality manually + +Pass all the test steps defined in a test case you want to use. + +Step 2. [Run the test][] + +## Extended out-of-the-box test + +You can extend from an out-of-the-box test to create your own test that is an extended out-of-the-box test. It is stored in the same location as out-of-the-box test that you are extended from `/dev/tests/functional/tests/app/Magento/`. + +## Usage + +This type of test is useful when the Magento functionality was extended, for example the minor changes were added to the existing functionality of a module. Also you can extend the out-of-the-box test to extend the current test coverage if functionality that you are interested in is not completely covered by the out-of-the-box test. + +Example use cases: + +- [variation addition][] +- [variation extension][] +- [fixture extension][] +- [repository addition][] +- [block overriding][] +- [handler overriding][] + +## New test + +### When should I use them? + +- new functionality + - new test flow +- new modules + +### Where can I put them? + +- dev/tests/functional/tests/app/Magento/ + +### How can I create them? + +To create new test you need a test object, test flow, logic components, test data and verification logic. + +Test object is represented as a fixture. Fixture defines object properties. + +Logic components are contained in blocks and typified elements. Blocks are united in a page. + +Test data are stored in data sets, sample data are stored in repositories, and sample test entities can be created by handlers. + +Test flow is declared in a test case as test steps and preconditions. + +Verification assertions are managed by constraints. + +#### Test flow + +* [Create a test case file][] +* [Create a data set file][] with all variations for your test. A data set XML file should have the same name as your test case. + +#### Test data + +To create the test entity you must fill a product creation form with data from a data set. To do it correctly you need fixture for simple product entity. Learn more about Fixture Creation. +fixtures +Very often you need to create some entity in precondition of your test case. To do this you need to create handler for simple product creation withing Handler directory of your module. Learn more about Handler Creation. + +#### Test data processing + +You need to create pages that you open. Learn about Page Creation. +All business logic (like click Save button or fill form) is stored in blocks. So you need to add blocks to your pages. Read about Block Creation. +After blocks creation you need to add them to pages and generate pages to be able to access blocks you added. +Once you have pages with blocks and fixture, you can start to develop preconditions and steps of your test case. Read about Test Case Creation. + +#### Test verification + + + + + +[Run the test]: {{site.gdeurl}}mtf/mtf_quickstart/mtf_quickstart_runtest.html +[variation addition]: {{site.gdeurl}}mtf/mtf_entities/mtf_dataset.html#add_variation +[variation extension]: {{site.gdeurl}}mtf/mtf_entities/mtf_dataset.html#extend_variation +[fixture extension]: {{site.gdeurl}}mtf/mtf_entities/mtf_fixture.html#mtf_fixture_extend +[repository addition]: {{site.gdeurl}}mtf/mtf_entities/mtf_fixture.html#mtf_fixture_repositoy +[block overriding]: {{site.gdeurl}}mtf/mtf_entities/mtf_block.html +[handler overriding]: {{site.gdeurl}}mtf/mtf_entities/mtf_handler.html + +[Create a test case file]: {{site.gdeurl}}mtf/mtf_entities/mtf_testcase.html#how-to-create +[Create a data set file]: {{site.gdeurl}}mtf/mtf_entities/mtf_dataset.html + + + + +*[MTF]: Magento Testing Framework +*[CRUD]: Create Read Update Delete \ No newline at end of file From 83c1691dc06bbac2cb88995e2f6632f0099bd78a Mon Sep 17 00:00:00 2001 From: Oleksandra Marchenko Date: Mon, 18 Jan 2016 17:31:18 +0200 Subject: [PATCH 015/902] Added content --- .../howdoi/checkout/checkout_edit_form.md | 103 +++++++++++++++--- 1 file changed, 90 insertions(+), 13 deletions(-) diff --git a/guides/v2.0/howdoi/checkout/checkout_edit_form.md b/guides/v2.0/howdoi/checkout/checkout_edit_form.md index 268b263dd91..3a6b430c3e6 100644 --- a/guides/v2.0/howdoi/checkout/checkout_edit_form.md +++ b/guides/v2.0/howdoi/checkout/checkout_edit_form.md @@ -1,13 +1,90 @@ ---- -layout: default -group: howdoi -subgroup: checkout -title: Add content to an Existing Form Field on Checkout Page -menu_title: Add Content to an Existing Form Field on Checkout Page -menu_order: 7 -github_link: howdoi/checkout/checkout_edit_form.md ---- - -

      What's in this topic

      - -

      What about adding a new field to the existing form?

      \ No newline at end of file +--- +layout: default +group: howdoi +subgroup: checkout +title: Add a custom template for a form field on Checkout page +menu_title: Add a custom template for a form field on Checkout page +menu_order: 7 +github_link: howdoi/checkout/checkout_edit_form.md +--- + +

      What's in this topic

      +This topic describes how to change the HTML template of a form field used in the Checkout pages. This refer to the forms used on both steps of the Checkout: Shipping Information step and Review and Paymetns Information step. By changing the template you can change the way the field is displayed. + +

      What else? Can we change the type of the field like this? What are real life user cases when a dev needs this?

      + +

      What about adding a new field to the existing form?

      + +## Overview + +The view part of the forms used in Checkout are implemented using Knockout JS. +

      Can we add link to the Form UI component http://devdocs.magento.com/guides/v2.0/ui-components/ui-form.html?

      + +To change the template of a Checkout form field, do the following: +1. [Implement a custom HTML template for knockout JS script that will render the form field](#template). +2. Specify the new template in the checkout page layout. + +There are more details about each step in the following sections. + +For the sake of compatibility, upgradability, and easy maintenance, do not edit the default Magento code, add your customizations in a separate module. For your checkout customization to be applied correctly, your custom module should [depend]({{site.gdeurl}}extension-dev-guide/composer-integration.html) on the Magento_Checkout module. + + +## Implement the HTML template for the field {#template} + +Create the template in the following directory: /view/frontend/web/template/form/element/.html + +
      +

      Original templates of all form field types are located in the `app/code/Magento/Ui/view/base/web/templates/form/element` directory.

      +
      + +

      Should they view the original templates? is anything else we can advise here?

      + +## Specify the new template in layout + +In your custom module directory, create a new `/view/frontend/layout/checkout_index_index.xml` file. +In this file, add content similar to the following: + +{% highlight xml%} + + + + + + + + + + + + + + + + + + + + + %MODULE_NAME%/form/element/%your_template% + + + + + + + + + + + + + + + + + + +{%endhighlight%} + + + From f8fcb96858fce7c0806bbd3a8b9d3365792805c5 Mon Sep 17 00:00:00 2001 From: Oleksandra Marchenko Date: Mon, 18 Jan 2016 19:12:54 +0200 Subject: [PATCH 016/902] added a topic for New Form --- guides/v2.0/howdoi/checkout/checkout_form.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 guides/v2.0/howdoi/checkout/checkout_form.md diff --git a/guides/v2.0/howdoi/checkout/checkout_form.md b/guides/v2.0/howdoi/checkout/checkout_form.md new file mode 100644 index 00000000000..17876be76bb --- /dev/null +++ b/guides/v2.0/howdoi/checkout/checkout_form.md @@ -0,0 +1,19 @@ +--- +layout: default +group: howdoi +subgroup: checkout +title: Add a new input form to Checkout +menu_title: Add a new input form to Checkout +menu_order: 8 +github_link: howdoi/checkout/checkout_form.md +--- +## What's in this topic + +This topic describes how to add a custom input form to the Checkout page. + +

      should this form be a UI component? Would a link to the Form component be appropriate http://devdocs.magento.com/guides/v2.0/ui-components/ui-form.html?

      + +Magento provides ability to add a custom form to the checkout flow. In order to add a custom form developer has to follow the following steps: +Add checkout_index_index layout handle; +Add JS component that will handle form submit; +Add template that will render form fields and corresponding content; \ No newline at end of file From 8a4e0e926cd5640948f94c534d88bd88adb53fbe Mon Sep 17 00:00:00 2001 From: Oleksandra Marchenko Date: Tue, 19 Jan 2016 08:49:36 +0200 Subject: [PATCH 017/902] updated --- guides/v2.0/howdoi/checkout/checkout_form.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/guides/v2.0/howdoi/checkout/checkout_form.md b/guides/v2.0/howdoi/checkout/checkout_form.md index 17876be76bb..31b0a80800a 100644 --- a/guides/v2.0/howdoi/checkout/checkout_form.md +++ b/guides/v2.0/howdoi/checkout/checkout_form.md @@ -13,7 +13,8 @@ This topic describes how to add a custom input form to the Checkout page.

      should this form be a UI component? Would a link to the Form component be appropriate http://devdocs.magento.com/guides/v2.0/ui-components/ui-form.html?

      -Magento provides ability to add a custom form to the checkout flow. In order to add a custom form developer has to follow the following steps: +Magento provides ability to add a custom form to any of the checkout steps: Shipping Information, Review and Payment Information, or custom. In order to add a custom form developer has to follow the following steps: + Add checkout_index_index layout handle; Add JS component that will handle form submit; Add template that will render form fields and corresponding content; \ No newline at end of file From 2649f42c62533c65d6eb85b4bf2de19090c210a2 Mon Sep 17 00:00:00 2001 From: Oleksandra Marchenko Date: Tue, 19 Jan 2016 14:12:10 +0200 Subject: [PATCH 018/902] Added content for Add a new form to Checkout topic --- common/images/how_checkout_form.png | Bin 0 -> 18177 bytes guides/v2.0/howdoi/checkout/checkout_form.md | 262 +++++++++++++++++- .../v2.0/howdoi/checkout/checkout_new_step.md | 2 +- 3 files changed, 260 insertions(+), 4 deletions(-) create mode 100644 common/images/how_checkout_form.png diff --git a/common/images/how_checkout_form.png b/common/images/how_checkout_form.png new file mode 100644 index 0000000000000000000000000000000000000000..0c8060c99816c048100aed65239c596c7c5855c5 GIT binary patch literal 18177 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
      fKDgFpe(PoGtM9;n11S#W(2&6r*^8%Sw% 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/view/frontend/web/js/model` directory, create a `.js` file implementing the form. + +

      Where should it be located?

      + +The form must be implemented as a UI component. It can extend the default Magento [form UI component]({{site.gdeurl}}ui-components/ui-form.html). Its implementation is stored in `/view/base/web/js/form/form.js`. + +Example of extending the default form component: + +{%highlight js%} +/*global define*/ +define([ + 'Magento_Ui/js/form/form' +], function(Component) { + 'use strict'; + return Component.extend({ + initialize: function () { + this._super(); + // component initialization logic + return this; + }, + + /** + * Form submit handler + * + * This method can have any name. + */ + onSubmit: function() { + // trigger form validation + this.source.set('params.invalid', false); + this.source.trigger('customCheckoutForm.data.validate'); + + // verify that form data is valid + if (!this.source.get('params.invalid')) { + // data is retrieved from data provider by value of the customScope property + var formData = this.source.get('customCheckoutForm'); + // do something with form data + console.dir(formData); + } + } + }); +}); +{%endhighlight%} + +

      is it a must that a form is a UI component? is it a must to use the default Magento form component?

      + +## Create the HTML template {#template} +Add the HTML template that will be rendered by Magento. +In the module directory, add the `knockout.js` HTML template for the form component. It must be located under the `/view/frontend/web/template` directory. + +Example: + +{%highlight html%} + +
      +
      +
      + + + + +
      + + +
      +
      + +{%endhighlight%} + +## Declare the form in the checkout page layout {#layout} + +Certain default checkout templates declare regions where some additional content can be inserted. + +

      any content or UI components? Or JS components? (what is the difference?)

      + +You can add your custom form in any of these regions. + +For example, the shipping JS component (see app/code/Magento/Checkout/view/frontend/web/template/shipping.html) provides the `before-form` region and corresponding UI container. + +

      How devs can find other regions?

      + +Any content added here is rendered before the Shipping Address form on the Shipping Information step. To add content to this region, the following layout update can be used: + +

      What exactly is declared in layout? names of .js components? templates?

      + +{%highlight xml%} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +{%endhighlight%} + +If the form fields are not generated dynamically, they can be defined in layout. + +The following code sample shows configuration of the form that contains four fields: text input, select, checkbox, and date. This form uses checkout data provider (checkoutProvider) that is introduced in the Magento_Checkout module: + +

      need explanations here

      + +{%highlight xml%} + + %MODULE_NAME%/js/view/custom-checkout-form + checkoutProvider + + %MODULE_NAME%/custom-checkout-form + + + + + uiComponent + + custom-checkout-form-fields + + + Magento_Ui/js/form/element/abstract + + + customCheckoutForm + ui/form/field + ui/form/element/input + + checkoutProvider + customCheckoutForm.text_field + Text Field + 1 + + true + + + + Magento_Ui/js/form/element/boolean + + + customCheckoutForm + ui/form/field + ui/form/element/checkbox + + checkoutProvider + customCheckoutForm.checkbox_field + Checkbox Field + 3 + + + Magento_Ui/js/form/element/select + + + customCheckoutForm + ui/form/field + ui/form/element/select + + + + Please select value + + + + Value 1 + value_1 + + + Value 2 + value_2 + + + + value_2 + checkoutProvider + customCheckoutForm.select_field + Select Field + 2 + + + Magento_Ui/js/form/element/date + + + customCheckoutForm + ui/form/field + ui/form/element/date + + checkoutProvider + customCheckoutForm.date_field + Date Field + + true + + + + + +{%endhighlight%} + +### Dynamically defined forms + +If form fields are generated dynamically, developer must implement an interceptor for the `\Magento\Checkout\Block\Checkout\LayoutProcessor::process` method. +Interceptor can add custom fields definitions to layout at run-time. The format of the field definition is the same as for fields defined in layout. + +For example: + +{% highlight php startinline=true %} +$textField = [ + 'component' => 'Magento_Ui/js/form/element/abstract', + 'config' => [ + 'customScope' => 'customCheckoutForm', + 'template' => 'ui/form/field', + 'elementTmpl' => 'ui/form/element/input', + ], + 'provider' => 'checkoutProvider', + 'dataScope' => 'customCheckoutForm.text_field', + 'label' => 'Text Field', + 'sortOrder' => 1, + 'validation' => [ + 'required-entry' => true, + ], +]; +{%endhighlight%} + +## Illustration +If you use the code samples provided as examples in this topic, this would result in adding the following form to the Shipping Information step: +The input form with four fields \ No newline at end of file diff --git a/guides/v2.0/howdoi/checkout/checkout_new_step.md b/guides/v2.0/howdoi/checkout/checkout_new_step.md index f983d80e7c4..a451414c525 100644 --- a/guides/v2.0/howdoi/checkout/checkout_new_step.md +++ b/guides/v2.0/howdoi/checkout/checkout_new_step.md @@ -121,7 +121,7 @@ define( ### Add the .html template -In the module directory, add the `.html` template for the component. It must be located under the '/view/frontend/web/template` directory. +In the module directory, add the `.html` template for the component. It must be located under the `/view/frontend/web/template` directory. A sample `mystep.html` follows: {%highlight html%} From 4189620740dfe231789f288174674c56ea2bf0cb Mon Sep 17 00:00:00 2001 From: Dmitry Shevtsov Date: Tue, 19 Jan 2016 16:29:46 +0200 Subject: [PATCH 019/902] MAGEDOC-2409: [MTF] 'Testing Approach' Chapter - extended strategy of a document --- guides/v2.0/mtf/mtf_test-approach.md | 73 +++++++++++++++++++--------- 1 file changed, 50 insertions(+), 23 deletions(-) diff --git a/guides/v2.0/mtf/mtf_test-approach.md b/guides/v2.0/mtf/mtf_test-approach.md index 7cf57b82640..cd34b62f14f 100644 --- a/guides/v2.0/mtf/mtf_test-approach.md +++ b/guides/v2.0/mtf/mtf_test-approach.md @@ -52,14 +52,16 @@ Step 1. Check the functionality manually Pass all the test steps defined in a test case you want to use. Step 2. [Run the test][] + +## New test -## Extended out-of-the-box test +### Extending an out-of-the-box test -You can extend from an out-of-the-box test to create your own test that is an extended out-of-the-box test. It is stored in the same location as out-of-the-box test that you are extended from `/dev/tests/functional/tests/app/Magento/`. +You can create a test extending from an out-of-the-box test. It is stored in the `/dev/tests/functional/tests/app/Magento/` directory. -## Usage +#### Usage -This type of test is useful when the Magento functionality was extended, for example the minor changes were added to the existing functionality of a module. Also you can extend the out-of-the-box test to extend the current test coverage if functionality that you are interested in is not completely covered by the out-of-the-box test. +This approach is useful when the Magento functionality was extended, for example the minor changes were added to the existing functionality of a module. Also you can extend the out-of-the-box test to extend the current test coverage if functionality that you are interested in is not completely covered by the out-of-the-box test. Example use cases: @@ -70,7 +72,7 @@ Example use cases: - [block overriding][] - [handler overriding][] -## New test +## Creating a test ### When should I use them? @@ -82,41 +84,66 @@ Example use cases: - dev/tests/functional/tests/app/Magento/ -### How can I create them? +### Test components -To create new test you need a test object, test flow, logic components, test data and verification logic. - -Test object is represented as a fixture. Fixture defines object properties. +To create new test you need a test object, test data, test flow, and test assertions. -Logic components are contained in blocks and typified elements. Blocks are united in a page. +#### Test object -Test data are stored in data sets, sample data are stored in repositories, and sample test entities can be created by handlers. - -Test flow is declared in a test case as test steps and preconditions. +Test object is represented as a fixture. Fixture defines object properties. Это то что собираемся протестировать и что будет целью тестирования, над ним будут проводиться все тестовые действия. -Verification assertions are managed by constraints. +Simple product fixture example. Learn more about fixture. -#### Test flow - -* [Create a test case file][] -* [Create a data set file][] with all variations for your test. A data set XML file should have the same name as your test case. #### Test data -To create the test entity you must fill a product creation form with data from a data set. To do it correctly you need fixture for simple product entity. Learn more about Fixture Creation. -fixtures -Very often you need to create some entity in precondition of your test case. To do this you need to create handler for simple product creation withing Handler directory of your module. Learn more about Handler Creation. +Test data are stored in data sets, sample data are stored in repositories, and sample test entities can be created by handlers. Тест + +data sets + +preconditions: sample data, sample test entities. Example Simple Product: create category + + +To create the test entity you must fill a product creation form with data from a data set. To do it correctly you need fixture for simple product entity. Learn more about Fixture. +Связать в рамках одного теста. Создаваемый продукт можно назначить существующей категории или создать новую категорию для этого продукта. Чтобы создать новую категорию нужен хендлер. +Often you need to create some entity in precondition of your test case. To do this you need to create handler for Category creation in Handler directory of your module. Learn more about Handler. + +#### Test flow -#### Test data processing +Test flow is declared in a test case as test steps and preconditions. +* [Create a test case file][] +* [Create a data set file][] with all variations for your test. A data set XML file should have the same name as your test case. + +UI manipulation methods are contained in blocks. A page is composed from blocks. + +тест степы - это действия на странице. Дальше про страницу You need to create pages that you open. Learn about Page Creation. All business logic (like click Save button or fill form) is stored in blocks. So you need to add blocks to your pages. Read about Block Creation. After blocks creation you need to add them to pages and generate pages to be able to access blocks you added. Once you have pages with blocks and fixture, you can start to develop preconditions and steps of your test case. Read about Test Case Creation. -#### Test verification +#### Test assertions + +Verification assertions are managed by constraints. Проверка того что мы сделали в степах. Констрейнты используют страницы и блоки, либо те же либо другие, в зависимости от декларируемой логики проверок. + +Пример сценария для новой функциональности + +тест дизайн. понимание того что хочешь автоматизировать. + +создание фикстуры + +дата сет. прикидываю какие данные хочу проверить, + +страницы и блоки для тест кейса + +тест кейс. переплетается с созданием страниц и блоков. + +страницы и блоки для ассерта +ассерты. +ран. дебаг. отладка. фикс From 5146f0b9ef2dba778653e9c3b6f28e6062f6941a Mon Sep 17 00:00:00 2001 From: Oleksandra Marchenko Date: Tue, 19 Jan 2016 18:35:30 +0200 Subject: [PATCH 020/902] Updated the Add a new form field template in Checkout topic --- .../howdoi/checkout/checkout_edit_form.md | 37 +++++++++++++------ 1 file changed, 25 insertions(+), 12 deletions(-) diff --git a/guides/v2.0/howdoi/checkout/checkout_edit_form.md b/guides/v2.0/howdoi/checkout/checkout_edit_form.md index 3a6b430c3e6..78ef9ac4e67 100644 --- a/guides/v2.0/howdoi/checkout/checkout_edit_form.md +++ b/guides/v2.0/howdoi/checkout/checkout_edit_form.md @@ -9,16 +9,11 @@ github_link: howdoi/checkout/checkout_edit_form.md ---

      What's in this topic

      -This topic describes how to change the HTML template of a form field used in the Checkout pages. This refer to the forms used on both steps of the Checkout: Shipping Information step and Review and Paymetns Information step. By changing the template you can change the way the field is displayed. - -

      What else? Can we change the type of the field like this? What are real life user cases when a dev needs this?

      - -

      What about adding a new field to the existing form?

      +This topic describes how to change the HTML template of a form field used in the Checkout pages. This refer to the forms used on both steps of the Checkout: Shipping Information step and Review and Paymetns Information step. By changing the template you can add additional elements displayed with the field, for example images, change the CSS class assigned to it, add attributes and so on. ## Overview The view part of the forms used in Checkout are implemented using Knockout JS. -

      Can we add link to the Form UI component http://devdocs.magento.com/guides/v2.0/ui-components/ui-form.html?

      To change the template of a Checkout form field, do the following: 1. [Implement a custom HTML template for knockout JS script that will render the form field](#template). @@ -28,17 +23,33 @@ There are more details about each step in the following sections. For the sake of compatibility, upgradability, and easy maintenance, do not edit the default Magento code, add your customizations in a separate module. For your checkout customization to be applied correctly, your custom module should [depend]({{site.gdeurl}}extension-dev-guide/composer-integration.html) on the Magento_Checkout module. - ## Implement the HTML template for the field {#template} -Create the template in the following directory: /view/frontend/web/template/form/element/.html +Create a new `.html` template in the following directory: `/view/frontend/web/template/form/element` + +Example of a field template: + +{%highlight html%} + + + +image_de +{%endhighlight%}

      Original templates of all form field types are located in the `app/code/Magento/Ui/view/base/web/templates/form/element` directory.

      -

      Should they view the original templates? is anything else we can advise here?

      - ## Specify the new template in layout In your custom module directory, create a new `/view/frontend/layout/checkout_index_index.xml` file. @@ -60,12 +71,14 @@ In this file, add content similar to the following: + - + - %MODULE_NAME%/form/element/%your_template% + + %your_module%/form/element/%your_template% From 0cd3bf2cc80a193a7cafab9a558119fd46934c86 Mon Sep 17 00:00:00 2001 From: Oleksandra Marchenko Date: Wed, 20 Jan 2016 13:07:29 +0200 Subject: [PATCH 021/902] minor corrections --- guides/v2.0/howdoi/checkout/checkout_edit_form.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/guides/v2.0/howdoi/checkout/checkout_edit_form.md b/guides/v2.0/howdoi/checkout/checkout_edit_form.md index 78ef9ac4e67..5c872800304 100644 --- a/guides/v2.0/howdoi/checkout/checkout_edit_form.md +++ b/guides/v2.0/howdoi/checkout/checkout_edit_form.md @@ -9,15 +9,15 @@ github_link: howdoi/checkout/checkout_edit_form.md ---

      What's in this topic

      -This topic describes how to change the HTML template of a form field used in the Checkout pages. This refer to the forms used on both steps of the Checkout: Shipping Information step and Review and Paymetns Information step. By changing the template you can add additional elements displayed with the field, for example images, change the CSS class assigned to it, add attributes and so on. +This topic describes how to change the HTML templates of form fields in the forms on the Checkout page. This refers to the forms used on both steps of the Checkout: Shipping Information step and Review and Payments Information step. By changing the template you can add additional elements displayed with the field, for example images, change the CSS class assigned to it, add attributes and so on. ## Overview -The view part of the forms used in Checkout are implemented using Knockout JS. +The forms used in Checkout are implemented using Knockout JS. -To change the template of a Checkout form field, do the following: -1. [Implement a custom HTML template for knockout JS script that will render the form field](#template). -2. Specify the new template in the checkout page layout. +To change the template of the form field, do the following: +1. [Create a custom HTML template for knockout JS script that will render the form field](#template). +2. [Specify the new template in the checkout page layout](#layout). There are more details about each step in the following sections. @@ -47,10 +47,10 @@ Example of a field template: {%endhighlight%}
      -

      Original templates of all form field types are located in the `app/code/Magento/Ui/view/base/web/templates/form/element` directory.

      +

      Original templates of all form field types are located in the app/code/Magento/Ui/view/base/web/templates/form/element directory.

      -## Specify the new template in layout +## Specify the new template in layout {#layout} In your custom module directory, create a new `/view/frontend/layout/checkout_index_index.xml` file. In this file, add content similar to the following: From 8c14b106fd5d2b0e910e5f12b361b587db507cae Mon Sep 17 00:00:00 2001 From: Dmitry Shevtsov Date: Wed, 20 Jan 2016 13:09:31 +0200 Subject: [PATCH 022/902] MAGETWO-48062: Publish backward incompatible changes on Price Rule and Reminder to devdocs - added CatalogRule changes --- guides/v2.0/release-notes/changes_2.0.md | 28 +++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/guides/v2.0/release-notes/changes_2.0.md b/guides/v2.0/release-notes/changes_2.0.md index dee4e88f5bf..be13ace57e9 100644 --- a/guides/v2.0/release-notes/changes_2.0.md +++ b/guides/v2.0/release-notes/changes_2.0.md @@ -13,7 +13,29 @@ This topic discusses backward-incompatible changes since the Magento 2.0 General * TOC {:toc} -## Module Magento_Catalog +## Magento_CatalogRule module + +### Setup version 2.0.1 changes + +#### DB schema changes + +* From the `catalogrule` table the following rows were deleted: `sub_is_enable`, `sub_simple_action`, `sub_discount_amount` +* From the `catalogrule_product` table the following rows were deleted: `sub_simple_action`, `sub_discount_amount` + +#### UI changes + +* The **Subproduct discounts** dropdown on a catalog price rule was deleted, including **Apply** and **Discount Amount** subfields. + +|--- +| Setup version 2.0.0 | Setup version 2.0.1 +|-|:- +| ![OLD - Adding a new catalog price rule]({{site.baseurl}}common/images/backw_chang_cat_pr_rul_200.png 'OLD - Adding a new catalog price rule') | ![NEW - Adding a new catalog price rule]({{site.baseurl}}common/images/backw_chang_cat_pr_rul_201.png 'NEW - Adding a new catalog price rule') + +#### Flow changes + +* The functionality of adding a price rule to the subproduct was deleted + +## Magento_Catalog module ### Setup version 2.0.4 changes @@ -109,3 +131,7 @@ When **Products -> Categories** menu item in the Magento Admin is chosen, the fi [`/app/code/Magento/Catalog/etc/module.xml`]: https://github.com/magento/magento2/blob/bbc0e893539cad4ee415dd458dece7cd36d44cdc/app/code/Magento/Catalog/etc/module.xml [`/app/code/Magento/Catalog/view/adminhtml/ui_component/category_form.xml`]: https://github.com/magento/magento2/blob/bbc0e893539cad4ee415dd458dece7cd36d44cdc/app/code/Magento/Catalog/view/adminhtml/ui_component/category_form.xml + + + +*[UI]: User Interface \ No newline at end of file From 5b9722013a6c6595e0b8876f0546c0463c220194 Mon Sep 17 00:00:00 2001 From: Dmitry Shevtsov Date: Wed, 20 Jan 2016 16:10:49 +0200 Subject: [PATCH 023/902] MAGETWO-48062: Publish backward incompatible changes on Price Rule and Reminder to devdocs - added images --- common/images/backw_chang_cat_pr_rul_200.png | Bin 0 -> 44877 bytes common/images/backw_chang_cat_pr_rul_201.png | Bin 0 -> 34071 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 common/images/backw_chang_cat_pr_rul_200.png create mode 100644 common/images/backw_chang_cat_pr_rul_201.png diff --git a/common/images/backw_chang_cat_pr_rul_200.png b/common/images/backw_chang_cat_pr_rul_200.png new file mode 100644 index 0000000000000000000000000000000000000000..6d519654af5d37f8bb2b983548786db8373854e0 GIT binary patch literal 44877 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 ADgXcg literal 0 HcmV?d00001 From 92d4104ffff43ecefd23b2bfd88d2106a204be99 Mon Sep 17 00:00:00 2001 From: BlackEagle Date: Wed, 20 Jan 2016 15:44:00 +0100 Subject: [PATCH 024/902] fix some paths in the solr-magento page Signed-off-by: BlackEagle --- guides/v2.0/config-guide/solr/solr-magento.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/guides/v2.0/config-guide/solr/solr-magento.md b/guides/v2.0/config-guide/solr/solr-magento.md index 1d38b4d4c24..bd995b2db2a 100644 --- a/guides/v2.0/config-guide/solr/solr-magento.md +++ b/guides/v2.0/config-guide/solr/solr-magento.md @@ -34,16 +34,16 @@ Magento comes packaged with a sample Solr configuration you can use and customiz 1. As a user with root privileges, enter the following commands in the order shown to copy over the Solr configuration with the one packaged with Magento EE: cd /example/solr - cp -R collection1 magento2/conf + cp -R collection1 magento2 cd magento2 - cp -R /vendor/magento/module-solr/conf/* . + cp -R /vendor/magento/module-solr/conf/* ./conf/ For example, if Solr is installed in /opt/solr/solr-4.10.4 and Magento EE is installed in /var/www/magento/html/magento2ee, enter: - cd /opt/solr/solr/solr-4.10.4 + cd /opt/solr/solr/solr-4.10.4/example/solr cp -R collection1 magento2 cd magento2 - cp -R /var/www/html/magento2ee/vendor/magento/module-solr/conf/* . + cp -R /var/www/html/magento2ee/vendor/magento/module-solr/conf/* ./conf/

      If you're prompted to overwrite files, try the command \cp -R <your Magento EE install dir>/vendor/magento/module-solr/conf/* .

      @@ -215,4 +215,4 @@ The following excerpt from the Solr command window shows the same search: #### Next step -
      Prepare Solr for production \ No newline at end of file +Prepare Solr for production From 8a36104fa1a3bb7a456351589d218e970bc362db Mon Sep 17 00:00:00 2001 From: Oleksandra Marchenko Date: Wed, 20 Jan 2016 18:49:24 +0200 Subject: [PATCH 025/902] Edited the Add a custom template for a form field on Checkout topic --- .../howdoi/checkout/checkout_edit_form.md | 13 +++++ .../v2.0/howdoi/checkout/checkout_overview.md | 54 ++++++++++--------- 2 files changed, 42 insertions(+), 25 deletions(-) diff --git a/guides/v2.0/howdoi/checkout/checkout_edit_form.md b/guides/v2.0/howdoi/checkout/checkout_edit_form.md index 5c872800304..03c5302df74 100644 --- a/guides/v2.0/howdoi/checkout/checkout_edit_form.md +++ b/guides/v2.0/howdoi/checkout/checkout_edit_form.md @@ -21,8 +21,18 @@ To change the template of the form field, do the following: There are more details about each step in the following sections. +**Contents**: + +* TOC +{:toc} + +#Prerequisites + +Set Magento to the production mode while you perform all customizations and debugging. + For the sake of compatibility, upgradability, and easy maintenance, do not edit the default Magento code, add your customizations in a separate module. For your checkout customization to be applied correctly, your custom module should [depend]({{site.gdeurl}}extension-dev-guide/composer-integration.html) on the Magento_Checkout module. + ## Implement the HTML template for the field {#template} Create a new `.html` template in the following directory: `/view/frontend/web/template/form/element` @@ -99,5 +109,8 @@ In this file, add content similar to the following: {%endhighlight%} +## Modifying the custom template after it was applied {#modify} + +If you modify your custom `.html` template after it was applied on the store pages, the changes will not apply until you do the following: delete all files in the `pub/static/frontend` and `var/view_preprocessing` directories, then reload the pages. diff --git a/guides/v2.0/howdoi/checkout/checkout_overview.md b/guides/v2.0/howdoi/checkout/checkout_overview.md index b81e9b061d7..bd65e8c5967 100644 --- a/guides/v2.0/howdoi/checkout/checkout_overview.md +++ b/guides/v2.0/howdoi/checkout/checkout_overview.md @@ -1,25 +1,29 @@ ---- -layout: default -group: howdoi -subgroup: checkout -title: Customize Checkout -menu_title: Customize Checkout -menu_node: parent -menu_order: 1 -github_link: frontend-dev-guide/howdoi/checkout/checkout_overview.md ---- - -Magento checkout is implemented using the UI components. -Out of the box, the checkout consists of two steps: - - - Shipping Information - - Review and Payment Information - - -You can customize the default checkout in many ways. Here the following customizations are described: - - - [Add a new checkout step]({{site.gdeurl}}howdoi/checkout/checkout_new_step.html) - - [Customize the view of an existing step]({{site.gdeurl}}howdoi/checkout/checkout_new_step.html) - -For the sake of compatibility, upgradability, and easy maintenance, do not edit the default Magento code, add your customizations in a custom module. - +--- +layout: default +group: howdoi +subgroup: checkout +title: Customize Checkout +menu_title: Customize Checkout +menu_node: parent +menu_order: 1 +github_link: frontend-dev-guide/howdoi/checkout/checkout_overview.md +--- + +Magento checkout is implemented using the UI components. +Out of the box, the checkout consists of two steps: + + - Shipping Information + - Review and Payment Information + + +You can customize the default checkout in many ways. Here the following customizations are described: + + - [Add a new checkout step]({{site.gdeurl}}howdoi/checkout/checkout_new_step.html) + - [Customize the view of an existing step]({{site.gdeurl}}howdoi/checkout/checkout_new_step.html) + - [Add a custom payment method to checkout]({{site.gdeurl}}howdoi/checkout/checkout_payment.html) + - [Add custom validations before order placement]({{site.gdeurl}}howdoi/checkout/checkout_order.html) + - [Add custom shipping carrier validations]({{site.gdeurl}}checkout/checkout_carrier.html) + - [Add custom input mask for ZIP code]({{site.gdeurl}}checkout/checkout_zip.html) + +For the sake of compatibility, upgradability, and easy maintenance, do not edit the default Magento code, add your customizations in a custom module. + From 3522cdef6513215aa2395e5e408f28deccffa037 Mon Sep 17 00:00:00 2001 From: Oleksandra Marchenko Date: Wed, 20 Jan 2016 19:00:50 +0200 Subject: [PATCH 026/902] Edited the Add a custom template for a form field on Checkout topic --- guides/v2.0/howdoi/checkout/checkout_edit_form.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guides/v2.0/howdoi/checkout/checkout_edit_form.md b/guides/v2.0/howdoi/checkout/checkout_edit_form.md index 03c5302df74..e6cc105ca47 100644 --- a/guides/v2.0/howdoi/checkout/checkout_edit_form.md +++ b/guides/v2.0/howdoi/checkout/checkout_edit_form.md @@ -26,7 +26,7 @@ There are more details about each step in the following sections. * TOC {:toc} -#Prerequisites +## Prerequisites Set Magento to the production mode while you perform all customizations and debugging. From 5133f8f70372c2c7a21a3c06c542bae3bfceff2e Mon Sep 17 00:00:00 2001 From: Oleksandra Marchenko Date: Wed, 20 Jan 2016 19:08:25 +0200 Subject: [PATCH 027/902] Edited the Add a custom template for a form field on Checkout topic --- guides/v2.0/howdoi/checkout/checkout_edit_form.md | 1 + 1 file changed, 1 insertion(+) diff --git a/guides/v2.0/howdoi/checkout/checkout_edit_form.md b/guides/v2.0/howdoi/checkout/checkout_edit_form.md index e6cc105ca47..4bfefec9337 100644 --- a/guides/v2.0/howdoi/checkout/checkout_edit_form.md +++ b/guides/v2.0/howdoi/checkout/checkout_edit_form.md @@ -16,6 +16,7 @@ This topic describes how to change the HTML templates of form fields in the form The forms used in Checkout are implemented using Knockout JS. To change the template of the form field, do the following: + 1. [Create a custom HTML template for knockout JS script that will render the form field](#template). 2. [Specify the new template in the checkout page layout](#layout). From 2c5ddd2778739da0470f668f3fb86f1aa0e083bf Mon Sep 17 00:00:00 2001 From: Oleksandra Marchenko Date: Thu, 21 Jan 2016 14:01:37 +0200 Subject: [PATCH 028/902] Updated the Add new form topic --- guides/v2.0/howdoi/checkout/checkout_form.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/guides/v2.0/howdoi/checkout/checkout_form.md b/guides/v2.0/howdoi/checkout/checkout_form.md index 40cfa36bc35..cddbb48e2c5 100644 --- a/guides/v2.0/howdoi/checkout/checkout_form.md +++ b/guides/v2.0/howdoi/checkout/checkout_form.md @@ -16,13 +16,17 @@ This topic describes how to add a custom input form to the Checkout page. Magento provides ability to add a custom form to any of the checkout steps: Shipping Information, Review and Payment Information, or custom. In order to add a custom form developer has to follow the following steps: 1. [Create the JS implementation of the form UI component] (#component) -2. [Create the knockout.js HTML template] (#template) +2. [Create the knockout.js HTML template for rendering the form] (#template) 3. [Declare the form in the checkout page layout] (#layout) -## Create the JS implementation of the form UI component {#component} +## Prerequisites + +[Set Magento to the production mode](#{{site.gdeurl}}config-guide/cli/config-cli-subcommands-mode.html) while you perform all customizations and debugging. For the sake of compatibility, upgradability, and easy maintenance, do not edit the default Magento code, add your customizations in a separate module. For your checkout customization to be applied correctly, your custom module should [depend]({{site.gdeurl}}extension-dev-guide/composer-integration.html) on the Magento_Checkout module. +## Create the JS implementation of the form UI component {#component} + In your `/view/frontend/web/js/model` directory, create a `.js` file implementing the form.

      Where should it be located?

      From 305c03753554efa66962782b863a7ed89c8a9384 Mon Sep 17 00:00:00 2001 From: Dmitry Shevtsov Date: Fri, 22 Jan 2016 14:39:02 +0200 Subject: [PATCH 029/902] MAGEDOC-2409: [MTF] 'Testing Approach' Chapter - CRLF was changed to LF --- guides/v2.0/mtf/mtf_test-approach.md | 61 ++++++++++++++++------------ 1 file changed, 34 insertions(+), 27 deletions(-) diff --git a/guides/v2.0/mtf/mtf_test-approach.md b/guides/v2.0/mtf/mtf_test-approach.md index cd34b62f14f..853769d1e5c 100644 --- a/guides/v2.0/mtf/mtf_test-approach.md +++ b/guides/v2.0/mtf/mtf_test-approach.md @@ -11,7 +11,7 @@ github_link: mtf/mtf_test-approach.md * TOC {:toc} -## Preface +## Preface {#preface} Magento testing framework works with functional tests only. Functional testing means checking that an application met specified business requirements. These requirements usually are collected in functional specifications that describe expected behaviour of the application. Role of functional testing is to validate this behavior. @@ -20,15 +20,15 @@ Tests are used to cover functionality of a business entity. A goal is to find di If you want to extend functionality you can modify existing tests or create your own functional tests using the MTF. -## Out-of-the-box test +## Out-of-the-box test {#out-of-the-box-test} The out-of-the-box tests are the ready to use functional tests developed by Magento. You can find them in the `/dev/tests/functional` directory. -### Coverage +### Coverage {#coverage} Test coverage of the out-of-the-box test depends on a module which it belongs to. The out-of-the-box tests cover basic functionality of Magento application. They test the CRUD functionality for all basic entities. The most important modules are covered better. -### Usage +### Usage {#oob-usage} You can use out-of-the-box tests in: @@ -45,7 +45,7 @@ You can use out-of-the-box tests in: - in combination with own tests - to test new feature: show that feature works and it didn't break any functionality of the Magento application (all other tests passed) -### How to use +### How to use {#how-to-use} Step 1. Check the functionality manually @@ -53,15 +53,15 @@ Pass all the test steps defined in a test case you want to use. Step 2. [Run the test][] -## New test +## New test {#new-test} -### Extending an out-of-the-box test +### Extending an out-of-the-box test {#extending-oob-test} You can create a test extending from an out-of-the-box test. It is stored in the `/dev/tests/functional/tests/app/Magento/` directory. -#### Usage +#### Usage {#ext-usage} -This approach is useful when the Magento functionality was extended, for example the minor changes were added to the existing functionality of a module. Also you can extend the out-of-the-box test to extend the current test coverage if functionality that you are interested in is not completely covered by the out-of-the-box test. +This approach is useful when the Magento functionality was extended, for example the minor changes were added to the existing functionality of a module. Also you can extend an out-of-the-box test to extend the current test coverage if functionality that you are interested in is not completely covered by the out-of-the-box test. Example use cases: @@ -72,36 +72,33 @@ Example use cases: - [block overriding][] - [handler overriding][] -## Creating a test +### Creating a test {#create-test} -### When should I use them? +When new functionality or/and new modules were added to Magento you would need to create an absolutely new test to check the functionality. -- new functionality - - new test flow -- new modules +New tests must be stored in corresponding modules `/dev/tests/functional/tests/app/Magento/`. -### Where can I put them? - -- dev/tests/functional/tests/app/Magento/ - -### Test components - -To create new test you need a test object, test data, test flow, and test assertions. +Each test consists of four main components: test object, test data, test flow, test assertions. #### Test object -Test object is represented as a fixture. Fixture defines object properties. Это то что собираемся протестировать и что будет целью тестирования, над ним будут проводиться все тестовые действия. - -Simple product fixture example. Learn more about fixture. +Test object is an object that you are going to test. All test actions will be performed under this object. +Test object is represented as a [fixture][]. The fixture defines properties of an object. +For example, in [CreateSimpleProductEntityTest][] the `\Magento\Catalog\Test\Fixture\CatalogProductSimple` is a test object. #### Test data -Test data are stored in data sets, sample data are stored in repositories, and sample test entities can be created by handlers. Тест +Test data are data for the test and data for preconditions + + - Data for a test are stored in [data set][] + - Preconditions include sample data that are stored in a [fixture repository][] and sample test entity that can be created by a [handler][]. + +#### Test flow -data sets +#### Test assertions -preconditions: sample data, sample test entities. Example Simple Product: create category +These components are discussed in the rest of this topic. To demonstrate usage of these components in the test creation process we will create step-by-step a new test . Example test will create a new simple product. This test already exists in functional tests directory, so you can track processes of its creation. To create the test entity you must fill a product creation form with data from a data set. To do it correctly you need fixture for simple product entity. Learn more about Fixture. @@ -145,6 +142,8 @@ Verification assertions are managed by constraints. Проверка того ч ран. дебаг. отладка. фикс +#### Example + [Run the test]: {{site.gdeurl}}mtf/mtf_quickstart/mtf_quickstart_runtest.html @@ -155,6 +154,14 @@ Verification assertions are managed by constraints. Проверка того ч [block overriding]: {{site.gdeurl}}mtf/mtf_entities/mtf_block.html [handler overriding]: {{site.gdeurl}}mtf/mtf_entities/mtf_handler.html +[fixture]: {{site.gdeurl}}mtf/mtf_entities/mtf_fixture.html +[data set]: {{site.gdeurl}}mtf/mtf_entities/mtf_dataset.html +[fixture repository]: {{site.gdeurl}}mtf/mtf_entities/mtf_fixture-repo.html +[handler]: {{site.gdeurl}}mtf/mtf_entities/mtf_handler.html + +[CreateSimpleProductEntityTest]: {{mage2000url}}dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/Product + + [Create a test case file]: {{site.gdeurl}}mtf/mtf_entities/mtf_testcase.html#how-to-create [Create a data set file]: {{site.gdeurl}}mtf/mtf_entities/mtf_dataset.html From 3b7b4381eaac2dc0293350c47945b45f45655845 Mon Sep 17 00:00:00 2001 From: Oleksandra Marchenko Date: Mon, 25 Jan 2016 17:24:49 +0200 Subject: [PATCH 030/902] Update --- guides/v2.0/howdoi/checkout/checkout_form.md | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/guides/v2.0/howdoi/checkout/checkout_form.md b/guides/v2.0/howdoi/checkout/checkout_form.md index cddbb48e2c5..b989a84e0b2 100644 --- a/guides/v2.0/howdoi/checkout/checkout_form.md +++ b/guides/v2.0/howdoi/checkout/checkout_form.md @@ -9,11 +9,13 @@ github_link: howdoi/checkout/checkout_form.md --- ## What's in this topic -This topic describes how to add a custom input form to the Checkout page. +This topic describes how to add a custom input form (implemented as a UI component) to the Checkout page. -

      should this form be a UI component? Would a link to the Form component be appropriate http://devdocs.magento.com/guides/v2.0/ui-components/ui-form.html?

      +Most of the elements, including the default forms on the Checkout page are implemented as UI components. And our recommendation is your custom form to be a UI component, extending the default [Magento_Ui/js/form/form]({{site.mage2000url}}app/code/Magento/Ui/view/base/web/js/form/form.js) component. -Magento provides ability to add a custom form to any of the checkout steps: Shipping Information, Review and Payment Information, or custom. In order to add a custom form developer has to follow the following steps: +## Overview + +Magento provides ability to add a custom form to any of the checkout steps: Shipping Information, Review and Payment Information, or custom. In order to add a custom form that is a UI component, take the following steps: 1. [Create the JS implementation of the form UI component] (#component) 2. [Create the knockout.js HTML template for rendering the form] (#template) @@ -27,11 +29,7 @@ For the sake of compatibility, upgradability, and easy maintenance, do not edit ## Create the JS implementation of the form UI component {#component} -In your `/view/frontend/web/js/model` directory, create a `.js` file implementing the form. - -

      Where should it be located?

      - -The form must be implemented as a UI component. It can extend the default Magento [form UI component]({{site.gdeurl}}ui-components/ui-form.html). Its implementation is stored in `/view/base/web/js/form/form.js`. +In your `/view/frontend/web/js/` directory, create a `.js` file implementing the form. Example of extending the default form component: From d5af7c1eb2d1aad1c91eb999fd8dde2300a152aa Mon Sep 17 00:00:00 2001 From: stevjohnson Date: Mon, 25 Jan 2016 12:06:31 -0600 Subject: [PATCH 031/902] update --- _includes/install/get-software_zip.md | 5 +++-- common/images/upgr_gitignore-err.png | Bin 0 -> 62148 bytes 2 files changed, 3 insertions(+), 2 deletions(-) create mode 100644 common/images/upgr_gitignore-err.png diff --git a/_includes/install/get-software_zip.md b/_includes/install/get-software_zip.md index ab824013009..aa2e58c0c6c 100644 --- a/_includes/install/get-software_zip.md +++ b/_includes/install/get-software_zip.md @@ -22,8 +22,9 @@ Archives are available in the following formats: `.zip`, `.tar.bz2`, `.tar.gz` Magento CE

      www.magento.com/download

      Choose either the software or the software and sample data:

      -
      • Magento-CE-2.0.0.* (without sample data)
      • -
      • Magento-CE-2.0.0+Samples.* (with sample data)
      +
      • Magento-CE-<version>.* (without sample data)
      • +
      • Magento-CE-<version>+Samples.* (with sample data)
      • +

        <version/> is the three-digit release number (for example, 2.0.0, 2.0.1, and so on.)

      Magento EE diff --git a/common/images/upgr_gitignore-err.png b/common/images/upgr_gitignore-err.png new file mode 100644 index 0000000000000000000000000000000000000000..cb852ad4dacc13f9a43f2b4eb080af784091d1ff GIT binary patch literal 62148 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 Date: Mon, 25 Jan 2016 12:47:30 -0600 Subject: [PATCH 032/902] Update --- _includes/install/install-roadmap.md | 3 +++ guides/v2.0/comp-mgr/trouble/cman/gitignore.md | 4 ++++ .../v2.0/comp-mgr/trouble/cman/were-sorry.md | 18 +----------------- guides/v2.0/howdoi/deploy/deploy-to-prod.md | 4 ++-- 4 files changed, 10 insertions(+), 19 deletions(-) diff --git a/_includes/install/install-roadmap.md b/_includes/install/install-roadmap.md index 21e2a5cf3ed..f8fae17782a 100644 --- a/_includes/install/install-roadmap.md +++ b/_includes/install/install-roadmap.md @@ -37,3 +37,6 @@ Topics include: * Upgrading (or *patching* the Magento application) * Updating components (including install, uninstall, update, enable, disable) + +### Deploy to production +Deploy Magento to production \ No newline at end of file diff --git a/guides/v2.0/comp-mgr/trouble/cman/gitignore.md b/guides/v2.0/comp-mgr/trouble/cman/gitignore.md index 045209e55f0..c9fce22428b 100644 --- a/guides/v2.0/comp-mgr/trouble/cman/gitignore.md +++ b/guides/v2.0/comp-mgr/trouble/cman/gitignore.md @@ -12,6 +12,10 @@ github_link: comp-mgr/trouble/cman/gitignore.md ### Problem: missing `.gitignore` files {#missing-ignore} If you downloaded a compressed archive, there might have been missing `.gitignore` files that prevent the upgrade from completing properly. To apply our update, patch `magento/magento-composer-installer` then run `composer update` from your Magento installation directory. +The following figure shows an example of this issue when using the Setup Wizard. + + + #### Solution To solve this issue: diff --git a/guides/v2.0/comp-mgr/trouble/cman/were-sorry.md b/guides/v2.0/comp-mgr/trouble/cman/were-sorry.md index 261d9c8df11..6273ee6281d 100644 --- a/guides/v2.0/comp-mgr/trouble/cman/were-sorry.md +++ b/guides/v2.0/comp-mgr/trouble/cman/were-sorry.md @@ -18,7 +18,6 @@ See one of the following sections for possible solutions: * [Problem: you're not authenticated](#not-auth) * [Problem: the updater application isn't initialized](#updater) -* [Problem: missing `.gitignore` files](#missing-ignore) ### Problem: you're not authenticated {#not-auth} You might not have entered your authentication keys in the Magento Admin. @@ -64,19 +63,4 @@ Modify Magento's `composer.json` to reference the `https://repo.magento.com` rep 8. Enter the following command: composer install -9. After the command completes, try the upgrade again. - -### Problem: missing `.gitignore` files {#missing-ignore} -If you downloaded a compressed archive, there might have been missing `.gitignore` files that prevent the upgrade from completing properly. To apply our update, patch `magento/magento-composer-installer` then run `composer update` from your Magento installation directory. - -#### Solution -To solve this issue: - -1. Log in to your Magento server as the Magento file system owner. -2. Change to your Magento installation directory. -3. Run the following commands in the order shown: - - composer update magento/magento-composer-installer - composer update - -4. Try your upgrade again. \ No newline at end of file +9. After the command completes, try the upgrade again. \ No newline at end of file diff --git a/guides/v2.0/howdoi/deploy/deploy-to-prod.md b/guides/v2.0/howdoi/deploy/deploy-to-prod.md index 4fc7fc94e58..fe17c19cb60 100644 --- a/guides/v2.0/howdoi/deploy/deploy-to-prod.md +++ b/guides/v2.0/howdoi/deploy/deploy-to-prod.md @@ -2,8 +2,8 @@ layout: default group: howdoi subgroup: Deploy -title: Deploy to production -menu_title: Deploy to production +title: Deploy Magento to production +menu_title: Deploy Magento to production menu_node: parent menu_order: 1 github_link: howdoi/deploy/deploy-to-prod.md From 33bb0678908c05d953633de35d7226c521158187 Mon Sep 17 00:00:00 2001 From: stevjohnson Date: Mon, 25 Jan 2016 14:38:52 -0600 Subject: [PATCH 033/902] PR#492. Improve advice by providing command to not delete .htaccess --- guides/v2.0/comp-mgr/trouble/cman/gitignore.md | 2 +- .../config-guide/cli/config-cli-subcommands-static-view.md | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/guides/v2.0/comp-mgr/trouble/cman/gitignore.md b/guides/v2.0/comp-mgr/trouble/cman/gitignore.md index 630e61d1e6e..c9fce22428b 100644 --- a/guides/v2.0/comp-mgr/trouble/cman/gitignore.md +++ b/guides/v2.0/comp-mgr/trouble/cman/gitignore.md @@ -1,6 +1,6 @@ --- layout: default -group: +group: compman subgroup: ZZ_Troubleshooting title: Missing `.gitignore` files menu_title: Missing `.gitignore` files diff --git a/guides/v2.0/config-guide/cli/config-cli-subcommands-static-view.md b/guides/v2.0/config-guide/cli/config-cli-subcommands-static-view.md index 93908a3ba00..90da7b6a94b 100644 --- a/guides/v2.0/config-guide/cli/config-cli-subcommands-static-view.md +++ b/guides/v2.0/config-guide/cli/config-cli-subcommands-static-view.md @@ -38,7 +38,9 @@ Static view files deployment is affected by Magento modes as follows:

      Developer mode only: When you install or enable a new module, it might load new JavaScript, CSS, layouts, and so on. To avoid issues with static files, you must clean the old files to make sure you get all the changes for the new module.

      You can clean generated static view files in any of the following ways:

      -
      • Manually by clearing the pub/static (please note: do not delete the .htaccess file within the pub/static folder) and var/view_preprocessed directories and subdirectories.
      • +
        • Manually by clearing the pub/static and var/view_preprocessed directories and subdirectories. except for pub/static/.htaccess.

          + To clear the pub/static directory of all files except .htaccess, enter the following command:
          + find . -depth -name .htaccess -prune -o -delete
        • Using the Magento command line. Several commands support an optional parameter --clear-static-content, which cleans generated static view files. For example, see Enable or disable modules.
        • In the Magento Admin. Go to System > Tools > Cache Management and click Flush Static Files Cache.
      From 95c9ab40204991a85f79df4184dd1b711f35e7d0 Mon Sep 17 00:00:00 2001 From: stevjohnson Date: Mon, 25 Jan 2016 17:08:49 -0600 Subject: [PATCH 034/902] PR#491. Add cross-references to production mode and the command --- guides/v2.0/install-gde/trouble/tshoot_no-styles.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/guides/v2.0/install-gde/trouble/tshoot_no-styles.md b/guides/v2.0/install-gde/trouble/tshoot_no-styles.md index 5f5a3ba42ef..6528fd13c9a 100644 --- a/guides/v2.0/install-gde/trouble/tshoot_no-styles.md +++ b/guides/v2.0/install-gde/trouble/tshoot_no-styles.md @@ -20,6 +20,6 @@ Magento static assets should be located under `/pub/st ### Solution -Verify your server rewrites setting and your Magento server's base URL and try again. If you set up the `AllowOverride` directive incorrectly, static files aren't served from the correct location. +* Verify your server rewrites setting and your Magento server's base URL and try again. If you set up the `AllowOverride` directive incorrectly, static files aren't served from the correct location. -This also happens when you are running in `production` mode and you have not built the static assets yet. Issue this command: `bin/magento setup:static-content:deploy` +* If the Magento application is in production mode, try deploying static view files using the command `magento setup:static-content:deploy`. From 6ea66e447ed5c3cf4228e1978ebe9d04aa99721f Mon Sep 17 00:00:00 2001 From: stevjohnson Date: Mon, 25 Jan 2016 19:25:54 -0600 Subject: [PATCH 035/902] First pass at tech bulletin --- guides/v2.0/release-notes/bk-tech-bulletin.md | 17 ++++++++ guides/v2.0/release-notes/tb_1-27-16.md | 40 +++++++++++++++++++ .../v2.0/release-notes/tech_bull_jan_22_16.md | 17 -------- 3 files changed, 57 insertions(+), 17 deletions(-) create mode 100644 guides/v2.0/release-notes/bk-tech-bulletin.md create mode 100644 guides/v2.0/release-notes/tb_1-27-16.md delete mode 100644 guides/v2.0/release-notes/tech_bull_jan_22_16.md diff --git a/guides/v2.0/release-notes/bk-tech-bulletin.md b/guides/v2.0/release-notes/bk-tech-bulletin.md new file mode 100644 index 00000000000..bc71e7bf0ca --- /dev/null +++ b/guides/v2.0/release-notes/bk-tech-bulletin.md @@ -0,0 +1,17 @@ +--- +layout: default +group: release-notes +subgroup: 10_bulletin +title: Technical Bulletin +menu_title: Technical Bulletin +menu_node: parent +menu_order: 1 +github_link: release-notes/bk-tech-bulletin.md +redirect_from: /guides/v1.0/release-notes/known-issues.html +--- + +## Technical Bulletin +The following bullets discuss late-breaking changes you need to know about right away: + +* Issues upgrading to 2.0.1 + diff --git a/guides/v2.0/release-notes/tb_1-27-16.md b/guides/v2.0/release-notes/tb_1-27-16.md new file mode 100644 index 00000000000..8d07a0def0a --- /dev/null +++ b/guides/v2.0/release-notes/tb_1-27-16.md @@ -0,0 +1,40 @@ +--- +layout: default +group: release-notes +subgroup: 10_bulletin +title: Issues upgrading to 2.0.1 (Jan. 27, 2016) +menu_title: Issues upgrading to 2.0.1 (Jan. 27, 2016) +menu_node: +menu_order: 2 +github_link: release-notes/tb_1-27-16.md +--- + +## Issues upgrading to 2.0.1 (Jan. 27, 2016) +This bulletin informs of you of the following issues: + +* [Upgrade fails because of missing `.gitignore` files](#gitignore) +* ["We're sorry, we can't take that action right now"](#sorry) + +### Upgrade fails because of missing `.gitignore` files {#gitignore} +Upgrades to Magento Community Edition (CE) and Enterprise Edition (EE) 2.0.1 fail if you got the Magento software compressed archive (`.tar.gz`, `.zip`, and `.bz2`). + +
      +
      • Other types of installations are not affected.
      • +
      • New installations of Magento 2 CE and EE have no issues because we fixed our compressed archives.
      +
      + +#### Detail +Our compressed archives for CE and EE were missing `.gitignore` files and, as a result, exceptions prevented the upgrade from completing successfully. + +At the same time, we fixed a separate issue that prevented upgrading to 2.0.1 if you use PHP 7. + +#### Solution +TBD + +### "We're sorry, we can't take that action right now" {#sorry} +If this message displays during your upgrade, it can mean any of the following: + +* You didn't authenticate with the System Upgrade utility +* The updater application isn't initialized + + This cause is relatively uncommon. \ No newline at end of file diff --git a/guides/v2.0/release-notes/tech_bull_jan_22_16.md b/guides/v2.0/release-notes/tech_bull_jan_22_16.md deleted file mode 100644 index 99445d88549..00000000000 --- a/guides/v2.0/release-notes/tech_bull_jan_22_16.md +++ /dev/null @@ -1,17 +0,0 @@ ---- -layout: default -group: -title: Technical Bulletin -menu_title: -menu_node: -menu_order: 2 -github_link: -redirect_from: /guides/v1.0/release-notes/known-issues.html ---- - -

      Technical Bulletin

      - -
      Date: January 22, 2016

      Issue:

      - *2.0.x upgrades fail when installed with .zip archive and then updated either with composer-update or System Upgrade tool.* IF you installed 2.0.0 using a .zip archive, AND you attempt to upgrade to 2.0.1 using either the Magento System Upgrade Utility or Composer, the upgrade process fails. The upgrade fails because certain required files were missing from the .zip file. Note that upgrade processes for installations that did not originally use a .zip file are not affected by this issue.

      Resolution:

      - *In Progress* Magento is working to deliver a resolution. In the meantime, please refer to the Magento forum for the latest information. * If you have not yet installed 2.0.1 nor updated to 2.0.1, please wait until a resolution is available shortly. - * If you have already attempted to upgrade to 2.0.1 and the process failed, instructions for resolving the failed upgrade will be communicated as soon as possible. \ No newline at end of file From 65b0d13abba3035599ad0cad68e96546eac7e3ab Mon Sep 17 00:00:00 2001 From: stevjohnson Date: Tue, 26 Jan 2016 06:18:50 -0600 Subject: [PATCH 036/902] Remove hidden p class=q --- .../service-contracts/design-patterns.md | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/guides/v2.0/extension-dev-guide/service-contracts/design-patterns.md b/guides/v2.0/extension-dev-guide/service-contracts/design-patterns.md index 5624f1bb085..4790c792c8e 100644 --- a/guides/v2.0/extension-dev-guide/service-contracts/design-patterns.md +++ b/guides/v2.0/extension-dev-guide/service-contracts/design-patterns.md @@ -38,15 +38,7 @@ redirect_from: /guides/v1.0/extension-dev-guide/service-contracts/design-pattern CustomerSearchResultsInterface returns an array of CustomerInterface data entities. In GroupSearchResultsInterface, thegetItems() function returns an array of GroupInterface data entities.

      - +

      Service interfaces

      Service interfaces include several interface subtypes:

        From c51f3250a02d08ac2a915eb8a0fcf8dfe290c246 Mon Sep 17 00:00:00 2001 From: Oleksandra Marchenko Date: Tue, 26 Jan 2016 16:32:04 +0200 Subject: [PATCH 037/902] Incorporated dev comments to the adding a form topic --- guides/v2.0/howdoi/checkout/checkout_form.md | 195 +++++++++--------- .../v2.0/howdoi/checkout/checkout_payment.md | 4 +- 2 files changed, 96 insertions(+), 103 deletions(-) diff --git a/guides/v2.0/howdoi/checkout/checkout_form.md b/guides/v2.0/howdoi/checkout/checkout_form.md index b989a84e0b2..6d6894eb877 100644 --- a/guides/v2.0/howdoi/checkout/checkout_form.md +++ b/guides/v2.0/howdoi/checkout/checkout_form.md @@ -9,17 +9,17 @@ github_link: howdoi/checkout/checkout_form.md --- ## What's in this topic -This topic describes how to add a custom input form (implemented as a UI component) to the Checkout page. +This topic describes how to add a custom input form (implemented as a UI component) to the Checkout page. -Most of the elements, including the default forms on the Checkout page are implemented as UI components. And our recommendation is your custom form to be a UI component, extending the default [Magento_Ui/js/form/form]({{site.mage2000url}}app/code/Magento/Ui/view/base/web/js/form/form.js) component. +Most of the elements, including the default forms on the Checkout page are implemented as UI components. And our recommendation is your custom form to be a UI component, extending the default [Magento_Ui/js/form/form]({{site.mage2000url}}app/code/Magento/Ui/view/base/web/js/form/form.js) component. ## Overview Magento provides ability to add a custom form to any of the checkout steps: Shipping Information, Review and Payment Information, or custom. In order to add a custom form that is a UI component, take the following steps: -1. [Create the JS implementation of the form UI component] (#component) -2. [Create the knockout.js HTML template for rendering the form] (#template) -3. [Declare the form in the checkout page layout] (#layout) +1. [Create the JS implementation of the form UI component](#component) +2. [Create the knockout.js HTML template for rendering the form](#template) +3. [Declare the form in the checkout page layout](#layout) ## Prerequisites @@ -45,7 +45,7 @@ define([ // component initialization logic return this; }, - + /** * Form submit handler * @@ -55,7 +55,7 @@ define([ // trigger form validation this.source.set('params.invalid', false); this.source.trigger('customCheckoutForm.data.validate'); - + // verify that form data is valid if (!this.source.get('params.invalid')) { // data is retrieved from data provider by value of the customScope property @@ -68,11 +68,9 @@ define([ }); {%endhighlight%} -

        is it a must that a form is a UI component? is it a must to use the default Magento form component?

        ## Create the HTML template {#template} -Add the HTML template that will be rendered by Magento. -In the module directory, add the `knockout.js` HTML template for the form component. It must be located under the `/view/frontend/web/template` directory. +Add the `knockout.js` HTML template for the form component under the `/view/frontend/web/template` directory. Example: @@ -99,19 +97,11 @@ Example: ## Declare the form in the checkout page layout {#layout} -Certain default checkout templates declare regions where some additional content can be inserted. - -

        any content or UI components? Or JS components? (what is the difference?)

        +Certain default checkout templates declare regions where some additional content can be inserted. You can add your custom form in any of these regions. These regions are provided with corresponding comments in the default Checkout page layout file `/view/frontend/layout/checkout_index_index.xml`. Also you locate the regions in the `.html` templates of the blocks used in this layout file. -You can add your custom form in any of these regions. - -For example, the shipping JS component (see app/code/Magento/Checkout/view/frontend/web/template/shipping.html) provides the `before-form` region and corresponding UI container. +For example, the shipping JS component (see [app/code/Magento/Checkout/view/frontend/web/template/shipping.html]({{mage2000.url}}app/code/Magento/Checkout/view/frontend/web/template/shipping.html)) provides the `before-form` region and corresponding UI container. -

        How devs can find other regions?

        - -Any content added here is rendered before the Shipping Address form on the Shipping Information step. To add content to this region, the following layout update can be used: - -

        What exactly is declared in layout? names of .js components? templates?

        +Any content added here is rendered before the Shipping Address form on the Shipping Information step. To add content to this region, create a `checkout_index_index.xml` layout update similar to the following in the `/view/frontend/layout/`: {%highlight xml%} @@ -131,7 +121,7 @@ Any content added here is rendered before the Shipping Address form on the Shipp - + @@ -150,97 +140,100 @@ Any content added here is rendered before the Shipping Address form on the Shipp {%endhighlight%} -If the form fields are not generated dynamically, they can be defined in layout. +### Static forms + +If the form fields are not generated dynamically, they can be defined in layout. -The following code sample shows configuration of the form that contains four fields: text input, select, checkbox, and date. This form uses checkout data provider (checkoutProvider) that is introduced in the Magento_Checkout module: +The following code sample shows configuration of the form that contains four fields: text input, select, checkbox, and date. This form uses checkout data provider (`checkoutProvider`) that is introduced in the Magento_Checkout module: -

        need explanations here

        +

        Do we need to add a link or any other details

        {%highlight xml%} - %MODULE_NAME%/js/view/custom-checkout-form + %your_module_dir%/js/view/custom-checkout-form checkoutProvider - %MODULE_NAME%/custom-checkout-form + %your_module_dir%/custom-checkout-form - - uiComponent - - custom-checkout-form-fields - - - Magento_Ui/js/form/element/abstract - - - customCheckoutForm - ui/form/field - ui/form/element/input - - checkoutProvider - customCheckoutForm.text_field - Text Field - 1 - - true - - - - Magento_Ui/js/form/element/boolean - - - customCheckoutForm - ui/form/field - ui/form/element/checkbox - - checkoutProvider - customCheckoutForm.checkbox_field - Checkbox Field - 3 - - - Magento_Ui/js/form/element/select - - - customCheckoutForm - ui/form/field - ui/form/element/select - - - - Please select value - + + uiComponent + + custom-checkout-form-fields + + + Magento_Ui/js/form/element/abstract + + + customCheckoutForm + ui/form/field + ui/form/element/input - - Value 1 - value_1 + checkoutProvider + customCheckoutForm.text_field + Text Field + 1 + + true - - Value 2 - value_2 + + + Magento_Ui/js/form/element/boolean + + + customCheckoutForm + ui/form/field + ui/form/element/checkbox + checkoutProvider + customCheckoutForm.checkbox_field + Checkbox Field + 3 - - value_2 - checkoutProvider - customCheckoutForm.select_field - Select Field - 2 - - - Magento_Ui/js/form/element/date - - - customCheckoutForm - ui/form/field - ui/form/element/date + + Magento_Ui/js/form/element/select + + + customCheckoutForm + ui/form/field + ui/form/element/select + + + + Please select value + + + + Value 1 + value_1 + + + Value 2 + value_2 + + + + value_2 + checkoutProvider + customCheckoutForm.select_field + Select Field + 2 - checkoutProvider - customCheckoutForm.date_field - Date Field - - true + + Magento_Ui/js/form/element/date + + + customCheckoutForm + ui/form/field + ui/form/element/date + + checkoutProvider + customCheckoutForm.date_field + Date Field + + true + @@ -250,8 +243,8 @@ The following code sample shows configuration of the form that contains four fie ### Dynamically defined forms -If form fields are generated dynamically, developer must implement an interceptor for the `\Magento\Checkout\Block\Checkout\LayoutProcessor::process` method. -Interceptor can add custom fields definitions to layout at run-time. The format of the field definition is the same as for fields defined in layout. +If form fields are generated dynamically, developer must implement a [plugin]({{site.gdeurl}}extension-dev-guide/plugins.html) for the `\Magento\Checkout\Block\Checkout\LayoutProcessor::process` method. +A plugin can add custom fields definitions to layout at run-time. The format of the field definition is the same as for fields defined in layout. For example: @@ -275,4 +268,4 @@ $textField = [ ## Illustration If you use the code samples provided as examples in this topic, this would result in adding the following form to the Shipping Information step: -The input form with four fields \ No newline at end of file +The input form with four fields diff --git a/guides/v2.0/howdoi/checkout/checkout_payment.md b/guides/v2.0/howdoi/checkout/checkout_payment.md index 19282869b43..d7178fd462e 100644 --- a/guides/v2.0/howdoi/checkout/checkout_payment.md +++ b/guides/v2.0/howdoi/checkout/checkout_payment.md @@ -195,7 +195,7 @@ A sample DI configuration file of a custom module `/etc/di.xml` {%endhighlight%} ### Add other payment-related features -You can also add payment-related features (like reward points, gift registry, an so on) to the Review and Payment Informatio checkout step. They must be implemented as UI components as well, and can be displayed before or after the list of payment methods. This is configured in the [checkout page layout file correspondingly](#layout). +You can also add payment-related features (like reward points, gift registry, an so on) to the Review and Payment Information checkout step. They must be implemented as UI components as well, and can be displayed before or after the list of payment methods. This is configured in the [checkout page layout file correspondingly](#layout). ## Create the .js component that registers the renderer {#register} In you custom module directory create the `.js` UI component that registers the payment method renderer in the renderers list. It must be located under the `/view/frontend/web/js/view/` directory. For example in the Magento modules, the payment methods renderers are stored in the `/view/frontend/web/js/view/payment/` directory. @@ -220,7 +220,7 @@ define( }, // other payment method renderers if required ); - /** Add view logic here if needed */ + /** Add view logic here if needed return Component.extend({}); } ); From 4bf589bcde7c53016a3420dc3e849353da09b78d Mon Sep 17 00:00:00 2001 From: stevjohnson Date: Tue, 26 Jan 2016 11:24:40 -0600 Subject: [PATCH 038/902] Renamed technical bulletin file name to match name given to Marketing --- guides/v2.0/release-notes/bk-tech-bulletin.md | 17 ----------------- .../{tb_1-27-16.md => tech_bull_jan_22_16.md} | 10 ++++++---- 2 files changed, 6 insertions(+), 21 deletions(-) delete mode 100644 guides/v2.0/release-notes/bk-tech-bulletin.md rename guides/v2.0/release-notes/{tb_1-27-16.md => tech_bull_jan_22_16.md} (79%) diff --git a/guides/v2.0/release-notes/bk-tech-bulletin.md b/guides/v2.0/release-notes/bk-tech-bulletin.md deleted file mode 100644 index bc71e7bf0ca..00000000000 --- a/guides/v2.0/release-notes/bk-tech-bulletin.md +++ /dev/null @@ -1,17 +0,0 @@ ---- -layout: default -group: release-notes -subgroup: 10_bulletin -title: Technical Bulletin -menu_title: Technical Bulletin -menu_node: parent -menu_order: 1 -github_link: release-notes/bk-tech-bulletin.md -redirect_from: /guides/v1.0/release-notes/known-issues.html ---- - -## Technical Bulletin -The following bullets discuss late-breaking changes you need to know about right away: - -* Issues upgrading to 2.0.1 - diff --git a/guides/v2.0/release-notes/tb_1-27-16.md b/guides/v2.0/release-notes/tech_bull_jan_22_16.md similarity index 79% rename from guides/v2.0/release-notes/tb_1-27-16.md rename to guides/v2.0/release-notes/tech_bull_jan_22_16.md index 8d07a0def0a..dfe25294d3a 100644 --- a/guides/v2.0/release-notes/tb_1-27-16.md +++ b/guides/v2.0/release-notes/tech_bull_jan_22_16.md @@ -1,12 +1,12 @@ --- layout: default group: release-notes -subgroup: 10_bulletin +subgroup: Technical Bulletin title: Issues upgrading to 2.0.1 (Jan. 27, 2016) menu_title: Issues upgrading to 2.0.1 (Jan. 27, 2016) menu_node: -menu_order: 2 -github_link: release-notes/tb_1-27-16.md +menu_order: 1 +github_link: release-notes/tech_bull_jan_22_16.md --- ## Issues upgrading to 2.0.1 (Jan. 27, 2016) @@ -16,7 +16,7 @@ This bulletin informs of you of the following issues: * ["We're sorry, we can't take that action right now"](#sorry) ### Upgrade fails because of missing `.gitignore` files {#gitignore} -Upgrades to Magento Community Edition (CE) and Enterprise Edition (EE) 2.0.1 fail if you got the Magento software compressed archive (`.tar.gz`, `.zip`, and `.bz2`). +Upgrades to Magento Community Edition (CE) and Enterprise Edition (EE) 2.0.1 failed if you got the Magento software compressed archive (`.tar.gz`, `.zip`, and `.bz2`) *before* January 27, 2016.
        • Other types of installations are not affected.
        • @@ -29,6 +29,8 @@ Our compressed archives for CE and EE were missing `.gitignore` files and, as a At the same time, we fixed a separate issue that prevented upgrading to 2.0.1 if you use PHP 7. #### Solution +Download a compressed archive that contains the missing `.gitignore` files and the PHP 7 fix. + TBD ### "We're sorry, we can't take that action right now" {#sorry} From 56445aa0f71d51e648da02299064f6b385f52c76 Mon Sep 17 00:00:00 2001 From: stevjohnson Date: Tue, 26 Jan 2016 12:09:49 -0600 Subject: [PATCH 039/902] Tech bulletin ready for spell check --- .../v2.0/release-notes/tech_bull_jan_22_16.md | 64 ++++++++++++++++++- 1 file changed, 62 insertions(+), 2 deletions(-) diff --git a/guides/v2.0/release-notes/tech_bull_jan_22_16.md b/guides/v2.0/release-notes/tech_bull_jan_22_16.md index dfe25294d3a..a59cc6ea2af 100644 --- a/guides/v2.0/release-notes/tech_bull_jan_22_16.md +++ b/guides/v2.0/release-notes/tech_bull_jan_22_16.md @@ -29,9 +29,69 @@ Our compressed archives for CE and EE were missing `.gitignore` files and, as a At the same time, we fixed a separate issue that prevented upgrading to 2.0.1 if you use PHP 7. #### Solution -Download a compressed archive that contains the missing `.gitignore` files and the PHP 7 fix. +Download a compressed archive that contains the missing `.gitignore` files and the PHP 7 fix as follows: -TBD +1. Download one of the following patch archives. Patches are available in the following formats: `.zip`, `.tar.bz2`, `.tar.gz` + + + + + + + + + + + + + + + + + + +
          Magento editionPatch location
          Magento CE

          www.magento.com/download

          +

          NAME.*

          Magento EEUse the following steps: +
          1. Go to www.magento.com
          2. +
          3. In the top horizontal navigation bar, click My Account.
          4. +
          5. Log in with your Magento user name and password.
          6. +
          7. In the left navigation bar, click Downloads.
          8. +
          9. In the right pane, click Magento Enterprise Edition 2.X > Full Release.
          10. +
          11. Follow the instructions on your screen to download NAME.*
          12. + + +
          13. Transfer the patch to your development system.
          + +2. Extract the patch in your Magento installation directory. + + * **If you have your own server** + + If you have your own server, log in as or change to the Magento file system owner. Use one of the following commands to extract the archive. + + + + + + + + + + + + + + + + + + + + +
          File formatCommand to extract
          .tar.gztar zxf <filename>
          .zipunzip <filename>
          .tar.bz2tar jxf <filename>
          + + * **If you use shared hosting**, you can typically use your hosting provider's tools to extract the archive. + +3. Try your upgrade again. ### "We're sorry, we can't take that action right now" {#sorry} If this message displays during your upgrade, it can mean any of the following: From fdf8a342d419e11f31f400ed92fc72b3db14ead5 Mon Sep 17 00:00:00 2001 From: stevjohnson Date: Tue, 26 Jan 2016 13:56:16 -0600 Subject: [PATCH 040/902] Ready for spell check after edits --- ...ll_jan_22_16.md => tech_bull_jan_27_16.md} | 28 ++++++++++++++++--- 1 file changed, 24 insertions(+), 4 deletions(-) rename guides/v2.0/release-notes/{tech_bull_jan_22_16.md => tech_bull_jan_27_16.md} (73%) diff --git a/guides/v2.0/release-notes/tech_bull_jan_22_16.md b/guides/v2.0/release-notes/tech_bull_jan_27_16.md similarity index 73% rename from guides/v2.0/release-notes/tech_bull_jan_22_16.md rename to guides/v2.0/release-notes/tech_bull_jan_27_16.md index a59cc6ea2af..409f8b72181 100644 --- a/guides/v2.0/release-notes/tech_bull_jan_22_16.md +++ b/guides/v2.0/release-notes/tech_bull_jan_27_16.md @@ -6,7 +6,7 @@ title: Issues upgrading to 2.0.1 (Jan. 27, 2016) menu_title: Issues upgrading to 2.0.1 (Jan. 27, 2016) menu_node: menu_order: 1 -github_link: release-notes/tech_bull_jan_22_16.md +github_link: release-notes/tech_bull_jan_27_16.md --- ## Issues upgrading to 2.0.1 (Jan. 27, 2016) @@ -24,11 +24,19 @@ Upgrades to Magento Community Edition (CE) and Enterprise Edition (EE) 2.0.1 fai
        #### Detail -Our compressed archives for CE and EE were missing `.gitignore` files and, as a result, exceptions prevented the upgrade from completing successfully. +Our compressed archives for CE and EE were missing `.gitignore` files and, as a result, exceptions prevented the upgrade from completing successfully. We the `magento/magento-composer-installer` component so it reports missing files instead of throwing an exception with no details about what was wrong. At the same time, we fixed a separate issue that prevented upgrading to 2.0.1 if you use PHP 7. #### Solution +Use any of the following solutions: + +* [Web-based solution](#gitignore-web-sln) +* [Command-line solution](#gitignore-cli-sln) + +### Web-based solution {#gitignore-web-sln} +This solution is recommended for anyone who has no access to their Magento server's command line. + Download a compressed archive that contains the missing `.gitignore` files and the PHP 7 fix as follows: 1. Download one of the following patch archives. Patches are available in the following formats: `.zip`, `.tar.bz2`, `.tar.gz` @@ -44,7 +52,7 @@ Download a compressed archive that contains the missing `.gitignore` files and t Magento CE

        www.magento.com/download

        -

        NAME.*

        +

        Follow the instructions on your screen to download NAME.*

        Magento EE @@ -91,7 +99,19 @@ Download a compressed archive that contains the missing `.gitignore` files and t * **If you use shared hosting**, you can typically use your hosting provider's tools to extract the archive. -3. Try your upgrade again. +3. Upgrade to version 2.0.2. + +#### Command-line solution {#gitignore-cli-sln} +If you have access to your Magento server's command line, you can resolve the mising `.gitignore` files issue as follows: + +1. Log in to your Magento server as the Magento file system owner. +2. Change to your Magento installation directory. +3. Run the following commands in the order shown: + + composer update magento/magento-composer-installer + composer update +4. If your server runs PHP 7, you must also [apply the patch](#gitignore-web-sln). +5. Upgrade to version 2.0.2. ### "We're sorry, we can't take that action right now" {#sorry} If this message displays during your upgrade, it can mean any of the following: From de23ef24e4eb1a32e41510b74c617e06255ff9fe Mon Sep 17 00:00:00 2001 From: Steve Johnson Date: Tue, 26 Jan 2016 11:58:13 -0800 Subject: [PATCH 041/902] Spell check technical bulletin --- guides/v2.0/release-notes/tech_bull_jan_27_16.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guides/v2.0/release-notes/tech_bull_jan_27_16.md b/guides/v2.0/release-notes/tech_bull_jan_27_16.md index 409f8b72181..8a78d02a245 100644 --- a/guides/v2.0/release-notes/tech_bull_jan_27_16.md +++ b/guides/v2.0/release-notes/tech_bull_jan_27_16.md @@ -102,7 +102,7 @@ Download a compressed archive that contains the missing `.gitignore` files and t 3. Upgrade to version 2.0.2. #### Command-line solution {#gitignore-cli-sln} -If you have access to your Magento server's command line, you can resolve the mising `.gitignore` files issue as follows: +If you have access to your Magento server's command line, you can resolve the missing `.gitignore` files issue as follows: 1. Log in to your Magento server as the Magento file system owner. 2. Change to your Magento installation directory. From ed99473bf5cdf4cb8809547e6520131768c0cd99 Mon Sep 17 00:00:00 2001 From: stevjohnson Date: Tue, 26 Jan 2016 15:21:46 -0600 Subject: [PATCH 042/902] Update tech bulletin based on review --- .../v2.0/comp-mgr/upgrader/upgrade-start.md | 14 +++---- ..._jan_27_16.md => tech_bull_201-upgrade.md} | 37 +++++++++++-------- 2 files changed, 29 insertions(+), 22 deletions(-) rename guides/v2.0/release-notes/{tech_bull_jan_27_16.md => tech_bull_201-upgrade.md} (75%) diff --git a/guides/v2.0/comp-mgr/upgrader/upgrade-start.md b/guides/v2.0/comp-mgr/upgrader/upgrade-start.md index cc5938431a0..f52b42f9e65 100644 --- a/guides/v2.0/comp-mgr/upgrader/upgrade-start.md +++ b/guides/v2.0/comp-mgr/upgrader/upgrade-start.md @@ -36,13 +36,13 @@ To run System Upgrade: Magento begins searching for upgrades right away -#### Error - The following error can indicate one of several issues, including that you haven't entered your authentication keys in the Magento Admin: - - - - For suggested solutions to other causes indicated by this message, see troubleshooting. - The page displays similar to the following when we find components to upgrade.

        Magento finds software to upgrade

        4. Continue with Step 1. Select versions to upgrade. + +#### Error +The following error can indicate one of several issues, including that you haven't entered your authentication keys in the Magento Admin: + + + +For suggested solutions to other causes indicated by this message, see troubleshooting. diff --git a/guides/v2.0/release-notes/tech_bull_jan_27_16.md b/guides/v2.0/release-notes/tech_bull_201-upgrade.md similarity index 75% rename from guides/v2.0/release-notes/tech_bull_jan_27_16.md rename to guides/v2.0/release-notes/tech_bull_201-upgrade.md index 409f8b72181..6b52e1acf0e 100644 --- a/guides/v2.0/release-notes/tech_bull_jan_27_16.md +++ b/guides/v2.0/release-notes/tech_bull_201-upgrade.md @@ -2,25 +2,32 @@ layout: default group: release-notes subgroup: Technical Bulletin -title: Issues upgrading to 2.0.1 (Jan. 27, 2016) -menu_title: Issues upgrading to 2.0.1 (Jan. 27, 2016) +title: Technical Bulletin +menu_title: Issues upgrading to 2.0.1 (Jan. 28, 2016) menu_node: menu_order: 1 -github_link: release-notes/tech_bull_jan_27_16.md +github_link: release-notes/tech_bull_201-upgrade.md --- -## Issues upgrading to 2.0.1 (Jan. 27, 2016) -This bulletin informs of you of the following issues: +## Issues upgrading to 2.0.1 (Jan. 28, 2016) +This bulletin informs you of the following issues: -* [Upgrade fails because of missing `.gitignore` files](#gitignore) -* ["We're sorry, we can't take that action right now"](#sorry) +* [Issue: Upgrade fails because of missing `.gitignore` files](#gitignore) +* [Error during upgrade: "We're sorry, we can't take that action right now"](#sorry) -### Upgrade fails because of missing `.gitignore` files {#gitignore} -Upgrades to Magento Community Edition (CE) and Enterprise Edition (EE) 2.0.1 failed if you got the Magento software compressed archive (`.tar.gz`, `.zip`, and `.bz2`) *before* January 27, 2016. +### Issue: Upgrade failures {#gitignore} +Upgrades to Magento Community Edition (CE) and Enterprise Edition (EE) 2.0.1 failed if you got the Magento software compressed archive (`.tar.gz`, `.zip`, and `.bz2`) *before* Jan. 28, 2016. + +We addressed the following issues in a patch: + +* Missing `.gitignore` files that resulted in exceptions +* An error related to the updater application and PHP 7: + + PHP Warning: require_once(/public_html/magento2/update/vendor/autoload.php): failed to open stream: No such file or directory in /public_html/magento2/update/app/bootstrap.php
        -
        • Other types of installations are not affected.
        • -
        • New installations of Magento 2 CE and EE have no issues because we fixed our compressed archives.
        +
        • If you installed the Magento software using either git clone or composer create-project, you are not affected by this issue. You can ignore this bulletin.
        • +
        • New installations of Magento 2 CE and EE on or after Jan. 28, 2016 have no issues because we fixed our compressed archives.
        #### Detail @@ -28,13 +35,13 @@ Our compressed archives for CE and EE were missing `.gitignore` files and, as a At the same time, we fixed a separate issue that prevented upgrading to 2.0.1 if you use PHP 7. -#### Solution -Use any of the following solutions: +#### Resolution +Use any of the following resolutions: * [Web-based solution](#gitignore-web-sln) * [Command-line solution](#gitignore-cli-sln) -### Web-based solution {#gitignore-web-sln} +#### Web-based solution {#gitignore-web-sln} This solution is recommended for anyone who has no access to their Magento server's command line. Download a compressed archive that contains the missing `.gitignore` files and the PHP 7 fix as follows: @@ -113,7 +120,7 @@ If you have access to your Magento server's command line, you can resolve the mi 4. If your server runs PHP 7, you must also [apply the patch](#gitignore-web-sln). 5. Upgrade to version 2.0.2. -### "We're sorry, we can't take that action right now" {#sorry} +### Error during upgrade: "We're sorry, we can't take that action right now" {#sorry} If this message displays during your upgrade, it can mean any of the following: * You didn't authenticate with the System Upgrade utility From 36673a779dfe1b05486ca997901f15ee8a7afc75 Mon Sep 17 00:00:00 2001 From: stevjohnson Date: Tue, 26 Jan 2016 16:16:26 -0600 Subject: [PATCH 043/902] Start to update cron --- _includes/config/setup-cron.md | 30 +++++++++++++++++++++++------- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/_includes/config/setup-cron.md b/_includes/config/setup-cron.md index b4e66a79c82..438eafda5e6 100644 --- a/_includes/config/setup-cron.md +++ b/_includes/config/setup-cron.md @@ -6,7 +6,7 @@ Magento uses cron for two sets of tasks, and for each, cron can be run with a di * The general cron job that reindexes indexers, generates e-mails, generates the sitemap, and so on, typically runs as the PHP command-line user's `php.ini` * Two other cron jobs are used by the Component Manager and System Upgrade utilities. Those commands must use the web server's `php.ini`. -If you're not very experienced with running cron, you can run all commands with the web server's configuration; however, we leave the decision up to you. +If you're not experienced with running cron, you can run all commands with the web server's configuration; however, we leave the decision up to you. #### Find the web server configuration @@ -14,7 +14,7 @@ To find the web server configuration, run a -#### Find the PHP command-line configuration +#### Find the PHP command-line configuration To display the PHP command-line configuration, enter php -i | grep php.ini @@ -24,6 +24,15 @@ A sample result follows: Configuration File (php.ini) Path => /etc/php5/cli Loaded Configuration File => /etc/php5/cli/php.ini +#### Find the PHP binary +To display the path to your PHP binary, enter + + which php + +A sample result follows: + + /usr/bin/php + #### Create the cron job To create a cron job as the Magento file system owner, enter the following command as a user with `root` privileges: @@ -36,14 +45,21 @@ For example, A text editor displays. (You might need to choose a text editor first.) - */1 * * * * php -c /bin/magento cron:run - */1 * * * * php -c /update/cron.php - */1 * * * * php -c /bin/magento setup:cron:run + */1 * * * * php -c /etc/php5/cli /var/www/magento2/bin/magento cron:run + */1 * * * * php -c /var/www/magento2/update/cron.php + */1 * * * * php -c /var/www/magento2/bin/magento setup:cron:run + +where + +* `` is the absolute file system path to your PHP binary +* `` is the path to a `php.ini` file to use for the cron job -where `` is the path to a `php.ini` file to use for the cron job. +Example: + */1 * * * * /usr/bin/php -c /bin/magento cron:run + */1 * * * * /usr/bin/php -c /update/cron.php + */1 * * * * /usr/bin/php -c /bin/magento setup:cron:run -(To confirm which `.ini` file the web server uses, create a .) The first command (`magento cron:run`) reindexes indexers, send automated e-mails, generates the sitemap, and so on. Usually it's associated with the PHP command line `.ini` file. The other two commands are used by the Component Manager and System Upgrade. From 13368449110ab2f9ef12315cd7588bd4e518b15e Mon Sep 17 00:00:00 2001 From: stevjohnson Date: Tue, 26 Jan 2016 16:41:40 -0600 Subject: [PATCH 044/902] Update cron documentation --- _includes/config/setup-cron.md | 37 +++++++++------------- guides/v2.0/comp-mgr/prereq/prereq_cron.md | 13 +++++--- 2 files changed, 24 insertions(+), 26 deletions(-) diff --git a/_includes/config/setup-cron.md b/_includes/config/setup-cron.md index 438eafda5e6..f2ac22245f6 100644 --- a/_includes/config/setup-cron.md +++ b/_includes/config/setup-cron.md @@ -14,16 +14,6 @@ To find the web server configuration, run a -#### Find the PHP command-line configuration -To display the PHP command-line configuration, enter - - php -i | grep php.ini - -A sample result follows: - - Configuration File (php.ini) Path => /etc/php5/cli - Loaded Configuration File => /etc/php5/cli/php.ini - #### Find the PHP binary To display the path to your PHP binary, enter @@ -45,28 +35,31 @@ For example, A text editor displays. (You might need to choose a text editor first.) - */1 * * * * php -c /etc/php5/cli /var/www/magento2/bin/magento cron:run - */1 * * * * php -c /var/www/magento2/update/cron.php - */1 * * * * php -c /var/www/magento2/bin/magento setup:cron:run + */1 * * * * /php -c /bin/magento cron:run + */1 * * * * /php -c /update/cron.php + */1 * * * * /php -c /bin/magento setup:cron:run where * `` is the absolute file system path to your PHP binary * `` is the path to a `php.ini` file to use for the cron job -Example: +The first command (`magento cron:run`) reindexes indexers, send automated e-mails, generates the sitemap, and so on. Usually it's associated with the PHP command line `.ini` file. The other two commands are used by the Component Manager and System Upgrade. - */1 * * * * /usr/bin/php -c /bin/magento cron:run - */1 * * * * /usr/bin/php -c /update/cron.php - */1 * * * * /usr/bin/php -c /bin/magento setup:cron:run +For example, if the PHP binary is located in `/usr/bin`, you installed Magento in `/var/www/html/magento2`, and all commands use the web server's `php.ini`, enter +Example: -The first command (`magento cron:run`) reindexes indexers, send automated e-mails, generates the sitemap, and so on. Usually it's associated with the PHP command line `.ini` file. The other two commands are used by the Component Manager and System Upgrade. + */1 * * * * /usr/bin/php -c /etc/php5/apache2/php.ini /var/www/magento2/bin/magento cron:run + */1 * * * * /usr/bin/php -c /etc/php5/apache2/php.ini /var/www/magento2/update/cron.php + */1 * * * * /usr/bin/php -c /etc/php5/apache2/php.ini /var/www/magento2/bin/magento setup:cron:run -For example, if you installed Magento in `/var/www/html/magento2` and all commands use the web server's `php.ini`, enter +*Optional*. To keep a running log of cron activity (especially if you're debugging an issue), append output to a file; for example: + +Example: - */1 * * * * php -c /etc/php5/cli/apache2 /var/www/html/magento2/bin/magento cron:run - */1 * * * * php -c /etc/php5/cli/apache2 /var/www/html/magento2/update/cron.php - */1 * * * * php -c /etc/php5/cli/apache2 /var/www/html/magento2/bin/magento setup:cron:run + */1 * * * * /usr/bin/php -c /etc/php5/apache2/php.ini /var/www/magento2/bin/magento cron:run > /tmp/cron.log& + */1 * * * * /usr/bin/php -c /etc/php5/apache2/php.ini /var/www/magento2/update/cron.php > /tmp/cron.log& + */1 * * * * /usr/bin/php -c /etc/php5/apache2/php.ini /var/www/magento2/bin/magento setup:cron:run > /tmp/cron.log& Save your changes to the crontab and exit the editor. \ No newline at end of file diff --git a/guides/v2.0/comp-mgr/prereq/prereq_cron.md b/guides/v2.0/comp-mgr/prereq/prereq_cron.md index 9df9ca1a719..a2cdc7d0f79 100644 --- a/guides/v2.0/comp-mgr/prereq/prereq_cron.md +++ b/guides/v2.0/comp-mgr/prereq/prereq_cron.md @@ -33,13 +33,18 @@ Enable the cron jobs as `phpinfo.php` file. For example, - */1 * * * * php /var/www/html/magento2/update/cron.php & - */1 * * * * php /var/www/html/magento2/bin/magento setup:cron:run & + */1 * * * * /usr/bin/php -c /etc/php5/apache2/php.ini /var/www/magento2/update/cron.php + */1 * * * * /usr/bin/php -c /etc/php5/apache2/php.ini /var/www/magento2/bin/magento setup:cron:run 3. Save your changes to cron and exit the editor. From fd3ee68f67d3dbb7418773e3ef560e3b365f05ac Mon Sep 17 00:00:00 2001 From: stevjohnson Date: Tue, 26 Jan 2016 17:37:01 -0600 Subject: [PATCH 045/902] Update tech bulletin and cron --- _includes/config/setup-cron.md | 21 ++++------ guides/v2.0/comp-mgr/prereq/prereq_cron.md | 4 +- .../release-notes/tech_bull_201-upgrade.md | 41 +++++++++++++++---- 3 files changed, 41 insertions(+), 25 deletions(-) diff --git a/_includes/config/setup-cron.md b/_includes/config/setup-cron.md index f2ac22245f6..f1d62ba7382 100644 --- a/_includes/config/setup-cron.md +++ b/_includes/config/setup-cron.md @@ -35,14 +35,15 @@ For example, A text editor displays. (You might need to choose a text editor first.) - */1 * * * * /php -c /bin/magento cron:run - */1 * * * * /php -c /update/cron.php - */1 * * * * /php -c /bin/magento setup:cron:run + */1 * * * * -c /bin/magento cron:run [> &] + */1 * * * * -c /update/cron.php [> &] + */1 * * * * -c /bin/magento setup:cron:run [> &] where * `` is the absolute file system path to your PHP binary * `` is the path to a `php.ini` file to use for the cron job +* `[> &]` is an optional but recommended string that appends cron output to a file. This is particularly useful for troubleshooting errors. The first command (`magento cron:run`) reindexes indexers, send automated e-mails, generates the sitemap, and so on. Usually it's associated with the PHP command line `.ini` file. The other two commands are used by the Component Manager and System Upgrade. @@ -50,16 +51,8 @@ For example, if the PHP binary is located in `/usr/bin`, you installed Magento i Example: - */1 * * * * /usr/bin/php -c /etc/php5/apache2/php.ini /var/www/magento2/bin/magento cron:run - */1 * * * * /usr/bin/php -c /etc/php5/apache2/php.ini /var/www/magento2/update/cron.php - */1 * * * * /usr/bin/php -c /etc/php5/apache2/php.ini /var/www/magento2/bin/magento setup:cron:run - -*Optional*. To keep a running log of cron activity (especially if you're debugging an issue), append output to a file; for example: - -Example: - - */1 * * * * /usr/bin/php -c /etc/php5/apache2/php.ini /var/www/magento2/bin/magento cron:run > /tmp/cron.log& - */1 * * * * /usr/bin/php -c /etc/php5/apache2/php.ini /var/www/magento2/update/cron.php > /tmp/cron.log& - */1 * * * * /usr/bin/php -c /etc/php5/apache2/php.ini /var/www/magento2/bin/magento setup:cron:run > /tmp/cron.log& + */1 * * * * /usr/bin/php -c /etc/php5/apache2/php.ini /var/www/magento2/bin/magento cron:run > /var/www/magento2/var/log/magento.cron.log& + */1 * * * * /usr/bin/php -c /etc/php5/apache2/php.ini /var/www/magento2/update/cron.php > /var/www/magento2/var/log/update.cron.log& + */1 * * * * /usr/bin/php -c /etc/php5/apache2/php.ini /var/www/magento2/bin/magento setup:cron:run > /var/www/magento2/var/log/setup.cron.log& Save your changes to the crontab and exit the editor. \ No newline at end of file diff --git a/guides/v2.0/comp-mgr/prereq/prereq_cron.md b/guides/v2.0/comp-mgr/prereq/prereq_cron.md index a2cdc7d0f79..17a0e2e7afc 100644 --- a/guides/v2.0/comp-mgr/prereq/prereq_cron.md +++ b/guides/v2.0/comp-mgr/prereq/prereq_cron.md @@ -33,8 +33,8 @@ Enable the cron jobs as compressed archive (`.tar.gz`, `.zip`, and `.bz2`) *before* Jan. 28, 2016. +Upgrades to Magento Community Edition (CE) and Enterprise Edition (EE) 2.0.1 failed if you got the Magento software compressed archive (`.tar.gz`, `.zip`, and `.bz2`). We addressed the following issues in a patch: @@ -25,13 +25,35 @@ We addressed the following issues in a patch: PHP Warning: require_once(/public_html/magento2/update/vendor/autoload.php): failed to open stream: No such file or directory in /public_html/magento2/update/app/bootstrap.php +The following table summarizes what you need to do. + + + + + + + + + + + + + + + + + + + + +
        Magento versionWhat to do
        Magento CE or EE 2.0.0Apply the patch
        Magento CE or EE 2.0.1Apply the patch
        Magento CE or EE 2.0.2No patch is required; you can ignore this bulletin.
        +
        -
        • If you installed the Magento software using either git clone or composer create-project, you are not affected by this issue. You can ignore this bulletin.
        • -
        • New installations of Magento 2 CE and EE on or after Jan. 28, 2016 have no issues because we fixed our compressed archives.
        +

        If you installed the Magento software using either git clone or composer create-project, you are not affected by this issue. You can ignore this bulletin.

        #### Detail -Our compressed archives for CE and EE were missing `.gitignore` files and, as a result, exceptions prevented the upgrade from completing successfully. We the `magento/magento-composer-installer` component so it reports missing files instead of throwing an exception with no details about what was wrong. +Our compressed archives for CE and EE were missing `.gitignore` files and, as a result, exceptions prevented the upgrade from completing successfully. We updated the `magento/magento-composer-installer` component so it reports missing files instead of throwing an exception with no details about what was wrong. At the same time, we fixed a separate issue that prevented upgrading to 2.0.1 if you use PHP 7. @@ -77,11 +99,13 @@ Download a compressed archive that contains the missing `.gitignore` files and t -2. Extract the patch in your Magento installation directory. +
        +

        Use the same patch whether or not you installed optional sample data.

        +
        - * **If you have your own server** +2. Extract the patch in your Magento installation directory. - If you have your own server, log in as or change to the Magento file system owner. Use one of the following commands to extract the archive. + * **If you have your own server**, log in as or change to the Magento file system owner. Use one of the following commands to extract the archive. @@ -117,7 +141,7 @@ If you have access to your Magento server's command line, you can resolve the mi composer update magento/magento-composer-installer composer update -4. If your server runs PHP 7, you must also [apply the patch](#gitignore-web-sln). +4. *PHP 7 only*. If your server runs PHP 7, you must also [apply the patch](#gitignore-web-sln). 5. Upgrade to version 2.0.2. ### Error during upgrade: "We're sorry, we can't take that action right now" {#sorry} @@ -126,4 +150,3 @@ If this message displays during your upgrade, it can mean any of the following: * You didn't authenticate with the System Upgrade utility * The updater application isn't initialized - This cause is relatively uncommon. \ No newline at end of file From 920e4ddbf622fb733f1dac3255f24a22763a1ff4 Mon Sep 17 00:00:00 2001 From: Oleksandra Marchenko Date: Wed, 27 Jan 2016 13:46:14 +0200 Subject: [PATCH 046/902] Incorporated comments to Checkout form --- common/images/how_checkout_form.png | Bin 18177 -> 15338 bytes guides/v2.0/howdoi/checkout/checkout_form.md | 21 ++++++++++--------- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/common/images/how_checkout_form.png b/common/images/how_checkout_form.png index 0c8060c99816c048100aed65239c596c7c5855c5..342e4b281f0c4205f9bb9f99f5c9a57a13a577c0 100644 GIT binary patch literal 15338 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 literal 18177 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
        fKDgFpe(PoGtM9;n11S#W(2&6r*^8%Sw% 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/view/frontend/layout/checkout_index_index.xml`. Also you locate the regions in the `.html` templates of the blocks used in this layout file. +Certain default checkout templates declare regions where additional content can be inserted. You can add your custom form in any of these regions. These regions are provided with corresponding comments in the default Checkout page layout file `/view/frontend/layout/checkout_index_index.xml`. Also you locate the regions in the `.html` templates of the blocks used in this layout file. -For example, the shipping JS component (see [app/code/Magento/Checkout/view/frontend/web/template/shipping.html]({{mage2000.url}}app/code/Magento/Checkout/view/frontend/web/template/shipping.html)) provides the `before-form` region and corresponding UI container. +For example, the shipping JS component (see [app/code/Magento/Checkout/view/frontend/web/template/shipping.html]({{site.mage2000url}}app/code/Magento/Checkout/view/frontend/web/template/shipping.html)) provides the `before-form` region and corresponding UI container. -Any content added here is rendered before the Shipping Address form on the Shipping Information step. To add content to this region, create a `checkout_index_index.xml` layout update similar to the following in the `/view/frontend/layout/`: +Any content added here is rendered before the Shipping Address form on the Shipping Information step. To add content to this region, create a `checkout_index_index.xml` layout update in the `/view/frontend/layout/`. It should be similar to the following: {%highlight xml%} @@ -243,7 +243,7 @@ The following code sample shows configuration of the form that contains four fie ### Dynamically defined forms -If form fields are generated dynamically, developer must implement a [plugin]({{site.gdeurl}}extension-dev-guide/plugins.html) for the `\Magento\Checkout\Block\Checkout\LayoutProcessor::process` method. +If form fields are generated dynamically, you must implement a [plugin]({{site.gdeurl}}extension-dev-guide/plugins.html) for the `\Magento\Checkout\Block\Checkout\LayoutProcessor::process` method. A plugin can add custom fields definitions to layout at run-time. The format of the field definition is the same as for fields defined in layout. For example: @@ -268,4 +268,5 @@ $textField = [ ## Illustration If you use the code samples provided as examples in this topic, this would result in adding the following form to the Shipping Information step: + The input form with four fields From cd94ae26e02b5071a0c831ce7d0ceda6847f2c74 Mon Sep 17 00:00:00 2001 From: Oleksandra Marchenko Date: Wed, 27 Jan 2016 16:04:27 +0200 Subject: [PATCH 047/902] Added review comments --- guides/v2.0/howdoi/checkout/checkout_edit_form.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/guides/v2.0/howdoi/checkout/checkout_edit_form.md b/guides/v2.0/howdoi/checkout/checkout_edit_form.md index 4bfefec9337..98dbc1d1995 100644 --- a/guides/v2.0/howdoi/checkout/checkout_edit_form.md +++ b/guides/v2.0/howdoi/checkout/checkout_edit_form.md @@ -11,7 +11,7 @@ github_link: howdoi/checkout/checkout_edit_form.md

        What's in this topic

        This topic describes how to change the HTML templates of form fields in the forms on the Checkout page. This refers to the forms used on both steps of the Checkout: Shipping Information step and Review and Payments Information step. By changing the template you can add additional elements displayed with the field, for example images, change the CSS class assigned to it, add attributes and so on. -## Overview +

        Overview

        The forms used in Checkout are implemented using Knockout JS. @@ -112,6 +112,6 @@ In this file, add content similar to the following: ## Modifying the custom template after it was applied {#modify} -If you modify your custom `.html` template after it was applied on the store pages, the changes will not apply until you do the following: delete all files in the `pub/static/frontend` and `var/view_preprocessing` directories, then reload the pages. +If you modify your custom `.html` template after it was applied on the store pages, the changes will not apply until you do the following: delete all files in the `pub/static/frontend` and `var/view_preprocessing` directories, and then reload the pages. From 905d11acf8b7fe9b77514a69887023b20c14e838 Mon Sep 17 00:00:00 2001 From: Oleksandra Marchenko Date: Wed, 27 Jan 2016 16:10:04 +0200 Subject: [PATCH 048/902] merged with develop --- guides/v2.0/howdoi/checkout/checkout_overview.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/guides/v2.0/howdoi/checkout/checkout_overview.md b/guides/v2.0/howdoi/checkout/checkout_overview.md index 64fdd05c1b2..655f86d021d 100644 --- a/guides/v2.0/howdoi/checkout/checkout_overview.md +++ b/guides/v2.0/howdoi/checkout/checkout_overview.md @@ -20,13 +20,13 @@ You can customize the default checkout in many ways. Here the following customiz - [Add a new checkout step]({{site.gdeurl}}howdoi/checkout/checkout_new_step.html) - [Customize the view of an existing step]({{site.gdeurl}}howdoi/checkout/checkout_new_step.html) -<<<<<<< HEAD - [Add a custom payment method to checkout]({{site.gdeurl}}howdoi/checkout/checkout_payment.html) - [Add custom validations before order placement]({{site.gdeurl}}howdoi/checkout/checkout_order.html) - [Add custom shipping carrier validations]({{site.gdeurl}}checkout/checkout_carrier.html) - [Add custom input mask for ZIP code]({{site.gdeurl}}checkout/checkout_zip.html) -======= ->>>>>>> 5478c31952a5a7b05c9aa98f36aed6c005b4c5a3 + - [Add a custom template for a form field on Checkout page]({{site.gdeurl}}checkout/checkout_edit_form.html) + + For the sake of compatibility, upgradability, and easy maintenance, do not edit the default Magento code, add your customizations in a custom module. From bdaeddc04c2f77f2bfa3742f3b5888037a12913a Mon Sep 17 00:00:00 2001 From: stevjohnson Date: Wed, 27 Jan 2016 08:50:50 -0600 Subject: [PATCH 049/902] Fix error in troubleshooting topic --- guides/v2.0/install-gde/trouble/tshoot_access-browser.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guides/v2.0/install-gde/trouble/tshoot_access-browser.md b/guides/v2.0/install-gde/trouble/tshoot_access-browser.md index fbea49901f0..6231e550474 100644 --- a/guides/v2.0/install-gde/trouble/tshoot_access-browser.md +++ b/guides/v2.0/install-gde/trouble/tshoot_access-browser.md @@ -16,7 +16,7 @@ redirect_from: /guides/v1.0/install-gde/trouble/tshoot_access-browser.html ### Symptom: The following message displays when you try to access the Magento storefront or Admin: Whoops, it looks like you have an invalid PHP version. - Magento supports PHP 5.4.11 or newer. + Magento supports PHP 5.5 or newer. #### Solution From 1d631b2496a52c388431eaa5dbb5e7bcbdd6b1d1 Mon Sep 17 00:00:00 2001 From: Oleksandra Marchenko Date: Wed, 27 Jan 2016 16:56:07 +0200 Subject: [PATCH 050/902] Minor corrections --- guides/v2.0/howdoi/checkout/checkout_edit_form.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/guides/v2.0/howdoi/checkout/checkout_edit_form.md b/guides/v2.0/howdoi/checkout/checkout_edit_form.md index 98dbc1d1995..229afe13e0f 100644 --- a/guides/v2.0/howdoi/checkout/checkout_edit_form.md +++ b/guides/v2.0/howdoi/checkout/checkout_edit_form.md @@ -9,16 +9,16 @@ github_link: howdoi/checkout/checkout_edit_form.md ---

        What's in this topic

        -This topic describes how to change the HTML templates of form fields in the forms on the Checkout page. This refers to the forms used on both steps of the Checkout: Shipping Information step and Review and Payments Information step. By changing the template you can add additional elements displayed with the field, for example images, change the CSS class assigned to it, add attributes and so on. +This topic describes how to change the HTML templates of form fields in forms on the Checkout page. This refers to the forms used on both steps of the Checkout: Shipping Information step and Review and Payments Information step. By changing the template you can add additional elements displayed with the field, for example images, change the CSS class assigned to it, add attributes and so on.

        Overview

        -The forms used in Checkout are implemented using Knockout JS. +The forms used on the Checkout page are implemented using Knockout JS. To change the template of the form field, do the following: 1. [Create a custom HTML template for knockout JS script that will render the form field](#template). -2. [Specify the new template in the checkout page layout](#layout). +2. [Specify the new template in the Checkout page layout](#layout). There are more details about each step in the following sections. @@ -29,7 +29,7 @@ There are more details about each step in the following sections. ## Prerequisites -Set Magento to the production mode while you perform all customizations and debugging. +[Set Magento to the production mode]({{site.gdeurl}}config-guide/cli/config-cli-subcommands-mode.html) while you perform all customizations and debugging. For the sake of compatibility, upgradability, and easy maintenance, do not edit the default Magento code, add your customizations in a separate module. For your checkout customization to be applied correctly, your custom module should [depend]({{site.gdeurl}}extension-dev-guide/composer-integration.html) on the Magento_Checkout module. From 35a0817c5f81df59142cfe5cb3b5bbdb9a054b80 Mon Sep 17 00:00:00 2001 From: Oleksandra Marchenko Date: Wed, 27 Jan 2016 18:30:36 +0200 Subject: [PATCH 051/902] Added the custom ship.address renderers topic --- guides/v2.0/howdoi/checkout/checkout_address.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 guides/v2.0/howdoi/checkout/checkout_address.md diff --git a/guides/v2.0/howdoi/checkout/checkout_address.md b/guides/v2.0/howdoi/checkout/checkout_address.md new file mode 100644 index 00000000000..ddbcae7a0d2 --- /dev/null +++ b/guides/v2.0/howdoi/checkout/checkout_address.md @@ -0,0 +1,13 @@ +--- +layout: default +group: howdoi +subgroup: checkout +title: Add custom shipping address renderers +menu_title: Add custom shipping address renderers +menu_order: 8 +github_link: howdoi/checkout/checkout_address.md +--- +## What's in this topic +Magento uses address renderers to display shipping address details on the Shipping Information step of the checkout flow. Default address renderers cover the majority of use cases, but Magento provides way to register custom address renderer for a new address type. + +

        This is a part of the bigger task of adding a custom shipping method to your Magento store.

        \ No newline at end of file From fad5594c04d0eac280f73c815ebc693eb5315ca5 Mon Sep 17 00:00:00 2001 From: stevjohnson Date: Wed, 27 Jan 2016 14:40:57 -0600 Subject: [PATCH 052/902] Revised tech bulletin for command line only --- .../release-notes/tech_bull_201-upgrade.md | 87 ++----------------- 1 file changed, 6 insertions(+), 81 deletions(-) diff --git a/guides/v2.0/release-notes/tech_bull_201-upgrade.md b/guides/v2.0/release-notes/tech_bull_201-upgrade.md index 7c1c49a17a3..34f44d6dd28 100644 --- a/guides/v2.0/release-notes/tech_bull_201-upgrade.md +++ b/guides/v2.0/release-notes/tech_bull_201-upgrade.md @@ -35,15 +35,16 @@ The following table summarizes what you need to do.
        - + - + - - + +
        Magento CE or EE 2.0.0Apply the patchApply the fix
        Magento CE or EE 2.0.1Apply the patchApply the fix
        Magento CE or EE 2.0.2No patch is required; you can ignore this bulletin.Magento CE or EE 2.0.2 installed or you haven't installed Magento yet.

        No action is required. Install version 2.0.2 if you haven't already.

        +

        You can ignore this bulletin.

        @@ -58,82 +59,7 @@ Our compressed archives for CE and EE were missing `.gitignore` files and, as a At the same time, we fixed a separate issue that prevented upgrading to 2.0.1 if you use PHP 7. #### Resolution -Use any of the following resolutions: - -* [Web-based solution](#gitignore-web-sln) -* [Command-line solution](#gitignore-cli-sln) - -#### Web-based solution {#gitignore-web-sln} -This solution is recommended for anyone who has no access to their Magento server's command line. - -Download a compressed archive that contains the missing `.gitignore` files and the PHP 7 fix as follows: - -1. Download one of the following patch archives. Patches are available in the following formats: `.zip`, `.tar.bz2`, `.tar.gz` - - - - - - - - - - - - - - - - - - -
        Magento editionPatch location
        Magento CE

        www.magento.com/download

        -

        Follow the instructions on your screen to download NAME.*

        Magento EEUse the following steps: -
        1. Go to www.magento.com
        2. -
        3. In the top horizontal navigation bar, click My Account.
        4. -
        5. Log in with your Magento user name and password.
        6. -
        7. In the left navigation bar, click Downloads.
        8. -
        9. In the right pane, click Magento Enterprise Edition 2.X > Full Release.
        10. -
        11. Follow the instructions on your screen to download NAME.*
        12. - - -
        13. Transfer the patch to your development system.
        - -
        -

        Use the same patch whether or not you installed optional sample data.

        -
        - -2. Extract the patch in your Magento installation directory. - - * **If you have your own server**, log in as or change to the
        Magento file system owner. Use one of the following commands to extract the archive. - - - - - - - - - - - - - - - - - - - - -
        File formatCommand to extract
        .tar.gztar zxf <filename>
        .zipunzip <filename>
        .tar.bz2tar jxf <filename>
        - - * **If you use shared hosting**, you can typically use your hosting provider's tools to extract the archive. - -3. Upgrade to version 2.0.2. - -#### Command-line solution {#gitignore-cli-sln} -If you have access to your Magento server's command line, you can resolve the missing `.gitignore` files issue as follows: +This resolution requires you to have access to your Magento server's command line. Resolve the missing `.gitignore` files issue as follows: 1. Log in to your Magento server as the Magento file system owner. 2. Change to your Magento installation directory. @@ -141,7 +67,6 @@ If you have access to your Magento server's command line, you can resolve the mi composer update magento/magento-composer-installer composer update -4. *PHP 7 only*. If your server runs PHP 7, you must also [apply the patch](#gitignore-web-sln). 5. Upgrade to version 2.0.2. ### Error during upgrade: "We're sorry, we can't take that action right now" {#sorry} From 3a6bffc61c7994555df3fe3980bd84be50da27de Mon Sep 17 00:00:00 2001 From: stevjohnson Date: Wed, 27 Jan 2016 18:40:53 -0600 Subject: [PATCH 053/902] Initial 2.0 branch publish test --- guides/v2.0/install-gde/bk-install-guide.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/guides/v2.0/install-gde/bk-install-guide.md b/guides/v2.0/install-gde/bk-install-guide.md index 50d96e640d0..d0fa71506d8 100644 --- a/guides/v2.0/install-gde/bk-install-guide.md +++ b/guides/v2.0/install-gde/bk-install-guide.md @@ -10,6 +10,9 @@ github_link: install-gde/bk-install-guide.md redirect_from: /guides/v1.0/install-gde/bk-install-guide.html --- + +HELLO +

        Magento software installation

        Hi, we're glad you're among the 240,000 merchants worldwide who put their trust in our eCommerce software. We've gathered some information to help you get started with Magento and with your Magento installation. From e0288a970803d042960f677058a6342be0d076a9 Mon Sep 17 00:00:00 2001 From: stevjohnson Date: Thu, 28 Jan 2016 04:26:15 -0600 Subject: [PATCH 054/902] Updates --- .../release-notes/tech_bull_201-upgrade.md | 36 ++++++++++++++++--- 1 file changed, 32 insertions(+), 4 deletions(-) diff --git a/guides/v2.0/release-notes/tech_bull_201-upgrade.md b/guides/v2.0/release-notes/tech_bull_201-upgrade.md index 34f44d6dd28..47353b7c3f1 100644 --- a/guides/v2.0/release-notes/tech_bull_201-upgrade.md +++ b/guides/v2.0/release-notes/tech_bull_201-upgrade.md @@ -58,16 +58,44 @@ Our compressed archives for CE and EE were missing `.gitignore` files and, as a At the same time, we fixed a separate issue that prevented upgrading to 2.0.1 if you use PHP 7. -#### Resolution -This resolution requires you to have access to your Magento server's command line. Resolve the missing `.gitignore` files issue as follows: +Use any of the following resolutions: + +* [Resolution 1 (if you're using version 2.0.0)](#resolution1) +* [Resolution 2 (if your upgrade to 2.0.1 has failed)](#resolution2) +* [Resolution 3 (does not require command line access)](#resolution3) + +#### Resolution 1 (using version 2.0.0) {#resolution1} +To Resolve the missing `.gitignore` files issue using this method, all of the following must be true: + +* You must have command-line access to your Magento server +* Your server must be running Magento 2 CE or EE version 2.0.0 + + To confirm the version, you can either look in the lower right corner of the Magento Admin or you can use the `php /bin/magento --version` command. + +To resolve the issue: 1. Log in to your Magento server as the Magento file system owner. 2. Change to your Magento installation directory. -3. Run the following commands in the order shown: +3. Run the following command: composer update magento/magento-composer-installer + +4. If prompted, enter your authentication keys. +4. Make sure `magento/magento-composer-installer` is version 0.1.6 +5. Run the following commands in the order shown: + composer require magento/product-community-edition 2.0.1 --no-update composer update -5. Upgrade to version 2.0.2. + +#### Resolution 2 (upgrade to 2.0.1 has failed){#resolution2} +If your upgrade to Magento CE or EE 2.0.1 has failed with the `.gitignore` exceptions, you must update the `magento/magento-composer-installer` component so it reports missing files instead of throwing an exception with no details about what was wrong. + +You must run `composer update` twice to update components and then delete some files that tell Magento your store is in maintenance mode. + +To resolve the issue: + +TBD + +#### Resolution 3 (does not require command line access) {#resolution3} ### Error during upgrade: "We're sorry, we can't take that action right now" {#sorry} If this message displays during your upgrade, it can mean any of the following: From dc7c51f364710d4e425626b5f8fc904c213079cd Mon Sep 17 00:00:00 2001 From: stevjohnson Date: Thu, 28 Jan 2016 05:20:38 -0600 Subject: [PATCH 055/902] Rewrite upgrade instrux --- .../release-notes/tech_bull_201-upgrade.md | 45 ++++++++++++++++--- 1 file changed, 40 insertions(+), 5 deletions(-) diff --git a/guides/v2.0/release-notes/tech_bull_201-upgrade.md b/guides/v2.0/release-notes/tech_bull_201-upgrade.md index 47353b7c3f1..4114097a418 100644 --- a/guides/v2.0/release-notes/tech_bull_201-upgrade.md +++ b/guides/v2.0/release-notes/tech_bull_201-upgrade.md @@ -65,7 +65,7 @@ Use any of the following resolutions: * [Resolution 3 (does not require command line access)](#resolution3) #### Resolution 1 (using version 2.0.0) {#resolution1} -To Resolve the missing `.gitignore` files issue using this method, all of the following must be true: +To resolve the missing `.gitignore` files issue using this method, all of the following must be true: * You must have command-line access to your Magento server * Your server must be running Magento 2 CE or EE version 2.0.0 @@ -83,19 +83,54 @@ To resolve the issue: 4. If prompted, enter your authentication keys. 4. Make sure `magento/magento-composer-installer` is version 0.1.6 5. Run the following commands in the order shown: + composer require magento/product-community-edition 2.0.1 --no-update composer update +6. Verify your server is running version 2.0.1 in any of the ways discussed earlier in this resolution. +7. Optionally upgrade to version 2.0.2. + +#### Resolution 2 (upgrade to 2.0.1 has failed) {#resolution2} +To resolve the missing `.gitignore` files issue using this method, all of the following must be true: -#### Resolution 2 (upgrade to 2.0.1 has failed){#resolution2} -If your upgrade to Magento CE or EE 2.0.1 has failed with the `.gitignore` exceptions, you must update the `magento/magento-composer-installer` component so it reports missing files instead of throwing an exception with no details about what was wrong. +* You must have command-line access to your Magento server +* You must have attempted to upgrade to 2.0.1 and failed -You must run `composer update` twice to update components and then delete some files that tell Magento your store is in maintenance mode. +You must run `composer update` twice to update components and then delete two files: one that recorded the failed upgrade and another that tells Magento your store is in maintenance mode. To resolve the issue: -TBD +1. Log in to your Magento server as the Magento file system owner. +2. Change to your Magento installation directory. +3. Run the following command: + + composer update magento/magento-composer-installer + +4. If prompted, enter your authentication keys. +5. Enter the following command: + + composer update +4. Make sure `magento/magento-composer-installer` is version 0.1.6 + + The following error might display: + + [ErrorException] + Source /var/www/html/magento2/vendor/magento/magento2-base/dev/tests/integration/.gitignore does not exist +6. After the command completes, enter the same command again: + + composer update +7. Wait while the command completes. +8. Delete the following files from `/var`: + + * `.update_error.flag` + * `.maintenance.flag` +8. Verify your Magento version is 2.0.1 in any of the following ways: + + * Using the `php /bin/magento --version` command + * Log in to the Magento Admin. The version displays in the lower right corner of the page. +7. Optionally upgrade to version 2.0.2. #### Resolution 3 (does not require command line access) {#resolution3} +To resolve the missing `.gitignore` files issue if you have no command-line access to your Magento server, install version 2.0.2 on a local machine and transfer the Magento codebase to your Magento server using FTP or a utility provided by your shared hosting service. ### Error during upgrade: "We're sorry, we can't take that action right now" {#sorry} If this message displays during your upgrade, it can mean any of the following: From 93efb18dfc91bdbcb0e5d4e91b3d4b00b06ce94f Mon Sep 17 00:00:00 2001 From: stevjohnson Date: Thu, 28 Jan 2016 05:22:07 -0600 Subject: [PATCH 056/902] Change component:enable command to module:enable --- guides/v2.0/extension-dev-guide/module-load-order.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guides/v2.0/extension-dev-guide/module-load-order.md b/guides/v2.0/extension-dev-guide/module-load-order.md index fe334ab985c..c9e3f215d68 100644 --- a/guides/v2.0/extension-dev-guide/module-load-order.md +++ b/guides/v2.0/extension-dev-guide/module-load-order.md @@ -21,7 +21,7 @@ If you know that your component's logic depends on something in another componen

        If you change the component load order using <sequence>, you must regenerate the component list in config.php; otherwise, the load order does not take effect.

        -

        Currently, the only way to do this is to enable the component using magento component:enable <component-list>, where <component-list> is the component or components to which you added <sequence>.

        +

        Currently, the only way to do this is to enable the component using magento module:enable <module-list>, where <,pdi;e-list> is the component or components to which you added <sequence>.

        From 9efc84eccdb158959182a7901b453526a19816bb Mon Sep 17 00:00:00 2001 From: stevjohnson Date: Thu, 28 Jan 2016 05:26:08 -0600 Subject: [PATCH 057/902] Update _config.yml with new site variables --- _config.yml | 35 +++++++++++++++++++++++++++++------ 1 file changed, 29 insertions(+), 6 deletions(-) diff --git a/_config.yml b/_config.yml index f9ec31f1238..e83ce9ef623 100644 --- a/_config.yml +++ b/_config.yml @@ -2,24 +2,47 @@ encoding: "utf-8" title: Magento 2 Developer Documentation email: mailto:DL-Magento-Doc-Feedback@ebay.com -description: Magento 2 Developer Guide -baseurl: "/" +description: > # this means to ignore newlines until "baseurl:" + Magento 2 Developer Guide. +baseurl: "/pages/Magento/devdocs_internal/" # url: "https://github.com/magento/devdocs" # the base hostname & protocol for your site # twitter_username: magento # github_username: magento markdown_ext: "markdown,mkdown,mkdn,mkd,md" +# 2.0.0 variables gdeurl: "/guides/v2.0/" -githuburl: "https://github.com/magento/devdocs/tree/develop/guides/v2.0/" +githuburl: "https://github.corp.ebay.com/Magento/devdocs_internal/tree/develop/guides/v2.0/" +mage2000url: "https://github.com/magento/magento2/blob/2.0/" + +# 1.x variables +m1xgdeurl: "/guides/m1x/" +m1xgithuburl: "https://github.corp.ebay.com/Magento/devdocs_internal/tree/develop/guides/m1x/" + +# 2.1.0 variables +gdeurl21: "/guides/v2.1/" +githuburl21: "https://github.corp.ebay.com/Magento/devdocs_internal/tree/develop/guides/v2.1/" +mage2100url: "https://github.com/magento/magento2/blob/2.1/" + +# 2.2.0 variables +gdeurl22: "/guides/v2.2/" +githuburl22: "https://github.corp.ebay.com/Magento/devdocs_internal/tree/develop/guides/v2.2/" +mage2200url: "https://github.com/magento/magento2/blob/2.2/" + +# 2.3.0 variables + +gdeurl23: "/guides/v2.3/" +githuburl23: "https://github.corp.ebay.com/Magento/devdocs_internal/tree/develop/guides/v2.3/" +mage2300url: "https://github.com/magento/magento2/blob/2.3/" + +# Other variables namem2fedg: "Magento 2 Frontend Developer's Guide" namem2devgde: "Magento 2 Developer's Guide" namem2apiref: "Magento 2 API Reference" namem2install: "Magento 2 Installation Guide" -mage2000url: "https://github.com/magento/magento2/blob/develop/" + # toc_baseurl: "https://github.corp.ebay.com/pages/Magento/devdocs_internal" -m1xgdeurl: "/guides/m1x/" -m1xgithuburl: "https://github.com/magento/devdocs/tree/develop/guides/m1x/" # Build settings markdown: kramdown From 478ad522e45d3fa092780e50d7efc0d84c0b8b54 Mon Sep 17 00:00:00 2001 From: stevjohnson Date: Thu, 28 Jan 2016 05:36:24 -0600 Subject: [PATCH 058/902] Update README.md to mention the 2.0 branch --- README.md | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/README.md b/README.md index 95338d06942..8b27659f932 100644 --- a/README.md +++ b/README.md @@ -2,16 +2,13 @@ Welcome! This site contains the latest Magento developer documentation for ongoing Magento 2.0 releases. -To contribute, please fork the develop branch. We won't accept pull requests into master. +To contribute, please fork the 2.0 branch. # Building this site You can build this site yourself using Jekyll. Here's how: ```bash -# Copy the sample config file and name it "config.yml" -$ cp _config.devdocs.yml _config.yml - # Install dependencies $ bundle install From daa314f692fe961a70159305de25c411d7dc8bed Mon Sep 17 00:00:00 2001 From: stevjohnson Date: Thu, 28 Jan 2016 05:49:52 -0600 Subject: [PATCH 059/902] Update baseurl --- _config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_config.yml b/_config.yml index e83ce9ef623..8e744792780 100644 --- a/_config.yml +++ b/_config.yml @@ -4,7 +4,7 @@ title: Magento 2 Developer Documentation email: mailto:DL-Magento-Doc-Feedback@ebay.com description: > # this means to ignore newlines until "baseurl:" Magento 2 Developer Guide. -baseurl: "/pages/Magento/devdocs_internal/" +baseurl: "/" # url: "https://github.com/magento/devdocs" # the base hostname & protocol for your site # twitter_username: magento # github_username: magento From a2212a73574b9db2a64308be3daec8415fe8ed09 Mon Sep 17 00:00:00 2001 From: Steve Johnson Date: Thu, 28 Jan 2016 05:53:20 -0600 Subject: [PATCH 060/902] Undo test change --- guides/v2.0/install-gde/bk-install-guide.md | 3 --- 1 file changed, 3 deletions(-) diff --git a/guides/v2.0/install-gde/bk-install-guide.md b/guides/v2.0/install-gde/bk-install-guide.md index d0fa71506d8..50d96e640d0 100644 --- a/guides/v2.0/install-gde/bk-install-guide.md +++ b/guides/v2.0/install-gde/bk-install-guide.md @@ -10,9 +10,6 @@ github_link: install-gde/bk-install-guide.md redirect_from: /guides/v1.0/install-gde/bk-install-guide.html --- - -HELLO -

        Magento software installation

        Hi, we're glad you're among the 240,000 merchants worldwide who put their trust in our eCommerce software. We've gathered some information to help you get started with Magento and with your Magento installation. From 0182d322661b673f1ceabbfcf80bdde6c000f4b0 Mon Sep 17 00:00:00 2001 From: stevjohnson Date: Thu, 28 Jan 2016 06:25:58 -0600 Subject: [PATCH 061/902] New review of 2.0.2 tech bulletin --- guides/v2.0/release-notes/tech_bull_201-upgrade.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/guides/v2.0/release-notes/tech_bull_201-upgrade.md b/guides/v2.0/release-notes/tech_bull_201-upgrade.md index 4114097a418..2a05867ac87 100644 --- a/guides/v2.0/release-notes/tech_bull_201-upgrade.md +++ b/guides/v2.0/release-notes/tech_bull_201-upgrade.md @@ -111,10 +111,10 @@ To resolve the issue: composer update 4. Make sure `magento/magento-composer-installer` is version 0.1.6 - The following error might display: + The following exception might display; it's expected: [ErrorException] - Source /var/www/html/magento2/vendor/magento/magento2-base/dev/tests/integration/.gitignore does not exist + Source /var/www/html/magento2/vendor/magento/magento2-base/dev/tests/integration/.gitignore does not exist 6. After the command completes, enter the same command again: composer update From a7aeb09c125a06329b8930b0fc4de155d52b141d Mon Sep 17 00:00:00 2001 From: Ben Date: Thu, 28 Jan 2016 14:16:48 +0000 Subject: [PATCH 062/902] Fix a typo in tabs widget guide - Change contend to content --- guides/v2.0/javascript-dev-guide/widgets/widget_tabs.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guides/v2.0/javascript-dev-guide/widgets/widget_tabs.md b/guides/v2.0/javascript-dev-guide/widgets/widget_tabs.md index 36e21a508fe..37119962454 100644 --- a/guides/v2.0/javascript-dev-guide/widgets/widget_tabs.md +++ b/guides/v2.0/javascript-dev-guide/widgets/widget_tabs.md @@ -61,7 +61,7 @@ The option of the ajaxContent -Defines if the contend is loaded by Ajax request. +Defines if the content is loaded by Ajax request. The option of the collapsible widget used by tabs. **Type**: Boolean From 0d5eccb191279637b140109398c574e7832f60c5 Mon Sep 17 00:00:00 2001 From: stevjohnson Date: Thu, 28 Jan 2016 09:15:15 -0600 Subject: [PATCH 063/902] Update --- guides/v2.0/release-notes/tech_bull_201-upgrade.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/guides/v2.0/release-notes/tech_bull_201-upgrade.md b/guides/v2.0/release-notes/tech_bull_201-upgrade.md index 2a05867ac87..0235c658e23 100644 --- a/guides/v2.0/release-notes/tech_bull_201-upgrade.md +++ b/guides/v2.0/release-notes/tech_bull_201-upgrade.md @@ -80,7 +80,7 @@ To resolve the issue: composer update magento/magento-composer-installer -4. If prompted, enter your authentication keys. +4. If prompted, enter your authentication keys. 4. Make sure `magento/magento-composer-installer` is version 0.1.6 5. Run the following commands in the order shown: @@ -105,7 +105,7 @@ To resolve the issue: composer update magento/magento-composer-installer -4. If prompted, enter your authentication keys. +4. If prompted, enter your authentication keys. 5. Enter the following command: composer update From 65f08558b9d86c41505b7fd5301d1e33393402ee Mon Sep 17 00:00:00 2001 From: stevjohnson Date: Thu, 28 Jan 2016 09:44:18 -0600 Subject: [PATCH 064/902] Add PHP 7 patch instructions --- .../release-notes/tech_bull_201-upgrade.md | 86 ++++++++++++++++++- 1 file changed, 84 insertions(+), 2 deletions(-) diff --git a/guides/v2.0/release-notes/tech_bull_201-upgrade.md b/guides/v2.0/release-notes/tech_bull_201-upgrade.md index 0235c658e23..e9fea8a0f72 100644 --- a/guides/v2.0/release-notes/tech_bull_201-upgrade.md +++ b/guides/v2.0/release-notes/tech_bull_201-upgrade.md @@ -18,7 +18,7 @@ This bulletin informs you of the following issues: ### Issue: Upgrade failures {#gitignore} Upgrades to Magento Community Edition (CE) and Enterprise Edition (EE) 2.0.1 failed if you got the Magento software compressed archive (`.tar.gz`, `.zip`, and `.bz2`). -We addressed the following issues in a patch: +We addressed the following issues: * Missing `.gitignore` files that resulted in exceptions * An error related to the updater application and PHP 7: @@ -41,6 +41,10 @@ The following table summarizes what you need to do. Magento CE or EE 2.0.1 Apply the fix + + Magento CE or EE 2.0.0 or 2.0.1 and your Magento server runs PHP 7.0.2 + Apply the fix and the patch + Magento CE or EE 2.0.2 installed or you haven't installed Magento yet.

        No action is required. Install version 2.0.2 if you haven't already.

        @@ -56,13 +60,14 @@ The following table summarizes what you need to do. #### Detail Our compressed archives for CE and EE were missing `.gitignore` files and, as a result, exceptions prevented the upgrade from completing successfully. We updated the `magento/magento-composer-installer` component so it reports missing files instead of throwing an exception with no details about what was wrong. -At the same time, we fixed a separate issue that prevented upgrading to 2.0.1 if you use PHP 7. +At the same time, we fixed a separate issue that prevented upgrading to 2.0.1 if you use PHP 7. (The fix for this issue is a patch that you must apply separately from the `.gitignore` issue fix.) Use any of the following resolutions: * [Resolution 1 (if you're using version 2.0.0)](#resolution1) * [Resolution 2 (if your upgrade to 2.0.1 has failed)](#resolution2) * [Resolution 3 (does not require command line access)](#resolution3) +* [PHP 7 patch](#resolution4) #### Resolution 1 (using version 2.0.0) {#resolution1} To resolve the missing `.gitignore` files issue using this method, all of the following must be true: @@ -87,6 +92,7 @@ To resolve the issue: composer require magento/product-community-edition 2.0.1 --no-update composer update 6. Verify your server is running version 2.0.1 in any of the ways discussed earlier in this resolution. +9. If your Magento server runs PHP 7, you must also [apply a patch](#resolution4). 7. Optionally upgrade to version 2.0.2. #### Resolution 2 (upgrade to 2.0.1 has failed) {#resolution2} @@ -127,11 +133,87 @@ To resolve the issue: * Using the `php /bin/magento --version` command * Log in to the Magento Admin. The version displays in the lower right corner of the page. +9. If your Magento server runs PHP 7, you must also [apply a patch](#resolution4). 7. Optionally upgrade to version 2.0.2. #### Resolution 3 (does not require command line access) {#resolution3} To resolve the missing `.gitignore` files issue if you have no command-line access to your Magento server, install version 2.0.2 on a local machine and transfer the Magento codebase to your Magento server using FTP or a utility provided by your shared hosting service. +### PHP 7 patch {#resolution4} +If your Magento server runs PHP 7.0.1, you must apply a patch before you can upgrade. + +To apply the patch: + +1. Download one of the following patch archives. Patches are available in the following formats: `.zip`, `.tar.bz2`, `.tar.gz` + + + + + + + + + + + + + + + + + + + + + + +
        Magento editionPatch location
        Magento CE

        www.magento.com/download

        +

        Follow the instructions on your screen to download MDVA-84.*

        Magento EE merchant portalUse the following steps: +
        1. Go to www.magento.com
        2. +
        3. In the top horizontal navigation bar, click My Account.
        4. +
        5. Log in with your Magento user name and password.
        6. +
        7. In the left navigation bar, click Downloads.
        8. +
        9. Click Magento Enterprise Edition 2.X > Magento Enterprise Edition 2.x Release > Support Patches
        10. +
        11. Follow the instructions on your screen to download MDVA-84.*
        12. + + +
        13. Transfer the patch to your development system.
        Magento EE partner portalUse the following steps: +
        1. Log in to partners.magento.com
        2. +
        3. Click Magento Enterprise Edition > Magento Enterprise Edition 2.X > Magento Enterprise Edition 2.x Release > Support Patches.
        4. +
        5. In the left navigation bar, click Downloads.
        6. +
        7. Follow the instructions on your screen to download MDVA-84.*
        8. +
        9. Transfer the patch to your development system.
        + +
        +

        Use the same patch whether or not you installed optional sample data.

        +
        + +2. Extract the patch in your Magento installation directory. + +Log in as or change to the Magento file system owner. Use one of the following commands to extract the archive. + + + + + + + + + + + + + + + + + + + + +
        File formatCommand to extract
        .tar.gztar zxf <filename>
        .zipunzip <filename>
        .tar.bz2tar jxf <filename>
        + + ### Error during upgrade: "We're sorry, we can't take that action right now" {#sorry} If this message displays during your upgrade, it can mean any of the following: From 74227338858cb2e0ae832ce06ccb51ee656b66f6 Mon Sep 17 00:00:00 2001 From: stevjohnson Date: Thu, 28 Jan 2016 11:36:12 -0600 Subject: [PATCH 065/902] Update based on PHP 7 issue for composer create-project as well, add upgrade paths --- .../v2.0/comp-mgr/trouble/cman/were-sorry.md | 8 +- .../release-notes/tech_bull_201-upgrade.md | 214 +++++++++--------- 2 files changed, 115 insertions(+), 107 deletions(-) diff --git a/guides/v2.0/comp-mgr/trouble/cman/were-sorry.md b/guides/v2.0/comp-mgr/trouble/cman/were-sorry.md index 6273ee6281d..296b34a6f91 100644 --- a/guides/v2.0/comp-mgr/trouble/cman/were-sorry.md +++ b/guides/v2.0/comp-mgr/trouble/cman/were-sorry.md @@ -18,6 +18,7 @@ See one of the following sections for possible solutions: * [Problem: you're not authenticated](#not-auth) * [Problem: the updater application isn't initialized](#updater) +* [Problem: you cloned the Magento GitHub repository](#git-clone) ### Problem: you're not authenticated {#not-auth} You might not have entered your authentication keys in the Magento Admin. @@ -63,4 +64,9 @@ Modify Magento's `composer.json` to reference the `https://repo.magento.com` rep 8. Enter the following command: composer install -9. After the command completes, try the upgrade again. \ No newline at end of file +9. After the command completes, try the upgrade again. + +### You cloned the Magento GitHub repository {#git-clone} +If you installed the Magento software by cloning the Magento repository, you cannot use the System Upgrade utility to upgrade it. + +Instead, see one of the options discussed in Contributing developers—update, reinstall Magento. diff --git a/guides/v2.0/release-notes/tech_bull_201-upgrade.md b/guides/v2.0/release-notes/tech_bull_201-upgrade.md index e9fea8a0f72..17c29f547b2 100644 --- a/guides/v2.0/release-notes/tech_bull_201-upgrade.md +++ b/guides/v2.0/release-notes/tech_bull_201-upgrade.md @@ -3,20 +3,27 @@ layout: default group: release-notes subgroup: Technical Bulletin title: Technical Bulletin -menu_title: Issues upgrading to 2.0.1 (Jan. 28, 2016) +menu_title: Magento upgrade issues (Jan. 28, 2016) menu_node: menu_order: 1 github_link: release-notes/tech_bull_201-upgrade.md --- -## Issues upgrading to 2.0.1 (Jan. 28, 2016) +## Magento upgrade issues (Jan. 28, 2016) This bulletin informs you of the following issues: * [Issue: Upgrade fails because of missing `.gitignore` files](#gitignore) * [Error during upgrade: "We're sorry, we can't take that action right now"](#sorry) +
        +

        If you installed the Magento software using git clone, you are not affected by this issue. You can ignore this bulletin.

        +
        + ### Issue: Upgrade failures {#gitignore} -Upgrades to Magento Community Edition (CE) and Enterprise Edition (EE) 2.0.1 failed if you got the Magento software compressed archive (`.tar.gz`, `.zip`, and `.bz2`). +Magento Community Edition (CE) and Enterprise Edition (EE) upgrades failed in any of the following circumstances: + +* If you got the Magento software compressed archive (`.tar.gz`, `.zip`, or `.bz2`). +* If your server runs PHP 7 and you installed the Magento software using *either* a compressed archive or the Composer metapackage. We addressed the following issues: @@ -29,34 +36,35 @@ The following table summarizes what you need to do. - - - - - - + + + + + + + + + + - + - - + + - - + +
        Magento versionWhat to do
        Magento CE or EE 2.0.0
        Upgrade pathWhat to do
        Magento CE or EE 2.0.2 installed or you haven't installed Magento yet.

        No action is required. Install version 2.0.2 if you haven't already.

        +

        You can ignore this bulletin.

        Magento CE or EE 2.0.0 to 2.0.1 Apply the fix
        Magento CE or EE 2.0.1Magento CE or EE 2.0.0 to 2.0.2 Apply the fix
        Magento CE or EE 2.0.0 or 2.0.1 and your Magento server runs PHP 7.0.2Apply the fix and the patchMagento CE or EE 2.0.1 to 2.0.2Apply the fix
        Magento CE or EE 2.0.2 installed or you haven't installed Magento yet.

        No action is required. Install version 2.0.2 if you haven't already.

        -

        You can ignore this bulletin.

        Any of the preceding and your Magento server runs PHP 7

        Apply the patch and the fix

        +

        Note: You must apply the PHP 7 patch whether you installed the Magento software using a compressed archive or the Composer metapackage.

        -
        -

        If you installed the Magento software using either git clone or composer create-project, you are not affected by this issue. You can ignore this bulletin.

        -
        - #### Detail Our compressed archives for CE and EE were missing `.gitignore` files and, as a result, exceptions prevented the upgrade from completing successfully. We updated the `magento/magento-composer-installer` component so it reports missing files instead of throwing an exception with no details about what was wrong. @@ -64,10 +72,85 @@ At the same time, we fixed a separate issue that prevented upgrading to 2.0.1 if Use any of the following resolutions: +* [PHP 7 patch](#resolution4) * [Resolution 1 (if you're using version 2.0.0)](#resolution1) * [Resolution 2 (if your upgrade to 2.0.1 has failed)](#resolution2) * [Resolution 3 (does not require command line access)](#resolution3) -* [PHP 7 patch](#resolution4) + +### PHP 7 patch {#resolution4} +If your Magento server runs PHP 7, you must apply a patch first. + +To apply the patch: + +1. Download one of the following patch archives. Patches are available in the following formats: `.zip`, `.tar.bz2`, `.tar.gz` + + + + + + + + + + + + + + + + + + + + + + +
        Magento editionPatch location
        Magento CE

        www.magento.com/download

        +

        Follow the instructions on your screen to download MDVA-84.*

        Magento EE merchant portalUse the following steps: +
        1. Go to www.magento.com
        2. +
        3. In the top horizontal navigation bar, click My Account.
        4. +
        5. Log in with your Magento user name and password.
        6. +
        7. In the left navigation bar, click Downloads.
        8. +
        9. Click Magento Enterprise Edition 2.X > Magento Enterprise Edition 2.x Release > Support Patches
        10. +
        11. Follow the instructions on your screen to download MDVA-84.*
        12. + + +
        13. Transfer the patch to your development system.
        Magento EE partner portalUse the following steps: +
        1. Log in to partners.magento.com
        2. +
        3. Click Magento Enterprise Edition > Magento Enterprise Edition 2.X > Magento Enterprise Edition 2.x Release > Support Patches.
        4. +
        5. In the left navigation bar, click Downloads.
        6. +
        7. Follow the instructions on your screen to download MDVA-84.*
        8. +
        9. Transfer the patch to your development system.
        + +
        +

        Use the same patch whether or not you installed optional sample data.

        +
        + +2. Extract the patch in your Magento installation directory. + + Log in as or change to the Magento file system owner. Use one of the following commands to extract the archive. + + + + + + + + + + + + + + + + + + + + +
        File formatCommand to extract
        .tar.gztar zxf <filename>
        .zipunzip <filename>
        .tar.bz2tar jxf <filename>
        +3. We recommend you upgrade to version 2.0.2. #### Resolution 1 (using version 2.0.0) {#resolution1} To resolve the missing `.gitignore` files issue using this method, all of the following must be true: @@ -92,14 +175,13 @@ To resolve the issue: composer require magento/product-community-edition 2.0.1 --no-update composer update 6. Verify your server is running version 2.0.1 in any of the ways discussed earlier in this resolution. -9. If your Magento server runs PHP 7, you must also [apply a patch](#resolution4). -7. Optionally upgrade to version 2.0.2. +7. We recommend you upgrade to version 2.0.2. -#### Resolution 2 (upgrade to 2.0.1 has failed) {#resolution2} +#### Resolution 2 (upgrade to 2.0.1 or 2.0.2 has failed) {#resolution2} To resolve the missing `.gitignore` files issue using this method, all of the following must be true: * You must have command-line access to your Magento server -* You must have attempted to upgrade to 2.0.1 and failed +* You must have attempted to upgrade to either 2.0.1 or 2.0.2 and failed You must run `composer update` twice to update components and then delete two files: one that recorded the failed upgrade and another that tells Magento your store is in maintenance mode. @@ -107,10 +189,6 @@ To resolve the issue: 1. Log in to your Magento server as the Magento file system owner. 2. Change to your Magento installation directory. -3. Run the following command: - - composer update magento/magento-composer-installer - 4. If prompted, enter your authentication keys. 5. Enter the following command: @@ -133,90 +211,14 @@ To resolve the issue: * Using the `php /bin/magento --version` command * Log in to the Magento Admin. The version displays in the lower right corner of the page. -9. If your Magento server runs PHP 7, you must also [apply a patch](#resolution4). -7. Optionally upgrade to version 2.0.2. +7. We recommend you upgrade to version 2.0.2. #### Resolution 3 (does not require command line access) {#resolution3} To resolve the missing `.gitignore` files issue if you have no command-line access to your Magento server, install version 2.0.2 on a local machine and transfer the Magento codebase to your Magento server using FTP or a utility provided by your shared hosting service. -### PHP 7 patch {#resolution4} -If your Magento server runs PHP 7.0.1, you must apply a patch before you can upgrade. - -To apply the patch: - -1. Download one of the following patch archives. Patches are available in the following formats: `.zip`, `.tar.bz2`, `.tar.gz` - - - - - - - - - - - - - - - - - - - - - - -
        Magento editionPatch location
        Magento CE

        www.magento.com/download

        -

        Follow the instructions on your screen to download MDVA-84.*

        Magento EE merchant portalUse the following steps: -
        1. Go to www.magento.com
        2. -
        3. In the top horizontal navigation bar, click My Account.
        4. -
        5. Log in with your Magento user name and password.
        6. -
        7. In the left navigation bar, click Downloads.
        8. -
        9. Click Magento Enterprise Edition 2.X > Magento Enterprise Edition 2.x Release > Support Patches
        10. -
        11. Follow the instructions on your screen to download MDVA-84.*
        12. - - -
        13. Transfer the patch to your development system.
        Magento EE partner portalUse the following steps: -
        1. Log in to partners.magento.com
        2. -
        3. Click Magento Enterprise Edition > Magento Enterprise Edition 2.X > Magento Enterprise Edition 2.x Release > Support Patches.
        4. -
        5. In the left navigation bar, click Downloads.
        6. -
        7. Follow the instructions on your screen to download MDVA-84.*
        8. -
        9. Transfer the patch to your development system.
        - -
        -

        Use the same patch whether or not you installed optional sample data.

        -
        - -2. Extract the patch in your Magento installation directory. - -Log in as or change to the Magento file system owner. Use one of the following commands to extract the archive. - - - - - - - - - - - - - - - - - - - - -
        File formatCommand to extract
        .tar.gztar zxf <filename>
        .zipunzip <filename>
        .tar.bz2tar jxf <filename>
        - - ### Error during upgrade: "We're sorry, we can't take that action right now" {#sorry} If this message displays during your upgrade, it can mean any of the following: * You didn't authenticate with the System Upgrade utility * The updater application isn't initialized - +* Problem: you cloned the Magento GitHub repository \ No newline at end of file From 2a5846b8cd348a5ba472a2405b16de0b63d061aa Mon Sep 17 00:00:00 2001 From: stevjohnson Date: Thu, 28 Jan 2016 13:43:34 -0600 Subject: [PATCH 066/902] Ready for final spell check --- .../release-notes/tech_bull_201-upgrade.md | 23 ++++++++++--------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/guides/v2.0/release-notes/tech_bull_201-upgrade.md b/guides/v2.0/release-notes/tech_bull_201-upgrade.md index 17c29f547b2..25aae8280ba 100644 --- a/guides/v2.0/release-notes/tech_bull_201-upgrade.md +++ b/guides/v2.0/release-notes/tech_bull_201-upgrade.md @@ -15,10 +15,6 @@ This bulletin informs you of the following issues: * [Issue: Upgrade fails because of missing `.gitignore` files](#gitignore) * [Error during upgrade: "We're sorry, we can't take that action right now"](#sorry) -
        -

        If you installed the Magento software using git clone, you are not affected by this issue. You can ignore this bulletin.

        -
        - ### Issue: Upgrade failures {#gitignore} Magento Community Edition (CE) and Enterprise Edition (EE) upgrades failed in any of the following circumstances: @@ -70,7 +66,7 @@ Our compressed archives for CE and EE were missing `.gitignore` files and, as a At the same time, we fixed a separate issue that prevented upgrading to 2.0.1 if you use PHP 7. (The fix for this issue is a patch that you must apply separately from the `.gitignore` issue fix.) -Use any of the following resolutions: +Use the following resolutions: * [PHP 7 patch](#resolution4) * [Resolution 1 (if you're using version 2.0.0)](#resolution1) @@ -152,7 +148,7 @@ To apply the patch: 3. We recommend you upgrade to version 2.0.2. -#### Resolution 1 (using version 2.0.0) {#resolution1} +#### Resolution 1 (using version 2.0.0 or 2.0.1) {#resolution1} To resolve the missing `.gitignore` files issue using this method, all of the following must be true: * You must have command-line access to your Magento server @@ -172,10 +168,15 @@ To resolve the issue: 4. Make sure `magento/magento-composer-installer` is version 0.1.6 5. Run the following commands in the order shown: - composer require magento/product-community-edition 2.0.1 --no-update + composer require magento/product-community-edition 2.0.2 --no-update composer update -6. Verify your server is running version 2.0.1 in any of the ways discussed earlier in this resolution. -7. We recommend you upgrade to version 2.0.2. + +
        +

        You can upgrade to either magento/product-community-edition 2.0.2 or magento/product-community-edition 2.0.1; we recommend 2.0.2.

        +
        + +6. Verify your server is running version 2.0.2 in any of the ways discussed earlier in this resolution. + #### Resolution 2 (upgrade to 2.0.1 or 2.0.2 has failed) {#resolution2} To resolve the missing `.gitignore` files issue using this method, all of the following must be true: @@ -203,7 +204,7 @@ To resolve the issue: composer update 7. Wait while the command completes. -8. Delete the following files from `/var`: +8. Delete the following files from `/var` directory: * `.update_error.flag` * `.maintenance.flag` @@ -221,4 +222,4 @@ If this message displays during your upgrade, it can mean any of the following: * You didn't authenticate with the System Upgrade utility * The updater application isn't initialized -* Problem: you cloned the Magento GitHub repository \ No newline at end of file +* You cloned the Magento GitHub repository \ No newline at end of file From 68cdc15ac93812e753a3f521a5772eac64981848 Mon Sep 17 00:00:00 2001 From: stevjohnson Date: Thu, 28 Jan 2016 14:19:58 -0600 Subject: [PATCH 067/902] Update tech bulletin --- common/images/upgr_gitignore-err.png | Bin 0 -> 62148 bytes .../release-notes/tech_bull_201-upgrade.md | 225 ++++++++++++++++++ .../v2.0/release-notes/tech_bull_jan_22_16.md | 17 -- 3 files changed, 225 insertions(+), 17 deletions(-) create mode 100644 common/images/upgr_gitignore-err.png create mode 100644 guides/v2.0/release-notes/tech_bull_201-upgrade.md delete mode 100644 guides/v2.0/release-notes/tech_bull_jan_22_16.md diff --git a/common/images/upgr_gitignore-err.png b/common/images/upgr_gitignore-err.png new file mode 100644 index 0000000000000000000000000000000000000000..cb852ad4dacc13f9a43f2b4eb080af784091d1ff GIT binary patch literal 62148 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 archive (`.tar.gz`, `.zip`, or `.bz2`). +* If your server runs PHP 7 and you installed the Magento software using *either* a compressed archive or the Composer metapackage. + +We addressed the following issues: + +* Missing `.gitignore` files that resulted in exceptions +* An error related to the updater application and PHP 7: + + PHP Warning: require_once(/public_html/magento2/update/vendor/autoload.php): failed to open stream: No such file or directory in /public_html/magento2/update/app/bootstrap.php + +The following table summarizes what you need to do. + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        Upgrade pathWhat to do
        Magento CE or EE 2.0.2 installed or you haven't installed Magento yet.

        No action is required. Install version 2.0.2 if you haven't already.

        +

        You can ignore this bulletin.

        Magento CE or EE 2.0.0 to 2.0.1Apply the fix
        Magento CE or EE 2.0.0 to 2.0.2Apply the fix
        Magento CE or EE 2.0.1 to 2.0.2Apply the fix
        Any of the preceding and your Magento server runs PHP 7

        Apply the patch and the fix

        +

        Note: You must apply the PHP 7 patch whether you installed the Magento software using a compressed archive or the Composer metapackage.

        + +#### Detail +Our compressed archives for CE and EE were missing `.gitignore` files and, as a result, exceptions prevented the upgrade from completing successfully. We updated the `magento/magento-composer-installer` component so it reports missing files instead of throwing an exception with no details about what was wrong. + +At the same time, we fixed a separate issue that prevented upgrading if you use PHP 7. (The fix for this issue is a patch that you must apply separately from the `.gitignore` issue fix.) + +Use the following resolutions: + +* [PHP 7 patch](#resolution4) +* [Resolution 1 (if you're using version 2.0.0 or 2.0.1)](#resolution1) +* [Resolution 2 (if your upgrade to 2.0.1 or 2.0.2 has failed)](#resolution2) +* [Resolution 3 (does not require command line access)](#resolution3) + +### PHP 7 patch {#resolution4} +If your Magento server runs PHP 7, you must apply a patch first. + +To apply the patch: + +1. Download one of the following patch archives. Patches are available in the following formats: `.zip`, `.tar.bz2`, `.tar.gz` + + + + + + + + + + + + + + + + + + + + + + +
        Magento editionPatch location
        Magento CE

        www.magento.com/download

        +

        Follow the instructions on your screen to download MDVA-84.*

        Magento EE merchant portalUse the following steps: +
        1. Go to www.magento.com
        2. +
        3. In the top horizontal navigation bar, click My Account.
        4. +
        5. Log in with your Magento user name and password.
        6. +
        7. In the left navigation bar, click Downloads.
        8. +
        9. Click Magento Enterprise Edition 2.X > Magento Enterprise Edition 2.x Release > Support Patches
        10. +
        11. Follow the instructions on your screen to download MDVA-84.*
        12. + + +
        13. Transfer the patch to your development system.
        Magento EE partner portalUse the following steps: +
        1. Log in to partners.magento.com
        2. +
        3. Click Magento Enterprise Edition > Magento Enterprise Edition 2.X > Magento Enterprise Edition 2.x Release > Support Patches.
        4. +
        5. In the left navigation bar, click Downloads.
        6. +
        7. Follow the instructions on your screen to download MDVA-84.*
        8. +
        9. Transfer the patch to your development system.
        + +
        +

        Use the same patch whether or not you installed optional sample data.

        +
        + +2. Extract the patch in your Magento installation directory. + + Log in as or change to the Magento file system owner. Use one of the following commands to extract the archive. + + + + + + + + + + + + + + + + + + + + +
        File formatCommand to extract
        .tar.gztar zxf <filename>
        .zipunzip <filename>
        .tar.bz2tar jxf <filename>
        +3. We recommend you upgrade to version 2.0.2. + +#### Resolution 1 (using version 2.0.0 or 2.0.1) {#resolution1} +To resolve the missing `.gitignore` files issue using this method, all of the following must be true: + +* You must have command-line access to your Magento server +* Your server must be running Magento 2 CE or EE version 2.0.0 + + To confirm the version, you can either look in the lower right corner of the Magento Admin or you can use the `php /bin/magento --version` command. + +To resolve the issue: + +1. Log in to your Magento server as the Magento file system owner. +2. Change to your Magento installation directory. +3. Run the following command: + + composer update magento/magento-composer-installer + +4. If prompted, enter your authentication keys. +4. Make sure `magento/magento-composer-installer` is version 0.1.6 +5. Run the following commands in the order shown: + + composer require magento/product-community-edition 2.0.2 --no-update + composer update + +
        +

        You can upgrade to either magento/product-community-edition 2.0.2 or magento/product-community-edition 2.0.1; we recommend 2.0.2.

        +
        + +6. Verify your server is running version 2.0.2 in any of the ways discussed earlier in this resolution. + + +#### Resolution 2 (upgrade to 2.0.1 or 2.0.2 has failed) {#resolution2} +To resolve the missing `.gitignore` files issue using this method, all of the following must be true: + +* You must have command-line access to your Magento server +* You must have attempted to upgrade to either 2.0.1 or 2.0.2 and failed + +You must run `composer update` twice to update components and then delete two files: one that recorded the failed upgrade and another that tells Magento your store is in maintenance mode. + +To resolve the issue: + +1. Log in to your Magento server as the Magento file system owner. +2. Change to your Magento installation directory. +4. If prompted, enter your authentication keys. +5. Enter the following command: + + composer update +4. Make sure `magento/magento-composer-installer` is version 0.1.6 + + The following exception might display; it's expected: + + [ErrorException] + Source /var/www/html/magento2/vendor/magento/magento2-base/dev/tests/integration/.gitignore does not exist +6. After the command completes, enter the same command again: + + composer update +7. Wait while the command completes. +8. Delete the following files from `/var` directory: + + * `.update_error.flag` + * `.maintenance.flag` +8. Verify your Magento version is 2.0.1 in any of the following ways: + + * Using the `php /bin/magento --version` command + * Log in to the Magento Admin. The version displays in the lower right corner of the page. +7. We recommend you upgrade to version 2.0.2. + +#### Resolution 3 (does not require command line access) {#resolution3} +To resolve the missing `.gitignore` files issue if you have no command-line access to your Magento server, install version 2.0.2 on a local machine and transfer the Magento codebase to your Magento server using FTP or a utility provided by your shared hosting service. + +### Error during upgrade: "We're sorry, we can't take that action right now" {#sorry} +If this message displays during your upgrade, it can mean any of the following: + +* You didn't authenticate with the System Upgrade utility +* The updater application isn't initialized +* You cloned the Magento GitHub repository \ No newline at end of file diff --git a/guides/v2.0/release-notes/tech_bull_jan_22_16.md b/guides/v2.0/release-notes/tech_bull_jan_22_16.md deleted file mode 100644 index 99445d88549..00000000000 --- a/guides/v2.0/release-notes/tech_bull_jan_22_16.md +++ /dev/null @@ -1,17 +0,0 @@ ---- -layout: default -group: -title: Technical Bulletin -menu_title: -menu_node: -menu_order: 2 -github_link: -redirect_from: /guides/v1.0/release-notes/known-issues.html ---- - -

        Technical Bulletin

        - -
        Date: January 22, 2016

        Issue:

        - *2.0.x upgrades fail when installed with .zip archive and then updated either with composer-update or System Upgrade tool.* IF you installed 2.0.0 using a .zip archive, AND you attempt to upgrade to 2.0.1 using either the Magento System Upgrade Utility or Composer, the upgrade process fails. The upgrade fails because certain required files were missing from the .zip file. Note that upgrade processes for installations that did not originally use a .zip file are not affected by this issue.

        Resolution:

        - *In Progress* Magento is working to deliver a resolution. In the meantime, please refer to the Magento forum for the latest information. * If you have not yet installed 2.0.1 nor updated to 2.0.1, please wait until a resolution is available shortly. - * If you have already attempted to upgrade to 2.0.1 and the process failed, instructions for resolving the failed upgrade will be communicated as soon as possible. \ No newline at end of file From 544defa593c35ce4c19a4093c46798bcb0b55323 Mon Sep 17 00:00:00 2001 From: stevjohnson Date: Thu, 28 Jan 2016 15:15:43 -0600 Subject: [PATCH 068/902] Update release notes page to point to all current versions --- guides/v2.0/release-notes/bk-release-notes.md | 22 ++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/guides/v2.0/release-notes/bk-release-notes.md b/guides/v2.0/release-notes/bk-release-notes.md index fba663d6aae..715d8229ee3 100644 --- a/guides/v2.0/release-notes/bk-release-notes.md +++ b/guides/v2.0/release-notes/bk-release-notes.md @@ -1,15 +1,27 @@ --- layout: default group: release-notes -title: Release Notes redirect -menu_title: Release Notes redirect +title: Release Notes +menu_title: Release Notes menu_order: 1 menu_node: github_link: release-notes/bk-release-notes.md redirect_from: /guides/v1.0/release-notes/bk-release-notes.html --- -The Magento 2.0 GA Release Notes have moved. Click one of the following links to be redirected. +The Magento 2.0.x Release Notes have moved. Click one of the following links to be redirected. -* Magento CE Release Notes -* Magento EE Release Notes \ No newline at end of file +Version 2.0.0 + +* Magento CE 2.0 Release Notes +* Magento EE 2.0 Release Notes + +Version 2.0.1 + +* Magento CE Release Notes +* Magento EE Release Notes + +Version 2.0.2 + +* Magento CE Release Notes +* Magento EE Release Notes From f7c1acd738de76db5d18807d921cb9a7575e057f Mon Sep 17 00:00:00 2001 From: Mehryar Mansoor Date: Thu, 28 Jan 2016 20:25:20 -0800 Subject: [PATCH 069/902] updating API schema --- swagger/schemas/latest.json | 1 + 1 file changed, 1 insertion(+) create mode 100644 swagger/schemas/latest.json diff --git a/swagger/schemas/latest.json b/swagger/schemas/latest.json new file mode 100644 index 00000000000..23b6a2b45b5 --- /dev/null +++ b/swagger/schemas/latest.json @@ -0,0 +1 @@ +{"swagger":"2.0","info":{"version":"2.0","title":"Magento Community"},"host":"10.64.246.214","basePath":"/builds/TEMP-MMFAT-IC/instance-0/rest/default","schemes":["http"],"tags":[{"name":"storeStoreRepositoryV1","description":"Store repository interface"},{"name":"storeGroupRepositoryV1","description":"Group repository interface"},{"name":"storeWebsiteRepositoryV1","description":"Website repository interface"},{"name":"storeStoreConfigManagerV1","description":"Store config manager interface"},{"name":"directoryCurrencyInformationAcquirerV1","description":"Currency information acquirer interface"},{"name":"directoryCountryInformationAcquirerV1","description":"Country information acquirer interface"},{"name":"backendModuleServiceV1","description":"Interface for module service."},{"name":"eavAttributeSetRepositoryV1","description":"Interface AttributeSetRepositoryInterface"},{"name":"eavAttributeSetManagementV1","description":"Interface AttributeSetManagementInterface"},{"name":"customerGroupRepositoryV1","description":"Customer group CRUD interface"},{"name":"customerGroupManagementV1","description":"Interface for managing customer groups."},{"name":"customerCustomerMetadataV1","description":"Interface for retrieval information about customer attributes metadata."},{"name":"customerAddressMetadataV1","description":"Interface for retrieval information about customer address attributes metadata."},{"name":"customerCustomerRepositoryV1","description":"Customer CRUD interface."},{"name":"customerAccountManagementV1","description":"Interface for managing customers accounts."},{"name":"customerAddressRepositoryV1","description":"Customer address CRUD interface."},{"name":"cmsPageRepositoryV1","description":"CMS page CRUD interface."},{"name":"cmsBlockRepositoryV1","description":"CMS block CRUD interface."},{"name":"catalogProductRepositoryV1","description":""},{"name":"catalogProductAttributeTypesListV1","description":""},{"name":"catalogProductAttributeRepositoryV1","description":"Interface RepositoryInterface must be implemented in new model"},{"name":"catalogCategoryAttributeRepositoryV1","description":"Interface RepositoryInterface must be implemented in new model"},{"name":"catalogCategoryAttributeOptionManagementV1","description":"Interface RepositoryInterface must be implemented in new model"},{"name":"catalogProductTypeListV1","description":""},{"name":"catalogAttributeSetRepositoryV1","description":""},{"name":"catalogAttributeSetManagementV1","description":""},{"name":"catalogProductAttributeManagementV1","description":""},{"name":"catalogProductAttributeGroupRepositoryV1","description":""},{"name":"catalogProductAttributeOptionManagementV1","description":""},{"name":"catalogProductMediaAttributeManagementV1","description":""},{"name":"catalogProductAttributeMediaGalleryManagementV1","description":""},{"name":"catalogProductTierPriceManagementV1","description":""},{"name":"catalogCategoryRepositoryV1","description":""},{"name":"catalogCategoryManagementV1","description":""},{"name":"catalogProductCustomOptionTypeListV1","description":""},{"name":"catalogProductCustomOptionRepositoryV1","description":""},{"name":"catalogProductLinkTypeListV1","description":""},{"name":"catalogProductLinkManagementV1","description":""},{"name":"catalogProductLinkRepositoryV1","description":"Interface Product links handling interface"},{"name":"catalogCategoryLinkManagementV1","description":""},{"name":"catalogCategoryLinkRepositoryV1","description":""},{"name":"catalogProductWebsiteLinkRepositoryV1","description":""},{"name":"searchV1","description":"Search API for all requests"},{"name":"checkoutAgreementsCheckoutAgreementsRepositoryV1","description":"Interface CheckoutAgreementsRepositoryInterface"},{"name":"quoteCartRepositoryV1","description":"Interface CartRepositoryInterface"},{"name":"quoteCartManagementV1","description":"Interface CartManagementInterface"},{"name":"quoteGuestCartRepositoryV1","description":"Cart Repository interface for guest carts."},{"name":"quoteGuestCartManagementV1","description":"Cart Management interface for guest carts."},{"name":"quoteShippingMethodManagementV1","description":"Interface ShippingMethodManagementInterface"},{"name":"quoteGuestShippingMethodManagementV1","description":"Shipping method management interface for guest carts."},{"name":"quoteCartItemRepositoryV1","description":"Interface CartItemRepositoryInterface"},{"name":"quoteGuestCartItemRepositoryV1","description":"Cart Item repository interface for guest carts."},{"name":"quotePaymentMethodManagementV1","description":"Interface PaymentMethodManagementInterface"},{"name":"quoteGuestPaymentMethodManagementV1","description":"Payment method management interface for guest carts."},{"name":"quoteBillingAddressManagementV1","description":"Interface BillingAddressManagementInterface"},{"name":"quoteGuestBillingAddressManagementV1","description":"Billing address management interface for guest carts."},{"name":"quoteCouponManagementV1","description":"Coupon management service interface."},{"name":"quoteGuestCouponManagementV1","description":"Coupon management interface for guest carts."},{"name":"quoteCartTotalRepositoryV1","description":"Interface CartTotalRepositoryInterface"},{"name":"quoteGuestCartTotalManagementV1","description":"Bundled API to collect totals for cart based on shipping/payment methods and additional data."},{"name":"quoteGuestCartTotalRepositoryV1","description":"Cart totals repository interface for guest carts."},{"name":"quoteCartTotalManagementV1","description":"Bundled API to collect totals for cart based on shipping/payment methods and additional data."},{"name":"catalogInventoryStockRegistryV1","description":"Interface StockRegistryInterface"},{"name":"downloadableLinkRepositoryV1","description":"Interface LinkRepositoryInterface"},{"name":"downloadableSampleRepositoryV1","description":"Interface SampleRepositoryInterface"},{"name":"bundleProductLinkManagementV1","description":"Interface for Management of ProductLink"},{"name":"bundleProductOptionRepositoryV1","description":"Interface ProductOptionRepositoryInterface"},{"name":"bundleProductOptionTypeListV1","description":"Interface ProductOptionTypeListInterface"},{"name":"bundleProductOptionManagementV1","description":"Option manager for bundle products"},{"name":"salesOrderRepositoryV1","description":"Order repository interface. An order is a document that a web store issues to a customer. Magento generates a sales order that lists the product items, billing and shipping addresses, and shipping and payment methods. A corresponding external document, known as a purchase order, is emailed to the customer."},{"name":"salesOrderManagementV1","description":"Order management interface. An order is a document that a web store issues to a customer. Magento generates a sales order that lists the product items, billing and shipping addresses, and shipping and payment methods. A corresponding external document, known as a purchase order, is emailed to the customer."},{"name":"salesOrderAddressRepositoryV1","description":"Order address repository interface. An order is a document that a web store issues to a customer. Magento generates a sales order that lists the product items, billing and shipping addresses, and shipping and payment methods. A corresponding external document, known as a purchase order, is emailed to the customer."},{"name":"salesOrderItemRepositoryV1","description":"Order item repository interface. An order is a document that a web store issues to a customer. Magento generates a sales order that lists the product items, billing and shipping addresses, and shipping and payment methods. A corresponding external document, known as a purchase order, is emailed to the customer."},{"name":"salesInvoiceRepositoryV1","description":"Invoice repository interface. An invoice is a record of the receipt of payment for an order."},{"name":"salesInvoiceManagementV1","description":"Invoice management interface. An invoice is a record of the receipt of payment for an order."},{"name":"salesInvoiceCommentRepositoryV1","description":"Invoice comment repository interface. An invoice is a record of the receipt of payment for an order. An invoice can include comments that detail the invoice history."},{"name":"salesCreditmemoManagementV1","description":"Credit memo add comment interface. After a customer places and pays for an order and an invoice has been issued, the merchant can create a credit memo to refund all or part of the amount paid for any returned or undelivered items. The memo restores funds to the customer account so that the customer can make future purchases."},{"name":"salesCreditmemoRepositoryV1","description":"Credit memo repository interface. After a customer places and pays for an order and an invoice has been issued, the merchant can create a credit memo to refund all or part of the amount paid for any returned or undelivered items. The memo restores funds to the customer account so that the customer can make future purchases."},{"name":"salesCreditmemoCommentRepositoryV1","description":"Credit memo comment repository interface. After a customer places and pays for an order and an invoice has been issued, the merchant can create a credit memo to refund all or part of the amount paid for any returned or undelivered items. The memo restores funds to the customer account so that the customer can make future purchases. A credit memo usually includes comments that detail why the credit memo amount was credited to the customer."},{"name":"salesShipmentRepositoryV1","description":"Shipment repository interface. A shipment is a delivery package that contains products. A shipment document accompanies the shipment. This document lists the products and their quantities in the delivery package."},{"name":"salesShipmentManagementV1","description":"Shipment management interface. A shipment is a delivery package that contains products. A shipment document accompanies the shipment. This document lists the products and their quantities in the delivery package."},{"name":"salesShipmentCommentRepositoryV1","description":"Shipment comment repository interface. A shipment is a delivery package that contains products. A shipment document accompanies the shipment. This document lists the products and their quantities in the delivery package. A shipment document can contain comments."},{"name":"salesShipmentTrackRepositoryV1","description":"Shipment track repository interface. A shipment is a delivery package that contains products. A shipment document accompanies the shipment. This document lists the products and their quantities in the delivery package."},{"name":"salesTransactionRepositoryV1","description":"Transaction repository interface. A transaction is an interaction between a merchant and a customer such as a purchase, a credit, a refund, and so on."},{"name":"checkoutGuestShippingInformationManagementV1","description":"Interface for managing guest shipping address information"},{"name":"checkoutShippingInformationManagementV1","description":"Interface for managing customer shipping address information"},{"name":"checkoutTotalsInformationManagementV1","description":"Interface for quote totals calculation"},{"name":"checkoutGuestTotalsInformationManagementV1","description":"Interface for guest quote totals calculation"},{"name":"checkoutGuestPaymentInformationManagementV1","description":"Interface for managing guest payment information"},{"name":"checkoutPaymentInformationManagementV1","description":"Interface for managing quote payment information"},{"name":"configurableProductLinkManagementV1","description":"Manage children products of configurable product"},{"name":"configurableProductConfigurableProductManagementV1","description":"Interface ConfigurableProductManagementInterface"},{"name":"configurableProductOptionRepositoryV1","description":"Manage options of configurable product"},{"name":"salesRuleRuleRepositoryV1","description":"Sales rule CRUD interface"},{"name":"salesRuleCouponRepositoryV1","description":"Coupon CRUD interface"},{"name":"salesRuleCouponManagementV1","description":"Coupon management interface"},{"name":"taxTaxRateRepositoryV1","description":"Tax rate CRUD interface."},{"name":"taxTaxRuleRepositoryV1","description":"Tax rule CRUD interface."},{"name":"taxTaxClassRepositoryV1","description":"Tax class CRUD interface."},{"name":"giftMessageCartRepositoryV1","description":"Interface CartRepositoryInterface"},{"name":"giftMessageItemRepositoryV1","description":"Interface ItemRepositoryInterface"},{"name":"giftMessageGuestCartRepositoryV1","description":"Interface GuestCartRepositoryInterface"},{"name":"giftMessageGuestItemRepositoryV1","description":"Interface GuestItemRepositoryInterface"},{"name":"integrationAdminTokenServiceV1","description":"Interface providing token generation for Admins"},{"name":"integrationCustomerTokenServiceV1","description":"Interface providing token generation for Customers"}],"paths":{"/V1/store/storeViews":{"get":{"tags":["storeStoreRepositoryV1"],"description":"Retrieve list of all stores","operationId":"storeStoreRepositoryV1GetListGet","responses":{"200":{"description":"200 Success.","schema":{"type":"array","items":{"$ref":"#/definitions/store-data-store-interface"}}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/store/storeGroups":{"get":{"tags":["storeGroupRepositoryV1"],"description":"Retrieve list of all groups","operationId":"storeGroupRepositoryV1GetListGet","responses":{"200":{"description":"200 Success.","schema":{"type":"array","items":{"$ref":"#/definitions/store-data-group-interface"}}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/store/websites":{"get":{"tags":["storeWebsiteRepositoryV1"],"description":"Retrieve list of all websites","operationId":"storeWebsiteRepositoryV1GetListGet","responses":{"200":{"description":"200 Success.","schema":{"type":"array","items":{"$ref":"#/definitions/store-data-website-interface"}}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/store/storeConfigs":{"get":{"tags":["storeStoreConfigManagerV1"],"description":"","operationId":"storeStoreConfigManagerV1GetStoreConfigsGet","parameters":[{"name":"storeCodes","in":"query","type":"array","items":{"type":"string"},"required":false}],"responses":{"200":{"description":"200 Success.","schema":{"type":"array","items":{"$ref":"#/definitions/store-data-store-config-interface"}}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/directory/currency":{"get":{"tags":["directoryCurrencyInformationAcquirerV1"],"description":"Get currency information for the store.","operationId":"directoryCurrencyInformationAcquirerV1GetCurrencyInfoGet","responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/directory-data-currency-information-interface"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/directory/countries":{"get":{"tags":["directoryCountryInformationAcquirerV1"],"description":"Get all countries and regions information for the store.","operationId":"directoryCountryInformationAcquirerV1GetCountriesInfoGet","responses":{"200":{"description":"200 Success.","schema":{"type":"array","items":{"$ref":"#/definitions/directory-data-country-information-interface"}}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/directory/countries/{countryId}":{"get":{"tags":["directoryCountryInformationAcquirerV1"],"description":"Get country and region information for the store.","operationId":"directoryCountryInformationAcquirerV1GetCountryInfoGet","parameters":[{"name":"countryId","in":"path","type":"string","required":true}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/directory-data-country-information-interface"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/modules":{"get":{"tags":["backendModuleServiceV1"],"description":"Returns an array of enabled modules","operationId":"backendModuleServiceV1GetModulesGet","responses":{"200":{"description":"200 Success.","schema":{"type":"array","items":{"type":"string"}}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/eav/attribute-sets/list":{"get":{"tags":["eavAttributeSetRepositoryV1"],"description":"Retrieve list of Attribute Sets","operationId":"eavAttributeSetRepositoryV1GetListGet","parameters":[{"name":"searchCriteria[filterGroups][][filters][][field]","in":"query","type":"string","description":"Field"},{"name":"searchCriteria[filterGroups][][filters][][value]","in":"query","type":"string","description":"Value"},{"name":"searchCriteria[filterGroups][][filters][][conditionType]","in":"query","type":"string","description":"Condition type"},{"name":"searchCriteria[sortOrders][][field]","in":"query","type":"string","description":"Sorting field."},{"name":"searchCriteria[sortOrders][][direction]","in":"query","type":"string","description":"Sorting direction."},{"name":"searchCriteria[pageSize]","in":"query","type":"integer","description":"Page size."},{"name":"searchCriteria[currentPage]","in":"query","type":"integer","description":"Current page."}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/eav-data-attribute-set-search-results-interface"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/eav/attribute-sets/{attributeSetId}":{"get":{"tags":["eavAttributeSetRepositoryV1"],"description":"Retrieve attribute set information based on given ID","operationId":"eavAttributeSetRepositoryV1GetGet","parameters":[{"name":"attributeSetId","in":"path","type":"integer","required":true}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/eav-data-attribute-set-interface"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}},"delete":{"tags":["eavAttributeSetRepositoryV1"],"description":"Remove attribute set by given ID","operationId":"eavAttributeSetRepositoryV1DeleteByIdDelete","parameters":[{"name":"attributeSetId","in":"path","type":"integer","required":true}],"responses":{"200":{"description":"200 Success.","schema":{"type":"boolean"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}},"put":{"tags":["eavAttributeSetRepositoryV1"],"description":"Save attribute set data","operationId":"eavAttributeSetRepositoryV1SavePut","parameters":[{"name":"attributeSetId","in":"path","type":"string","required":true},{"name":"$body","in":"body","schema":{"required":["attributeSet"],"properties":{"attributeSet":{"$ref":"#/definitions/eav-data-attribute-set-interface"}},"type":"object"}}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/eav-data-attribute-set-interface"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"500":{"description":"Internal Server error","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/eav/attribute-sets":{"post":{"tags":["eavAttributeSetManagementV1"],"description":"Create attribute set from data","operationId":"eavAttributeSetManagementV1CreatePost","parameters":[{"name":"$body","in":"body","schema":{"required":["entityTypeCode","attributeSet","skeletonId"],"properties":{"entityTypeCode":{"type":"string"},"attributeSet":{"$ref":"#/definitions/eav-data-attribute-set-interface"},"skeletonId":{"type":"integer"}},"type":"object"}}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/eav-data-attribute-set-interface"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/customerGroups/{id}":{"get":{"tags":["customerGroupRepositoryV1"],"description":"Get customer group by group ID.","operationId":"customerGroupRepositoryV1GetByIdGet","parameters":[{"name":"id","in":"path","type":"integer","required":true}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/customer-data-group-interface"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"500":{"description":"Internal Server error","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}},"put":{"tags":["customerGroupRepositoryV1"],"description":"Save customer group.","operationId":"customerGroupRepositoryV1SavePut","parameters":[{"name":"id","in":"path","type":"string","required":true},{"name":"$body","in":"body","schema":{"required":["group"],"properties":{"group":{"$ref":"#/definitions/customer-data-group-interface"}},"type":"object"}}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/customer-data-group-interface"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"500":{"description":"Internal Server error","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}},"delete":{"tags":["customerGroupRepositoryV1"],"description":"Delete customer group by ID.","operationId":"customerGroupRepositoryV1DeleteByIdDelete","parameters":[{"name":"id","in":"path","type":"integer","required":true}],"responses":{"200":{"description":"200 Success.","schema":{"type":"boolean","description":"true on success"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"500":{"description":"Internal Server error","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/customerGroups/search":{"get":{"tags":["customerGroupRepositoryV1"],"description":"Retrieve customer groups. The list of groups can be filtered to exclude the NOT_LOGGED_IN group using the first parameter and/or it can be filtered by tax class.","operationId":"customerGroupRepositoryV1GetListGet","parameters":[{"name":"searchCriteria[filterGroups][][filters][][field]","in":"query","type":"string","description":"Field"},{"name":"searchCriteria[filterGroups][][filters][][value]","in":"query","type":"string","description":"Value"},{"name":"searchCriteria[filterGroups][][filters][][conditionType]","in":"query","type":"string","description":"Condition type"},{"name":"searchCriteria[sortOrders][][field]","in":"query","type":"string","description":"Sorting field."},{"name":"searchCriteria[sortOrders][][direction]","in":"query","type":"string","description":"Sorting direction."},{"name":"searchCriteria[pageSize]","in":"query","type":"integer","description":"Page size."},{"name":"searchCriteria[currentPage]","in":"query","type":"integer","description":"Current page."}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/customer-data-group-search-results-interface"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"500":{"description":"Internal Server error","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/customerGroups":{"post":{"tags":["customerGroupRepositoryV1"],"description":"Save customer group.","operationId":"customerGroupRepositoryV1SavePost","parameters":[{"name":"$body","in":"body","schema":{"required":["group"],"properties":{"group":{"$ref":"#/definitions/customer-data-group-interface"}},"type":"object"}}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/customer-data-group-interface"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"500":{"description":"Internal Server error","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/customerGroups/default/{storeId}":{"get":{"tags":["customerGroupManagementV1"],"description":"Get default customer group.","operationId":"customerGroupManagementV1GetDefaultGroupGet","parameters":[{"name":"storeId","in":"path","type":"integer","required":true}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/customer-data-group-interface"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"500":{"description":"Internal Server error","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/customerGroups/default":{"get":{"tags":["customerGroupManagementV1"],"description":"Get default customer group.","operationId":"customerGroupManagementV1GetDefaultGroupGet","parameters":[{"name":"storeId","in":"query","type":"integer","required":false}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/customer-data-group-interface"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"500":{"description":"Internal Server error","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/customerGroups/{id}/permissions":{"get":{"tags":["customerGroupManagementV1"],"description":"Check if customer group can be deleted.","operationId":"customerGroupManagementV1IsReadonlyGet","parameters":[{"name":"id","in":"path","type":"integer","required":true}],"responses":{"200":{"description":"200 Success.","schema":{"type":"boolean"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"500":{"description":"Internal Server error","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/attributeMetadata/customer/attribute/{attributeCode}":{"get":{"tags":["customerCustomerMetadataV1"],"description":"Retrieve attribute metadata.","operationId":"customerCustomerMetadataV1GetAttributeMetadataGet","parameters":[{"name":"attributeCode","in":"path","type":"string","required":true}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/customer-data-attribute-metadata-interface"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"500":{"description":"Internal Server error","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/attributeMetadata/customer/form/{formCode}":{"get":{"tags":["customerCustomerMetadataV1"],"description":"Retrieve all attributes filtered by form code","operationId":"customerCustomerMetadataV1GetAttributesGet","parameters":[{"name":"formCode","in":"path","type":"string","required":true}],"responses":{"200":{"description":"200 Success.","schema":{"type":"array","items":{"$ref":"#/definitions/customer-data-attribute-metadata-interface"}}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"500":{"description":"Internal Server error","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/attributeMetadata/customer":{"get":{"tags":["customerCustomerMetadataV1"],"description":"Get all attribute metadata.","operationId":"customerCustomerMetadataV1GetAllAttributesMetadataGet","responses":{"200":{"description":"200 Success.","schema":{"type":"array","items":{"$ref":"#/definitions/customer-data-attribute-metadata-interface"}}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"500":{"description":"Internal Server error","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/attributeMetadata/customer/custom":{"get":{"tags":["customerCustomerMetadataV1"],"description":"Get custom attributes metadata for the given data interface.","operationId":"customerCustomerMetadataV1GetCustomAttributesMetadataGet","parameters":[{"name":"dataInterfaceName","in":"query","type":"string","required":false}],"responses":{"200":{"description":"200 Success.","schema":{"type":"array","items":{"$ref":"#/definitions/customer-data-attribute-metadata-interface"}}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"500":{"description":"Internal Server error","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/attributeMetadata/customerAddress/attribute/{attributeCode}":{"get":{"tags":["customerAddressMetadataV1"],"description":"Retrieve attribute metadata.","operationId":"customerAddressMetadataV1GetAttributeMetadataGet","parameters":[{"name":"attributeCode","in":"path","type":"string","required":true}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/customer-data-attribute-metadata-interface"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"500":{"description":"Internal Server error","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/attributeMetadata/customerAddress/form/{formCode}":{"get":{"tags":["customerAddressMetadataV1"],"description":"Retrieve all attributes filtered by form code","operationId":"customerAddressMetadataV1GetAttributesGet","parameters":[{"name":"formCode","in":"path","type":"string","required":true}],"responses":{"200":{"description":"200 Success.","schema":{"type":"array","items":{"$ref":"#/definitions/customer-data-attribute-metadata-interface"}}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"500":{"description":"Internal Server error","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/attributeMetadata/customerAddress":{"get":{"tags":["customerAddressMetadataV1"],"description":"Get all attribute metadata.","operationId":"customerAddressMetadataV1GetAllAttributesMetadataGet","responses":{"200":{"description":"200 Success.","schema":{"type":"array","items":{"$ref":"#/definitions/customer-data-attribute-metadata-interface"}}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"500":{"description":"Internal Server error","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/attributeMetadata/customerAddress/custom":{"get":{"tags":["customerAddressMetadataV1"],"description":"Get custom attributes metadata for the given data interface.","operationId":"customerAddressMetadataV1GetCustomAttributesMetadataGet","parameters":[{"name":"dataInterfaceName","in":"query","type":"string","required":false}],"responses":{"200":{"description":"200 Success.","schema":{"type":"array","items":{"$ref":"#/definitions/customer-data-attribute-metadata-interface"}}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"500":{"description":"Internal Server error","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/customers/{customerId}":{"get":{"tags":["customerCustomerRepositoryV1"],"description":"Retrieve customer.","operationId":"customerCustomerRepositoryV1GetByIdGet","parameters":[{"name":"customerId","in":"path","type":"integer","required":true}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/customer-data-customer-interface"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"500":{"description":"Internal Server error","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}},"delete":{"tags":["customerCustomerRepositoryV1"],"description":"Delete customer by ID.","operationId":"customerCustomerRepositoryV1DeleteByIdDelete","parameters":[{"name":"customerId","in":"path","type":"integer","required":true}],"responses":{"200":{"description":"200 Success.","schema":{"type":"boolean","description":"true on success"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"500":{"description":"Internal Server error","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/customers/{id}":{"put":{"tags":["customerCustomerRepositoryV1"],"description":"Create customer.","operationId":"customerCustomerRepositoryV1SavePut","parameters":[{"name":"id","in":"path","type":"string","required":true},{"name":"$body","in":"body","schema":{"required":["customer"],"properties":{"customer":{"$ref":"#/definitions/customer-data-customer-interface"},"passwordHash":{"type":"string"}},"type":"object"}}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/customer-data-customer-interface"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"500":{"description":"Internal Server error","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/customers/me":{"put":{"tags":["customerCustomerRepositoryV1"],"description":"Create customer.","operationId":"customerCustomerRepositoryV1SavePut","parameters":[{"name":"$body","in":"body","schema":{"required":["customer"],"properties":{"customer":{"$ref":"#/definitions/customer-data-customer-interface"},"passwordHash":{"type":"string"}},"type":"object"}}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/customer-data-customer-interface"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"500":{"description":"Internal Server error","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}},"get":{"tags":["customerCustomerRepositoryV1"],"description":"Retrieve customer.","operationId":"customerCustomerRepositoryV1GetByIdGet","responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/customer-data-customer-interface"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"500":{"description":"Internal Server error","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/customers/search":{"get":{"tags":["customerCustomerRepositoryV1"],"description":"Retrieve customers which match a specified criteria.","operationId":"customerCustomerRepositoryV1GetListGet","parameters":[{"name":"searchCriteria[filterGroups][][filters][][field]","in":"query","type":"string","description":"Field"},{"name":"searchCriteria[filterGroups][][filters][][value]","in":"query","type":"string","description":"Value"},{"name":"searchCriteria[filterGroups][][filters][][conditionType]","in":"query","type":"string","description":"Condition type"},{"name":"searchCriteria[sortOrders][][field]","in":"query","type":"string","description":"Sorting field."},{"name":"searchCriteria[sortOrders][][direction]","in":"query","type":"string","description":"Sorting direction."},{"name":"searchCriteria[pageSize]","in":"query","type":"integer","description":"Page size."},{"name":"searchCriteria[currentPage]","in":"query","type":"integer","description":"Current page."}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/customer-data-customer-search-results-interface"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"500":{"description":"Internal Server error","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/customers":{"post":{"tags":["customerAccountManagementV1"],"description":"Create customer account. Perform necessary business operations like sending email.","operationId":"customerAccountManagementV1CreateAccountPost","parameters":[{"name":"$body","in":"body","schema":{"required":["customer"],"properties":{"customer":{"$ref":"#/definitions/customer-data-customer-interface"},"password":{"type":"string"},"redirectUrl":{"type":"string"}},"type":"object"}}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/customer-data-customer-interface"}},"500":{"description":"Internal Server error","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/customers/me/activate":{"put":{"tags":["customerAccountManagementV1"],"description":"Activate a customer account using a key that was sent in a confirmation email.","operationId":"customerAccountManagementV1ActivateByIdPut","parameters":[{"name":"$body","in":"body","schema":{"required":["confirmationKey"],"properties":{"confirmationKey":{"type":"string"}},"type":"object"}}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/customer-data-customer-interface"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"500":{"description":"Internal Server error","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/customers/{email}/activate":{"put":{"tags":["customerAccountManagementV1"],"description":"Activate a customer account using a key that was sent in a confirmation email.","operationId":"customerAccountManagementV1ActivatePut","parameters":[{"name":"email","in":"path","type":"string","required":true},{"name":"$body","in":"body","schema":{"required":["confirmationKey"],"properties":{"confirmationKey":{"type":"string"}},"type":"object"}}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/customer-data-customer-interface"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"500":{"description":"Internal Server error","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/customers/me/password":{"put":{"tags":["customerAccountManagementV1"],"description":"Change customer password.","operationId":"customerAccountManagementV1ChangePasswordByIdPut","parameters":[{"name":"$body","in":"body","schema":{"required":["currentPassword","newPassword"],"properties":{"currentPassword":{"type":"string"},"newPassword":{"type":"string"}},"type":"object"}}],"responses":{"200":{"description":"200 Success.","schema":{"type":"boolean","description":"true on success"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"500":{"description":"Internal Server error","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/customers/{customerId}/password/resetLinkToken/{resetPasswordLinkToken}":{"get":{"tags":["customerAccountManagementV1"],"description":"Check if password reset token is valid.","operationId":"customerAccountManagementV1ValidateResetPasswordLinkTokenGet","parameters":[{"name":"customerId","in":"path","type":"integer","required":true},{"name":"resetPasswordLinkToken","in":"path","type":"string","required":true}],"responses":{"200":{"description":"200 Success.","schema":{"type":"boolean","description":"True if the token is valid"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"500":{"description":"Internal Server error","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/customers/password":{"put":{"tags":["customerAccountManagementV1"],"description":"Send an email to the customer with a password reset link.","operationId":"customerAccountManagementV1InitiatePasswordResetPut","parameters":[{"name":"$body","in":"body","schema":{"required":["email","template"],"properties":{"email":{"type":"string"},"template":{"type":"string"},"websiteId":{"type":"integer"}},"type":"object"}}],"responses":{"200":{"description":"200 Success.","schema":{"type":"boolean","description":"true on success"}},"500":{"description":"Internal Server error","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/customers/{customerId}/confirm":{"get":{"tags":["customerAccountManagementV1"],"description":"Gets the account confirmation status.","operationId":"customerAccountManagementV1GetConfirmationStatusGet","parameters":[{"name":"customerId","in":"path","type":"integer","required":true}],"responses":{"200":{"description":"200 Success.","schema":{"type":"string"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"500":{"description":"Internal Server error","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/customers/confirm":{"post":{"tags":["customerAccountManagementV1"],"description":"Resend confirmation email.","operationId":"customerAccountManagementV1ResendConfirmationPost","parameters":[{"name":"$body","in":"body","schema":{"required":["email","websiteId"],"properties":{"email":{"type":"string"},"websiteId":{"type":"integer"},"redirectUrl":{"type":"string"}},"type":"object"}}],"responses":{"200":{"description":"200 Success.","schema":{"type":"boolean","description":"true on success"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"500":{"description":"Internal Server error","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/customers/validate":{"put":{"tags":["customerAccountManagementV1"],"description":"Validate customer data.","operationId":"customerAccountManagementV1ValidatePut","parameters":[{"name":"$body","in":"body","schema":{"required":["customer"],"properties":{"customer":{"$ref":"#/definitions/customer-data-customer-interface"}},"type":"object"}}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/customer-data-validation-results-interface"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"500":{"description":"Internal Server error","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/customers/{customerId}/permissions/readonly":{"get":{"tags":["customerAccountManagementV1"],"description":"Check if customer can be deleted.","operationId":"customerAccountManagementV1IsReadonlyGet","parameters":[{"name":"customerId","in":"path","type":"integer","required":true}],"responses":{"200":{"description":"200 Success.","schema":{"type":"boolean"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"500":{"description":"Internal Server error","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/customers/isEmailAvailable":{"post":{"tags":["customerAccountManagementV1"],"description":"Check if given email is associated with a customer account in given website.","operationId":"customerAccountManagementV1IsEmailAvailablePost","parameters":[{"name":"$body","in":"body","schema":{"required":["customerEmail"],"properties":{"customerEmail":{"type":"string"},"websiteId":{"type":"integer","description":"If not set, will use the current websiteId"}},"type":"object"}}],"responses":{"200":{"description":"200 Success.","schema":{"type":"boolean"}},"500":{"description":"Internal Server error","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/customers/me/billingAddress":{"get":{"tags":["customerAccountManagementV1"],"description":"Retrieve default billing address for the given customerId.","operationId":"customerAccountManagementV1GetDefaultBillingAddressGet","responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/customer-data-address-interface"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"500":{"description":"Internal Server error","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/customers/{customerId}/billingAddress":{"get":{"tags":["customerAccountManagementV1"],"description":"Retrieve default billing address for the given customerId.","operationId":"customerAccountManagementV1GetDefaultBillingAddressGet","parameters":[{"name":"customerId","in":"path","type":"integer","required":true}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/customer-data-address-interface"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"500":{"description":"Internal Server error","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/customers/me/shippingAddress":{"get":{"tags":["customerAccountManagementV1"],"description":"Retrieve default shipping address for the given customerId.","operationId":"customerAccountManagementV1GetDefaultShippingAddressGet","responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/customer-data-address-interface"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"500":{"description":"Internal Server error","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/customers/{customerId}/shippingAddress":{"get":{"tags":["customerAccountManagementV1"],"description":"Retrieve default shipping address for the given customerId.","operationId":"customerAccountManagementV1GetDefaultShippingAddressGet","parameters":[{"name":"customerId","in":"path","type":"integer","required":true}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/customer-data-address-interface"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"500":{"description":"Internal Server error","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/customers/addresses/{addressId}":{"get":{"tags":["customerAddressRepositoryV1"],"description":"Retrieve customer address.","operationId":"customerAddressRepositoryV1GetByIdGet","parameters":[{"name":"addressId","in":"path","type":"integer","required":true}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/customer-data-address-interface"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"500":{"description":"Internal Server error","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/addresses/{addressId}":{"delete":{"tags":["customerAddressRepositoryV1"],"description":"Delete customer address by ID.","operationId":"customerAddressRepositoryV1DeleteByIdDelete","parameters":[{"name":"addressId","in":"path","type":"integer","required":true}],"responses":{"200":{"description":"200 Success.","schema":{"type":"boolean","description":"true on success"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"500":{"description":"Internal Server error","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/cmsPage/{pageId}":{"get":{"tags":["cmsPageRepositoryV1"],"description":"Retrieve page.","operationId":"cmsPageRepositoryV1GetByIdGet","parameters":[{"name":"pageId","in":"path","type":"integer","required":true}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/cms-data-page-interface"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"500":{"description":"Internal Server error","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}},"delete":{"tags":["cmsPageRepositoryV1"],"description":"Delete page by ID.","operationId":"cmsPageRepositoryV1DeleteByIdDelete","parameters":[{"name":"pageId","in":"path","type":"integer","required":true}],"responses":{"200":{"description":"200 Success.","schema":{"type":"boolean","description":"true on success"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"500":{"description":"Internal Server error","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/cmsPage/search":{"get":{"tags":["cmsPageRepositoryV1"],"description":"Retrieve pages matching the specified criteria.","operationId":"cmsPageRepositoryV1GetListGet","parameters":[{"name":"searchCriteria[filterGroups][][filters][][field]","in":"query","type":"string","description":"Field"},{"name":"searchCriteria[filterGroups][][filters][][value]","in":"query","type":"string","description":"Value"},{"name":"searchCriteria[filterGroups][][filters][][conditionType]","in":"query","type":"string","description":"Condition type"},{"name":"searchCriteria[sortOrders][][field]","in":"query","type":"string","description":"Sorting field."},{"name":"searchCriteria[sortOrders][][direction]","in":"query","type":"string","description":"Sorting direction."},{"name":"searchCriteria[pageSize]","in":"query","type":"integer","description":"Page size."},{"name":"searchCriteria[currentPage]","in":"query","type":"integer","description":"Current page."}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/cms-data-page-search-results-interface"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"500":{"description":"Internal Server error","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/cmsPage":{"post":{"tags":["cmsPageRepositoryV1"],"description":"Save page.","operationId":"cmsPageRepositoryV1SavePost","parameters":[{"name":"$body","in":"body","schema":{"required":["page"],"properties":{"page":{"$ref":"#/definitions/cms-data-page-interface"}},"type":"object"}}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/cms-data-page-interface"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"500":{"description":"Internal Server error","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/cmsPage/{id}":{"put":{"tags":["cmsPageRepositoryV1"],"description":"Save page.","operationId":"cmsPageRepositoryV1SavePut","parameters":[{"name":"id","in":"path","type":"string","required":true},{"name":"$body","in":"body","schema":{"required":["page"],"properties":{"page":{"$ref":"#/definitions/cms-data-page-interface"}},"type":"object"}}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/cms-data-page-interface"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"500":{"description":"Internal Server error","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/cmsBlock/{blockId}":{"get":{"tags":["cmsBlockRepositoryV1"],"description":"Retrieve block.","operationId":"cmsBlockRepositoryV1GetByIdGet","parameters":[{"name":"blockId","in":"path","type":"integer","required":true}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/cms-data-block-interface"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"500":{"description":"Internal Server error","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}},"delete":{"tags":["cmsBlockRepositoryV1"],"description":"Delete block by ID.","operationId":"cmsBlockRepositoryV1DeleteByIdDelete","parameters":[{"name":"blockId","in":"path","type":"integer","required":true}],"responses":{"200":{"description":"200 Success.","schema":{"type":"boolean","description":"true on success"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"500":{"description":"Internal Server error","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/cmsBlock/search":{"get":{"tags":["cmsBlockRepositoryV1"],"description":"Retrieve blocks matching the specified criteria.","operationId":"cmsBlockRepositoryV1GetListGet","parameters":[{"name":"searchCriteria[filterGroups][][filters][][field]","in":"query","type":"string","description":"Field"},{"name":"searchCriteria[filterGroups][][filters][][value]","in":"query","type":"string","description":"Value"},{"name":"searchCriteria[filterGroups][][filters][][conditionType]","in":"query","type":"string","description":"Condition type"},{"name":"searchCriteria[sortOrders][][field]","in":"query","type":"string","description":"Sorting field."},{"name":"searchCriteria[sortOrders][][direction]","in":"query","type":"string","description":"Sorting direction."},{"name":"searchCriteria[pageSize]","in":"query","type":"integer","description":"Page size."},{"name":"searchCriteria[currentPage]","in":"query","type":"integer","description":"Current page."}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/cms-data-block-search-results-interface"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"500":{"description":"Internal Server error","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/cmsBlock":{"post":{"tags":["cmsBlockRepositoryV1"],"description":"Save block.","operationId":"cmsBlockRepositoryV1SavePost","parameters":[{"name":"$body","in":"body","schema":{"required":["block"],"properties":{"block":{"$ref":"#/definitions/cms-data-block-interface"}},"type":"object"}}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/cms-data-block-interface"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"500":{"description":"Internal Server error","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/cmsBlock/{id}":{"put":{"tags":["cmsBlockRepositoryV1"],"description":"Save block.","operationId":"cmsBlockRepositoryV1SavePut","parameters":[{"name":"id","in":"path","type":"string","required":true},{"name":"$body","in":"body","schema":{"required":["block"],"properties":{"block":{"$ref":"#/definitions/cms-data-block-interface"}},"type":"object"}}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/cms-data-block-interface"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"500":{"description":"Internal Server error","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/products":{"post":{"tags":["catalogProductRepositoryV1"],"description":"Create product","operationId":"catalogProductRepositoryV1SavePost","parameters":[{"name":"$body","in":"body","schema":{"required":["product"],"properties":{"product":{"$ref":"#/definitions/catalog-data-product-interface"},"saveOptions":{"type":"boolean"}},"type":"object"}}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/catalog-data-product-interface"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}},"get":{"tags":["catalogProductRepositoryV1"],"description":"Get product list","operationId":"catalogProductRepositoryV1GetListGet","parameters":[{"name":"searchCriteria[filterGroups][][filters][][field]","in":"query","type":"string","description":"Field"},{"name":"searchCriteria[filterGroups][][filters][][value]","in":"query","type":"string","description":"Value"},{"name":"searchCriteria[filterGroups][][filters][][conditionType]","in":"query","type":"string","description":"Condition type"},{"name":"searchCriteria[sortOrders][][field]","in":"query","type":"string","description":"Sorting field."},{"name":"searchCriteria[sortOrders][][direction]","in":"query","type":"string","description":"Sorting direction."},{"name":"searchCriteria[pageSize]","in":"query","type":"integer","description":"Page size."},{"name":"searchCriteria[currentPage]","in":"query","type":"integer","description":"Current page."}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/catalog-data-product-search-results-interface"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/products/{sku}":{"put":{"tags":["catalogProductRepositoryV1"],"description":"Create product","operationId":"catalogProductRepositoryV1SavePut","parameters":[{"name":"sku","in":"path","type":"string","required":true},{"name":"$body","in":"body","schema":{"required":["product"],"properties":{"product":{"$ref":"#/definitions/catalog-data-product-interface"},"saveOptions":{"type":"boolean"}},"type":"object"}}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/catalog-data-product-interface"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}},"delete":{"tags":["catalogProductRepositoryV1"],"description":"","operationId":"catalogProductRepositoryV1DeleteByIdDelete","parameters":[{"name":"sku","in":"path","type":"string","required":true}],"responses":{"200":{"description":"200 Success.","schema":{"type":"boolean","description":"Will returned True if deleted"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}},"get":{"tags":["catalogProductRepositoryV1"],"description":"Get info about product by product SKU","operationId":"catalogProductRepositoryV1GetGet","parameters":[{"name":"sku","in":"path","type":"string","required":true},{"name":"editMode","in":"query","type":"boolean","required":false},{"name":"storeId","in":"query","type":"integer","required":false},{"name":"forceReload","in":"query","type":"boolean","required":false}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/catalog-data-product-interface"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/products/attributes/types":{"get":{"tags":["catalogProductAttributeTypesListV1"],"description":"Retrieve list of product attribute types","operationId":"catalogProductAttributeTypesListV1GetItemsGet","responses":{"200":{"description":"200 Success.","schema":{"type":"array","items":{"$ref":"#/definitions/catalog-data-product-attribute-type-interface"}}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/products/attributes/{attributeCode}":{"get":{"tags":["catalogProductAttributeRepositoryV1"],"description":"Retrieve specific attribute","operationId":"catalogProductAttributeRepositoryV1GetGet","parameters":[{"name":"attributeCode","in":"path","type":"string","required":true}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/catalog-data-product-attribute-interface"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}},"put":{"tags":["catalogProductAttributeRepositoryV1"],"description":"Save attribute data","operationId":"catalogProductAttributeRepositoryV1SavePut","parameters":[{"name":"attributeCode","in":"path","type":"string","required":true},{"name":"$body","in":"body","schema":{"required":["attribute"],"properties":{"attribute":{"$ref":"#/definitions/catalog-data-product-attribute-interface"}},"type":"object"}}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/catalog-data-product-attribute-interface"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}},"delete":{"tags":["catalogProductAttributeRepositoryV1"],"description":"Delete Attribute by id","operationId":"catalogProductAttributeRepositoryV1DeleteByIdDelete","parameters":[{"name":"attributeCode","in":"path","type":"string","required":true}],"responses":{"200":{"description":"200 Success.","schema":{"type":"boolean"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/products/attributes":{"get":{"tags":["catalogProductAttributeRepositoryV1"],"description":"Retrieve all attributes for entity type","operationId":"catalogProductAttributeRepositoryV1GetListGet","parameters":[{"name":"searchCriteria[filterGroups][][filters][][field]","in":"query","type":"string","description":"Field"},{"name":"searchCriteria[filterGroups][][filters][][value]","in":"query","type":"string","description":"Value"},{"name":"searchCriteria[filterGroups][][filters][][conditionType]","in":"query","type":"string","description":"Condition type"},{"name":"searchCriteria[sortOrders][][field]","in":"query","type":"string","description":"Sorting field."},{"name":"searchCriteria[sortOrders][][direction]","in":"query","type":"string","description":"Sorting direction."},{"name":"searchCriteria[pageSize]","in":"query","type":"integer","description":"Page size."},{"name":"searchCriteria[currentPage]","in":"query","type":"integer","description":"Current page."}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/catalog-data-product-attribute-search-results-interface"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}},"post":{"tags":["catalogProductAttributeRepositoryV1"],"description":"Save attribute data","operationId":"catalogProductAttributeRepositoryV1SavePost","parameters":[{"name":"$body","in":"body","schema":{"required":["attribute"],"properties":{"attribute":{"$ref":"#/definitions/catalog-data-product-attribute-interface"}},"type":"object"}}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/catalog-data-product-attribute-interface"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/categories/attributes/{attributeCode}":{"get":{"tags":["catalogCategoryAttributeRepositoryV1"],"description":"Retrieve specific attribute","operationId":"catalogCategoryAttributeRepositoryV1GetGet","parameters":[{"name":"attributeCode","in":"path","type":"string","required":true}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/catalog-data-category-attribute-interface"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/categories/attributes":{"get":{"tags":["catalogCategoryAttributeRepositoryV1"],"description":"Retrieve all attributes for entity type","operationId":"catalogCategoryAttributeRepositoryV1GetListGet","parameters":[{"name":"searchCriteria[filterGroups][][filters][][field]","in":"query","type":"string","description":"Field"},{"name":"searchCriteria[filterGroups][][filters][][value]","in":"query","type":"string","description":"Value"},{"name":"searchCriteria[filterGroups][][filters][][conditionType]","in":"query","type":"string","description":"Condition type"},{"name":"searchCriteria[sortOrders][][field]","in":"query","type":"string","description":"Sorting field."},{"name":"searchCriteria[sortOrders][][direction]","in":"query","type":"string","description":"Sorting direction."},{"name":"searchCriteria[pageSize]","in":"query","type":"integer","description":"Page size."},{"name":"searchCriteria[currentPage]","in":"query","type":"integer","description":"Current page."}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/catalog-data-category-attribute-search-results-interface"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/categories/attributes/{attributeCode}/options":{"get":{"tags":["catalogCategoryAttributeOptionManagementV1"],"description":"Retrieve list of attribute options","operationId":"catalogCategoryAttributeOptionManagementV1GetItemsGet","parameters":[{"name":"attributeCode","in":"path","type":"string","required":true}],"responses":{"200":{"description":"200 Success.","schema":{"type":"array","items":{"$ref":"#/definitions/eav-data-attribute-option-interface"}}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/products/types":{"get":{"tags":["catalogProductTypeListV1"],"description":"Retrieve available product types","operationId":"catalogProductTypeListV1GetProductTypesGet","responses":{"200":{"description":"200 Success.","schema":{"type":"array","items":{"$ref":"#/definitions/catalog-data-product-type-interface"}}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/products/attribute-sets/sets/list":{"get":{"tags":["catalogAttributeSetRepositoryV1"],"description":"Retrieve list of Attribute Sets","operationId":"catalogAttributeSetRepositoryV1GetListGet","parameters":[{"name":"searchCriteria[filterGroups][][filters][][field]","in":"query","type":"string","description":"Field"},{"name":"searchCriteria[filterGroups][][filters][][value]","in":"query","type":"string","description":"Value"},{"name":"searchCriteria[filterGroups][][filters][][conditionType]","in":"query","type":"string","description":"Condition type"},{"name":"searchCriteria[sortOrders][][field]","in":"query","type":"string","description":"Sorting field."},{"name":"searchCriteria[sortOrders][][direction]","in":"query","type":"string","description":"Sorting direction."},{"name":"searchCriteria[pageSize]","in":"query","type":"integer","description":"Page size."},{"name":"searchCriteria[currentPage]","in":"query","type":"integer","description":"Current page."}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/eav-data-attribute-set-search-results-interface"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/products/attribute-sets/{attributeSetId}":{"get":{"tags":["catalogAttributeSetRepositoryV1"],"description":"Retrieve attribute set information based on given ID","operationId":"catalogAttributeSetRepositoryV1GetGet","parameters":[{"name":"attributeSetId","in":"path","type":"integer","required":true}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/eav-data-attribute-set-interface"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}},"delete":{"tags":["catalogAttributeSetRepositoryV1"],"description":"Remove attribute set by given ID","operationId":"catalogAttributeSetRepositoryV1DeleteByIdDelete","parameters":[{"name":"attributeSetId","in":"path","type":"integer","required":true}],"responses":{"200":{"description":"200 Success.","schema":{"type":"boolean"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}},"put":{"tags":["catalogAttributeSetRepositoryV1"],"description":"Save attribute set data","operationId":"catalogAttributeSetRepositoryV1SavePut","parameters":[{"name":"attributeSetId","in":"path","type":"string","required":true},{"name":"$body","in":"body","schema":{"required":["attributeSet"],"properties":{"attributeSet":{"$ref":"#/definitions/eav-data-attribute-set-interface"}},"type":"object"}}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/eav-data-attribute-set-interface"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"500":{"description":"Internal Server error","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/products/attribute-sets":{"post":{"tags":["catalogAttributeSetManagementV1"],"description":"Create attribute set from data","operationId":"catalogAttributeSetManagementV1CreatePost","parameters":[{"name":"$body","in":"body","schema":{"required":["attributeSet","skeletonId"],"properties":{"attributeSet":{"$ref":"#/definitions/eav-data-attribute-set-interface"},"skeletonId":{"type":"integer"}},"type":"object"}}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/eav-data-attribute-set-interface"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/products/attribute-sets/{attributeSetId}/attributes":{"get":{"tags":["catalogProductAttributeManagementV1"],"description":"Retrieve related attributes based on given attribute set ID","operationId":"catalogProductAttributeManagementV1GetAttributesGet","parameters":[{"name":"attributeSetId","in":"path","type":"string","required":true}],"responses":{"200":{"description":"200 Success.","schema":{"type":"array","items":{"$ref":"#/definitions/catalog-data-product-attribute-interface"}}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/products/attribute-sets/attributes":{"post":{"tags":["catalogProductAttributeManagementV1"],"description":"Assign attribute to attribute set","operationId":"catalogProductAttributeManagementV1AssignPost","parameters":[{"name":"$body","in":"body","schema":{"required":["attributeSetId","attributeGroupId","attributeCode","sortOrder"],"properties":{"attributeSetId":{"type":"integer"},"attributeGroupId":{"type":"integer"},"attributeCode":{"type":"string"},"sortOrder":{"type":"integer"}},"type":"object"}}],"responses":{"200":{"description":"200 Success.","schema":{"type":"integer"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/products/attribute-sets/{attributeSetId}/attributes/{attributeCode}":{"delete":{"tags":["catalogProductAttributeManagementV1"],"description":"Remove attribute from attribute set","operationId":"catalogProductAttributeManagementV1UnassignDelete","parameters":[{"name":"attributeSetId","in":"path","type":"string","required":true},{"name":"attributeCode","in":"path","type":"string","required":true}],"responses":{"200":{"description":"200 Success.","schema":{"type":"boolean"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/products/attribute-sets/groups/list":{"get":{"tags":["catalogProductAttributeGroupRepositoryV1"],"description":"Retrieve list of attribute groups","operationId":"catalogProductAttributeGroupRepositoryV1GetListGet","parameters":[{"name":"searchCriteria[filterGroups][][filters][][field]","in":"query","type":"string","description":"Field"},{"name":"searchCriteria[filterGroups][][filters][][value]","in":"query","type":"string","description":"Value"},{"name":"searchCriteria[filterGroups][][filters][][conditionType]","in":"query","type":"string","description":"Condition type"},{"name":"searchCriteria[sortOrders][][field]","in":"query","type":"string","description":"Sorting field."},{"name":"searchCriteria[sortOrders][][direction]","in":"query","type":"string","description":"Sorting direction."},{"name":"searchCriteria[pageSize]","in":"query","type":"integer","description":"Page size."},{"name":"searchCriteria[currentPage]","in":"query","type":"integer","description":"Current page."}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/eav-data-attribute-group-search-results-interface"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/products/attribute-sets/groups":{"post":{"tags":["catalogProductAttributeGroupRepositoryV1"],"description":"Save attribute group","operationId":"catalogProductAttributeGroupRepositoryV1SavePost","parameters":[{"name":"$body","in":"body","schema":{"required":["group"],"properties":{"group":{"$ref":"#/definitions/eav-data-attribute-group-interface"}},"type":"object"}}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/eav-data-attribute-group-interface"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/products/attribute-sets/{attributeSetId}/groups":{"put":{"tags":["catalogProductAttributeGroupRepositoryV1"],"description":"Save attribute group","operationId":"catalogProductAttributeGroupRepositoryV1SavePut","parameters":[{"name":"attributeSetId","in":"path","type":"string","required":true},{"name":"$body","in":"body","schema":{"required":["group"],"properties":{"group":{"$ref":"#/definitions/eav-data-attribute-group-interface"}},"type":"object"}}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/eav-data-attribute-group-interface"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/products/attribute-sets/groups/{groupId}":{"delete":{"tags":["catalogProductAttributeGroupRepositoryV1"],"description":"Remove attribute group by id","operationId":"catalogProductAttributeGroupRepositoryV1DeleteByIdDelete","parameters":[{"name":"groupId","in":"path","type":"integer","required":true}],"responses":{"200":{"description":"200 Success.","schema":{"type":"boolean"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/products/attributes/{attributeCode}/options":{"get":{"tags":["catalogProductAttributeOptionManagementV1"],"description":"Retrieve list of attribute options","operationId":"catalogProductAttributeOptionManagementV1GetItemsGet","parameters":[{"name":"attributeCode","in":"path","type":"string","required":true}],"responses":{"200":{"description":"200 Success.","schema":{"type":"array","items":{"$ref":"#/definitions/eav-data-attribute-option-interface"}}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}},"post":{"tags":["catalogProductAttributeOptionManagementV1"],"description":"Add option to attribute","operationId":"catalogProductAttributeOptionManagementV1AddPost","parameters":[{"name":"attributeCode","in":"path","type":"string","required":true},{"name":"$body","in":"body","schema":{"required":["option"],"properties":{"option":{"$ref":"#/definitions/eav-data-attribute-option-interface"}},"type":"object"}}],"responses":{"200":{"description":"200 Success.","schema":{"type":"boolean"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/products/attributes/{attributeCode}/options/{optionId}":{"delete":{"tags":["catalogProductAttributeOptionManagementV1"],"description":"Delete option from attribute","operationId":"catalogProductAttributeOptionManagementV1DeleteDelete","parameters":[{"name":"attributeCode","in":"path","type":"string","required":true},{"name":"optionId","in":"path","type":"string","required":true}],"responses":{"200":{"description":"200 Success.","schema":{"type":"boolean"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/products/media/types/{attributeSetName}":{"get":{"tags":["catalogProductMediaAttributeManagementV1"],"description":"Retrieve the list of media attributes (fronted input type is media_image) assigned to the given attribute set.","operationId":"catalogProductMediaAttributeManagementV1GetListGet","parameters":[{"name":"attributeSetName","in":"path","type":"string","required":true}],"responses":{"200":{"description":"200 Success.","schema":{"type":"array","description":"list of media attributes","items":{"$ref":"#/definitions/catalog-data-product-attribute-interface"}}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/products/{sku}/media/{entryId}":{"get":{"tags":["catalogProductAttributeMediaGalleryManagementV1"],"description":"Return information about gallery entry","operationId":"catalogProductAttributeMediaGalleryManagementV1GetGet","parameters":[{"name":"sku","in":"path","type":"string","required":true},{"name":"entryId","in":"path","type":"integer","required":true}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/catalog-data-product-attribute-media-gallery-entry-interface"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}},"put":{"tags":["catalogProductAttributeMediaGalleryManagementV1"],"description":"Update gallery entry","operationId":"catalogProductAttributeMediaGalleryManagementV1UpdatePut","parameters":[{"name":"sku","in":"path","type":"string","required":true},{"name":"entryId","in":"path","type":"string","required":true},{"name":"$body","in":"body","schema":{"required":["entry"],"properties":{"entry":{"$ref":"#/definitions/catalog-data-product-attribute-media-gallery-entry-interface"}},"type":"object"}}],"responses":{"200":{"description":"200 Success.","schema":{"type":"boolean"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}},"delete":{"tags":["catalogProductAttributeMediaGalleryManagementV1"],"description":"Remove gallery entry","operationId":"catalogProductAttributeMediaGalleryManagementV1RemoveDelete","parameters":[{"name":"sku","in":"path","type":"string","required":true},{"name":"entryId","in":"path","type":"integer","required":true}],"responses":{"200":{"description":"200 Success.","schema":{"type":"boolean"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/products/{sku}/media":{"post":{"tags":["catalogProductAttributeMediaGalleryManagementV1"],"description":"Create new gallery entry","operationId":"catalogProductAttributeMediaGalleryManagementV1CreatePost","parameters":[{"name":"sku","in":"path","type":"string","required":true},{"name":"$body","in":"body","schema":{"required":["entry"],"properties":{"entry":{"$ref":"#/definitions/catalog-data-product-attribute-media-gallery-entry-interface"}},"type":"object"}}],"responses":{"200":{"description":"200 Success.","schema":{"type":"integer","description":"gallery entry ID"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}},"get":{"tags":["catalogProductAttributeMediaGalleryManagementV1"],"description":"Retrieve the list of gallery entries associated with given product","operationId":"catalogProductAttributeMediaGalleryManagementV1GetListGet","parameters":[{"name":"sku","in":"path","type":"string","required":true}],"responses":{"200":{"description":"200 Success.","schema":{"type":"array","items":{"$ref":"#/definitions/catalog-data-product-attribute-media-gallery-entry-interface"}}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/products/{sku}/group-prices/{customerGroupId}/tiers":{"get":{"tags":["catalogProductTierPriceManagementV1"],"description":"Get tier price of product","operationId":"catalogProductTierPriceManagementV1GetListGet","parameters":[{"name":"sku","in":"path","type":"string","required":true},{"name":"customerGroupId","in":"path","type":"string","required":true,"description":"'all' can be used to specify 'ALL GROUPS'"}],"responses":{"200":{"description":"200 Success.","schema":{"type":"array","items":{"$ref":"#/definitions/catalog-data-product-tier-price-interface"}}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/products/{sku}/group-prices/{customerGroupId}/tiers/{qty}/price/{price}":{"post":{"tags":["catalogProductTierPriceManagementV1"],"description":"Create tier price for product","operationId":"catalogProductTierPriceManagementV1AddPost","parameters":[{"name":"sku","in":"path","type":"string","required":true},{"name":"customerGroupId","in":"path","type":"string","required":true,"description":"'all' can be used to specify 'ALL GROUPS'"},{"name":"price","in":"path","type":"number","required":true},{"name":"qty","in":"path","type":"number","required":true}],"responses":{"200":{"description":"200 Success.","schema":{"type":"boolean"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/products/{sku}/group-prices/{customerGroupId}/tiers/{qty}":{"delete":{"tags":["catalogProductTierPriceManagementV1"],"description":"Remove tier price from product","operationId":"catalogProductTierPriceManagementV1RemoveDelete","parameters":[{"name":"sku","in":"path","type":"string","required":true},{"name":"customerGroupId","in":"path","type":"string","required":true,"description":"'all' can be used to specify 'ALL GROUPS'"},{"name":"qty","in":"path","type":"number","required":true}],"responses":{"200":{"description":"200 Success.","schema":{"type":"boolean"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/categories/{categoryId}":{"delete":{"tags":["catalogCategoryRepositoryV1"],"description":"Delete category by identifier","operationId":"catalogCategoryRepositoryV1DeleteByIdentifierDelete","parameters":[{"name":"categoryId","in":"path","type":"integer","required":true}],"responses":{"200":{"description":"200 Success.","schema":{"type":"boolean","description":"Will returned True if deleted"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}},"get":{"tags":["catalogCategoryRepositoryV1"],"description":"Get info about category by category id","operationId":"catalogCategoryRepositoryV1GetGet","parameters":[{"name":"categoryId","in":"path","type":"integer","required":true},{"name":"storeId","in":"query","type":"integer","required":false}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/catalog-data-category-interface"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/categories":{"post":{"tags":["catalogCategoryRepositoryV1"],"description":"Create category service","operationId":"catalogCategoryRepositoryV1SavePost","parameters":[{"name":"$body","in":"body","schema":{"required":["category"],"properties":{"category":{"$ref":"#/definitions/catalog-data-category-interface"}},"type":"object"}}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/catalog-data-category-interface"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}},"get":{"tags":["catalogCategoryManagementV1"],"description":"Retrieve list of categories","operationId":"catalogCategoryManagementV1GetTreeGet","parameters":[{"name":"rootCategoryId","in":"query","type":"integer","required":false},{"name":"depth","in":"query","type":"integer","required":false}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/catalog-data-category-tree-interface"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/categories/{id}":{"put":{"tags":["catalogCategoryRepositoryV1"],"description":"Create category service","operationId":"catalogCategoryRepositoryV1SavePut","parameters":[{"name":"id","in":"path","type":"string","required":true},{"name":"$body","in":"body","schema":{"required":["category"],"properties":{"category":{"$ref":"#/definitions/catalog-data-category-interface"}},"type":"object"}}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/catalog-data-category-interface"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/categories/{categoryId}/move":{"put":{"tags":["catalogCategoryManagementV1"],"description":"Move category","operationId":"catalogCategoryManagementV1MovePut","parameters":[{"name":"categoryId","in":"path","type":"integer","required":true},{"name":"$body","in":"body","schema":{"required":["parentId"],"properties":{"parentId":{"type":"integer"},"afterId":{"type":"integer"}},"type":"object"}}],"responses":{"200":{"description":"200 Success.","schema":{"type":"boolean"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"500":{"description":"Internal Server error","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/products/options/types":{"get":{"tags":["catalogProductCustomOptionTypeListV1"],"description":"Get custom option types","operationId":"catalogProductCustomOptionTypeListV1GetItemsGet","responses":{"200":{"description":"200 Success.","schema":{"type":"array","items":{"$ref":"#/definitions/catalog-data-product-custom-option-type-interface"}}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/products/{sku}/options":{"get":{"tags":["catalogProductCustomOptionRepositoryV1"],"description":"Get the list of custom options for a specific product","operationId":"catalogProductCustomOptionRepositoryV1GetListGet","parameters":[{"name":"sku","in":"path","type":"string","required":true}],"responses":{"200":{"description":"200 Success.","schema":{"type":"array","items":{"$ref":"#/definitions/catalog-data-product-custom-option-interface"}}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/products/{sku}/options/{optionId}":{"get":{"tags":["catalogProductCustomOptionRepositoryV1"],"description":"Get custom option for a specific product","operationId":"catalogProductCustomOptionRepositoryV1GetGet","parameters":[{"name":"sku","in":"path","type":"string","required":true},{"name":"optionId","in":"path","type":"integer","required":true}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/catalog-data-product-custom-option-interface"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}},"delete":{"tags":["catalogProductCustomOptionRepositoryV1"],"description":"","operationId":"catalogProductCustomOptionRepositoryV1DeleteByIdentifierDelete","parameters":[{"name":"sku","in":"path","type":"string","required":true},{"name":"optionId","in":"path","type":"integer","required":true}],"responses":{"200":{"description":"200 Success.","schema":{"type":"boolean"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/products/options":{"post":{"tags":["catalogProductCustomOptionRepositoryV1"],"description":"Save Custom Option","operationId":"catalogProductCustomOptionRepositoryV1SavePost","parameters":[{"name":"$body","in":"body","schema":{"required":["option"],"properties":{"option":{"$ref":"#/definitions/catalog-data-product-custom-option-interface"}},"type":"object"}}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/catalog-data-product-custom-option-interface"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/products/options/{optionId}":{"put":{"tags":["catalogProductCustomOptionRepositoryV1"],"description":"Save Custom Option","operationId":"catalogProductCustomOptionRepositoryV1SavePut","parameters":[{"name":"optionId","in":"path","type":"string","required":true},{"name":"$body","in":"body","schema":{"required":["option"],"properties":{"option":{"$ref":"#/definitions/catalog-data-product-custom-option-interface"}},"type":"object"}}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/catalog-data-product-custom-option-interface"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/products/links/types":{"get":{"tags":["catalogProductLinkTypeListV1"],"description":"Retrieve information about available product link types","operationId":"catalogProductLinkTypeListV1GetItemsGet","responses":{"200":{"description":"200 Success.","schema":{"type":"array","items":{"$ref":"#/definitions/catalog-data-product-link-type-interface"}}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/products/links/{type}/attributes":{"get":{"tags":["catalogProductLinkTypeListV1"],"description":"Provide a list of the product link type attributes","operationId":"catalogProductLinkTypeListV1GetItemAttributesGet","parameters":[{"name":"type","in":"path","type":"string","required":true}],"responses":{"200":{"description":"200 Success.","schema":{"type":"array","items":{"$ref":"#/definitions/catalog-data-product-link-attribute-interface"}}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/products/{sku}/links/{type}":{"get":{"tags":["catalogProductLinkManagementV1"],"description":"Provide the list of links for a specific product","operationId":"catalogProductLinkManagementV1GetLinkedItemsByTypeGet","parameters":[{"name":"sku","in":"path","type":"string","required":true},{"name":"type","in":"path","type":"string","required":true}],"responses":{"200":{"description":"200 Success.","schema":{"type":"array","items":{"$ref":"#/definitions/catalog-data-product-link-interface"}}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/products/{sku}/links":{"post":{"tags":["catalogProductLinkManagementV1"],"description":"Assign a product link to another product","operationId":"catalogProductLinkManagementV1SetProductLinksPost","parameters":[{"name":"sku","in":"path","type":"string","required":true},{"name":"$body","in":"body","schema":{"required":["items"],"properties":{"items":{"type":"array","items":{"$ref":"#/definitions/catalog-data-product-link-interface"}}},"type":"object"}}],"responses":{"200":{"description":"200 Success.","schema":{"type":"boolean"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}},"put":{"tags":["catalogProductLinkRepositoryV1"],"description":"Save product link","operationId":"catalogProductLinkRepositoryV1SavePut","parameters":[{"name":"sku","in":"path","type":"string","required":true},{"name":"$body","in":"body","schema":{"required":["entity"],"properties":{"entity":{"$ref":"#/definitions/catalog-data-product-link-interface"}},"type":"object"}}],"responses":{"200":{"description":"200 Success.","schema":{"type":"boolean"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/products/{sku}/links/{type}/{linkedProductSku}":{"delete":{"tags":["catalogProductLinkRepositoryV1"],"description":"","operationId":"catalogProductLinkRepositoryV1DeleteByIdDelete","parameters":[{"name":"sku","in":"path","type":"string","required":true},{"name":"type","in":"path","type":"string","required":true},{"name":"linkedProductSku","in":"path","type":"string","required":true}],"responses":{"200":{"description":"200 Success.","schema":{"type":"boolean"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/categories/{categoryId}/products":{"get":{"tags":["catalogCategoryLinkManagementV1"],"description":"Get products assigned to category","operationId":"catalogCategoryLinkManagementV1GetAssignedProductsGet","parameters":[{"name":"categoryId","in":"path","type":"integer","required":true}],"responses":{"200":{"description":"200 Success.","schema":{"type":"array","items":{"$ref":"#/definitions/catalog-data-category-product-link-interface"}}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}},"post":{"tags":["catalogCategoryLinkRepositoryV1"],"description":"Assign a product to the required category","operationId":"catalogCategoryLinkRepositoryV1SavePost","parameters":[{"name":"categoryId","in":"path","type":"string","required":true},{"name":"$body","in":"body","schema":{"required":["productLink"],"properties":{"productLink":{"$ref":"#/definitions/catalog-data-category-product-link-interface"}},"type":"object"}}],"responses":{"200":{"description":"200 Success.","schema":{"type":"boolean","description":"will returned True if assigned"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}},"put":{"tags":["catalogCategoryLinkRepositoryV1"],"description":"Assign a product to the required category","operationId":"catalogCategoryLinkRepositoryV1SavePut","parameters":[{"name":"categoryId","in":"path","type":"string","required":true},{"name":"$body","in":"body","schema":{"required":["productLink"],"properties":{"productLink":{"$ref":"#/definitions/catalog-data-category-product-link-interface"}},"type":"object"}}],"responses":{"200":{"description":"200 Success.","schema":{"type":"boolean","description":"will returned True if assigned"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/categories/{categoryId}/products/{sku}":{"delete":{"tags":["catalogCategoryLinkRepositoryV1"],"description":"Remove the product assignment from the category by category id and sku","operationId":"catalogCategoryLinkRepositoryV1DeleteByIdsDelete","parameters":[{"name":"categoryId","in":"path","type":"string","required":true},{"name":"sku","in":"path","type":"string","required":true}],"responses":{"200":{"description":"200 Success.","schema":{"type":"boolean","description":"will returned True if products successfully deleted"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/products/{sku}/websites":{"post":{"tags":["catalogProductWebsiteLinkRepositoryV1"],"description":"Assign a product to the website","operationId":"catalogProductWebsiteLinkRepositoryV1SavePost","parameters":[{"name":"sku","in":"path","type":"string","required":true},{"name":"$body","in":"body","schema":{"required":["productWebsiteLink"],"properties":{"productWebsiteLink":{"$ref":"#/definitions/catalog-data-product-website-link-interface"}},"type":"object"}}],"responses":{"200":{"description":"200 Success.","schema":{"type":"boolean","description":"will returned True if website successfully assigned to product"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}},"put":{"tags":["catalogProductWebsiteLinkRepositoryV1"],"description":"Assign a product to the website","operationId":"catalogProductWebsiteLinkRepositoryV1SavePut","parameters":[{"name":"sku","in":"path","type":"string","required":true},{"name":"$body","in":"body","schema":{"required":["productWebsiteLink"],"properties":{"productWebsiteLink":{"$ref":"#/definitions/catalog-data-product-website-link-interface"}},"type":"object"}}],"responses":{"200":{"description":"200 Success.","schema":{"type":"boolean","description":"will returned True if website successfully assigned to product"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/products/{sku}/websites/{websiteId}":{"delete":{"tags":["catalogProductWebsiteLinkRepositoryV1"],"description":"Remove the website assignment from the product by product sku","operationId":"catalogProductWebsiteLinkRepositoryV1DeleteByIdDelete","parameters":[{"name":"sku","in":"path","type":"string","required":true},{"name":"websiteId","in":"path","type":"integer","required":true}],"responses":{"200":{"description":"200 Success.","schema":{"type":"boolean","description":"will returned True if website successfully unassigned from product"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/search":{"get":{"tags":["searchV1"],"description":"Make Full Text Search and return found Documents","operationId":"searchV1SearchGet","parameters":[{"name":"searchCriteria[requestName]","in":"query","type":"string"},{"name":"searchCriteria[filterGroups][][filters][][field]","in":"query","type":"string","description":"Field"},{"name":"searchCriteria[filterGroups][][filters][][value]","in":"query","type":"string","description":"Value"},{"name":"searchCriteria[filterGroups][][filters][][conditionType]","in":"query","type":"string","description":"Condition type"},{"name":"searchCriteria[sortOrders][][field]","in":"query","type":"string","description":"Sorting field."},{"name":"searchCriteria[sortOrders][][direction]","in":"query","type":"string","description":"Sorting direction."},{"name":"searchCriteria[pageSize]","in":"query","type":"integer","description":"Page size."},{"name":"searchCriteria[currentPage]","in":"query","type":"integer","description":"Current page."}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/framework-search-search-result-interface"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/carts/licence":{"get":{"tags":["checkoutAgreementsCheckoutAgreementsRepositoryV1"],"description":"Lists active checkout agreements.","operationId":"checkoutAgreementsCheckoutAgreementsRepositoryV1GetListGet","responses":{"200":{"description":"200 Success.","schema":{"type":"array","items":{"$ref":"#/definitions/checkout-agreements-data-agreement-interface"}}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/carts/{cartId}":{"get":{"tags":["quoteCartRepositoryV1"],"description":"Enables an administrative user to return information for a specified cart.","operationId":"quoteCartRepositoryV1GetGet","parameters":[{"name":"cartId","in":"path","type":"integer","required":true}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/quote-data-cart-interface"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}},"put":{"tags":["quoteCartManagementV1"],"description":"Assigns a specified customer to a specified shopping cart.","operationId":"quoteCartManagementV1AssignCustomerPut","parameters":[{"name":"cartId","in":"path","type":"integer","required":true,"description":"The cart ID."},{"name":"$body","in":"body","schema":{"required":["customerId","storeId"],"properties":{"customerId":{"type":"integer","description":"The customer ID."},"storeId":{"type":"integer"}},"type":"object"}}],"responses":{"200":{"description":"200 Success.","schema":{"type":"boolean"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/carts/search":{"get":{"tags":["quoteCartRepositoryV1"],"description":"Enables administrative users to list carts that match specified search criteria.","operationId":"quoteCartRepositoryV1GetListGet","parameters":[{"name":"searchCriteria[filterGroups][][filters][][field]","in":"query","type":"string","description":"Field"},{"name":"searchCriteria[filterGroups][][filters][][value]","in":"query","type":"string","description":"Value"},{"name":"searchCriteria[filterGroups][][filters][][conditionType]","in":"query","type":"string","description":"Condition type"},{"name":"searchCriteria[sortOrders][][field]","in":"query","type":"string","description":"Sorting field."},{"name":"searchCriteria[sortOrders][][direction]","in":"query","type":"string","description":"Sorting direction."},{"name":"searchCriteria[pageSize]","in":"query","type":"integer","description":"Page size."},{"name":"searchCriteria[currentPage]","in":"query","type":"integer","description":"Current page."}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/quote-data-cart-search-results-interface"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/carts/":{"post":{"tags":["quoteCartManagementV1"],"description":"Creates an empty cart and quote for a guest.","operationId":"quoteCartManagementV1CreateEmptyCartPost","responses":{"200":{"description":"200 Success.","schema":{"type":"integer","description":"Cart ID."}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/customers/{customerId}/carts":{"post":{"tags":["quoteCartManagementV1"],"description":"Creates an empty cart and quote for a specified customer.","operationId":"quoteCartManagementV1CreateEmptyCartForCustomerPost","parameters":[{"name":"customerId","in":"path","type":"integer","required":true,"description":"The customer ID."}],"responses":{"200":{"description":"200 Success.","schema":{"type":"integer","description":"Cart ID."}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/carts/mine":{"post":{"tags":["quoteCartManagementV1"],"description":"Creates an empty cart and quote for a specified customer.","operationId":"quoteCartManagementV1CreateEmptyCartForCustomerPost","responses":{"200":{"description":"200 Success.","schema":{"type":"integer","description":"Cart ID."}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}},"get":{"tags":["quoteCartManagementV1"],"description":"Returns information for the cart for a specified customer.","operationId":"quoteCartManagementV1GetCartForCustomerGet","responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/quote-data-cart-interface"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/carts/mine/order":{"put":{"tags":["quoteCartManagementV1"],"description":"Places an order for a specified cart.","operationId":"quoteCartManagementV1PlaceOrderPut","parameters":[{"name":"$body","in":"body","schema":{"properties":{"paymentMethod":{"$ref":"#/definitions/quote-data-payment-interface"}},"type":"object"}}],"responses":{"200":{"description":"200 Success.","schema":{"type":"integer","description":"Order ID."}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/carts/{cartId}/order":{"put":{"tags":["quoteCartManagementV1"],"description":"Places an order for a specified cart.","operationId":"quoteCartManagementV1PlaceOrderPut","parameters":[{"name":"cartId","in":"path","type":"integer","required":true,"description":"The cart ID."},{"name":"$body","in":"body","schema":{"properties":{"paymentMethod":{"$ref":"#/definitions/quote-data-payment-interface"}},"type":"object"}}],"responses":{"200":{"description":"200 Success.","schema":{"type":"integer","description":"Order ID."}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/guest-carts/{cartId}":{"get":{"tags":["quoteGuestCartRepositoryV1"],"description":"Enable a guest user to return information for a specified cart.","operationId":"quoteGuestCartRepositoryV1GetGet","parameters":[{"name":"cartId","in":"path","type":"string","required":true}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/quote-data-cart-interface"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}},"put":{"tags":["quoteGuestCartManagementV1"],"description":"Assign a specified customer to a specified shopping cart.","operationId":"quoteGuestCartManagementV1AssignCustomerPut","parameters":[{"name":"cartId","in":"path","type":"string","required":true,"description":"The cart ID."},{"name":"$body","in":"body","schema":{"required":["customerId","storeId"],"properties":{"customerId":{"type":"integer","description":"The customer ID."},"storeId":{"type":"integer"}},"type":"object"}}],"responses":{"200":{"description":"200 Success.","schema":{"type":"boolean"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/guest-carts":{"post":{"tags":["quoteGuestCartManagementV1"],"description":"Enable an customer or guest user to create an empty cart and quote for an anonymous customer.","operationId":"quoteGuestCartManagementV1CreateEmptyCartPost","responses":{"200":{"description":"200 Success.","schema":{"type":"string","description":"Cart ID."}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/guest-carts/{cartId}/order":{"put":{"tags":["quoteGuestCartManagementV1"],"description":"Place an order for a specified cart.","operationId":"quoteGuestCartManagementV1PlaceOrderPut","parameters":[{"name":"cartId","in":"path","type":"string","required":true,"description":"The cart ID."},{"name":"$body","in":"body","schema":{"properties":{"paymentMethod":{"$ref":"#/definitions/quote-data-payment-interface"}},"type":"object"}}],"responses":{"200":{"description":"200 Success.","schema":{"type":"integer","description":"Order ID."}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/carts/{cartId}/shipping-methods":{"get":{"tags":["quoteShippingMethodManagementV1"],"description":"Lists applicable shipping methods for a specified quote.","operationId":"quoteShippingMethodManagementV1GetListGet","parameters":[{"name":"cartId","in":"path","type":"integer","required":true,"description":"The shopping cart ID."}],"responses":{"200":{"description":"200 Success.","schema":{"type":"array","description":"An array of shipping methods.","items":{"$ref":"#/definitions/quote-data-shipping-method-interface"}}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/carts/{cartId}/estimate-shipping-methods":{"post":{"tags":["quoteShippingMethodManagementV1"],"description":"Estimate shipping","operationId":"quoteShippingMethodManagementV1EstimateByAddressPost","parameters":[{"name":"cartId","in":"path","type":"integer","required":true,"description":"The shopping cart ID."},{"name":"$body","in":"body","schema":{"required":["address"],"properties":{"address":{"$ref":"#/definitions/quote-data-estimate-address-interface"}},"type":"object"}}],"responses":{"200":{"description":"200 Success.","schema":{"type":"array","description":"An array of shipping methods.","items":{"$ref":"#/definitions/quote-data-shipping-method-interface"}}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/carts/{cartId}/estimate-shipping-methods-by-address-id":{"post":{"tags":["quoteShippingMethodManagementV1"],"description":"Estimate shipping","operationId":"quoteShippingMethodManagementV1EstimateByAddressIdPost","parameters":[{"name":"cartId","in":"path","type":"integer","required":true,"description":"The shopping cart ID."},{"name":"$body","in":"body","schema":{"required":["addressId"],"properties":{"addressId":{"type":"integer","description":"The estimate address id"}},"type":"object"}}],"responses":{"200":{"description":"200 Success.","schema":{"type":"array","description":"An array of shipping methods.","items":{"$ref":"#/definitions/quote-data-shipping-method-interface"}}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/carts/mine/shipping-methods":{"get":{"tags":["quoteShippingMethodManagementV1"],"description":"Lists applicable shipping methods for a specified quote.","operationId":"quoteShippingMethodManagementV1GetListGet","responses":{"200":{"description":"200 Success.","schema":{"type":"array","description":"An array of shipping methods.","items":{"$ref":"#/definitions/quote-data-shipping-method-interface"}}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/carts/mine/estimate-shipping-methods":{"post":{"tags":["quoteShippingMethodManagementV1"],"description":"Estimate shipping","operationId":"quoteShippingMethodManagementV1EstimateByAddressPost","parameters":[{"name":"$body","in":"body","schema":{"required":["address"],"properties":{"address":{"$ref":"#/definitions/quote-data-estimate-address-interface"}},"type":"object"}}],"responses":{"200":{"description":"200 Success.","schema":{"type":"array","description":"An array of shipping methods.","items":{"$ref":"#/definitions/quote-data-shipping-method-interface"}}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/carts/mine/estimate-shipping-methods-by-address-id":{"post":{"tags":["quoteShippingMethodManagementV1"],"description":"Estimate shipping","operationId":"quoteShippingMethodManagementV1EstimateByAddressIdPost","parameters":[{"name":"$body","in":"body","schema":{"required":["addressId"],"properties":{"addressId":{"type":"integer","description":"The estimate address id"}},"type":"object"}}],"responses":{"200":{"description":"200 Success.","schema":{"type":"array","description":"An array of shipping methods.","items":{"$ref":"#/definitions/quote-data-shipping-method-interface"}}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/guest-carts/{cartId}/shipping-methods":{"get":{"tags":["quoteGuestShippingMethodManagementV1"],"description":"List applicable shipping methods for a specified quote.","operationId":"quoteGuestShippingMethodManagementV1GetListGet","parameters":[{"name":"cartId","in":"path","type":"string","required":true,"description":"The shopping cart ID."}],"responses":{"200":{"description":"200 Success.","schema":{"type":"array","description":"An array of shipping methods.","items":{"$ref":"#/definitions/quote-data-shipping-method-interface"}}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/guest-carts/{cartId}/estimate-shipping-methods":{"post":{"tags":["quoteGuestShippingMethodManagementV1"],"description":"Estimate shipping","operationId":"quoteGuestShippingMethodManagementV1EstimateByAddressPost","parameters":[{"name":"cartId","in":"path","type":"string","required":true,"description":"The shopping cart ID."},{"name":"$body","in":"body","schema":{"required":["address"],"properties":{"address":{"$ref":"#/definitions/quote-data-estimate-address-interface"}},"type":"object"}}],"responses":{"200":{"description":"200 Success.","schema":{"type":"array","description":"An array of shipping methods.","items":{"$ref":"#/definitions/quote-data-shipping-method-interface"}}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/carts/{cartId}/items":{"get":{"tags":["quoteCartItemRepositoryV1"],"description":"Lists items that are assigned to a specified cart.","operationId":"quoteCartItemRepositoryV1GetListGet","parameters":[{"name":"cartId","in":"path","type":"integer","required":true,"description":"The cart ID."}],"responses":{"200":{"description":"200 Success.","schema":{"type":"array","description":"Array of items.","items":{"$ref":"#/definitions/quote-data-cart-item-interface"}}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/carts/{quoteId}/items":{"post":{"tags":["quoteCartItemRepositoryV1"],"description":"Add/update the specified cart item.","operationId":"quoteCartItemRepositoryV1SavePost","parameters":[{"name":"quoteId","in":"path","type":"string","required":true},{"name":"$body","in":"body","schema":{"required":["cartItem"],"properties":{"cartItem":{"$ref":"#/definitions/quote-data-cart-item-interface"}},"type":"object"}}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/quote-data-cart-item-interface"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/carts/{cartId}/items/{itemId}":{"put":{"tags":["quoteCartItemRepositoryV1"],"description":"Add/update the specified cart item.","operationId":"quoteCartItemRepositoryV1SavePut","parameters":[{"name":"cartId","in":"path","type":"string","required":true},{"name":"itemId","in":"path","type":"string","required":true},{"name":"$body","in":"body","schema":{"required":["cartItem"],"properties":{"cartItem":{"$ref":"#/definitions/quote-data-cart-item-interface"}},"type":"object"}}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/quote-data-cart-item-interface"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}},"delete":{"tags":["quoteCartItemRepositoryV1"],"description":"Removes the specified item from the specified cart.","operationId":"quoteCartItemRepositoryV1DeleteByIdDelete","parameters":[{"name":"cartId","in":"path","type":"integer","required":true,"description":"The cart ID."},{"name":"itemId","in":"path","type":"integer","required":true,"description":"The item ID of the item to be removed."}],"responses":{"200":{"description":"200 Success.","schema":{"type":"boolean"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/carts/mine/items":{"get":{"tags":["quoteCartItemRepositoryV1"],"description":"Lists items that are assigned to a specified cart.","operationId":"quoteCartItemRepositoryV1GetListGet","responses":{"200":{"description":"200 Success.","schema":{"type":"array","description":"Array of items.","items":{"$ref":"#/definitions/quote-data-cart-item-interface"}}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}},"post":{"tags":["quoteCartItemRepositoryV1"],"description":"Add/update the specified cart item.","operationId":"quoteCartItemRepositoryV1SavePost","parameters":[{"name":"$body","in":"body","schema":{"required":["cartItem"],"properties":{"cartItem":{"$ref":"#/definitions/quote-data-cart-item-interface"}},"type":"object"}}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/quote-data-cart-item-interface"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/carts/mine/items/{itemId}":{"put":{"tags":["quoteCartItemRepositoryV1"],"description":"Add/update the specified cart item.","operationId":"quoteCartItemRepositoryV1SavePut","parameters":[{"name":"itemId","in":"path","type":"string","required":true},{"name":"$body","in":"body","schema":{"required":["cartItem"],"properties":{"cartItem":{"$ref":"#/definitions/quote-data-cart-item-interface"}},"type":"object"}}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/quote-data-cart-item-interface"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}},"delete":{"tags":["quoteCartItemRepositoryV1"],"description":"Removes the specified item from the specified cart.","operationId":"quoteCartItemRepositoryV1DeleteByIdDelete","parameters":[{"name":"itemId","in":"path","type":"integer","required":true,"description":"The item ID of the item to be removed."}],"responses":{"200":{"description":"200 Success.","schema":{"type":"boolean"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/guest-carts/{cartId}/items":{"get":{"tags":["quoteGuestCartItemRepositoryV1"],"description":"List items that are assigned to a specified cart.","operationId":"quoteGuestCartItemRepositoryV1GetListGet","parameters":[{"name":"cartId","in":"path","type":"string","required":true,"description":"The cart ID."}],"responses":{"200":{"description":"200 Success.","schema":{"type":"array","description":"Array of items.","items":{"$ref":"#/definitions/quote-data-cart-item-interface"}}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}},"post":{"tags":["quoteGuestCartItemRepositoryV1"],"description":"Add the specified item to the specified cart.","operationId":"quoteGuestCartItemRepositoryV1SavePost","parameters":[{"name":"cartId","in":"path","type":"string","required":true},{"name":"$body","in":"body","schema":{"required":["cartItem"],"properties":{"cartItem":{"$ref":"#/definitions/quote-data-cart-item-interface"}},"type":"object"}}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/quote-data-cart-item-interface"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/guest-carts/{cartId}/items/{itemId}":{"put":{"tags":["quoteGuestCartItemRepositoryV1"],"description":"Add the specified item to the specified cart.","operationId":"quoteGuestCartItemRepositoryV1SavePut","parameters":[{"name":"cartId","in":"path","type":"string","required":true},{"name":"itemId","in":"path","type":"string","required":true},{"name":"$body","in":"body","schema":{"required":["cartItem"],"properties":{"cartItem":{"$ref":"#/definitions/quote-data-cart-item-interface"}},"type":"object"}}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/quote-data-cart-item-interface"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}},"delete":{"tags":["quoteGuestCartItemRepositoryV1"],"description":"Remove the specified item from the specified cart.","operationId":"quoteGuestCartItemRepositoryV1DeleteByIdDelete","parameters":[{"name":"cartId","in":"path","type":"string","required":true,"description":"The cart ID."},{"name":"itemId","in":"path","type":"integer","required":true,"description":"The item ID of the item to be removed."}],"responses":{"200":{"description":"200 Success.","schema":{"type":"boolean"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/carts/{cartId}/selected-payment-method":{"get":{"tags":["quotePaymentMethodManagementV1"],"description":"Returns the payment method for a specified shopping cart.","operationId":"quotePaymentMethodManagementV1GetGet","parameters":[{"name":"cartId","in":"path","type":"integer","required":true,"description":"The cart ID."}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/quote-data-payment-interface"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}},"put":{"tags":["quotePaymentMethodManagementV1"],"description":"Adds a specified payment method to a specified shopping cart.","operationId":"quotePaymentMethodManagementV1SetPut","parameters":[{"name":"cartId","in":"path","type":"integer","required":true,"description":"The cart ID."},{"name":"$body","in":"body","schema":{"required":["method"],"properties":{"method":{"$ref":"#/definitions/quote-data-payment-interface"}},"type":"object"}}],"responses":{"200":{"description":"200 Success.","schema":{"type":"string","description":"redirect url or error message."}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/carts/{cartId}/payment-methods":{"get":{"tags":["quotePaymentMethodManagementV1"],"description":"Lists available payment methods for a specified shopping cart.","operationId":"quotePaymentMethodManagementV1GetListGet","parameters":[{"name":"cartId","in":"path","type":"integer","required":true,"description":"The cart ID."}],"responses":{"200":{"description":"200 Success.","schema":{"type":"array","description":"Array of payment methods.","items":{"$ref":"#/definitions/quote-data-payment-method-interface"}}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/carts/mine/selected-payment-method":{"get":{"tags":["quotePaymentMethodManagementV1"],"description":"Returns the payment method for a specified shopping cart.","operationId":"quotePaymentMethodManagementV1GetGet","responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/quote-data-payment-interface"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}},"put":{"tags":["quotePaymentMethodManagementV1"],"description":"Adds a specified payment method to a specified shopping cart.","operationId":"quotePaymentMethodManagementV1SetPut","parameters":[{"name":"$body","in":"body","schema":{"required":["method"],"properties":{"method":{"$ref":"#/definitions/quote-data-payment-interface"}},"type":"object"}}],"responses":{"200":{"description":"200 Success.","schema":{"type":"string","description":"redirect url or error message."}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/carts/mine/payment-methods":{"get":{"tags":["quotePaymentMethodManagementV1"],"description":"Lists available payment methods for a specified shopping cart.","operationId":"quotePaymentMethodManagementV1GetListGet","responses":{"200":{"description":"200 Success.","schema":{"type":"array","description":"Array of payment methods.","items":{"$ref":"#/definitions/quote-data-payment-method-interface"}}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/guest-carts/{cartId}/selected-payment-method":{"get":{"tags":["quoteGuestPaymentMethodManagementV1"],"description":"Return the payment method for a specified shopping cart.","operationId":"quoteGuestPaymentMethodManagementV1GetGet","parameters":[{"name":"cartId","in":"path","type":"string","required":true,"description":"The cart ID."}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/quote-data-payment-interface"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}},"put":{"tags":["quoteGuestPaymentMethodManagementV1"],"description":"Add a specified payment method to a specified shopping cart.","operationId":"quoteGuestPaymentMethodManagementV1SetPut","parameters":[{"name":"cartId","in":"path","type":"string","required":true,"description":"The cart ID."},{"name":"$body","in":"body","schema":{"required":["method"],"properties":{"method":{"$ref":"#/definitions/quote-data-payment-interface"}},"type":"object"}}],"responses":{"200":{"description":"200 Success.","schema":{"type":"integer","description":"Payment method ID."}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/guest-carts/{cartId}/payment-methods":{"get":{"tags":["quoteGuestPaymentMethodManagementV1"],"description":"List available payment methods for a specified shopping cart.","operationId":"quoteGuestPaymentMethodManagementV1GetListGet","parameters":[{"name":"cartId","in":"path","type":"string","required":true,"description":"The cart ID."}],"responses":{"200":{"description":"200 Success.","schema":{"type":"array","description":"Array of payment methods.","items":{"$ref":"#/definitions/quote-data-payment-method-interface"}}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/carts/{cartId}/billing-address":{"get":{"tags":["quoteBillingAddressManagementV1"],"description":"Returns the billing address for a specified quote.","operationId":"quoteBillingAddressManagementV1GetGet","parameters":[{"name":"cartId","in":"path","type":"integer","required":true,"description":"The cart ID."}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/quote-data-address-interface"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}},"post":{"tags":["quoteBillingAddressManagementV1"],"description":"Assigns a specified billing address to a specified cart.","operationId":"quoteBillingAddressManagementV1AssignPost","parameters":[{"name":"cartId","in":"path","type":"integer","required":true,"description":"The cart ID."},{"name":"$body","in":"body","schema":{"required":["address"],"properties":{"address":{"$ref":"#/definitions/quote-data-address-interface"},"useForShipping":{"type":"boolean"}},"type":"object"}}],"responses":{"200":{"description":"200 Success.","schema":{"type":"integer","description":"Address ID."}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/carts/mine/billing-address":{"get":{"tags":["quoteBillingAddressManagementV1"],"description":"Returns the billing address for a specified quote.","operationId":"quoteBillingAddressManagementV1GetGet","responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/quote-data-address-interface"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}},"post":{"tags":["quoteBillingAddressManagementV1"],"description":"Assigns a specified billing address to a specified cart.","operationId":"quoteBillingAddressManagementV1AssignPost","parameters":[{"name":"$body","in":"body","schema":{"required":["address"],"properties":{"address":{"$ref":"#/definitions/quote-data-address-interface"},"useForShipping":{"type":"boolean"}},"type":"object"}}],"responses":{"200":{"description":"200 Success.","schema":{"type":"integer","description":"Address ID."}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/guest-carts/{cartId}/billing-address":{"get":{"tags":["quoteGuestBillingAddressManagementV1"],"description":"Return the billing address for a specified quote.","operationId":"quoteGuestBillingAddressManagementV1GetGet","parameters":[{"name":"cartId","in":"path","type":"string","required":true,"description":"The cart ID."}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/quote-data-address-interface"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}},"post":{"tags":["quoteGuestBillingAddressManagementV1"],"description":"Assign a specified billing address to a specified cart.","operationId":"quoteGuestBillingAddressManagementV1AssignPost","parameters":[{"name":"cartId","in":"path","type":"string","required":true,"description":"The cart ID."},{"name":"$body","in":"body","schema":{"required":["address"],"properties":{"address":{"$ref":"#/definitions/quote-data-address-interface"}},"type":"object"}}],"responses":{"200":{"description":"200 Success.","schema":{"type":"integer","description":"Address ID."}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/carts/{cartId}/coupons":{"get":{"tags":["quoteCouponManagementV1"],"description":"Returns information for a coupon in a specified cart.","operationId":"quoteCouponManagementV1GetGet","parameters":[{"name":"cartId","in":"path","type":"integer","required":true,"description":"The cart ID."}],"responses":{"200":{"description":"200 Success.","schema":{"type":"string","description":"The coupon code data."}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}},"delete":{"tags":["quoteCouponManagementV1"],"description":"Deletes a coupon from a specified cart.","operationId":"quoteCouponManagementV1RemoveDelete","parameters":[{"name":"cartId","in":"path","type":"integer","required":true,"description":"The cart ID."}],"responses":{"200":{"description":"200 Success.","schema":{"type":"boolean"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/carts/{cartId}/coupons/{couponCode}":{"put":{"tags":["quoteCouponManagementV1"],"description":"Adds a coupon by code to a specified cart.","operationId":"quoteCouponManagementV1SetPut","parameters":[{"name":"cartId","in":"path","type":"integer","required":true,"description":"The cart ID."},{"name":"couponCode","in":"path","type":"string","required":true,"description":"The coupon code data."}],"responses":{"200":{"description":"200 Success.","schema":{"type":"boolean"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/carts/mine/coupons":{"get":{"tags":["quoteCouponManagementV1"],"description":"Returns information for a coupon in a specified cart.","operationId":"quoteCouponManagementV1GetGet","responses":{"200":{"description":"200 Success.","schema":{"type":"string","description":"The coupon code data."}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}},"delete":{"tags":["quoteCouponManagementV1"],"description":"Deletes a coupon from a specified cart.","operationId":"quoteCouponManagementV1RemoveDelete","responses":{"200":{"description":"200 Success.","schema":{"type":"boolean"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/carts/mine/coupons/{couponCode}":{"put":{"tags":["quoteCouponManagementV1"],"description":"Adds a coupon by code to a specified cart.","operationId":"quoteCouponManagementV1SetPut","parameters":[{"name":"couponCode","in":"path","type":"string","required":true,"description":"The coupon code data."}],"responses":{"200":{"description":"200 Success.","schema":{"type":"boolean"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/guest-carts/{cartId}/coupons":{"get":{"tags":["quoteGuestCouponManagementV1"],"description":"Return information for a coupon in a specified cart.","operationId":"quoteGuestCouponManagementV1GetGet","parameters":[{"name":"cartId","in":"path","type":"string","required":true,"description":"The cart ID."}],"responses":{"200":{"description":"200 Success.","schema":{"type":"string","description":"The coupon code data."}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}},"delete":{"tags":["quoteGuestCouponManagementV1"],"description":"Delete a coupon from a specified cart.","operationId":"quoteGuestCouponManagementV1RemoveDelete","parameters":[{"name":"cartId","in":"path","type":"string","required":true,"description":"The cart ID."}],"responses":{"200":{"description":"200 Success.","schema":{"type":"boolean"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/guest-carts/{cartId}/coupons/{couponCode}":{"put":{"tags":["quoteGuestCouponManagementV1"],"description":"Add a coupon by code to a specified cart.","operationId":"quoteGuestCouponManagementV1SetPut","parameters":[{"name":"cartId","in":"path","type":"string","required":true,"description":"The cart ID."},{"name":"couponCode","in":"path","type":"string","required":true,"description":"The coupon code data."}],"responses":{"200":{"description":"200 Success.","schema":{"type":"boolean"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/carts/{cartId}/totals":{"get":{"tags":["quoteCartTotalRepositoryV1"],"description":"Returns quote totals data for a specified cart.","operationId":"quoteCartTotalRepositoryV1GetGet","parameters":[{"name":"cartId","in":"path","type":"integer","required":true,"description":"The cart ID."}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/quote-data-totals-interface"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/carts/mine/totals":{"get":{"tags":["quoteCartTotalRepositoryV1"],"description":"Returns quote totals data for a specified cart.","operationId":"quoteCartTotalRepositoryV1GetGet","responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/quote-data-totals-interface"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/guest-carts/{cartId}/collect-totals":{"put":{"tags":["quoteGuestCartTotalManagementV1"],"description":"Set shipping/billing methods and additional data for cart and collect totals for guest.","operationId":"quoteGuestCartTotalManagementV1CollectTotalsPut","parameters":[{"name":"cartId","in":"path","type":"string","required":true,"description":"The cart ID."},{"name":"$body","in":"body","schema":{"required":["paymentMethod"],"properties":{"paymentMethod":{"$ref":"#/definitions/quote-data-payment-interface"},"shippingCarrierCode":{"type":"string","description":"The carrier code."},"shippingMethodCode":{"type":"string","description":"The shipping method code."},"additionalData":{"$ref":"#/definitions/quote-data-totals-additional-data-interface"}},"type":"object"}}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/quote-data-totals-interface"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/guest-carts/{cartId}/totals":{"get":{"tags":["quoteGuestCartTotalRepositoryV1"],"description":"Return quote totals data for a specified cart.","operationId":"quoteGuestCartTotalRepositoryV1GetGet","parameters":[{"name":"cartId","in":"path","type":"string","required":true,"description":"The cart ID."}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/quote-data-totals-interface"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/carts/mine/collect-totals":{"put":{"tags":["quoteCartTotalManagementV1"],"description":"Set shipping/billing methods and additional data for cart and collect totals.","operationId":"quoteCartTotalManagementV1CollectTotalsPut","parameters":[{"name":"$body","in":"body","schema":{"required":["paymentMethod"],"properties":{"paymentMethod":{"$ref":"#/definitions/quote-data-payment-interface"},"shippingCarrierCode":{"type":"string","description":"The carrier code."},"shippingMethodCode":{"type":"string","description":"The shipping method code."},"additionalData":{"$ref":"#/definitions/quote-data-totals-additional-data-interface"}},"type":"object"}}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/quote-data-totals-interface"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/stockItems/{productSku}":{"get":{"tags":["catalogInventoryStockRegistryV1"],"description":"","operationId":"catalogInventoryStockRegistryV1GetStockItemBySkuGet","parameters":[{"name":"productSku","in":"path","type":"string","required":true},{"name":"scopeId","in":"query","type":"integer","required":false}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/catalog-inventory-data-stock-item-interface"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/products/{productSku}/stockItems/{itemId}":{"put":{"tags":["catalogInventoryStockRegistryV1"],"description":"","operationId":"catalogInventoryStockRegistryV1UpdateStockItemBySkuPut","parameters":[{"name":"productSku","in":"path","type":"string","required":true},{"name":"itemId","in":"path","type":"string","required":true},{"name":"$body","in":"body","schema":{"required":["stockItem"],"properties":{"stockItem":{"$ref":"#/definitions/catalog-inventory-data-stock-item-interface"}},"type":"object"}}],"responses":{"200":{"description":"200 Success.","schema":{"type":"integer"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/stockItems/lowStock/":{"get":{"tags":["catalogInventoryStockRegistryV1"],"description":"Retrieves a list of SKU's with low inventory qty","operationId":"catalogInventoryStockRegistryV1GetLowStockItemsGet","parameters":[{"name":"scopeId","in":"query","type":"integer","required":true},{"name":"qty","in":"query","type":"number","required":true},{"name":"currentPage","in":"query","type":"integer","required":false},{"name":"pageSize","in":"query","type":"integer","required":false}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/catalog-inventory-data-stock-status-collection-interface"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/stockStatuses/{productSku}":{"get":{"tags":["catalogInventoryStockRegistryV1"],"description":"","operationId":"catalogInventoryStockRegistryV1GetStockStatusBySkuGet","parameters":[{"name":"productSku","in":"path","type":"string","required":true},{"name":"scopeId","in":"query","type":"integer","required":false}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/catalog-inventory-data-stock-status-interface"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/products/{sku}/downloadable-links":{"get":{"tags":["downloadableLinkRepositoryV1"],"description":"List of links with associated samples","operationId":"downloadableLinkRepositoryV1GetListGet","parameters":[{"name":"sku","in":"path","type":"string","required":true}],"responses":{"200":{"description":"200 Success.","schema":{"type":"array","items":{"$ref":"#/definitions/downloadable-data-link-interface"}}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}},"post":{"tags":["downloadableLinkRepositoryV1"],"description":"Update downloadable link of the given product (link type and its resources cannot be changed)","operationId":"downloadableLinkRepositoryV1SavePost","parameters":[{"name":"sku","in":"path","type":"string","required":true},{"name":"$body","in":"body","schema":{"required":["link"],"properties":{"link":{"$ref":"#/definitions/downloadable-data-link-interface"},"isGlobalScopeContent":{"type":"boolean"}},"type":"object"}}],"responses":{"200":{"description":"200 Success.","schema":{"type":"integer"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/products/{sku}/downloadable-links/{id}":{"put":{"tags":["downloadableLinkRepositoryV1"],"description":"Update downloadable link of the given product (link type and its resources cannot be changed)","operationId":"downloadableLinkRepositoryV1SavePut","parameters":[{"name":"sku","in":"path","type":"string","required":true},{"name":"id","in":"path","type":"string","required":true},{"name":"$body","in":"body","schema":{"required":["link"],"properties":{"link":{"$ref":"#/definitions/downloadable-data-link-interface"},"isGlobalScopeContent":{"type":"boolean"}},"type":"object"}}],"responses":{"200":{"description":"200 Success.","schema":{"type":"integer"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/products/downloadable-links/{id}":{"delete":{"tags":["downloadableLinkRepositoryV1"],"description":"Delete downloadable link","operationId":"downloadableLinkRepositoryV1DeleteDelete","parameters":[{"name":"id","in":"path","type":"integer","required":true}],"responses":{"200":{"description":"200 Success.","schema":{"type":"boolean"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/products/{sku}/downloadable-links/samples":{"get":{"tags":["downloadableSampleRepositoryV1"],"description":"List of samples for downloadable product","operationId":"downloadableSampleRepositoryV1GetListGet","parameters":[{"name":"sku","in":"path","type":"string","required":true}],"responses":{"200":{"description":"200 Success.","schema":{"type":"array","items":{"$ref":"#/definitions/downloadable-data-sample-interface"}}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}},"post":{"tags":["downloadableSampleRepositoryV1"],"description":"Update downloadable sample of the given product","operationId":"downloadableSampleRepositoryV1SavePost","parameters":[{"name":"sku","in":"path","type":"string","required":true},{"name":"$body","in":"body","schema":{"required":["sample"],"properties":{"sample":{"$ref":"#/definitions/downloadable-data-sample-interface"},"isGlobalScopeContent":{"type":"boolean"}},"type":"object"}}],"responses":{"200":{"description":"200 Success.","schema":{"type":"integer"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/products/{sku}/downloadable-links/samples/{id}":{"put":{"tags":["downloadableSampleRepositoryV1"],"description":"Update downloadable sample of the given product","operationId":"downloadableSampleRepositoryV1SavePut","parameters":[{"name":"sku","in":"path","type":"string","required":true},{"name":"id","in":"path","type":"string","required":true},{"name":"$body","in":"body","schema":{"required":["sample"],"properties":{"sample":{"$ref":"#/definitions/downloadable-data-sample-interface"},"isGlobalScopeContent":{"type":"boolean"}},"type":"object"}}],"responses":{"200":{"description":"200 Success.","schema":{"type":"integer"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/products/downloadable-links/samples/{id}":{"delete":{"tags":["downloadableSampleRepositoryV1"],"description":"Delete downloadable sample","operationId":"downloadableSampleRepositoryV1DeleteDelete","parameters":[{"name":"id","in":"path","type":"integer","required":true}],"responses":{"200":{"description":"200 Success.","schema":{"type":"boolean"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/bundle-products/{sku}/links/{optionId}":{"post":{"tags":["bundleProductLinkManagementV1"],"description":"Add child product to specified Bundle option by product sku","operationId":"bundleProductLinkManagementV1AddChildByProductSkuPost","parameters":[{"name":"sku","in":"path","type":"string","required":true},{"name":"optionId","in":"path","type":"integer","required":true},{"name":"$body","in":"body","schema":{"required":["linkedProduct"],"properties":{"linkedProduct":{"$ref":"#/definitions/bundle-data-link-interface"}},"type":"object"}}],"responses":{"200":{"description":"200 Success.","schema":{"type":"integer"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/bundle-products/{sku}/links/{id}":{"put":{"tags":["bundleProductLinkManagementV1"],"description":"","operationId":"bundleProductLinkManagementV1SaveChildPut","parameters":[{"name":"sku","in":"path","type":"string","required":true},{"name":"id","in":"path","type":"string","required":true},{"name":"$body","in":"body","schema":{"required":["linkedProduct"],"properties":{"linkedProduct":{"$ref":"#/definitions/bundle-data-link-interface"}},"type":"object"}}],"responses":{"200":{"description":"200 Success.","schema":{"type":"boolean"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/bundle-products/{productSku}/children":{"get":{"tags":["bundleProductLinkManagementV1"],"description":"Get all children for Bundle product","operationId":"bundleProductLinkManagementV1GetChildrenGet","parameters":[{"name":"productSku","in":"path","type":"string","required":true},{"name":"optionId","in":"query","type":"integer","required":false}],"responses":{"200":{"description":"200 Success.","schema":{"type":"array","items":{"$ref":"#/definitions/bundle-data-link-interface"}}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/bundle-products/{sku}/options/{optionId}/children/{childSku}":{"delete":{"tags":["bundleProductLinkManagementV1"],"description":"Remove product from Bundle product option","operationId":"bundleProductLinkManagementV1RemoveChildDelete","parameters":[{"name":"sku","in":"path","type":"string","required":true},{"name":"optionId","in":"path","type":"integer","required":true},{"name":"childSku","in":"path","type":"string","required":true}],"responses":{"200":{"description":"200 Success.","schema":{"type":"boolean"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/bundle-products/{sku}/options/all":{"get":{"tags":["bundleProductOptionRepositoryV1"],"description":"Get all options for bundle product","operationId":"bundleProductOptionRepositoryV1GetListGet","parameters":[{"name":"sku","in":"path","type":"string","required":true}],"responses":{"200":{"description":"200 Success.","schema":{"type":"array","items":{"$ref":"#/definitions/bundle-data-option-interface"}}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/bundle-products/{sku}/options/{optionId}":{"get":{"tags":["bundleProductOptionRepositoryV1"],"description":"Get option for bundle product","operationId":"bundleProductOptionRepositoryV1GetGet","parameters":[{"name":"sku","in":"path","type":"string","required":true},{"name":"optionId","in":"path","type":"integer","required":true}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/bundle-data-option-interface"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}},"delete":{"tags":["bundleProductOptionRepositoryV1"],"description":"Remove bundle option","operationId":"bundleProductOptionRepositoryV1DeleteByIdDelete","parameters":[{"name":"sku","in":"path","type":"string","required":true},{"name":"optionId","in":"path","type":"integer","required":true}],"responses":{"200":{"description":"200 Success.","schema":{"type":"boolean"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/bundle-products/options/types":{"get":{"tags":["bundleProductOptionTypeListV1"],"description":"Get all types for options for bundle products","operationId":"bundleProductOptionTypeListV1GetItemsGet","responses":{"200":{"description":"200 Success.","schema":{"type":"array","items":{"$ref":"#/definitions/bundle-data-option-type-interface"}}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/bundle-products/options/add":{"post":{"tags":["bundleProductOptionManagementV1"],"description":"Add new option for bundle product","operationId":"bundleProductOptionManagementV1SavePost","parameters":[{"name":"$body","in":"body","schema":{"required":["option"],"properties":{"option":{"$ref":"#/definitions/bundle-data-option-interface"}},"type":"object"}}],"responses":{"200":{"description":"200 Success.","schema":{"type":"integer"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/bundle-products/options/{optionId}":{"put":{"tags":["bundleProductOptionManagementV1"],"description":"Add new option for bundle product","operationId":"bundleProductOptionManagementV1SavePut","parameters":[{"name":"optionId","in":"path","type":"string","required":true},{"name":"$body","in":"body","schema":{"required":["option"],"properties":{"option":{"$ref":"#/definitions/bundle-data-option-interface"}},"type":"object"}}],"responses":{"200":{"description":"200 Success.","schema":{"type":"integer"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/orders/{id}":{"get":{"tags":["salesOrderRepositoryV1"],"description":"Loads a specified order.","operationId":"salesOrderRepositoryV1GetGet","parameters":[{"name":"id","in":"path","type":"integer","required":true,"description":"The order ID."}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/sales-data-order-interface"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/orders":{"get":{"tags":["salesOrderRepositoryV1"],"description":"Lists orders that match specified search criteria.","operationId":"salesOrderRepositoryV1GetListGet","parameters":[{"name":"searchCriteria[filterGroups][][filters][][field]","in":"query","type":"string","description":"Field"},{"name":"searchCriteria[filterGroups][][filters][][value]","in":"query","type":"string","description":"Value"},{"name":"searchCriteria[filterGroups][][filters][][conditionType]","in":"query","type":"string","description":"Condition type"},{"name":"searchCriteria[sortOrders][][field]","in":"query","type":"string","description":"Sorting field."},{"name":"searchCriteria[sortOrders][][direction]","in":"query","type":"string","description":"Sorting direction."},{"name":"searchCriteria[pageSize]","in":"query","type":"integer","description":"Page size."},{"name":"searchCriteria[currentPage]","in":"query","type":"integer","description":"Current page."}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/sales-data-order-search-result-interface"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/orders/{id}/statuses":{"get":{"tags":["salesOrderManagementV1"],"description":"Gets the status for a specified order.","operationId":"salesOrderManagementV1GetStatusGet","parameters":[{"name":"id","in":"path","type":"integer","required":true,"description":"The order ID."}],"responses":{"200":{"description":"200 Success.","schema":{"type":"string","description":"Order status."}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/orders/{id}/cancel":{"post":{"tags":["salesOrderManagementV1"],"description":"Cancels a specified order.","operationId":"salesOrderManagementV1CancelPost","parameters":[{"name":"id","in":"path","type":"integer","required":true,"description":"The order ID."}],"responses":{"200":{"description":"200 Success.","schema":{"type":"boolean"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/orders/{id}/emails":{"post":{"tags":["salesOrderManagementV1"],"description":"Emails a user a specified order.","operationId":"salesOrderManagementV1NotifyPost","parameters":[{"name":"id","in":"path","type":"integer","required":true,"description":"The order ID."}],"responses":{"200":{"description":"200 Success.","schema":{"type":"boolean"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/orders/{id}/hold":{"post":{"tags":["salesOrderManagementV1"],"description":"Holds a specified order.","operationId":"salesOrderManagementV1HoldPost","parameters":[{"name":"id","in":"path","type":"integer","required":true,"description":"The order ID."}],"responses":{"200":{"description":"200 Success.","schema":{"type":"boolean"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/orders/{id}/unhold":{"post":{"tags":["salesOrderManagementV1"],"description":"Releases a specified order from hold status.","operationId":"salesOrderManagementV1UnHoldPost","parameters":[{"name":"id","in":"path","type":"integer","required":true,"description":"The order ID."}],"responses":{"200":{"description":"200 Success.","schema":{"type":"boolean"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/orders/{id}/comments":{"post":{"tags":["salesOrderManagementV1"],"description":"Adds a comment to a specified order.","operationId":"salesOrderManagementV1AddCommentPost","parameters":[{"name":"id","in":"path","type":"integer","required":true,"description":"The order ID."},{"name":"$body","in":"body","schema":{"required":["statusHistory"],"properties":{"statusHistory":{"$ref":"#/definitions/sales-data-order-status-history-interface"}},"type":"object"}}],"responses":{"200":{"description":"200 Success.","schema":{"type":"boolean"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}},"get":{"tags":["salesOrderManagementV1"],"description":"Lists comments for a specified order.","operationId":"salesOrderManagementV1GetCommentsListGet","parameters":[{"name":"id","in":"path","type":"integer","required":true,"description":"The order ID."}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/sales-data-order-status-history-search-result-interface"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/orders/{parent_id}":{"put":{"tags":["salesOrderAddressRepositoryV1"],"description":"Performs persist operations for a specified order address.","operationId":"salesOrderAddressRepositoryV1SavePut","parameters":[{"name":"parent_id","in":"path","type":"string","required":true},{"name":"$body","in":"body","schema":{"required":["entity"],"properties":{"entity":{"$ref":"#/definitions/sales-data-order-address-interface"}},"type":"object"}}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/sales-data-order-address-interface"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/orders/items/{id}":{"get":{"tags":["salesOrderItemRepositoryV1"],"description":"Loads a specified order item.","operationId":"salesOrderItemRepositoryV1GetGet","parameters":[{"name":"id","in":"path","type":"integer","required":true,"description":"The order item ID."}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/sales-data-order-item-interface"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/orders/items":{"get":{"tags":["salesOrderItemRepositoryV1"],"description":"Lists order items that match specified search criteria.","operationId":"salesOrderItemRepositoryV1GetListGet","parameters":[{"name":"searchCriteria[filterGroups][][filters][][field]","in":"query","type":"string","description":"Field"},{"name":"searchCriteria[filterGroups][][filters][][value]","in":"query","type":"string","description":"Value"},{"name":"searchCriteria[filterGroups][][filters][][conditionType]","in":"query","type":"string","description":"Condition type"},{"name":"searchCriteria[sortOrders][][field]","in":"query","type":"string","description":"Sorting field."},{"name":"searchCriteria[sortOrders][][direction]","in":"query","type":"string","description":"Sorting direction."},{"name":"searchCriteria[pageSize]","in":"query","type":"integer","description":"Page size."},{"name":"searchCriteria[currentPage]","in":"query","type":"integer","description":"Current page."}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/sales-data-order-item-search-result-interface"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/invoices/{id}":{"get":{"tags":["salesInvoiceRepositoryV1"],"description":"Loads a specified invoice.","operationId":"salesInvoiceRepositoryV1GetGet","parameters":[{"name":"id","in":"path","type":"integer","required":true,"description":"The invoice ID."}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/sales-data-invoice-interface"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/invoices":{"get":{"tags":["salesInvoiceRepositoryV1"],"description":"Lists invoices that match specified search criteria.","operationId":"salesInvoiceRepositoryV1GetListGet","parameters":[{"name":"searchCriteria[filterGroups][][filters][][field]","in":"query","type":"string","description":"Field"},{"name":"searchCriteria[filterGroups][][filters][][value]","in":"query","type":"string","description":"Value"},{"name":"searchCriteria[filterGroups][][filters][][conditionType]","in":"query","type":"string","description":"Condition type"},{"name":"searchCriteria[sortOrders][][field]","in":"query","type":"string","description":"Sorting field."},{"name":"searchCriteria[sortOrders][][direction]","in":"query","type":"string","description":"Sorting direction."},{"name":"searchCriteria[pageSize]","in":"query","type":"integer","description":"Page size."},{"name":"searchCriteria[currentPage]","in":"query","type":"integer","description":"Current page."}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/sales-data-invoice-search-result-interface"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/invoices/":{"post":{"tags":["salesInvoiceRepositoryV1"],"description":"Performs persist operations for a specified invoice.","operationId":"salesInvoiceRepositoryV1SavePost","parameters":[{"name":"$body","in":"body","schema":{"required":["entity"],"properties":{"entity":{"$ref":"#/definitions/sales-data-invoice-interface"}},"type":"object"}}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/sales-data-invoice-interface"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/invoices/{id}/comments":{"get":{"tags":["salesInvoiceManagementV1"],"description":"Lists comments for a specified invoice.","operationId":"salesInvoiceManagementV1GetCommentsListGet","parameters":[{"name":"id","in":"path","type":"integer","required":true,"description":"The invoice ID."}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/sales-data-invoice-comment-search-result-interface"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/invoices/{id}/emails":{"post":{"tags":["salesInvoiceManagementV1"],"description":"Emails a user a specified invoice.","operationId":"salesInvoiceManagementV1NotifyPost","parameters":[{"name":"id","in":"path","type":"integer","required":true,"description":"The invoice ID."}],"responses":{"200":{"description":"200 Success.","schema":{"type":"boolean"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/invoices/{id}/void":{"post":{"tags":["salesInvoiceManagementV1"],"description":"Voids a specified invoice.","operationId":"salesInvoiceManagementV1SetVoidPost","parameters":[{"name":"id","in":"path","type":"integer","required":true,"description":"The invoice ID."}],"responses":{"200":{"description":"200 Success.","schema":{"type":"boolean"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/invoices/{id}/capture":{"post":{"tags":["salesInvoiceManagementV1"],"description":"Sets invoice capture.","operationId":"salesInvoiceManagementV1SetCapturePost","parameters":[{"name":"id","in":"path","type":"integer","required":true}],"responses":{"200":{"description":"200 Success.","schema":{"type":"string"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/invoices/comments":{"post":{"tags":["salesInvoiceCommentRepositoryV1"],"description":"Performs persist operations for a specified invoice comment.","operationId":"salesInvoiceCommentRepositoryV1SavePost","parameters":[{"name":"$body","in":"body","schema":{"required":["entity"],"properties":{"entity":{"$ref":"#/definitions/sales-data-invoice-comment-interface"}},"type":"object"}}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/sales-data-invoice-comment-interface"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/creditmemo/{id}/comments":{"get":{"tags":["salesCreditmemoManagementV1"],"description":"Lists comments for a specified credit memo.","operationId":"salesCreditmemoManagementV1GetCommentsListGet","parameters":[{"name":"id","in":"path","type":"integer","required":true,"description":"The credit memo ID."}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/sales-data-creditmemo-comment-search-result-interface"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}},"post":{"tags":["salesCreditmemoCommentRepositoryV1"],"description":"Performs persist operations for a specified entity.","operationId":"salesCreditmemoCommentRepositoryV1SavePost","parameters":[{"name":"id","in":"path","type":"string","required":true},{"name":"$body","in":"body","schema":{"required":["entity"],"properties":{"entity":{"$ref":"#/definitions/sales-data-creditmemo-comment-interface"}},"type":"object"}}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/sales-data-creditmemo-comment-interface"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/creditmemo/{id}":{"put":{"tags":["salesCreditmemoManagementV1"],"description":"Cancels a specified credit memo.","operationId":"salesCreditmemoManagementV1CancelPut","parameters":[{"name":"id","in":"path","type":"integer","required":true,"description":"The credit memo ID."}],"responses":{"200":{"description":"200 Success.","schema":{"type":"boolean"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"500":{"description":"Internal Server error","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}},"get":{"tags":["salesCreditmemoRepositoryV1"],"description":"Loads a specified credit memo.","operationId":"salesCreditmemoRepositoryV1GetGet","parameters":[{"name":"id","in":"path","type":"integer","required":true,"description":"The credit memo ID."}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/sales-data-creditmemo-interface"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/creditmemo/{id}/emails":{"post":{"tags":["salesCreditmemoManagementV1"],"description":"Emails a user a specified credit memo.","operationId":"salesCreditmemoManagementV1NotifyPost","parameters":[{"name":"id","in":"path","type":"integer","required":true,"description":"The credit memo ID."}],"responses":{"200":{"description":"200 Success.","schema":{"type":"boolean"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/creditmemos":{"get":{"tags":["salesCreditmemoRepositoryV1"],"description":"Lists credit memos that match specified search criteria.","operationId":"salesCreditmemoRepositoryV1GetListGet","parameters":[{"name":"searchCriteria[filterGroups][][filters][][field]","in":"query","type":"string","description":"Field"},{"name":"searchCriteria[filterGroups][][filters][][value]","in":"query","type":"string","description":"Value"},{"name":"searchCriteria[filterGroups][][filters][][conditionType]","in":"query","type":"string","description":"Condition type"},{"name":"searchCriteria[sortOrders][][field]","in":"query","type":"string","description":"Sorting field."},{"name":"searchCriteria[sortOrders][][direction]","in":"query","type":"string","description":"Sorting direction."},{"name":"searchCriteria[pageSize]","in":"query","type":"integer","description":"Page size."},{"name":"searchCriteria[currentPage]","in":"query","type":"integer","description":"Current page."}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/sales-data-creditmemo-search-result-interface"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/creditmemo":{"post":{"tags":["salesCreditmemoRepositoryV1"],"description":"Performs persist operations for a specified credit memo.","operationId":"salesCreditmemoRepositoryV1SavePost","parameters":[{"name":"$body","in":"body","schema":{"required":["entity"],"properties":{"entity":{"$ref":"#/definitions/sales-data-creditmemo-interface"}},"type":"object"}}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/sales-data-creditmemo-interface"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/shipment/{id}":{"get":{"tags":["salesShipmentRepositoryV1"],"description":"Loads a specified shipment.","operationId":"salesShipmentRepositoryV1GetGet","parameters":[{"name":"id","in":"path","type":"integer","required":true,"description":"The shipment ID."}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/sales-data-shipment-interface"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/shipments":{"get":{"tags":["salesShipmentRepositoryV1"],"description":"Lists shipments that match specified search criteria.","operationId":"salesShipmentRepositoryV1GetListGet","parameters":[{"name":"searchCriteria[filterGroups][][filters][][field]","in":"query","type":"string","description":"Field"},{"name":"searchCriteria[filterGroups][][filters][][value]","in":"query","type":"string","description":"Value"},{"name":"searchCriteria[filterGroups][][filters][][conditionType]","in":"query","type":"string","description":"Condition type"},{"name":"searchCriteria[sortOrders][][field]","in":"query","type":"string","description":"Sorting field."},{"name":"searchCriteria[sortOrders][][direction]","in":"query","type":"string","description":"Sorting direction."},{"name":"searchCriteria[pageSize]","in":"query","type":"integer","description":"Page size."},{"name":"searchCriteria[currentPage]","in":"query","type":"integer","description":"Current page."}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/sales-data-shipment-search-result-interface"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/shipment/":{"post":{"tags":["salesShipmentRepositoryV1"],"description":"Performs persist operations for a specified shipment.","operationId":"salesShipmentRepositoryV1SavePost","parameters":[{"name":"$body","in":"body","schema":{"required":["entity"],"properties":{"entity":{"$ref":"#/definitions/sales-data-shipment-interface"}},"type":"object"}}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/sales-data-shipment-interface"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/shipment/{id}/comments":{"get":{"tags":["salesShipmentManagementV1"],"description":"Lists comments for a specified shipment.","operationId":"salesShipmentManagementV1GetCommentsListGet","parameters":[{"name":"id","in":"path","type":"integer","required":true,"description":"The shipment ID."}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/sales-data-shipment-comment-search-result-interface"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}},"post":{"tags":["salesShipmentCommentRepositoryV1"],"description":"Performs persist operations for a specified shipment comment.","operationId":"salesShipmentCommentRepositoryV1SavePost","parameters":[{"name":"id","in":"path","type":"string","required":true},{"name":"$body","in":"body","schema":{"required":["entity"],"properties":{"entity":{"$ref":"#/definitions/sales-data-shipment-comment-interface"}},"type":"object"}}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/sales-data-shipment-comment-interface"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/shipment/{id}/emails":{"post":{"tags":["salesShipmentManagementV1"],"description":"Emails user a specified shipment.","operationId":"salesShipmentManagementV1NotifyPost","parameters":[{"name":"id","in":"path","type":"integer","required":true,"description":"The shipment ID."}],"responses":{"200":{"description":"200 Success.","schema":{"type":"boolean"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/shipment/{id}/label":{"get":{"tags":["salesShipmentManagementV1"],"description":"Gets a specified shipment label.","operationId":"salesShipmentManagementV1GetLabelGet","parameters":[{"name":"id","in":"path","type":"integer","required":true,"description":"The shipment label ID."}],"responses":{"200":{"description":"200 Success.","schema":{"type":"string","description":"Shipment label."}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/shipment/track":{"post":{"tags":["salesShipmentTrackRepositoryV1"],"description":"Performs persist operations for a specified shipment track.","operationId":"salesShipmentTrackRepositoryV1SavePost","parameters":[{"name":"$body","in":"body","schema":{"required":["entity"],"properties":{"entity":{"$ref":"#/definitions/sales-data-shipment-track-interface"}},"type":"object"}}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/sales-data-shipment-track-interface"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/shipment/track/{id}":{"delete":{"tags":["salesShipmentTrackRepositoryV1"],"description":"Deletes a specified shipment track by ID.","operationId":"salesShipmentTrackRepositoryV1DeleteByIdDelete","parameters":[{"name":"id","in":"path","type":"integer","required":true,"description":"The shipment track ID."}],"responses":{"200":{"description":"200 Success.","schema":{"type":"boolean"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/transactions/{id}":{"get":{"tags":["salesTransactionRepositoryV1"],"description":"Loads a specified transaction.","operationId":"salesTransactionRepositoryV1GetGet","parameters":[{"name":"id","in":"path","type":"integer","required":true,"description":"The transaction ID."}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/sales-data-transaction-interface"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/transactions":{"get":{"tags":["salesTransactionRepositoryV1"],"description":"Lists transactions that match specified search criteria.","operationId":"salesTransactionRepositoryV1GetListGet","parameters":[{"name":"searchCriteria[filterGroups][][filters][][field]","in":"query","type":"string","description":"Field"},{"name":"searchCriteria[filterGroups][][filters][][value]","in":"query","type":"string","description":"Value"},{"name":"searchCriteria[filterGroups][][filters][][conditionType]","in":"query","type":"string","description":"Condition type"},{"name":"searchCriteria[sortOrders][][field]","in":"query","type":"string","description":"Sorting field."},{"name":"searchCriteria[sortOrders][][direction]","in":"query","type":"string","description":"Sorting direction."},{"name":"searchCriteria[pageSize]","in":"query","type":"integer","description":"Page size."},{"name":"searchCriteria[currentPage]","in":"query","type":"integer","description":"Current page."}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/sales-data-transaction-search-result-interface"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/guest-carts/{cartId}/shipping-information":{"post":{"tags":["checkoutGuestShippingInformationManagementV1"],"description":"","operationId":"checkoutGuestShippingInformationManagementV1SaveAddressInformationPost","parameters":[{"name":"cartId","in":"path","type":"string","required":true},{"name":"$body","in":"body","schema":{"required":["addressInformation"],"properties":{"addressInformation":{"$ref":"#/definitions/checkout-data-shipping-information-interface"}},"type":"object"}}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/checkout-data-payment-details-interface"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/carts/mine/shipping-information":{"post":{"tags":["checkoutShippingInformationManagementV1"],"description":"","operationId":"checkoutShippingInformationManagementV1SaveAddressInformationPost","parameters":[{"name":"$body","in":"body","schema":{"required":["addressInformation"],"properties":{"addressInformation":{"$ref":"#/definitions/checkout-data-shipping-information-interface"}},"type":"object"}}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/checkout-data-payment-details-interface"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/carts/{cartId}/shipping-information":{"post":{"tags":["checkoutShippingInformationManagementV1"],"description":"","operationId":"checkoutShippingInformationManagementV1SaveAddressInformationPost","parameters":[{"name":"cartId","in":"path","type":"integer","required":true},{"name":"$body","in":"body","schema":{"required":["addressInformation"],"properties":{"addressInformation":{"$ref":"#/definitions/checkout-data-shipping-information-interface"}},"type":"object"}}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/checkout-data-payment-details-interface"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/carts/{cartId}/totals-information":{"post":{"tags":["checkoutTotalsInformationManagementV1"],"description":"Calculate quote totals based on address and shipping method.","operationId":"checkoutTotalsInformationManagementV1CalculatePost","parameters":[{"name":"cartId","in":"path","type":"integer","required":true},{"name":"$body","in":"body","schema":{"required":["addressInformation"],"properties":{"addressInformation":{"$ref":"#/definitions/checkout-data-totals-information-interface"}},"type":"object"}}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/quote-data-totals-interface"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/carts/mine/totals-information":{"post":{"tags":["checkoutTotalsInformationManagementV1"],"description":"Calculate quote totals based on address and shipping method.","operationId":"checkoutTotalsInformationManagementV1CalculatePost","parameters":[{"name":"$body","in":"body","schema":{"required":["addressInformation"],"properties":{"addressInformation":{"$ref":"#/definitions/checkout-data-totals-information-interface"}},"type":"object"}}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/quote-data-totals-interface"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/guest-carts/{cartId}/totals-information":{"post":{"tags":["checkoutGuestTotalsInformationManagementV1"],"description":"Calculate quote totals based on address and shipping method.","operationId":"checkoutGuestTotalsInformationManagementV1CalculatePost","parameters":[{"name":"cartId","in":"path","type":"string","required":true},{"name":"$body","in":"body","schema":{"required":["addressInformation"],"properties":{"addressInformation":{"$ref":"#/definitions/checkout-data-totals-information-interface"}},"type":"object"}}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/quote-data-totals-interface"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/guest-carts/{cartId}/payment-information":{"post":{"tags":["checkoutGuestPaymentInformationManagementV1"],"description":"Set payment information and place order for a specified cart.","operationId":"checkoutGuestPaymentInformationManagementV1SavePaymentInformationAndPlaceOrderPost","parameters":[{"name":"cartId","in":"path","type":"string","required":true},{"name":"$body","in":"body","schema":{"required":["email","paymentMethod"],"properties":{"email":{"type":"string"},"paymentMethod":{"$ref":"#/definitions/quote-data-payment-interface"},"billingAddress":{"$ref":"#/definitions/quote-data-address-interface"}},"type":"object"}}],"responses":{"200":{"description":"200 Success.","schema":{"type":"integer","description":"Order ID."}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}},"get":{"tags":["checkoutGuestPaymentInformationManagementV1"],"description":"Get payment information","operationId":"checkoutGuestPaymentInformationManagementV1GetPaymentInformationGet","parameters":[{"name":"cartId","in":"path","type":"string","required":true}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/checkout-data-payment-details-interface"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/guest-carts/{cartId}/set-payment-information":{"post":{"tags":["checkoutGuestPaymentInformationManagementV1"],"description":"Set payment information for a specified cart.","operationId":"checkoutGuestPaymentInformationManagementV1SavePaymentInformationPost","parameters":[{"name":"cartId","in":"path","type":"string","required":true},{"name":"$body","in":"body","schema":{"required":["email","paymentMethod"],"properties":{"email":{"type":"string"},"paymentMethod":{"$ref":"#/definitions/quote-data-payment-interface"},"billingAddress":{"$ref":"#/definitions/quote-data-address-interface"}},"type":"object"}}],"responses":{"200":{"description":"200 Success.","schema":{"type":"integer","description":"Order ID."}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/carts/mine/payment-information":{"post":{"tags":["checkoutPaymentInformationManagementV1"],"description":"Set payment information and place order for a specified cart.","operationId":"checkoutPaymentInformationManagementV1SavePaymentInformationAndPlaceOrderPost","parameters":[{"name":"$body","in":"body","schema":{"required":["paymentMethod"],"properties":{"paymentMethod":{"$ref":"#/definitions/quote-data-payment-interface"},"billingAddress":{"$ref":"#/definitions/quote-data-address-interface"}},"type":"object"}}],"responses":{"200":{"description":"200 Success.","schema":{"type":"integer","description":"Order ID."}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}},"get":{"tags":["checkoutPaymentInformationManagementV1"],"description":"Get payment information","operationId":"checkoutPaymentInformationManagementV1GetPaymentInformationGet","responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/checkout-data-payment-details-interface"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/carts/mine/set-payment-information":{"post":{"tags":["checkoutPaymentInformationManagementV1"],"description":"Set payment information for a specified cart.","operationId":"checkoutPaymentInformationManagementV1SavePaymentInformationPost","parameters":[{"name":"$body","in":"body","schema":{"required":["paymentMethod"],"properties":{"paymentMethod":{"$ref":"#/definitions/quote-data-payment-interface"},"billingAddress":{"$ref":"#/definitions/quote-data-address-interface"}},"type":"object"}}],"responses":{"200":{"description":"200 Success.","schema":{"type":"integer","description":"Order ID."}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/configurable-products/{sku}/children":{"get":{"tags":["configurableProductLinkManagementV1"],"description":"Get all children for Bundle product","operationId":"configurableProductLinkManagementV1GetChildrenGet","parameters":[{"name":"sku","in":"path","type":"string","required":true}],"responses":{"200":{"description":"200 Success.","schema":{"type":"array","items":{"$ref":"#/definitions/catalog-data-product-interface"}}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/configurable-products/{sku}/children/{childSku}":{"delete":{"tags":["configurableProductLinkManagementV1"],"description":"Remove configurable product option","operationId":"configurableProductLinkManagementV1RemoveChildDelete","parameters":[{"name":"sku","in":"path","type":"string","required":true},{"name":"childSku","in":"path","type":"string","required":true}],"responses":{"200":{"description":"200 Success.","schema":{"type":"boolean"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/configurable-products/{sku}/child":{"post":{"tags":["configurableProductLinkManagementV1"],"description":"","operationId":"configurableProductLinkManagementV1AddChildPost","parameters":[{"name":"sku","in":"path","type":"string","required":true},{"name":"$body","in":"body","schema":{"required":["childSku"],"properties":{"childSku":{"type":"string"}},"type":"object"}}],"responses":{"200":{"description":"200 Success.","schema":{"type":"boolean"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/configurable-products/variation":{"put":{"tags":["configurableProductConfigurableProductManagementV1"],"description":"Generate variation based on same product","operationId":"configurableProductConfigurableProductManagementV1GenerateVariationPut","parameters":[{"name":"$body","in":"body","schema":{"required":["product","options"],"properties":{"product":{"$ref":"#/definitions/catalog-data-product-interface"},"options":{"type":"array","items":{"$ref":"#/definitions/configurable-product-data-option-interface"}}},"type":"object"}}],"responses":{"200":{"description":"200 Success.","schema":{"type":"array","items":{"$ref":"#/definitions/catalog-data-product-interface"}}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/configurable-products/{sku}/options/{id}":{"get":{"tags":["configurableProductOptionRepositoryV1"],"description":"Get option for configurable product","operationId":"configurableProductOptionRepositoryV1GetGet","parameters":[{"name":"sku","in":"path","type":"string","required":true},{"name":"id","in":"path","type":"integer","required":true}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/configurable-product-data-option-interface"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}},"put":{"tags":["configurableProductOptionRepositoryV1"],"description":"Save option","operationId":"configurableProductOptionRepositoryV1SavePut","parameters":[{"name":"sku","in":"path","type":"string","required":true},{"name":"id","in":"path","type":"string","required":true},{"name":"$body","in":"body","schema":{"required":["option"],"properties":{"option":{"$ref":"#/definitions/configurable-product-data-option-interface"}},"type":"object"}}],"responses":{"200":{"description":"200 Success.","schema":{"type":"integer"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"500":{"description":"Internal Server error","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}},"delete":{"tags":["configurableProductOptionRepositoryV1"],"description":"Remove option from configurable product","operationId":"configurableProductOptionRepositoryV1DeleteByIdDelete","parameters":[{"name":"sku","in":"path","type":"string","required":true},{"name":"id","in":"path","type":"integer","required":true}],"responses":{"200":{"description":"200 Success.","schema":{"type":"boolean"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/configurable-products/{sku}/options/all":{"get":{"tags":["configurableProductOptionRepositoryV1"],"description":"Get all options for configurable product","operationId":"configurableProductOptionRepositoryV1GetListGet","parameters":[{"name":"sku","in":"path","type":"string","required":true}],"responses":{"200":{"description":"200 Success.","schema":{"type":"array","items":{"$ref":"#/definitions/configurable-product-data-option-interface"}}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/configurable-products/{sku}/options":{"post":{"tags":["configurableProductOptionRepositoryV1"],"description":"Save option","operationId":"configurableProductOptionRepositoryV1SavePost","parameters":[{"name":"sku","in":"path","type":"string","required":true},{"name":"$body","in":"body","schema":{"required":["option"],"properties":{"option":{"$ref":"#/definitions/configurable-product-data-option-interface"}},"type":"object"}}],"responses":{"200":{"description":"200 Success.","schema":{"type":"integer"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"500":{"description":"Internal Server error","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/salesRules/{ruleId}":{"get":{"tags":["salesRuleRuleRepositoryV1"],"description":"Get rule by ID.","operationId":"salesRuleRuleRepositoryV1GetByIdGet","parameters":[{"name":"ruleId","in":"path","type":"integer","required":true}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/sales-rule-data-rule-interface"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"500":{"description":"Internal Server error","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}},"put":{"tags":["salesRuleRuleRepositoryV1"],"description":"Save sales rule.","operationId":"salesRuleRuleRepositoryV1SavePut","parameters":[{"name":"ruleId","in":"path","type":"string","required":true},{"name":"$body","in":"body","schema":{"required":["rule"],"properties":{"rule":{"$ref":"#/definitions/sales-rule-data-rule-interface"}},"type":"object"}}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/sales-rule-data-rule-interface"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"500":{"description":"Internal Server error","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}},"delete":{"tags":["salesRuleRuleRepositoryV1"],"description":"Delete rule by ID.","operationId":"salesRuleRuleRepositoryV1DeleteByIdDelete","parameters":[{"name":"ruleId","in":"path","type":"integer","required":true}],"responses":{"200":{"description":"200 Success.","schema":{"type":"boolean","description":"true on success"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"500":{"description":"Internal Server error","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/salesRules/search":{"get":{"tags":["salesRuleRuleRepositoryV1"],"description":"Retrieve sales rules.","operationId":"salesRuleRuleRepositoryV1GetListGet","parameters":[{"name":"searchCriteria[filterGroups][][filters][][field]","in":"query","type":"string","description":"Field"},{"name":"searchCriteria[filterGroups][][filters][][value]","in":"query","type":"string","description":"Value"},{"name":"searchCriteria[filterGroups][][filters][][conditionType]","in":"query","type":"string","description":"Condition type"},{"name":"searchCriteria[sortOrders][][field]","in":"query","type":"string","description":"Sorting field."},{"name":"searchCriteria[sortOrders][][direction]","in":"query","type":"string","description":"Sorting direction."},{"name":"searchCriteria[pageSize]","in":"query","type":"integer","description":"Page size."},{"name":"searchCriteria[currentPage]","in":"query","type":"integer","description":"Current page."}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/sales-rule-data-rule-search-result-interface"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"500":{"description":"Internal Server error","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/salesRules":{"post":{"tags":["salesRuleRuleRepositoryV1"],"description":"Save sales rule.","operationId":"salesRuleRuleRepositoryV1SavePost","parameters":[{"name":"$body","in":"body","schema":{"required":["rule"],"properties":{"rule":{"$ref":"#/definitions/sales-rule-data-rule-interface"}},"type":"object"}}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/sales-rule-data-rule-interface"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"500":{"description":"Internal Server error","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/coupons/{couponId}":{"get":{"tags":["salesRuleCouponRepositoryV1"],"description":"Get coupon by coupon id.","operationId":"salesRuleCouponRepositoryV1GetByIdGet","parameters":[{"name":"couponId","in":"path","type":"integer","required":true}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/sales-rule-data-coupon-interface"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"500":{"description":"Internal Server error","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}},"put":{"tags":["salesRuleCouponRepositoryV1"],"description":"Save coupon.","operationId":"salesRuleCouponRepositoryV1SavePut","parameters":[{"name":"couponId","in":"path","type":"string","required":true},{"name":"$body","in":"body","schema":{"required":["coupon"],"properties":{"coupon":{"$ref":"#/definitions/sales-rule-data-coupon-interface"}},"type":"object"}}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/sales-rule-data-coupon-interface"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"500":{"description":"Internal Server error","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}},"delete":{"tags":["salesRuleCouponRepositoryV1"],"description":"Delete coupon by coupon id.","operationId":"salesRuleCouponRepositoryV1DeleteByIdDelete","parameters":[{"name":"couponId","in":"path","type":"integer","required":true}],"responses":{"200":{"description":"200 Success.","schema":{"type":"boolean","description":"true on success"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"500":{"description":"Internal Server error","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/coupons/search":{"get":{"tags":["salesRuleCouponRepositoryV1"],"description":"Retrieve coupon.","operationId":"salesRuleCouponRepositoryV1GetListGet","parameters":[{"name":"searchCriteria[filterGroups][][filters][][field]","in":"query","type":"string","description":"Field"},{"name":"searchCriteria[filterGroups][][filters][][value]","in":"query","type":"string","description":"Value"},{"name":"searchCriteria[filterGroups][][filters][][conditionType]","in":"query","type":"string","description":"Condition type"},{"name":"searchCriteria[sortOrders][][field]","in":"query","type":"string","description":"Sorting field."},{"name":"searchCriteria[sortOrders][][direction]","in":"query","type":"string","description":"Sorting direction."},{"name":"searchCriteria[pageSize]","in":"query","type":"integer","description":"Page size."},{"name":"searchCriteria[currentPage]","in":"query","type":"integer","description":"Current page."}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/sales-rule-data-coupon-search-result-interface"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"500":{"description":"Internal Server error","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/coupons":{"post":{"tags":["salesRuleCouponRepositoryV1"],"description":"Save coupon.","operationId":"salesRuleCouponRepositoryV1SavePost","parameters":[{"name":"$body","in":"body","schema":{"required":["coupon"],"properties":{"coupon":{"$ref":"#/definitions/sales-rule-data-coupon-interface"}},"type":"object"}}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/sales-rule-data-coupon-interface"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"500":{"description":"Internal Server error","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/coupons/generate":{"post":{"tags":["salesRuleCouponManagementV1"],"description":"Generate coupon for a rule","operationId":"salesRuleCouponManagementV1GeneratePost","parameters":[{"name":"$body","in":"body","schema":{"required":["couponSpec"],"properties":{"couponSpec":{"$ref":"#/definitions/sales-rule-data-coupon-generation-spec-interface"}},"type":"object"}}],"responses":{"200":{"description":"200 Success.","schema":{"type":"array","items":{"type":"string"}}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"500":{"description":"Internal Server error","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/coupons/deleteByIds":{"post":{"tags":["salesRuleCouponManagementV1"],"description":"Delete coupon by coupon ids.","operationId":"salesRuleCouponManagementV1DeleteByIdsPost","parameters":[{"name":"$body","in":"body","schema":{"required":["ids"],"properties":{"ids":{"type":"array","items":{"type":"integer"}},"ignoreInvalidCoupons":{"type":"boolean"}},"type":"object"}}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/sales-rule-data-coupon-mass-delete-result-interface"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"500":{"description":"Internal Server error","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/coupons/deleteByCodes":{"post":{"tags":["salesRuleCouponManagementV1"],"description":"Delete coupon by coupon codes.","operationId":"salesRuleCouponManagementV1DeleteByCodesPost","parameters":[{"name":"$body","in":"body","schema":{"required":["codes"],"properties":{"codes":{"type":"array","items":{"type":"string"}},"ignoreInvalidCoupons":{"type":"boolean"}},"type":"object"}}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/sales-rule-data-coupon-mass-delete-result-interface"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"500":{"description":"Internal Server error","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/taxRates":{"post":{"tags":["taxTaxRateRepositoryV1"],"description":"Create or update tax rate","operationId":"taxTaxRateRepositoryV1SavePost","parameters":[{"name":"$body","in":"body","schema":{"required":["taxRate"],"properties":{"taxRate":{"$ref":"#/definitions/tax-data-tax-rate-interface"}},"type":"object"}}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/tax-data-tax-rate-interface"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"500":{"description":"Internal Server error","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}},"put":{"tags":["taxTaxRateRepositoryV1"],"description":"Create or update tax rate","operationId":"taxTaxRateRepositoryV1SavePut","parameters":[{"name":"$body","in":"body","schema":{"required":["taxRate"],"properties":{"taxRate":{"$ref":"#/definitions/tax-data-tax-rate-interface"}},"type":"object"}}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/tax-data-tax-rate-interface"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"500":{"description":"Internal Server error","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/taxRates/{rateId}":{"get":{"tags":["taxTaxRateRepositoryV1"],"description":"Get tax rate","operationId":"taxTaxRateRepositoryV1GetGet","parameters":[{"name":"rateId","in":"path","type":"integer","required":true}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/tax-data-tax-rate-interface"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}},"delete":{"tags":["taxTaxRateRepositoryV1"],"description":"Delete tax rate","operationId":"taxTaxRateRepositoryV1DeleteByIdDelete","parameters":[{"name":"rateId","in":"path","type":"integer","required":true}],"responses":{"200":{"description":"200 Success.","schema":{"type":"boolean"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"500":{"description":"Internal Server error","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/taxRates/search":{"get":{"tags":["taxTaxRateRepositoryV1"],"description":"Search TaxRates","operationId":"taxTaxRateRepositoryV1GetListGet","parameters":[{"name":"searchCriteria[filterGroups][][filters][][field]","in":"query","type":"string","description":"Field"},{"name":"searchCriteria[filterGroups][][filters][][value]","in":"query","type":"string","description":"Value"},{"name":"searchCriteria[filterGroups][][filters][][conditionType]","in":"query","type":"string","description":"Condition type"},{"name":"searchCriteria[sortOrders][][field]","in":"query","type":"string","description":"Sorting field."},{"name":"searchCriteria[sortOrders][][direction]","in":"query","type":"string","description":"Sorting direction."},{"name":"searchCriteria[pageSize]","in":"query","type":"integer","description":"Page size."},{"name":"searchCriteria[currentPage]","in":"query","type":"integer","description":"Current page."}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/tax-data-tax-rate-search-results-interface"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/taxRules":{"post":{"tags":["taxTaxRuleRepositoryV1"],"description":"Save TaxRule","operationId":"taxTaxRuleRepositoryV1SavePost","parameters":[{"name":"$body","in":"body","schema":{"required":["rule"],"properties":{"rule":{"$ref":"#/definitions/tax-data-tax-rule-interface"}},"type":"object"}}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/tax-data-tax-rule-interface"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"500":{"description":"Internal Server error","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}},"put":{"tags":["taxTaxRuleRepositoryV1"],"description":"Save TaxRule","operationId":"taxTaxRuleRepositoryV1SavePut","parameters":[{"name":"$body","in":"body","schema":{"required":["rule"],"properties":{"rule":{"$ref":"#/definitions/tax-data-tax-rule-interface"}},"type":"object"}}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/tax-data-tax-rule-interface"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"500":{"description":"Internal Server error","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/taxRules/{ruleId}":{"delete":{"tags":["taxTaxRuleRepositoryV1"],"description":"Delete TaxRule","operationId":"taxTaxRuleRepositoryV1DeleteByIdDelete","parameters":[{"name":"ruleId","in":"path","type":"integer","required":true}],"responses":{"200":{"description":"200 Success.","schema":{"type":"boolean"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"500":{"description":"Internal Server error","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}},"get":{"tags":["taxTaxRuleRepositoryV1"],"description":"Get TaxRule","operationId":"taxTaxRuleRepositoryV1GetGet","parameters":[{"name":"ruleId","in":"path","type":"integer","required":true}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/tax-data-tax-rule-interface"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/taxRules/search":{"get":{"tags":["taxTaxRuleRepositoryV1"],"description":"Search TaxRules","operationId":"taxTaxRuleRepositoryV1GetListGet","parameters":[{"name":"searchCriteria[filterGroups][][filters][][field]","in":"query","type":"string","description":"Field"},{"name":"searchCriteria[filterGroups][][filters][][value]","in":"query","type":"string","description":"Value"},{"name":"searchCriteria[filterGroups][][filters][][conditionType]","in":"query","type":"string","description":"Condition type"},{"name":"searchCriteria[sortOrders][][field]","in":"query","type":"string","description":"Sorting field."},{"name":"searchCriteria[sortOrders][][direction]","in":"query","type":"string","description":"Sorting direction."},{"name":"searchCriteria[pageSize]","in":"query","type":"integer","description":"Page size."},{"name":"searchCriteria[currentPage]","in":"query","type":"integer","description":"Current page."}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/tax-data-tax-rule-search-results-interface"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/taxClasses":{"post":{"tags":["taxTaxClassRepositoryV1"],"description":"Create a Tax Class","operationId":"taxTaxClassRepositoryV1SavePost","parameters":[{"name":"$body","in":"body","schema":{"required":["taxClass"],"properties":{"taxClass":{"$ref":"#/definitions/tax-data-tax-class-interface"}},"type":"object"}}],"responses":{"200":{"description":"200 Success.","schema":{"type":"string","description":"id for the newly created Tax class"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"500":{"description":"Internal Server error","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/taxClasses/{taxClassId}":{"get":{"tags":["taxTaxClassRepositoryV1"],"description":"Get a tax class with the given tax class id.","operationId":"taxTaxClassRepositoryV1GetGet","parameters":[{"name":"taxClassId","in":"path","type":"integer","required":true}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/tax-data-tax-class-interface"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}},"delete":{"tags":["taxTaxClassRepositoryV1"],"description":"Delete a tax class with the given tax class id.","operationId":"taxTaxClassRepositoryV1DeleteByIdDelete","parameters":[{"name":"taxClassId","in":"path","type":"integer","required":true}],"responses":{"200":{"description":"200 Success.","schema":{"type":"boolean","description":"True if the tax class was deleted, false otherwise"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/taxClasses/{classId}":{"put":{"tags":["taxTaxClassRepositoryV1"],"description":"Create a Tax Class","operationId":"taxTaxClassRepositoryV1SavePut","parameters":[{"name":"classId","in":"path","type":"string","required":true},{"name":"$body","in":"body","schema":{"required":["taxClass"],"properties":{"taxClass":{"$ref":"#/definitions/tax-data-tax-class-interface"}},"type":"object"}}],"responses":{"200":{"description":"200 Success.","schema":{"type":"string","description":"id for the newly created Tax class"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"500":{"description":"Internal Server error","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/taxClasses/search":{"get":{"tags":["taxTaxClassRepositoryV1"],"description":"Retrieve tax classes which match a specific criteria.","operationId":"taxTaxClassRepositoryV1GetListGet","parameters":[{"name":"searchCriteria[filterGroups][][filters][][field]","in":"query","type":"string","description":"Field"},{"name":"searchCriteria[filterGroups][][filters][][value]","in":"query","type":"string","description":"Value"},{"name":"searchCriteria[filterGroups][][filters][][conditionType]","in":"query","type":"string","description":"Condition type"},{"name":"searchCriteria[sortOrders][][field]","in":"query","type":"string","description":"Sorting field."},{"name":"searchCriteria[sortOrders][][direction]","in":"query","type":"string","description":"Sorting direction."},{"name":"searchCriteria[pageSize]","in":"query","type":"integer","description":"Page size."},{"name":"searchCriteria[currentPage]","in":"query","type":"integer","description":"Current page."}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/tax-data-tax-class-search-results-interface"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/carts/{cartId}/gift-message":{"get":{"tags":["giftMessageCartRepositoryV1"],"description":"Return the gift message for a specified order.","operationId":"giftMessageCartRepositoryV1GetGet","parameters":[{"name":"cartId","in":"path","type":"integer","required":true,"description":"The shopping cart ID."}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/gift-message-data-message-interface"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}},"post":{"tags":["giftMessageCartRepositoryV1"],"description":"Set the gift message for an entire order.","operationId":"giftMessageCartRepositoryV1SavePost","parameters":[{"name":"cartId","in":"path","type":"integer","required":true,"description":"The cart ID."},{"name":"$body","in":"body","schema":{"required":["giftMessage"],"properties":{"giftMessage":{"$ref":"#/definitions/gift-message-data-message-interface"}},"type":"object"}}],"responses":{"200":{"description":"200 Success.","schema":{"type":"boolean"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/carts/mine/gift-message":{"get":{"tags":["giftMessageCartRepositoryV1"],"description":"Return the gift message for a specified order.","operationId":"giftMessageCartRepositoryV1GetGet","responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/gift-message-data-message-interface"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}},"post":{"tags":["giftMessageCartRepositoryV1"],"description":"Set the gift message for an entire order.","operationId":"giftMessageCartRepositoryV1SavePost","parameters":[{"name":"$body","in":"body","schema":{"required":["giftMessage"],"properties":{"giftMessage":{"$ref":"#/definitions/gift-message-data-message-interface"}},"type":"object"}}],"responses":{"200":{"description":"200 Success.","schema":{"type":"boolean"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/carts/{cartId}/gift-message/{itemId}":{"get":{"tags":["giftMessageItemRepositoryV1"],"description":"Return the gift message for a specified item in a specified shopping cart.","operationId":"giftMessageItemRepositoryV1GetGet","parameters":[{"name":"cartId","in":"path","type":"integer","required":true,"description":"The shopping cart ID."},{"name":"itemId","in":"path","type":"integer","required":true,"description":"The item ID."}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/gift-message-data-message-interface"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}},"post":{"tags":["giftMessageItemRepositoryV1"],"description":"Set the gift message for a specified item in a specified shopping cart.","operationId":"giftMessageItemRepositoryV1SavePost","parameters":[{"name":"cartId","in":"path","type":"integer","required":true,"description":"The cart ID."},{"name":"itemId","in":"path","type":"integer","required":true,"description":"The item ID."},{"name":"$body","in":"body","schema":{"required":["giftMessage"],"properties":{"giftMessage":{"$ref":"#/definitions/gift-message-data-message-interface"}},"type":"object"}}],"responses":{"200":{"description":"200 Success.","schema":{"type":"boolean"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/carts/mine/gift-message/{itemId}":{"get":{"tags":["giftMessageItemRepositoryV1"],"description":"Return the gift message for a specified item in a specified shopping cart.","operationId":"giftMessageItemRepositoryV1GetGet","parameters":[{"name":"itemId","in":"path","type":"integer","required":true,"description":"The item ID."}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/gift-message-data-message-interface"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}},"post":{"tags":["giftMessageItemRepositoryV1"],"description":"Set the gift message for a specified item in a specified shopping cart.","operationId":"giftMessageItemRepositoryV1SavePost","parameters":[{"name":"itemId","in":"path","type":"integer","required":true,"description":"The item ID."},{"name":"$body","in":"body","schema":{"required":["giftMessage"],"properties":{"giftMessage":{"$ref":"#/definitions/gift-message-data-message-interface"}},"type":"object"}}],"responses":{"200":{"description":"200 Success.","schema":{"type":"boolean"}},"401":{"description":"401 Unauthorized","schema":{"$ref":"#/definitions/error-response"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/guest-carts/{cartId}/gift-message":{"get":{"tags":["giftMessageGuestCartRepositoryV1"],"description":"Return the gift message for a specified order.","operationId":"giftMessageGuestCartRepositoryV1GetGet","parameters":[{"name":"cartId","in":"path","type":"string","required":true,"description":"The shopping cart ID."}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/gift-message-data-message-interface"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}},"post":{"tags":["giftMessageGuestCartRepositoryV1"],"description":"Set the gift message for an entire order.","operationId":"giftMessageGuestCartRepositoryV1SavePost","parameters":[{"name":"cartId","in":"path","type":"string","required":true,"description":"The cart ID."},{"name":"$body","in":"body","schema":{"required":["giftMessage"],"properties":{"giftMessage":{"$ref":"#/definitions/gift-message-data-message-interface"}},"type":"object"}}],"responses":{"200":{"description":"200 Success.","schema":{"type":"boolean"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/guest-carts/{cartId}/gift-message/{itemId}":{"get":{"tags":["giftMessageGuestItemRepositoryV1"],"description":"Return the gift message for a specified item in a specified shopping cart.","operationId":"giftMessageGuestItemRepositoryV1GetGet","parameters":[{"name":"cartId","in":"path","type":"string","required":true,"description":"The shopping cart ID."},{"name":"itemId","in":"path","type":"integer","required":true,"description":"The item ID."}],"responses":{"200":{"description":"200 Success.","schema":{"$ref":"#/definitions/gift-message-data-message-interface"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}},"post":{"tags":["giftMessageGuestItemRepositoryV1"],"description":"Set the gift message for a specified item in a specified shopping cart.","operationId":"giftMessageGuestItemRepositoryV1SavePost","parameters":[{"name":"cartId","in":"path","type":"string","required":true,"description":"The cart ID."},{"name":"itemId","in":"path","type":"integer","required":true,"description":"The item ID."},{"name":"$body","in":"body","schema":{"required":["giftMessage"],"properties":{"giftMessage":{"$ref":"#/definitions/gift-message-data-message-interface"}},"type":"object"}}],"responses":{"200":{"description":"200 Success.","schema":{"type":"boolean"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/integration/admin/token":{"post":{"tags":["integrationAdminTokenServiceV1"],"description":"Create access token for admin given the admin credentials.","operationId":"integrationAdminTokenServiceV1CreateAdminAccessTokenPost","parameters":[{"name":"$body","in":"body","schema":{"required":["username","password"],"properties":{"username":{"type":"string"},"password":{"type":"string"}},"type":"object"}}],"responses":{"200":{"description":"200 Success.","schema":{"type":"string","description":"Token created"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"500":{"description":"Internal Server error","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}},"/V1/integration/customer/token":{"post":{"tags":["integrationCustomerTokenServiceV1"],"description":"Create access token for admin given the customer credentials.","operationId":"integrationCustomerTokenServiceV1CreateCustomerAccessTokenPost","parameters":[{"name":"$body","in":"body","schema":{"required":["username","password"],"properties":{"username":{"type":"string"},"password":{"type":"string"}},"type":"object"}}],"responses":{"200":{"description":"200 Success.","schema":{"type":"string","description":"Token created"}},"400":{"description":"400 Bad Request","schema":{"$ref":"#/definitions/error-response"}},"default":{"description":"Unexpected error","schema":{"$ref":"#/definitions/error-response"}}}}}},"definitions":{"error-response":{"type":"object","properties":{"message":{"type":"string","description":"Error message"},"errors":{"$ref":"#/definitions/error-errors"},"code":{"type":"integer","description":"Error code"},"parameters":{"$ref":"#/definitions/error-parameters"},"trace":{"type":"string","description":"Stack trace"}},"required":["message"]},"error-errors":{"type":"array","description":"Errors list","items":{"$ref":"#/definitions/error-errors-item"}},"error-errors-item":{"type":"object","description":"Error details","properties":{"message":{"type":"string","description":"Error message"},"parameters":{"$ref":"#/definitions/error-parameters"}}},"error-parameters":{"type":"array","description":"Error parameters list","items":{"$ref":"#/definitions/error-parameters-item"}},"error-parameters-item":{"type":"object","description":"Error parameters item","properties":{"resources":{"type":"string","description":"ACL resource"},"fieldName":{"type":"string","description":"Missing or invalid field name"},"fieldValue":{"type":"string","description":"Incorrect field value"}}},"store-data-store-interface":{"type":"object","description":"Store interface","properties":{"id":{"type":"integer"},"code":{"type":"string"},"name":{"type":"string","description":"Store name"},"websiteId":{"type":"integer"},"storeGroupId":{"type":"integer"},"extensionAttributes":{"$ref":"#/definitions/store-data-store-extension-interface"}},"required":["id","code","name","websiteId","storeGroupId"]},"store-data-store-extension-interface":{"type":"object","description":"ExtensionInterface class for @see \\Magento\\Store\\Api\\Data\\StoreInterface"},"store-data-group-interface":{"type":"object","description":"Group interface","properties":{"id":{"type":"integer"},"websiteId":{"type":"integer"},"rootCategoryId":{"type":"integer"},"defaultStoreId":{"type":"integer"},"name":{"type":"string"},"extensionAttributes":{"$ref":"#/definitions/store-data-group-extension-interface"}},"required":["id","websiteId","rootCategoryId","defaultStoreId","name"]},"store-data-group-extension-interface":{"type":"object","description":"ExtensionInterface class for @see \\Magento\\Store\\Api\\Data\\GroupInterface"},"store-data-website-interface":{"type":"object","description":"Website interface","properties":{"id":{"type":"integer"},"code":{"type":"string"},"name":{"type":"string","description":"Website name"},"defaultGroupId":{"type":"integer"},"extensionAttributes":{"$ref":"#/definitions/store-data-website-extension-interface"}},"required":["id","code","name","defaultGroupId"]},"store-data-website-extension-interface":{"type":"object","description":"ExtensionInterface class for @see \\Magento\\Store\\Api\\Data\\WebsiteInterface"},"store-data-store-config-interface":{"type":"object","description":"StoreConfig interface","properties":{"id":{"type":"integer","description":"Store id"},"code":{"type":"string","description":"Store code"},"websiteId":{"type":"integer","description":"Website id of the store"},"locale":{"type":"string","description":"Store locale"},"baseCurrencyCode":{"type":"string","description":"Base currency code"},"defaultDisplayCurrencyCode":{"type":"string","description":"Default display currency code"},"timezone":{"type":"string","description":"Timezone of the store"},"weightUnit":{"type":"string","description":"The unit of weight"},"baseUrl":{"type":"string","description":"Base URL for the store"},"baseLinkUrl":{"type":"string","description":"Base link URL for the store"},"baseStaticUrl":{"type":"string","description":"Base static URL for the store"},"baseMediaUrl":{"type":"string","description":"Base media URL for the store"},"secureBaseUrl":{"type":"string","description":"Secure base URL for the store"},"secureBaseLinkUrl":{"type":"string","description":"Secure base link URL for the store"},"secureBaseStaticUrl":{"type":"string","description":"Secure base static URL for the store"},"secureBaseMediaUrl":{"type":"string","description":"Secure base media URL for the store"},"extensionAttributes":{"$ref":"#/definitions/store-data-store-config-extension-interface"}},"required":["id","code","websiteId","locale","baseCurrencyCode","defaultDisplayCurrencyCode","timezone","weightUnit","baseUrl","baseLinkUrl","baseStaticUrl","baseMediaUrl","secureBaseUrl","secureBaseLinkUrl","secureBaseStaticUrl","secureBaseMediaUrl"]},"store-data-store-config-extension-interface":{"type":"object","description":"ExtensionInterface class for @see \\Magento\\Store\\Api\\Data\\StoreConfigInterface"},"directory-data-currency-information-interface":{"type":"object","description":"Currency Information interface.","properties":{"baseCurrencyCode":{"type":"string","description":"The base currency code for the store."},"baseCurrencySymbol":{"type":"string","description":"The currency symbol of the base currency for the store."},"defaultDisplayCurrencyCode":{"type":"string","description":"The default display currency code for the store."},"defaultDisplayCurrencySymbol":{"type":"string","description":"The currency symbol of the default display currency for the store."},"availableCurrencyCodes":{"type":"array","description":"The list of allowed currency codes for the store.","items":{"type":"string"}},"exchangeRates":{"type":"array","description":"The list of exchange rate information for the store.","items":{"$ref":"#/definitions/directory-data-exchange-rate-interface"}},"extensionAttributes":{"$ref":"#/definitions/directory-data-currency-information-extension-interface"}},"required":["baseCurrencyCode","baseCurrencySymbol","defaultDisplayCurrencyCode","defaultDisplayCurrencySymbol","availableCurrencyCodes","exchangeRates"]},"directory-data-exchange-rate-interface":{"type":"object","description":"Exchange Rate interface.","properties":{"currencyTo":{"type":"string","description":"The currency code associated with the exchange rate."},"rate":{"type":"number","description":"The exchange rate for the associated currency and the store's base currency."},"extensionAttributes":{"$ref":"#/definitions/directory-data-exchange-rate-extension-interface"}},"required":["currencyTo","rate"]},"directory-data-exchange-rate-extension-interface":{"type":"object","description":"ExtensionInterface class for @see \\Magento\\Directory\\Api\\Data\\ExchangeRateInterface"},"directory-data-currency-information-extension-interface":{"type":"object","description":"ExtensionInterface class for @see \\Magento\\Directory\\Api\\Data\\CurrencyInformationInterface"},"directory-data-country-information-interface":{"type":"object","description":"Country Information interface.","properties":{"id":{"type":"string","description":"The country id for the store."},"twoLetterAbbreviation":{"type":"string","description":"The country 2 letter abbreviation for the store."},"threeLetterAbbreviation":{"type":"string","description":"The country 3 letter abbreviation for the store."},"fullNameLocale":{"type":"string","description":"The country full name (in store locale) for the store."},"fullNameEnglish":{"type":"string","description":"The country full name (in English) for the store."},"availableRegions":{"type":"array","description":"The available regions for the store.","items":{"$ref":"#/definitions/directory-data-region-information-interface"}},"extensionAttributes":{"$ref":"#/definitions/directory-data-country-information-extension-interface"}},"required":["id","twoLetterAbbreviation","threeLetterAbbreviation","fullNameLocale","fullNameEnglish"]},"directory-data-region-information-interface":{"type":"object","description":"Region Information interface.","properties":{"id":{"type":"string","description":"Region id"},"code":{"type":"string","description":"Region code"},"name":{"type":"string","description":"Region name"},"extensionAttributes":{"$ref":"#/definitions/directory-data-region-information-extension-interface"}},"required":["id","code","name"]},"directory-data-region-information-extension-interface":{"type":"object","description":"ExtensionInterface class for @see \\Magento\\Directory\\Api\\Data\\RegionInformationInterface"},"directory-data-country-information-extension-interface":{"type":"object","description":"ExtensionInterface class for @see \\Magento\\Directory\\Api\\Data\\CountryInformationInterface"},"eav-data-attribute-set-search-results-interface":{"type":"object","description":"","properties":{"items":{"type":"array","description":"Attribute sets list.","items":{"$ref":"#/definitions/eav-data-attribute-set-interface"}},"searchCriteria":{"$ref":"#/definitions/framework-search-criteria-interface"},"totalCount":{"type":"integer","description":"Total count."}},"required":["items","searchCriteria","totalCount"]},"eav-data-attribute-set-interface":{"type":"object","description":"","properties":{"attributeSetId":{"type":"integer","description":"Attribute set ID"},"attributeSetName":{"type":"string","description":"Attribute set name"},"sortOrder":{"type":"integer","description":"Attribute set sort order index"},"entityTypeId":{"type":"integer","description":"Attribute set entity type id"},"extensionAttributes":{"$ref":"#/definitions/eav-data-attribute-set-extension-interface"}},"required":["attributeSetName","sortOrder"]},"eav-data-attribute-set-extension-interface":{"type":"object","description":"ExtensionInterface class for @see \\Magento\\Eav\\Api\\Data\\AttributeSetInterface"},"framework-search-criteria-interface":{"type":"object","description":"Search criteria interface.","properties":{"filterGroups":{"type":"array","description":"A list of filter groups.","items":{"$ref":"#/definitions/framework-search-filter-group"}},"sortOrders":{"type":"array","description":"Sort order.","items":{"$ref":"#/definitions/framework-sort-order"}},"pageSize":{"type":"integer","description":"Page size."},"currentPage":{"type":"integer","description":"Current page."}},"required":["filterGroups"]},"framework-search-filter-group":{"type":"object","description":"Groups two or more filters together using a logical OR","properties":{"filters":{"type":"array","description":"A list of filters in this group","items":{"$ref":"#/definitions/framework-filter"}}}},"framework-filter":{"type":"object","description":"Filter which can be used by any methods from service layer.","properties":{"field":{"type":"string","description":"Field"},"value":{"type":"string","description":"Value"},"conditionType":{"type":"string","description":"Condition type"}},"required":["field","value"]},"framework-sort-order":{"type":"object","description":"Data object for sort order.","properties":{"field":{"type":"string","description":"Sorting field."},"direction":{"type":"string","description":"Sorting direction."}},"required":["field","direction"]},"customer-data-group-interface":{"type":"object","description":"Customer group interface.","properties":{"id":{"type":"integer","description":"Id"},"code":{"type":"string","description":"Code"},"taxClassId":{"type":"integer","description":"Tax class id"},"taxClassName":{"type":"string","description":"Tax class name"},"extensionAttributes":{"$ref":"#/definitions/customer-data-group-extension-interface"}},"required":["code","taxClassId"]},"customer-data-group-extension-interface":{"type":"object","description":"ExtensionInterface class for @see \\Magento\\Customer\\Api\\Data\\GroupInterface"},"customer-data-group-search-results-interface":{"type":"object","description":"Interface for customer groups search results.","properties":{"items":{"type":"array","description":"Customer groups list.","items":{"$ref":"#/definitions/customer-data-group-interface"}},"searchCriteria":{"$ref":"#/definitions/framework-search-criteria-interface"},"totalCount":{"type":"integer","description":"Total count."}},"required":["items","searchCriteria","totalCount"]},"customer-data-attribute-metadata-interface":{"type":"object","description":"Customer attribute metadata interface.","properties":{"frontendInput":{"type":"string","description":"HTML for input element."},"inputFilter":{"type":"string","description":"Template used for input (e.g. \"date\")"},"storeLabel":{"type":"string","description":"Label of the store."},"validationRules":{"type":"array","description":"Validation rules.","items":{"$ref":"#/definitions/customer-data-validation-rule-interface"}},"multilineCount":{"type":"integer","description":"Of lines of the attribute value."},"visible":{"type":"boolean","description":"Attribute is visible on frontend."},"required":{"type":"boolean","description":"Attribute is required."},"dataModel":{"type":"string","description":"Data model for attribute."},"options":{"type":"array","description":"Options of the attribute (key => value pairs for select)","items":{"$ref":"#/definitions/customer-data-option-interface"}},"frontendClass":{"type":"string","description":"Class which is used to display the attribute on frontend."},"userDefined":{"type":"boolean","description":"Current attribute has been defined by a user."},"sortOrder":{"type":"integer","description":"Attributes sort order."},"frontendLabel":{"type":"string","description":"Label which supposed to be displayed on frontend."},"note":{"type":"string","description":"The note attribute for the element."},"system":{"type":"boolean","description":"This is a system attribute."},"backendType":{"type":"string","description":"Backend type."},"isUsedInGrid":{"type":"boolean","description":"It is used in customer grid"},"isVisibleInGrid":{"type":"boolean","description":"It is visible in customer grid"},"isFilterableInGrid":{"type":"boolean","description":"It is filterable in customer grid"},"isSearchableInGrid":{"type":"boolean","description":"It is searchable in customer grid"},"attributeCode":{"type":"string","description":"Code of the attribute."}},"required":["frontendInput","inputFilter","storeLabel","validationRules","multilineCount","visible","required","dataModel","options","frontendClass","userDefined","sortOrder","frontendLabel","note","system","backendType","attributeCode"]},"customer-data-validation-rule-interface":{"type":"object","description":"Validation rule interface.","properties":{"name":{"type":"string","description":"Validation rule name"},"value":{"type":"string","description":"Validation rule value"}},"required":["name","value"]},"customer-data-option-interface":{"type":"object","description":"Option interface.","properties":{"label":{"type":"string","description":"Option label"},"value":{"type":"string","description":"Option value"},"options":{"type":"array","description":"Nested options","items":{"$ref":"#/definitions/customer-data-option-interface"}}},"required":["label"]},"customer-data-customer-interface":{"type":"object","description":"Customer interface.","properties":{"id":{"type":"integer","description":"Customer id"},"groupId":{"type":"integer","description":"Group id"},"defaultBilling":{"type":"string","description":"Default billing address id"},"defaultShipping":{"type":"string","description":"Default shipping address id"},"confirmation":{"type":"string","description":"Confirmation"},"createdAt":{"type":"string","description":"Created at time"},"updatedAt":{"type":"string","description":"Updated at time"},"createdIn":{"type":"string","description":"Created in area"},"dob":{"type":"string","description":"Date of birth"},"email":{"type":"string","description":"Email address"},"firstname":{"type":"string","description":"First name"},"lastname":{"type":"string","description":"Last name"},"middlename":{"type":"string","description":"Middle name"},"prefix":{"type":"string","description":"Prefix"},"suffix":{"type":"string","description":"Suffix"},"gender":{"type":"integer","description":"Gender"},"storeId":{"type":"integer","description":"Store id"},"taxvat":{"type":"string","description":"Tax Vat"},"websiteId":{"type":"integer","description":"Website id"},"addresses":{"type":"array","description":"Customer addresses.","items":{"$ref":"#/definitions/customer-data-address-interface"}},"disableAutoGroupChange":{"type":"integer","description":"Disable auto group change flag."},"extensionAttributes":{"$ref":"#/definitions/customer-data-customer-extension-interface"},"customAttributes":{"type":"array","description":"Custom attributes values.","items":{"$ref":"#/definitions/framework-attribute-interface"}}},"required":["email","firstname","lastname"]},"customer-data-address-interface":{"type":"object","description":"Customer address interface.","properties":{"id":{"type":"integer","description":"ID"},"customerId":{"type":"integer","description":"Customer ID"},"region":{"$ref":"#/definitions/customer-data-region-interface"},"regionId":{"type":"integer","description":"Region ID"},"countryId":{"type":"string","description":"Country code in ISO_3166-2 format"},"street":{"type":"array","description":"Street","items":{"type":"string"}},"company":{"type":"string","description":"Company"},"telephone":{"type":"string","description":"Telephone number"},"fax":{"type":"string","description":"Fax number"},"postcode":{"type":"string","description":"Postcode"},"city":{"type":"string","description":"City name"},"firstname":{"type":"string","description":"First name"},"lastname":{"type":"string","description":"Last name"},"middlename":{"type":"string","description":"Middle name"},"prefix":{"type":"string","description":"Prefix"},"suffix":{"type":"string","description":"Suffix"},"vatId":{"type":"string","description":"Vat id"},"defaultShipping":{"type":"boolean","description":"If this address is default shipping address."},"defaultBilling":{"type":"boolean","description":"If this address is default billing address"},"extensionAttributes":{"$ref":"#/definitions/customer-data-address-extension-interface"},"customAttributes":{"type":"array","description":"Custom attributes values.","items":{"$ref":"#/definitions/framework-attribute-interface"}}}},"customer-data-region-interface":{"type":"object","description":"Customer address region interface.","properties":{"regionCode":{"type":"string","description":"Region code"},"region":{"type":"string","description":"Region"},"regionId":{"type":"integer","description":"Region id"},"extensionAttributes":{"$ref":"#/definitions/customer-data-region-extension-interface"}},"required":["regionCode","region","regionId"]},"customer-data-region-extension-interface":{"type":"object","description":"ExtensionInterface class for @see \\Magento\\Customer\\Api\\Data\\RegionInterface"},"customer-data-address-extension-interface":{"type":"object","description":"ExtensionInterface class for @see \\Magento\\Customer\\Api\\Data\\AddressInterface"},"framework-attribute-interface":{"type":"object","description":"Interface for custom attribute value.","properties":{"attributeCode":{"type":"string","description":"Attribute code"},"value":{"type":"string","description":"Attribute value"}},"required":["attributeCode","value"]},"customer-data-customer-extension-interface":{"type":"object","description":"ExtensionInterface class for @see \\Magento\\Customer\\Api\\Data\\CustomerInterface"},"customer-data-customer-search-results-interface":{"type":"object","description":"Interface for customer search results.","properties":{"items":{"type":"array","description":"Customers list.","items":{"$ref":"#/definitions/customer-data-customer-interface"}},"searchCriteria":{"$ref":"#/definitions/framework-search-criteria-interface"},"totalCount":{"type":"integer","description":"Total count."}},"required":["items","searchCriteria","totalCount"]},"customer-data-validation-results-interface":{"type":"object","description":"Validation results interface.","properties":{"valid":{"type":"boolean","description":"If the provided data is valid."},"messages":{"type":"array","description":"Error messages as array in case of validation failure, else return empty array.","items":{"type":"string"}}},"required":["valid","messages"]},"cms-data-page-interface":{"type":"object","description":"CMS page interface.","properties":{"id":{"type":"integer","description":"ID"},"identifier":{"type":"string","description":"Identifier"},"title":{"type":"string","description":"Title"},"pageLayout":{"type":"string","description":"Page layout"},"metaKeywords":{"type":"string","description":"Meta keywords"},"metaDescription":{"type":"string","description":"Meta description"},"contentHeading":{"type":"string","description":"Content heading"},"content":{"type":"string","description":"Content"},"creationTime":{"type":"string","description":"Creation time"},"updateTime":{"type":"string","description":"Update time"},"sortOrder":{"type":"string","description":"Sort order"},"layoutUpdateXml":{"type":"string","description":"Layout update xml"},"customTheme":{"type":"string","description":"Custom theme"},"customRootTemplate":{"type":"string","description":"Custom root template"},"customLayoutUpdateXml":{"type":"string","description":"Custom layout update xml"},"customThemeFrom":{"type":"string","description":"Custom theme from"},"customThemeTo":{"type":"string","description":"Custom theme to"},"active":{"type":"boolean","description":"Active"}},"required":["identifier"]},"cms-data-page-search-results-interface":{"type":"object","description":"Interface for cms page search results.","properties":{"items":{"type":"array","description":"Pages list.","items":{"$ref":"#/definitions/cms-data-page-interface"}},"searchCriteria":{"$ref":"#/definitions/framework-search-criteria-interface"},"totalCount":{"type":"integer","description":"Total count."}},"required":["items","searchCriteria","totalCount"]},"cms-data-block-interface":{"type":"object","description":"CMS block interface.","properties":{"id":{"type":"integer","description":"ID"},"identifier":{"type":"string","description":"Identifier"},"title":{"type":"string","description":"Title"},"content":{"type":"string","description":"Content"},"creationTime":{"type":"string","description":"Creation time"},"updateTime":{"type":"string","description":"Update time"},"active":{"type":"boolean","description":"Active"}},"required":["identifier"]},"cms-data-block-search-results-interface":{"type":"object","description":"Interface for cms block search results.","properties":{"items":{"type":"array","description":"Blocks list.","items":{"$ref":"#/definitions/cms-data-block-interface"}},"searchCriteria":{"$ref":"#/definitions/framework-search-criteria-interface"},"totalCount":{"type":"integer","description":"Total count."}},"required":["items","searchCriteria","totalCount"]},"catalog-data-product-interface":{"type":"object","description":"","properties":{"id":{"type":"integer","description":"Id"},"sku":{"type":"string","description":"Sku"},"name":{"type":"string","description":"Name"},"attributeSetId":{"type":"integer","description":"Attribute set id"},"price":{"type":"number","description":"Price"},"status":{"type":"integer","description":"Status"},"visibility":{"type":"integer","description":"Visibility"},"typeId":{"type":"string","description":"Type id"},"createdAt":{"type":"string","description":"Created date"},"updatedAt":{"type":"string","description":"Updated date"},"weight":{"type":"number","description":"Weight"},"extensionAttributes":{"$ref":"#/definitions/catalog-data-product-extension-interface"},"productLinks":{"type":"array","description":"Product links info","items":{"$ref":"#/definitions/catalog-data-product-link-interface"}},"options":{"type":"array","description":"List of product options","items":{"$ref":"#/definitions/catalog-data-product-custom-option-interface"}},"mediaGalleryEntries":{"type":"array","description":"Media gallery entries","items":{"$ref":"#/definitions/catalog-data-product-attribute-media-gallery-entry-interface"}},"tierPrices":{"type":"array","description":"List of product tier prices","items":{"$ref":"#/definitions/catalog-data-product-tier-price-interface"}},"customAttributes":{"type":"array","description":"Custom attributes values.","items":{"$ref":"#/definitions/framework-attribute-interface"}}},"required":["sku"]},"catalog-data-product-extension-interface":{"type":"object","description":"ExtensionInterface class for @see \\Magento\\Catalog\\Api\\Data\\ProductInterface","properties":{"stockItem":{"$ref":"#/definitions/catalog-inventory-data-stock-item-interface"},"downloadableProductLinks":{"type":"array","items":{"$ref":"#/definitions/downloadable-data-link-interface"}},"downloadableProductSamples":{"type":"array","items":{"$ref":"#/definitions/downloadable-data-sample-interface"}},"bundleProductOptions":{"type":"array","items":{"$ref":"#/definitions/bundle-data-option-interface"}},"configurableProductOptions":{"type":"array","items":{"$ref":"#/definitions/configurable-product-data-option-interface"}},"configurableProductLinks":{"type":"array","items":{"type":"integer"}}}},"catalog-inventory-data-stock-item-interface":{"type":"object","description":"Interface StockItem","properties":{"itemId":{"type":"integer"},"productId":{"type":"integer"},"stockId":{"type":"integer","description":"Stock identifier"},"qty":{"type":"number"},"isInStock":{"type":"boolean","description":"Stock Availability"},"isQtyDecimal":{"type":"boolean"},"showDefaultNotificationMessage":{"type":"boolean"},"useConfigMinQty":{"type":"boolean"},"minQty":{"type":"number","description":"Minimal quantity available for item status in stock"},"useConfigMinSaleQty":{"type":"integer"},"minSaleQty":{"type":"number","description":"Minimum Qty Allowed in Shopping Cart or NULL when there is no limitation"},"useConfigMaxSaleQty":{"type":"boolean"},"maxSaleQty":{"type":"number","description":"Maximum Qty Allowed in Shopping Cart data wrapper"},"useConfigBackorders":{"type":"boolean"},"backorders":{"type":"integer","description":"Backorders status"},"useConfigNotifyStockQty":{"type":"boolean"},"notifyStockQty":{"type":"number","description":"Notify for Quantity Below data wrapper"},"useConfigQtyIncrements":{"type":"boolean"},"qtyIncrements":{"type":"number","description":"Quantity Increments data wrapper"},"useConfigEnableQtyInc":{"type":"boolean"},"enableQtyIncrements":{"type":"boolean","description":"Whether Quantity Increments is enabled"},"useConfigManageStock":{"type":"boolean"},"manageStock":{"type":"boolean","description":"Can Manage Stock"},"lowStockDate":{"type":"string"},"isDecimalDivided":{"type":"boolean"},"stockStatusChangedAuto":{"type":"integer"},"extensionAttributes":{"$ref":"#/definitions/catalog-inventory-data-stock-item-extension-interface"}},"required":["qty","isInStock","isQtyDecimal","showDefaultNotificationMessage","useConfigMinQty","minQty","useConfigMinSaleQty","minSaleQty","useConfigMaxSaleQty","maxSaleQty","useConfigBackorders","backorders","useConfigNotifyStockQty","notifyStockQty","useConfigQtyIncrements","qtyIncrements","useConfigEnableQtyInc","enableQtyIncrements","useConfigManageStock","manageStock","lowStockDate","isDecimalDivided","stockStatusChangedAuto"]},"catalog-inventory-data-stock-item-extension-interface":{"type":"object","description":"ExtensionInterface class for @see \\Magento\\CatalogInventory\\Api\\Data\\StockItemInterface"},"downloadable-data-link-interface":{"type":"object","description":"","properties":{"id":{"type":"integer","description":"Sample(or link) id"},"title":{"type":"string"},"sortOrder":{"type":"integer"},"isShareable":{"type":"integer","description":"Shareable status"},"price":{"type":"number","description":"Price"},"numberOfDownloads":{"type":"integer","description":"Of downloads per user"},"linkType":{"type":"string"},"linkFile":{"type":"string","description":"relative file path"},"linkFileContent":{"$ref":"#/definitions/downloadable-data-file-content-interface"},"linkUrl":{"type":"string","description":"Link url or null when type is 'file'"},"sampleType":{"type":"string"},"sampleFile":{"type":"string","description":"relative file path"},"sampleFileContent":{"$ref":"#/definitions/downloadable-data-file-content-interface"},"sampleUrl":{"type":"string","description":"file URL"},"extensionAttributes":{"$ref":"#/definitions/downloadable-data-link-extension-interface"}},"required":["sortOrder","isShareable","price","linkType","sampleType"]},"downloadable-data-file-content-interface":{"type":"object","description":"","properties":{"fileData":{"type":"string","description":"Data (base64 encoded content)"},"name":{"type":"string","description":"File name"},"extensionAttributes":{"$ref":"#/definitions/downloadable-data-file-content-extension-interface"}},"required":["fileData","name"]},"downloadable-data-file-content-extension-interface":{"type":"object","description":"ExtensionInterface class for @see \\Magento\\Downloadable\\Api\\Data\\File\\ContentInterface"},"downloadable-data-link-extension-interface":{"type":"object","description":"ExtensionInterface class for @see \\Magento\\Downloadable\\Api\\Data\\LinkInterface"},"downloadable-data-sample-interface":{"type":"object","description":"","properties":{"id":{"type":"integer","description":"Sample(or link) id"},"title":{"type":"string","description":"Title"},"sortOrder":{"type":"integer","description":"Order index for sample"},"sampleType":{"type":"string"},"sampleFile":{"type":"string","description":"relative file path"},"sampleFileContent":{"$ref":"#/definitions/downloadable-data-file-content-interface"},"sampleUrl":{"type":"string","description":"file URL"},"extensionAttributes":{"$ref":"#/definitions/downloadable-data-sample-extension-interface"}},"required":["title","sortOrder","sampleType"]},"downloadable-data-sample-extension-interface":{"type":"object","description":"ExtensionInterface class for @see \\Magento\\Downloadable\\Api\\Data\\SampleInterface"},"bundle-data-option-interface":{"type":"object","description":"Interface OptionInterface","properties":{"optionId":{"type":"integer","description":"Option id"},"title":{"type":"string","description":"Option title"},"required":{"type":"boolean","description":"Is required option"},"type":{"type":"string","description":"Input type"},"position":{"type":"integer","description":"Option position"},"sku":{"type":"string","description":"Product sku"},"productLinks":{"type":"array","description":"Product links","items":{"$ref":"#/definitions/bundle-data-link-interface"}},"extensionAttributes":{"$ref":"#/definitions/bundle-data-option-extension-interface"}}},"bundle-data-link-interface":{"type":"object","description":"Interface LinkInterface","properties":{"id":{"type":"string","description":"The identifier"},"sku":{"type":"string","description":"Linked product sku"},"optionId":{"type":"integer","description":"Option id"},"qty":{"type":"number","description":"Qty"},"position":{"type":"integer","description":"Position"},"isDefault":{"type":"boolean","description":"Is default"},"price":{"type":"number","description":"Price"},"priceType":{"type":"integer","description":"Price type"},"canChangeQuantity":{"type":"integer","description":"Whether quantity could be changed"},"extensionAttributes":{"$ref":"#/definitions/bundle-data-link-extension-interface"}},"required":["isDefault","price","priceType"]},"bundle-data-link-extension-interface":{"type":"object","description":"ExtensionInterface class for @see \\Magento\\Bundle\\Api\\Data\\LinkInterface"},"bundle-data-option-extension-interface":{"type":"object","description":"ExtensionInterface class for @see \\Magento\\Bundle\\Api\\Data\\OptionInterface"},"configurable-product-data-option-interface":{"type":"object","description":"","properties":{"id":{"type":"integer"},"attributeId":{"type":"string"},"label":{"type":"string"},"position":{"type":"integer"},"isUseDefault":{"type":"boolean"},"values":{"type":"array","items":{"$ref":"#/definitions/configurable-product-data-option-value-interface"}},"extensionAttributes":{"$ref":"#/definitions/configurable-product-data-option-extension-interface"},"productId":{"type":"integer"}}},"configurable-product-data-option-value-interface":{"type":"object","description":"","properties":{"valueIndex":{"type":"integer"},"extensionAttributes":{"$ref":"#/definitions/configurable-product-data-option-value-extension-interface"}},"required":["valueIndex"]},"configurable-product-data-option-value-extension-interface":{"type":"object","description":"ExtensionInterface class for @see \\Magento\\ConfigurableProduct\\Api\\Data\\OptionValueInterface"},"configurable-product-data-option-extension-interface":{"type":"object","description":"ExtensionInterface class for @see \\Magento\\ConfigurableProduct\\Api\\Data\\OptionInterface"},"catalog-data-product-link-interface":{"type":"object","description":"","properties":{"sku":{"type":"string","description":"SKU"},"linkType":{"type":"string","description":"Link type"},"linkedProductSku":{"type":"string","description":"Linked product sku"},"linkedProductType":{"type":"string","description":"Linked product type (simple, virtual, etc)"},"position":{"type":"integer","description":"Linked item position"},"extensionAttributes":{"$ref":"#/definitions/catalog-data-product-link-extension-interface"}},"required":["sku","linkType","linkedProductSku","linkedProductType","position"]},"catalog-data-product-link-extension-interface":{"type":"object","description":"ExtensionInterface class for @see \\Magento\\Catalog\\Api\\Data\\ProductLinkInterface","properties":{"qty":{"type":"number"}}},"catalog-data-product-custom-option-interface":{"type":"object","description":"","properties":{"productSku":{"type":"string","description":"Product SKU"},"optionId":{"type":"integer","description":"Option id"},"title":{"type":"string","description":"Option title"},"type":{"type":"string","description":"Option type"},"sortOrder":{"type":"integer","description":"Sort order"},"isRequire":{"type":"boolean","description":"Is require"},"price":{"type":"number","description":"Price"},"priceType":{"type":"string","description":"Price type"},"sku":{"type":"string","description":"Sku"},"fileExtension":{"type":"string"},"maxCharacters":{"type":"integer"},"imageSizeX":{"type":"integer"},"imageSizeY":{"type":"integer"},"values":{"type":"array","items":{"$ref":"#/definitions/catalog-data-product-custom-option-values-interface"}},"extensionAttributes":{"$ref":"#/definitions/catalog-data-product-custom-option-extension-interface"}},"required":["productSku","title","type","sortOrder","isRequire"]},"catalog-data-product-custom-option-values-interface":{"type":"object","description":"","properties":{"title":{"type":"string","description":"Option title"},"sortOrder":{"type":"integer","description":"Sort order"},"price":{"type":"number","description":"Price"},"priceType":{"type":"string","description":"Price type"},"sku":{"type":"string","description":"Sku"},"optionTypeId":{"type":"integer","description":"Option type id"}},"required":["title","sortOrder","price","priceType"]},"catalog-data-product-custom-option-extension-interface":{"type":"object","description":"ExtensionInterface class for @see \\Magento\\Catalog\\Api\\Data\\ProductCustomOptionInterface"},"catalog-data-product-attribute-media-gallery-entry-interface":{"type":"object","description":"","properties":{"id":{"type":"integer","description":"Gallery entry ID"},"mediaType":{"type":"string","description":"Media type"},"label":{"type":"string","description":"Gallery entry alternative text"},"position":{"type":"integer","description":"Gallery entry position (sort order)"},"disabled":{"type":"boolean","description":"If gallery entry is hidden from product page"},"types":{"type":"array","description":"Gallery entry image types (thumbnail, image, small_image etc)","items":{"type":"string"}},"file":{"type":"string","description":"File path"},"content":{"$ref":"#/definitions/framework-data-image-content-interface"},"extensionAttributes":{"$ref":"#/definitions/catalog-data-product-attribute-media-gallery-entry-extension-interface"}},"required":["mediaType","label","position","disabled","types"]},"framework-data-image-content-interface":{"type":"object","description":"Image Content data interface","properties":{"base64EncodedData":{"type":"string","description":"Media data (base64 encoded content)"},"type":{"type":"string","description":"MIME type"},"name":{"type":"string","description":"Image name"}},"required":["base64EncodedData","type","name"]},"catalog-data-product-attribute-media-gallery-entry-extension-interface":{"type":"object","description":"ExtensionInterface class for @see \\Magento\\Catalog\\Api\\Data\\ProductAttributeMediaGalleryEntryInterface","properties":{"videoContent":{"$ref":"#/definitions/framework-data-video-content-interface"}}},"framework-data-video-content-interface":{"type":"object","description":"Video Content data interface","properties":{"mediaType":{"type":"string","description":"MIME type"},"videoProvider":{"type":"string","description":"Provider"},"videoUrl":{"type":"string","description":"Video URL"},"videoTitle":{"type":"string","description":"Title"},"videoDescription":{"type":"string","description":"Video Description"},"videoMetadata":{"type":"string","description":"Metadata"}},"required":["mediaType","videoProvider","videoUrl","videoTitle","videoDescription","videoMetadata"]},"catalog-data-product-tier-price-interface":{"type":"object","description":"","properties":{"customerGroupId":{"type":"integer","description":"Customer group id"},"qty":{"type":"number","description":"Tier qty"},"value":{"type":"number","description":"Price value"},"extensionAttributes":{"$ref":"#/definitions/catalog-data-product-tier-price-extension-interface"}},"required":["customerGroupId","qty","value"]},"catalog-data-product-tier-price-extension-interface":{"type":"object","description":"ExtensionInterface class for @see \\Magento\\Catalog\\Api\\Data\\ProductTierPriceInterface"},"catalog-data-product-search-results-interface":{"type":"object","description":"","properties":{"items":{"type":"array","description":"Attributes list.","items":{"$ref":"#/definitions/catalog-data-product-interface"}},"searchCriteria":{"$ref":"#/definitions/framework-search-criteria-interface"},"totalCount":{"type":"integer","description":"Total count."}},"required":["items","searchCriteria","totalCount"]},"catalog-data-product-attribute-type-interface":{"type":"object","description":"","properties":{"value":{"type":"string","description":"Value"},"label":{"type":"string","description":"Type label"},"extensionAttributes":{"$ref":"#/definitions/catalog-data-product-attribute-type-extension-interface"}},"required":["value","label"]},"catalog-data-product-attribute-type-extension-interface":{"type":"object","description":"ExtensionInterface class for @see \\Magento\\Catalog\\Api\\Data\\ProductAttributeTypeInterface"},"catalog-data-product-attribute-interface":{"type":"object","description":"","properties":{"isWysiwygEnabled":{"type":"boolean","description":"WYSIWYG flag"},"isHtmlAllowedOnFront":{"type":"boolean","description":"The HTML tags are allowed on the frontend"},"usedForSortBy":{"type":"boolean","description":"It is used for sorting in product listing"},"isFilterable":{"type":"boolean","description":"It used in layered navigation"},"isFilterableInSearch":{"type":"boolean","description":"It is used in search results layered navigation"},"isUsedInGrid":{"type":"boolean","description":"It is used in catalog product grid"},"isVisibleInGrid":{"type":"boolean","description":"It is visible in catalog product grid"},"isFilterableInGrid":{"type":"boolean","description":"It is filterable in catalog product grid"},"position":{"type":"integer","description":"Position"},"applyTo":{"type":"array","description":"Apply to value for the element","items":{"type":"string"}},"isSearchable":{"type":"string","description":"The attribute can be used in Quick Search"},"isVisibleInAdvancedSearch":{"type":"string","description":"The attribute can be used in Advanced Search"},"isComparable":{"type":"string","description":"The attribute can be compared on the frontend"},"isUsedForPromoRules":{"type":"string","description":"The attribute can be used for promo rules"},"isVisibleOnFront":{"type":"string","description":"The attribute is visible on the frontend"},"usedInProductListing":{"type":"string","description":"The attribute can be used in product listing"},"isVisible":{"type":"boolean","description":"Attribute is visible on frontend."},"scope":{"type":"string","description":"Attribute scope"},"extensionAttributes":{"$ref":"#/definitions/catalog-data-eav-attribute-extension-interface"},"attributeId":{"type":"integer","description":"Id of the attribute."},"attributeCode":{"type":"string","description":"Code of the attribute."},"frontendInput":{"type":"string","description":"HTML for input element."},"entityTypeId":{"type":"string","description":"Entity type id"},"isRequired":{"type":"boolean","description":"Attribute is required."},"options":{"type":"array","description":"Options of the attribute (key => value pairs for select)","items":{"$ref":"#/definitions/eav-data-attribute-option-interface"}},"isUserDefined":{"type":"boolean","description":"Current attribute has been defined by a user."},"defaultFrontendLabel":{"type":"string","description":"Frontend label for default store"},"frontendLabels":{"type":"array","description":"Frontend label for each store","items":{"$ref":"#/definitions/eav-data-attribute-frontend-label-interface"}},"note":{"type":"string","description":"The note attribute for the element."},"backendType":{"type":"string","description":"Backend type."},"backendModel":{"type":"string","description":"Backend model"},"sourceModel":{"type":"string","description":"Source model"},"defaultValue":{"type":"string","description":"Default value for the element."},"isUnique":{"type":"string","description":"This is a unique attribute"},"frontendClass":{"type":"string","description":"Frontend class of attribute"},"validationRules":{"type":"array","description":"Validation rules.","items":{"$ref":"#/definitions/eav-data-attribute-validation-rule-interface"}},"customAttributes":{"type":"array","description":"Custom attributes values.","items":{"$ref":"#/definitions/framework-attribute-interface"}}},"required":["attributeCode","frontendInput","isRequired","frontendLabels"]},"catalog-data-eav-attribute-extension-interface":{"type":"object","description":"ExtensionInterface class for @see \\Magento\\Catalog\\Api\\Data\\EavAttributeInterface"},"eav-data-attribute-option-interface":{"type":"object","description":"Created from:","properties":{"label":{"type":"string","description":"Option label"},"value":{"type":"string","description":"Option value"},"sortOrder":{"type":"integer","description":"Option order"},"isDefault":{"type":"boolean","description":"Default"},"storeLabels":{"type":"array","description":"Option label for store scopes","items":{"$ref":"#/definitions/eav-data-attribute-option-label-interface"}}},"required":["label","value"]},"eav-data-attribute-option-label-interface":{"type":"object","description":"","properties":{"storeId":{"type":"integer","description":"Store id"},"label":{"type":"string","description":"Option label"}}},"eav-data-attribute-frontend-label-interface":{"type":"object","description":"","properties":{"storeId":{"type":"integer","description":"Store id"},"label":{"type":"string","description":"Option label"}}},"eav-data-attribute-validation-rule-interface":{"type":"object","description":"","properties":{"key":{"type":"string","description":"Object key"},"value":{"type":"string","description":"Object value"}},"required":["key","value"]},"catalog-data-product-attribute-search-results-interface":{"type":"object","description":"","properties":{"items":{"type":"array","description":"Attributes list.","items":{"$ref":"#/definitions/catalog-data-product-attribute-interface"}},"searchCriteria":{"$ref":"#/definitions/framework-search-criteria-interface"},"totalCount":{"type":"integer","description":"Total count."}},"required":["items","searchCriteria","totalCount"]},"catalog-data-category-attribute-interface":{"type":"object","description":"","properties":{"isWysiwygEnabled":{"type":"boolean","description":"WYSIWYG flag"},"isHtmlAllowedOnFront":{"type":"boolean","description":"The HTML tags are allowed on the frontend"},"usedForSortBy":{"type":"boolean","description":"It is used for sorting in product listing"},"isFilterable":{"type":"boolean","description":"It used in layered navigation"},"isFilterableInSearch":{"type":"boolean","description":"It is used in search results layered navigation"},"isUsedInGrid":{"type":"boolean","description":"It is used in catalog product grid"},"isVisibleInGrid":{"type":"boolean","description":"It is visible in catalog product grid"},"isFilterableInGrid":{"type":"boolean","description":"It is filterable in catalog product grid"},"position":{"type":"integer","description":"Position"},"applyTo":{"type":"array","description":"Apply to value for the element","items":{"type":"string"}},"isSearchable":{"type":"string","description":"The attribute can be used in Quick Search"},"isVisibleInAdvancedSearch":{"type":"string","description":"The attribute can be used in Advanced Search"},"isComparable":{"type":"string","description":"The attribute can be compared on the frontend"},"isUsedForPromoRules":{"type":"string","description":"The attribute can be used for promo rules"},"isVisibleOnFront":{"type":"string","description":"The attribute is visible on the frontend"},"usedInProductListing":{"type":"string","description":"The attribute can be used in product listing"},"isVisible":{"type":"boolean","description":"Attribute is visible on frontend."},"scope":{"type":"string","description":"Attribute scope"},"extensionAttributes":{"$ref":"#/definitions/catalog-data-eav-attribute-extension-interface"},"attributeId":{"type":"integer","description":"Id of the attribute."},"attributeCode":{"type":"string","description":"Code of the attribute."},"frontendInput":{"type":"string","description":"HTML for input element."},"entityTypeId":{"type":"string","description":"Entity type id"},"isRequired":{"type":"boolean","description":"Attribute is required."},"options":{"type":"array","description":"Options of the attribute (key => value pairs for select)","items":{"$ref":"#/definitions/eav-data-attribute-option-interface"}},"isUserDefined":{"type":"boolean","description":"Current attribute has been defined by a user."},"defaultFrontendLabel":{"type":"string","description":"Frontend label for default store"},"frontendLabels":{"type":"array","description":"Frontend label for each store","items":{"$ref":"#/definitions/eav-data-attribute-frontend-label-interface"}},"note":{"type":"string","description":"The note attribute for the element."},"backendType":{"type":"string","description":"Backend type."},"backendModel":{"type":"string","description":"Backend model"},"sourceModel":{"type":"string","description":"Source model"},"defaultValue":{"type":"string","description":"Default value for the element."},"isUnique":{"type":"string","description":"This is a unique attribute"},"frontendClass":{"type":"string","description":"Frontend class of attribute"},"validationRules":{"type":"array","description":"Validation rules.","items":{"$ref":"#/definitions/eav-data-attribute-validation-rule-interface"}},"customAttributes":{"type":"array","description":"Custom attributes values.","items":{"$ref":"#/definitions/framework-attribute-interface"}}},"required":["attributeCode","frontendInput","isRequired","frontendLabels"]},"catalog-data-category-attribute-search-results-interface":{"type":"object","description":"","properties":{"items":{"type":"array","description":"Attributes list.","items":{"$ref":"#/definitions/catalog-data-category-attribute-interface"}},"searchCriteria":{"$ref":"#/definitions/framework-search-criteria-interface"},"totalCount":{"type":"integer","description":"Total count."}},"required":["items","searchCriteria","totalCount"]},"catalog-data-product-type-interface":{"type":"object","description":"Product type details","properties":{"name":{"type":"string","description":"Product type code"},"label":{"type":"string","description":"Product type label"},"extensionAttributes":{"$ref":"#/definitions/catalog-data-product-type-extension-interface"}},"required":["name","label"]},"catalog-data-product-type-extension-interface":{"type":"object","description":"ExtensionInterface class for @see \\Magento\\Catalog\\Api\\Data\\ProductTypeInterface"},"eav-data-attribute-group-search-results-interface":{"type":"object","description":"","properties":{"items":{"type":"array","description":"Attribute sets list.","items":{"$ref":"#/definitions/eav-data-attribute-group-interface"}},"searchCriteria":{"$ref":"#/definitions/framework-search-criteria-interface"},"totalCount":{"type":"integer","description":"Total count."}},"required":["items","searchCriteria","totalCount"]},"eav-data-attribute-group-interface":{"type":"object","description":"","properties":{"attributeGroupId":{"type":"string","description":"Id"},"attributeGroupName":{"type":"string","description":"Name"},"attributeSetId":{"type":"integer","description":"Attribute set id"},"extensionAttributes":{"$ref":"#/definitions/eav-data-attribute-group-extension-interface"}}},"eav-data-attribute-group-extension-interface":{"type":"object","description":"ExtensionInterface class for @see \\Magento\\Eav\\Api\\Data\\AttributeGroupInterface"},"catalog-data-category-interface":{"type":"object","description":"","properties":{"id":{"type":"integer"},"parentId":{"type":"integer","description":"Parent category ID"},"name":{"type":"string","description":"Category name"},"isActive":{"type":"boolean","description":"Whether category is active"},"position":{"type":"integer","description":"Category position"},"level":{"type":"integer","description":"Category level"},"children":{"type":"string"},"createdAt":{"type":"string"},"updatedAt":{"type":"string"},"path":{"type":"string"},"availableSortBy":{"type":"array","items":{"type":"string"}},"includeInMenu":{"type":"boolean"},"extensionAttributes":{"$ref":"#/definitions/catalog-data-category-extension-interface"},"customAttributes":{"type":"array","description":"Custom attributes values.","items":{"$ref":"#/definitions/framework-attribute-interface"}}},"required":["name"]},"catalog-data-category-extension-interface":{"type":"object","description":"ExtensionInterface class for @see \\Magento\\Catalog\\Api\\Data\\CategoryInterface"},"catalog-data-category-tree-interface":{"type":"object","description":"","properties":{"id":{"type":"integer"},"parentId":{"type":"integer","description":"Parent category ID"},"name":{"type":"string","description":"Category name"},"isActive":{"type":"boolean","description":"Whether category is active"},"position":{"type":"integer","description":"Category position"},"level":{"type":"integer","description":"Category level"},"productCount":{"type":"integer","description":"Product count"},"childrenData":{"type":"array","items":{"$ref":"#/definitions/catalog-data-category-tree-interface"}}},"required":["parentId","name","isActive","position","level","productCount","childrenData"]},"catalog-data-product-custom-option-type-interface":{"type":"object","description":"","properties":{"label":{"type":"string","description":"Option type label"},"code":{"type":"string","description":"Option type code"},"group":{"type":"string","description":"Option type group"},"extensionAttributes":{"$ref":"#/definitions/catalog-data-product-custom-option-type-extension-interface"}},"required":["label","code","group"]},"catalog-data-product-custom-option-type-extension-interface":{"type":"object","description":"ExtensionInterface class for @see \\Magento\\Catalog\\Api\\Data\\ProductCustomOptionTypeInterface"},"catalog-data-product-link-type-interface":{"type":"object","description":"","properties":{"code":{"type":"integer","description":"Link type code"},"name":{"type":"string","description":"Link type name"},"extensionAttributes":{"$ref":"#/definitions/catalog-data-product-link-type-extension-interface"}},"required":["code","name"]},"catalog-data-product-link-type-extension-interface":{"type":"object","description":"ExtensionInterface class for @see \\Magento\\Catalog\\Api\\Data\\ProductLinkTypeInterface"},"catalog-data-product-link-attribute-interface":{"type":"object","description":"","properties":{"code":{"type":"string","description":"Attribute code"},"type":{"type":"string","description":"Attribute type"},"extensionAttributes":{"$ref":"#/definitions/catalog-data-product-link-attribute-extension-interface"}},"required":["code","type"]},"catalog-data-product-link-attribute-extension-interface":{"type":"object","description":"ExtensionInterface class for @see \\Magento\\Catalog\\Api\\Data\\ProductLinkAttributeInterface"},"catalog-data-category-product-link-interface":{"type":"object","description":"","properties":{"sku":{"type":"string"},"position":{"type":"integer"},"categoryId":{"type":"string","description":"Category id"},"extensionAttributes":{"$ref":"#/definitions/catalog-data-category-product-link-extension-interface"}},"required":["categoryId"]},"catalog-data-category-product-link-extension-interface":{"type":"object","description":"ExtensionInterface class for @see \\Magento\\Catalog\\Api\\Data\\CategoryProductLinkInterface"},"catalog-data-product-website-link-interface":{"type":"object","description":"","properties":{"sku":{"type":"string"},"websiteId":{"type":"integer","description":"Website ids"}},"required":["sku","websiteId"]},"framework-search-search-result-interface":{"type":"object","description":"","properties":{"items":{"type":"array","items":{"$ref":"#/definitions/framework-search-document-interface"}},"aggregations":{"$ref":"#/definitions/framework-search-aggregation-interface"},"searchCriteria":{"$ref":"#/definitions/framework-search-search-criteria-interface"},"totalCount":{"type":"integer","description":"Total count."}},"required":["items","aggregations","searchCriteria","totalCount"]},"framework-search-document-interface":{"type":"object","description":"","properties":{"id":{"type":"integer"},"customAttributes":{"type":"array","description":"Custom attributes values.","items":{"$ref":"#/definitions/framework-attribute-interface"}}},"required":["id"]},"framework-search-aggregation-interface":{"type":"object","description":"Faceted data","properties":{"buckets":{"type":"array","description":"All Document fields","items":{"$ref":"#/definitions/framework-search-bucket-interface"}},"bucketNames":{"type":"array","description":"Document field names","items":{"type":"string"}}},"required":["buckets","bucketNames"]},"framework-search-bucket-interface":{"type":"object","description":"Facet Bucket","properties":{"name":{"type":"string","description":"Field name"},"values":{"type":"array","description":"Field values","items":{"$ref":"#/definitions/framework-search-aggregation-value-interface"}}},"required":["name","values"]},"framework-search-aggregation-value-interface":{"type":"object","description":"","properties":{"value":{"type":"string","description":"Aggregation"},"metrics":{"type":"array","description":"Metrics","items":{"type":"string"}}},"required":["value","metrics"]},"framework-search-search-criteria-interface":{"type":"object","description":"","properties":{"requestName":{"type":"string"},"filterGroups":{"type":"array","description":"A list of filter groups.","items":{"$ref":"#/definitions/framework-search-filter-group"}},"sortOrders":{"type":"array","description":"Sort order.","items":{"$ref":"#/definitions/framework-sort-order"}},"pageSize":{"type":"integer","description":"Page size."},"currentPage":{"type":"integer","description":"Current page."}},"required":["requestName","filterGroups"]},"checkout-agreements-data-agreement-interface":{"type":"object","description":"","properties":{"agreementId":{"type":"integer","description":"Agreement ID."},"name":{"type":"string","description":"Agreement name."},"content":{"type":"string","description":"Agreement content."},"contentHeight":{"type":"string","description":"Agreement content height. Otherwise, null."},"checkboxText":{"type":"string","description":"Agreement checkbox text."},"isActive":{"type":"boolean","description":"Agreement status."},"isHtml":{"type":"boolean","description":"* true - HTML. * false - plain text."},"mode":{"type":"integer","description":"The agreement applied mode."},"extensionAttributes":{"$ref":"#/definitions/checkout-agreements-data-agreement-extension-interface"}},"required":["agreementId","name","content","checkboxText","isActive","isHtml","mode"]},"checkout-agreements-data-agreement-extension-interface":{"type":"object","description":"ExtensionInterface class for @see \\Magento\\CheckoutAgreements\\Api\\Data\\AgreementInterface"},"quote-data-cart-interface":{"type":"object","description":"Interface CartInterface","properties":{"id":{"type":"integer","description":"Cart/quote ID."},"createdAt":{"type":"string","description":"Cart creation date and time. Otherwise, null."},"updatedAt":{"type":"string","description":"Cart last update date and time. Otherwise, null."},"convertedAt":{"type":"string","description":"Cart conversion date and time. Otherwise, null."},"isActive":{"type":"boolean","description":"Active status flag value. Otherwise, null."},"isVirtual":{"type":"boolean","description":"Virtual flag value. Otherwise, null."},"items":{"type":"array","description":"Array of items. Otherwise, null.","items":{"$ref":"#/definitions/quote-data-cart-item-interface"}},"itemsCount":{"type":"integer","description":"Number of different items or products in the cart. Otherwise, null."},"itemsQty":{"type":"number","description":"Total quantity of all cart items. Otherwise, null."},"customer":{"$ref":"#/definitions/customer-data-customer-interface"},"billingAddress":{"$ref":"#/definitions/quote-data-address-interface"},"reservedOrderId":{"type":"integer","description":"Reserved order ID. Otherwise, null."},"origOrderId":{"type":"integer","description":"Original order ID. Otherwise, null."},"currency":{"$ref":"#/definitions/quote-data-currency-interface"},"customerIsGuest":{"type":"boolean","description":"For guest customers, false for logged in customers"},"customerNote":{"type":"string","description":"Notice text"},"customerNoteNotify":{"type":"boolean","description":"Customer notification flag"},"customerTaxClassId":{"type":"integer","description":"Customer tax class ID."},"storeId":{"type":"integer","description":"Store identifier"},"extensionAttributes":{"$ref":"#/definitions/quote-data-cart-extension-interface"}},"required":["id","customer","storeId"]},"quote-data-cart-item-interface":{"type":"object","description":"Interface CartItemInterface","properties":{"itemId":{"type":"integer","description":"Item ID. Otherwise, null."},"sku":{"type":"string","description":"Product SKU. Otherwise, null."},"qty":{"type":"number","description":"Product quantity."},"name":{"type":"string","description":"Product name. Otherwise, null."},"price":{"type":"number","description":"Product price. Otherwise, null."},"productType":{"type":"string","description":"Product type. Otherwise, null."},"quoteId":{"type":"string","description":"Quote id."},"productOption":{"$ref":"#/definitions/quote-data-product-option-interface"},"extensionAttributes":{"$ref":"#/definitions/quote-data-cart-item-extension-interface"}},"required":["qty","quoteId"]},"quote-data-product-option-interface":{"type":"object","description":"Product option interface","properties":{"extensionAttributes":{"$ref":"#/definitions/quote-data-product-option-extension-interface"}}},"quote-data-product-option-extension-interface":{"type":"object","description":"ExtensionInterface class for @see \\Magento\\Quote\\Api\\Data\\ProductOptionInterface","properties":{"customOptions":{"type":"array","items":{"$ref":"#/definitions/catalog-data-custom-option-interface"}},"downloadableOption":{"$ref":"#/definitions/downloadable-data-downloadable-option-interface"},"bundleOptions":{"type":"array","items":{"$ref":"#/definitions/bundle-data-bundle-option-interface"}},"configurableItemOptions":{"type":"array","items":{"$ref":"#/definitions/configurable-product-data-configurable-item-option-value-interface"}}}},"catalog-data-custom-option-interface":{"type":"object","description":"Interface CustomOptionInterface","properties":{"optionId":{"type":"string","description":"Option id"},"optionValue":{"type":"string","description":"Option value"},"extensionAttributes":{"$ref":"#/definitions/catalog-data-custom-option-extension-interface"}},"required":["optionId","optionValue"]},"catalog-data-custom-option-extension-interface":{"type":"object","description":"ExtensionInterface class for @see \\Magento\\Catalog\\Api\\Data\\CustomOptionInterface","properties":{"fileInfo":{"$ref":"#/definitions/framework-data-image-content-interface"}}},"downloadable-data-downloadable-option-interface":{"type":"object","description":"Downloadable Option","properties":{"downloadableLinks":{"type":"array","description":"The list of downloadable links","items":{"type":"integer"}}},"required":["downloadableLinks"]},"bundle-data-bundle-option-interface":{"type":"object","description":"Interface BundleOptionInterface","properties":{"optionId":{"type":"integer","description":"Bundle option id."},"optionQty":{"type":"integer","description":"Bundle option quantity."},"optionSelections":{"type":"array","description":"Bundle option selection ids.","items":{"type":"integer"}},"extensionAttributes":{"$ref":"#/definitions/bundle-data-bundle-option-extension-interface"}},"required":["optionId","optionQty","optionSelections"]},"bundle-data-bundle-option-extension-interface":{"type":"object","description":"ExtensionInterface class for @see \\Magento\\Bundle\\Api\\Data\\BundleOptionInterface"},"configurable-product-data-configurable-item-option-value-interface":{"type":"object","description":"Interface ConfigurableItemOptionValueInterface","properties":{"optionId":{"type":"string","description":"Option SKU"},"optionValue":{"type":"integer","description":"Item id"},"extensionAttributes":{"$ref":"#/definitions/configurable-product-data-configurable-item-option-value-extension-interface"}},"required":["optionId"]},"configurable-product-data-configurable-item-option-value-extension-interface":{"type":"object","description":"ExtensionInterface class for @see \\Magento\\ConfigurableProduct\\Api\\Data\\ConfigurableItemOptionValueInterface"},"quote-data-cart-item-extension-interface":{"type":"object","description":"ExtensionInterface class for @see \\Magento\\Quote\\Api\\Data\\CartItemInterface"},"quote-data-address-interface":{"type":"object","description":"Interface AddressInterface","properties":{"id":{"type":"integer","description":"Id"},"region":{"type":"string","description":"Region name"},"regionId":{"type":"integer","description":"Region id"},"regionCode":{"type":"string","description":"Region code"},"countryId":{"type":"string","description":"Country id"},"street":{"type":"array","description":"Street","items":{"type":"string"}},"company":{"type":"string","description":"Company"},"telephone":{"type":"string","description":"Telephone number"},"fax":{"type":"string","description":"Fax number"},"postcode":{"type":"string","description":"Postcode"},"city":{"type":"string","description":"City name"},"firstname":{"type":"string","description":"First name"},"lastname":{"type":"string","description":"Last name"},"middlename":{"type":"string","description":"Middle name"},"prefix":{"type":"string","description":"Prefix"},"suffix":{"type":"string","description":"Suffix"},"vatId":{"type":"string","description":"Vat id"},"customerId":{"type":"integer","description":"Customer id"},"email":{"type":"string","description":"Billing/shipping email"},"sameAsBilling":{"type":"integer","description":"Same as billing flag"},"customerAddressId":{"type":"integer","description":"Customer address id"},"saveInAddressBook":{"type":"integer","description":"Save in address book flag"},"extensionAttributes":{"$ref":"#/definitions/quote-data-address-extension-interface"},"customAttributes":{"type":"array","description":"Custom attributes values.","items":{"$ref":"#/definitions/framework-attribute-interface"}}},"required":["region","regionId","regionCode","countryId","street","telephone","postcode","city","firstname","lastname","email"]},"quote-data-address-extension-interface":{"type":"object","description":"ExtensionInterface class for @see \\Magento\\Quote\\Api\\Data\\AddressInterface"},"quote-data-currency-interface":{"type":"object","description":"Interface CurrencyInterface","properties":{"globalCurrencyCode":{"type":"string","description":"Global currency code"},"baseCurrencyCode":{"type":"string","description":"Base currency code"},"storeCurrencyCode":{"type":"string","description":"Store currency code"},"quoteCurrencyCode":{"type":"string","description":"Quote currency code"},"storeToBaseRate":{"type":"number","description":"Store currency to base currency rate"},"storeToQuoteRate":{"type":"number","description":"Store currency to quote currency rate"},"baseToGlobalRate":{"type":"number","description":"Base currency to global currency rate"},"baseToQuoteRate":{"type":"number","description":"Base currency to quote currency rate"},"extensionAttributes":{"$ref":"#/definitions/quote-data-currency-extension-interface"}}},"quote-data-currency-extension-interface":{"type":"object","description":"ExtensionInterface class for @see \\Magento\\Quote\\Api\\Data\\CurrencyInterface"},"quote-data-cart-extension-interface":{"type":"object","description":"ExtensionInterface class for @see \\Magento\\Quote\\Api\\Data\\CartInterface"},"quote-data-cart-search-results-interface":{"type":"object","description":"Interface CartSearchResultsInterface","properties":{"items":{"type":"array","description":"Carts list.","items":{"$ref":"#/definitions/quote-data-cart-interface"}},"searchCriteria":{"$ref":"#/definitions/framework-search-criteria-interface"},"totalCount":{"type":"integer","description":"Total count."}},"required":["items","searchCriteria","totalCount"]},"quote-data-payment-interface":{"type":"object","description":"Interface PaymentInterface","properties":{"poNumber":{"type":"string","description":"Purchase order number"},"method":{"type":"string","description":"Payment method code"},"additionalData":{"type":"array","description":"Payment additional details","items":{"type":"string"}},"extensionAttributes":{"$ref":"#/definitions/quote-data-payment-extension-interface"}},"required":["method"]},"quote-data-payment-extension-interface":{"type":"object","description":"ExtensionInterface class for @see \\Magento\\Quote\\Api\\Data\\PaymentInterface","properties":{"agreementIds":{"type":"array","items":{"type":"string"}}}},"quote-data-shipping-method-interface":{"type":"object","description":"Interface ShippingMethodInterface","properties":{"carrierCode":{"type":"string","description":"Shipping carrier code."},"methodCode":{"type":"string","description":"Shipping method code."},"carrierTitle":{"type":"string","description":"Shipping carrier title. Otherwise, null."},"methodTitle":{"type":"string","description":"Shipping method title. Otherwise, null."},"amount":{"type":"number","description":"Shipping amount in store currency."},"baseAmount":{"type":"number","description":"Shipping amount in base currency."},"available":{"type":"boolean","description":"The value of the availability flag for the current shipping method."},"extensionAttributes":{"$ref":"#/definitions/quote-data-shipping-method-extension-interface"},"errorMessage":{"type":"string","description":"Shipping Error message."},"priceExclTax":{"type":"number","description":"Shipping price excl tax."},"priceInclTax":{"type":"number","description":"Shipping price incl tax."}},"required":["carrierCode","methodCode","amount","baseAmount","available","errorMessage","priceExclTax","priceInclTax"]},"quote-data-shipping-method-extension-interface":{"type":"object","description":"ExtensionInterface class for @see \\Magento\\Quote\\Api\\Data\\ShippingMethodInterface"},"quote-data-estimate-address-interface":{"type":"object","description":"Interface EstimateAddressInterface","properties":{"region":{"type":"string","description":"Region name"},"regionId":{"type":"integer","description":"Region id"},"countryId":{"type":"string","description":"Country id"},"postcode":{"type":"string","description":"Postcode"},"extensionAttributes":{"$ref":"#/definitions/quote-data-estimate-address-extension-interface"},"customAttributes":{"type":"array","description":"Custom attributes values.","items":{"$ref":"#/definitions/framework-attribute-interface"}}},"required":["region","regionId","countryId","postcode"]},"quote-data-estimate-address-extension-interface":{"type":"object","description":"ExtensionInterface class for @see \\Magento\\Quote\\Api\\Data\\EstimateAddressInterface"},"quote-data-payment-method-interface":{"type":"object","description":"Interface PaymentMethodInterface","properties":{"code":{"type":"string","description":"Payment method code"},"title":{"type":"string","description":"Payment method title"}},"required":["code","title"]},"quote-data-totals-interface":{"type":"object","description":"Interface TotalsInterface","properties":{"grandTotal":{"type":"number","description":"Grand total in quote currency"},"baseGrandTotal":{"type":"number","description":"Grand total in base currency"},"subtotal":{"type":"number","description":"Subtotal in quote currency"},"baseSubtotal":{"type":"number","description":"Subtotal in base currency"},"discountAmount":{"type":"number","description":"Discount amount in quote currency"},"baseDiscountAmount":{"type":"number","description":"Discount amount in base currency"},"subtotalWithDiscount":{"type":"number","description":"Subtotal in quote currency with applied discount"},"baseSubtotalWithDiscount":{"type":"number","description":"Subtotal in base currency with applied discount"},"shippingAmount":{"type":"number","description":"Shipping amount in quote currency"},"baseShippingAmount":{"type":"number","description":"Shipping amount in base currency"},"shippingDiscountAmount":{"type":"number","description":"Shipping discount amount in quote currency"},"baseShippingDiscountAmount":{"type":"number","description":"Shipping discount amount in base currency"},"taxAmount":{"type":"number","description":"Tax amount in quote currency"},"baseTaxAmount":{"type":"number","description":"Tax amount in base currency"},"weeeTaxAppliedAmount":{"type":"number","description":"Item weee tax applied amount in quote currency."},"shippingTaxAmount":{"type":"number","description":"Shipping tax amount in quote currency"},"baseShippingTaxAmount":{"type":"number","description":"Shipping tax amount in base currency"},"subtotalInclTax":{"type":"number","description":"Subtotal including tax in quote currency"},"baseSubtotalInclTax":{"type":"number","description":"Subtotal including tax in base currency"},"shippingInclTax":{"type":"number","description":"Shipping including tax in quote currency"},"baseShippingInclTax":{"type":"number","description":"Shipping including tax in base currency"},"baseCurrencyCode":{"type":"string","description":"Base currency code"},"quoteCurrencyCode":{"type":"string","description":"Quote currency code"},"couponCode":{"type":"string","description":"Applied coupon code"},"itemsQty":{"type":"integer","description":"Items qty"},"items":{"type":"array","description":"Totals by items","items":{"$ref":"#/definitions/quote-data-totals-item-interface"}},"totalSegments":{"type":"array","description":"Dynamically calculated totals","items":{"$ref":"#/definitions/quote-data-total-segment-interface"}},"extensionAttributes":{"$ref":"#/definitions/quote-data-totals-extension-interface"}},"required":["weeeTaxAppliedAmount","totalSegments"]},"quote-data-totals-item-interface":{"type":"object","description":"Interface TotalsItemInterface","properties":{"itemId":{"type":"integer","description":"Item id"},"price":{"type":"number","description":"Item price in quote currency."},"basePrice":{"type":"number","description":"Item price in base currency."},"qty":{"type":"number","description":"Item quantity."},"rowTotal":{"type":"number","description":"Row total in quote currency."},"baseRowTotal":{"type":"number","description":"Row total in base currency."},"rowTotalWithDiscount":{"type":"number","description":"Row total with discount in quote currency. Otherwise, null."},"taxAmount":{"type":"number","description":"Tax amount in quote currency. Otherwise, null."},"baseTaxAmount":{"type":"number","description":"Tax amount in base currency. Otherwise, null."},"taxPercent":{"type":"number","description":"Tax percent. Otherwise, null."},"discountAmount":{"type":"number","description":"Discount amount in quote currency. Otherwise, null."},"baseDiscountAmount":{"type":"number","description":"Discount amount in base currency. Otherwise, null."},"discountPercent":{"type":"number","description":"Discount percent. Otherwise, null."},"priceInclTax":{"type":"number","description":"Price including tax in quote currency. Otherwise, null."},"basePriceInclTax":{"type":"number","description":"Price including tax in base currency. Otherwise, null."},"rowTotalInclTax":{"type":"number","description":"Row total including tax in quote currency. Otherwise, null."},"baseRowTotalInclTax":{"type":"number","description":"Row total including tax in base currency. Otherwise, null."},"options":{"type":"string","description":"Item price in quote currency."},"weeeTaxAppliedAmount":{"type":"number","description":"Item weee tax applied amount in quote currency."},"weeeTaxApplied":{"type":"string","description":"Item weee tax applied in quote currency."},"extensionAttributes":{"$ref":"#/definitions/quote-data-totals-item-extension-interface"},"name":{"type":"string","description":"Product name. Otherwise, null."}},"required":["itemId","price","basePrice","qty","rowTotal","baseRowTotal","options","weeeTaxAppliedAmount","weeeTaxApplied"]},"quote-data-totals-item-extension-interface":{"type":"object","description":"ExtensionInterface class for @see \\Magento\\Quote\\Api\\Data\\TotalsItemInterface"},"quote-data-total-segment-interface":{"type":"object","description":"Interface TotalsInterface","properties":{"code":{"type":"string","description":"Code"},"title":{"type":"string","description":"Total title"},"value":{"type":"number","description":"Total value"},"area":{"type":"string","description":"Display area code."},"extensionAttributes":{"$ref":"#/definitions/quote-data-total-segment-extension-interface"}},"required":["code","value"]},"quote-data-total-segment-extension-interface":{"type":"object","description":"ExtensionInterface class for @see \\Magento\\Quote\\Api\\Data\\TotalSegmentInterface","properties":{"taxGrandtotalDetails":{"type":"array","items":{"$ref":"#/definitions/tax-data-grand-total-details-interface"}}}},"tax-data-grand-total-details-interface":{"type":"object","description":"","properties":{"amount":{"type":"number","description":"Tax amount value"},"rates":{"type":"array","description":"Tax rates info","items":{"$ref":"#/definitions/tax-data-grand-total-rates-interface"}},"groupId":{"type":"integer","description":"Group identifier"}},"required":["amount","rates","groupId"]},"tax-data-grand-total-rates-interface":{"type":"object","description":"","properties":{"percent":{"type":"string","description":"Tax percentage value"},"title":{"type":"string","description":"Rate title"}},"required":["percent","title"]},"quote-data-totals-extension-interface":{"type":"object","description":"ExtensionInterface class for @see \\Magento\\Quote\\Api\\Data\\TotalsInterface"},"quote-data-totals-additional-data-interface":{"type":"object","description":"Additional data for totals collection.","properties":{"extensionAttributes":{"$ref":"#/definitions/quote-data-totals-additional-data-extension-interface"},"customAttributes":{"type":"array","description":"Custom attributes values.","items":{"$ref":"#/definitions/framework-attribute-interface"}}}},"quote-data-totals-additional-data-extension-interface":{"type":"object","description":"ExtensionInterface class for @see \\Magento\\Quote\\Api\\Data\\TotalsAdditionalDataInterface","properties":{"giftMessages":{"type":"array","items":{"$ref":"#/definitions/gift-message-data-message-interface"}}}},"gift-message-data-message-interface":{"type":"object","description":"","properties":{"giftMessageId":{"type":"integer","description":"Gift message ID. Otherwise, null."},"customerId":{"type":"integer","description":"Customer ID. Otherwise, null."},"sender":{"type":"string","description":"Sender name."},"recipient":{"type":"string","description":"Recipient name."},"message":{"type":"string","description":"Message text."},"extensionAttributes":{"$ref":"#/definitions/gift-message-data-message-extension-interface"}},"required":["sender","recipient","message"]},"gift-message-data-message-extension-interface":{"type":"object","description":"ExtensionInterface class for @see \\Magento\\GiftMessage\\Api\\Data\\MessageInterface","properties":{"entityId":{"type":"string"},"entityType":{"type":"string"}}},"catalog-inventory-data-stock-status-collection-interface":{"type":"object","description":"Stock Status collection interface","properties":{"items":{"type":"array","description":"Items","items":{"$ref":"#/definitions/catalog-inventory-data-stock-status-interface"}},"searchCriteria":{"$ref":"#/definitions/catalog-inventory-stock-status-criteria-interface"},"totalCount":{"type":"integer","description":"Total count."}},"required":["items","searchCriteria","totalCount"]},"catalog-inventory-data-stock-status-interface":{"type":"object","description":"Interface StockStatusInterface","properties":{"productId":{"type":"integer"},"stockId":{"type":"integer"},"qty":{"type":"integer"},"stockStatus":{"type":"integer"},"stockItem":{"$ref":"#/definitions/catalog-inventory-data-stock-item-interface"},"extensionAttributes":{"$ref":"#/definitions/catalog-inventory-data-stock-status-extension-interface"}},"required":["productId","stockId","qty","stockStatus","stockItem"]},"catalog-inventory-data-stock-status-extension-interface":{"type":"object","description":"ExtensionInterface class for @see \\Magento\\CatalogInventory\\Api\\Data\\StockStatusInterface"},"catalog-inventory-stock-status-criteria-interface":{"type":"object","description":"Interface StockStatusCriteriaInterface","properties":{"mapperInterfaceName":{"type":"string","description":"Associated Mapper Interface name"},"criteriaList":{"type":"array","description":"Criteria objects added to current Composite Criteria","items":{"$ref":"#/definitions/framework-criteria-interface"}},"filters":{"type":"array","description":"List of filters","items":{"type":"string"}},"orders":{"type":"array","description":"Ordering criteria","items":{"type":"string"}},"limit":{"type":"array","description":"Limit","items":{"type":"string"}}},"required":["mapperInterfaceName","criteriaList","filters","orders","limit"]},"framework-criteria-interface":{"type":"object","description":"Interface CriteriaInterface","properties":{"mapperInterfaceName":{"type":"string","description":"Associated Mapper Interface name"},"criteriaList":{"type":"array","description":"Criteria objects added to current Composite Criteria","items":{"$ref":"#/definitions/framework-criteria-interface"}},"filters":{"type":"array","description":"List of filters","items":{"type":"string"}},"orders":{"type":"array","description":"Ordering criteria","items":{"type":"string"}},"limit":{"type":"array","description":"Limit","items":{"type":"string"}}},"required":["mapperInterfaceName","criteriaList","filters","orders","limit"]},"bundle-data-option-type-interface":{"type":"object","description":"Interface OptionTypeInterface","properties":{"label":{"type":"string","description":"Type label"},"code":{"type":"string","description":"Type code"},"extensionAttributes":{"$ref":"#/definitions/bundle-data-option-type-extension-interface"}},"required":["label","code"]},"bundle-data-option-type-extension-interface":{"type":"object","description":"ExtensionInterface class for @see \\Magento\\Bundle\\Api\\Data\\OptionTypeInterface"},"sales-data-order-interface":{"type":"object","description":"Order interface. An order is a document that a web store issues to a customer. Magento generates a sales order that lists the product items, billing and shipping addresses, and shipping and payment methods. A corresponding external document, known as a purchase order, is emailed to the customer.","properties":{"adjustmentNegative":{"type":"number","description":"Negative adjustment value."},"adjustmentPositive":{"type":"number","description":"Positive adjustment value."},"appliedRuleIds":{"type":"string","description":"Applied rule IDs."},"baseAdjustmentNegative":{"type":"number","description":"Base negative adjustment value."},"baseAdjustmentPositive":{"type":"number","description":"Base positive adjustment value."},"baseCurrencyCode":{"type":"string","description":"Base currency code."},"baseDiscountAmount":{"type":"number","description":"Base discount amount."},"baseDiscountCanceled":{"type":"number","description":"Base discount canceled."},"baseDiscountInvoiced":{"type":"number","description":"Base discount invoiced."},"baseDiscountRefunded":{"type":"number","description":"Base discount refunded."},"baseGrandTotal":{"type":"number","description":"Base grand total."},"baseDiscountTaxCompensationAmount":{"type":"number","description":"Base discount tax compensation amount."},"baseDiscountTaxCompensationInvoiced":{"type":"number","description":"Base discount tax compensation invoiced."},"baseDiscountTaxCompensationRefunded":{"type":"number","description":"Base discount tax compensation refunded."},"baseShippingAmount":{"type":"number","description":"Base shipping amount."},"baseShippingCanceled":{"type":"number","description":"Base shipping canceled."},"baseShippingDiscountAmount":{"type":"number","description":"Base shipping discount amount."},"baseShippingDiscountTaxCompensationAmnt":{"type":"number","description":"Base shipping discount tax compensation amount."},"baseShippingInclTax":{"type":"number","description":"Base shipping including tax."},"baseShippingInvoiced":{"type":"number","description":"Base shipping invoiced."},"baseShippingRefunded":{"type":"number","description":"Base shipping refunded."},"baseShippingTaxAmount":{"type":"number","description":"Base shipping tax amount."},"baseShippingTaxRefunded":{"type":"number","description":"Base shipping tax refunded."},"baseSubtotal":{"type":"number","description":"Base subtotal."},"baseSubtotalCanceled":{"type":"number","description":"Base subtotal canceled."},"baseSubtotalInclTax":{"type":"number","description":"Base subtotal including tax."},"baseSubtotalInvoiced":{"type":"number","description":"Base subtotal invoiced."},"baseSubtotalRefunded":{"type":"number","description":"Base subtotal refunded."},"baseTaxAmount":{"type":"number","description":"Base tax amount."},"baseTaxCanceled":{"type":"number","description":"Base tax canceled."},"baseTaxInvoiced":{"type":"number","description":"Base tax invoiced."},"baseTaxRefunded":{"type":"number","description":"Base tax refunded."},"baseTotalCanceled":{"type":"number","description":"Base total canceled."},"baseTotalDue":{"type":"number","description":"Base total due."},"baseTotalInvoiced":{"type":"number","description":"Base total invoiced."},"baseTotalInvoicedCost":{"type":"number","description":"Base total invoiced cost."},"baseTotalOfflineRefunded":{"type":"number","description":"Base total offline refunded."},"baseTotalOnlineRefunded":{"type":"number","description":"Base total online refunded."},"baseTotalPaid":{"type":"number","description":"Base total paid."},"baseTotalQtyOrdered":{"type":"number","description":"Base total quantity ordered."},"baseTotalRefunded":{"type":"number","description":"Base total refunded."},"baseToGlobalRate":{"type":"number","description":"Base-to-global rate."},"baseToOrderRate":{"type":"number","description":"Base-to-order rate."},"billingAddressId":{"type":"integer","description":"Billing address ID."},"canShipPartially":{"type":"integer","description":"Can-ship-partially flag value."},"canShipPartiallyItem":{"type":"integer","description":"Can-ship-partially-item flag value."},"couponCode":{"type":"string","description":"Coupon code."},"createdAt":{"type":"string","description":"Created-at timestamp."},"customerDob":{"type":"string","description":"Customer date-of-birth (DOB)."},"customerEmail":{"type":"string","description":"Customer email address."},"customerFirstname":{"type":"string","description":"Customer first name."},"customerGender":{"type":"integer","description":"Customer gender."},"customerGroupId":{"type":"integer","description":"Customer group ID."},"customerId":{"type":"integer","description":"Customer ID."},"customerIsGuest":{"type":"integer","description":"Customer-is-guest flag value."},"customerLastname":{"type":"string","description":"Customer last name."},"customerMiddlename":{"type":"string","description":"Customer middle name."},"customerNote":{"type":"string","description":"Customer note."},"customerNoteNotify":{"type":"integer","description":"Customer-note-notify flag value."},"customerPrefix":{"type":"string","description":"Customer prefix."},"customerSuffix":{"type":"string","description":"Customer suffix."},"customerTaxvat":{"type":"string","description":"Customer value-added tax (VAT)."},"discountAmount":{"type":"number","description":"Discount amount."},"discountCanceled":{"type":"number","description":"Discount canceled."},"discountDescription":{"type":"string","description":"Discount description."},"discountInvoiced":{"type":"number","description":"Discount invoiced."},"discountRefunded":{"type":"number","description":"Discount refunded amount."},"editIncrement":{"type":"integer","description":"Edit increment value."},"emailSent":{"type":"integer","description":"Email-sent flag value."},"entityId":{"type":"integer","description":"Order ID."},"extCustomerId":{"type":"string","description":"External customer ID."},"extOrderId":{"type":"string","description":"External order ID."},"forcedShipmentWithInvoice":{"type":"integer","description":"Forced-shipment-with-invoice flag value."},"globalCurrencyCode":{"type":"string","description":"Global currency code."},"grandTotal":{"type":"number","description":"Grand total."},"discountTaxCompensationAmount":{"type":"number","description":"Discount tax compensation amount."},"discountTaxCompensationInvoiced":{"type":"number","description":"Discount tax compensation invoiced amount."},"discountTaxCompensationRefunded":{"type":"number","description":"Discount tax compensation refunded amount."},"holdBeforeState":{"type":"string","description":"Hold before state."},"holdBeforeStatus":{"type":"string","description":"Hold before status."},"incrementId":{"type":"string","description":"Increment ID."},"isVirtual":{"type":"integer","description":"Is-virtual flag value."},"orderCurrencyCode":{"type":"string","description":"Order currency code."},"originalIncrementId":{"type":"string","description":"Original increment ID."},"paymentAuthorizationAmount":{"type":"number","description":"Payment authorization amount."},"paymentAuthExpiration":{"type":"integer","description":"Payment authorization expiration date."},"protectCode":{"type":"string","description":"Protect code."},"quoteAddressId":{"type":"integer","description":"Quote address ID."},"quoteId":{"type":"integer","description":"Quote ID."},"relationChildId":{"type":"string","description":"Relation child ID."},"relationChildRealId":{"type":"string","description":"Relation child real ID."},"relationParentId":{"type":"string","description":"Relation parent ID."},"relationParentRealId":{"type":"string","description":"Relation parent real ID."},"remoteIp":{"type":"string","description":"Remote IP address."},"shippingAmount":{"type":"number","description":"Shipping amount."},"shippingCanceled":{"type":"number","description":"Shipping canceled amount."},"shippingDescription":{"type":"string","description":"Shipping description."},"shippingDiscountAmount":{"type":"number","description":"Shipping discount amount."},"shippingDiscountTaxCompensationAmount":{"type":"number","description":"Shipping discount tax compensation amount."},"shippingInclTax":{"type":"number","description":"Shipping including tax amount."},"shippingInvoiced":{"type":"number","description":"Shipping invoiced amount."},"shippingRefunded":{"type":"number","description":"Shipping refunded amount."},"shippingTaxAmount":{"type":"number","description":"Shipping tax amount."},"shippingTaxRefunded":{"type":"number","description":"Shipping tax refunded amount."},"state":{"type":"string","description":"State."},"status":{"type":"string","description":"Status."},"storeCurrencyCode":{"type":"string","description":"Store currency code."},"storeId":{"type":"integer","description":"Store ID."},"storeName":{"type":"string","description":"Store name."},"storeToBaseRate":{"type":"number","description":"Store-to-base rate."},"storeToOrderRate":{"type":"number","description":"Store-to-order rate."},"subtotal":{"type":"number","description":"Subtotal."},"subtotalCanceled":{"type":"number","description":"Subtotal canceled amount."},"subtotalInclTax":{"type":"number","description":"Subtotal including tax amount."},"subtotalInvoiced":{"type":"number","description":"Subtotal invoiced amount."},"subtotalRefunded":{"type":"number","description":"Subtotal refunded amount."},"taxAmount":{"type":"number","description":"Tax amount."},"taxCanceled":{"type":"number","description":"Tax canceled amount."},"taxInvoiced":{"type":"number","description":"Tax invoiced amount."},"taxRefunded":{"type":"number","description":"Tax refunded amount."},"totalCanceled":{"type":"number","description":"Total canceled."},"totalDue":{"type":"number","description":"Total due."},"totalInvoiced":{"type":"number","description":"Total invoiced amount."},"totalItemCount":{"type":"integer","description":"Total item count."},"totalOfflineRefunded":{"type":"number","description":"Total offline refunded amount."},"totalOnlineRefunded":{"type":"number","description":"Total online refunded amount."},"totalPaid":{"type":"number","description":"Total paid."},"totalQtyOrdered":{"type":"number","description":"Total quantity ordered."},"totalRefunded":{"type":"number","description":"Total amount refunded."},"updatedAt":{"type":"string","description":"Updated-at timestamp."},"weight":{"type":"number","description":"Weight."},"xForwardedFor":{"type":"string","description":"X-Forwarded-For field value."},"items":{"type":"array","description":"Array of items.","items":{"$ref":"#/definitions/sales-data-order-item-interface"}},"billingAddress":{"$ref":"#/definitions/sales-data-order-address-interface"},"payment":{"$ref":"#/definitions/sales-data-order-payment-interface"},"statusHistories":{"type":"array","description":"Array of status histories.","items":{"$ref":"#/definitions/sales-data-order-status-history-interface"}},"extensionAttributes":{"$ref":"#/definitions/sales-data-order-extension-interface"}},"required":["baseGrandTotal","baseDiscountTaxCompensationAmount","baseDiscountTaxCompensationInvoiced","baseDiscountTaxCompensationRefunded","baseShippingDiscountTaxCompensationAmnt","customerEmail","grandTotal","discountTaxCompensationAmount","discountTaxCompensationInvoiced","discountTaxCompensationRefunded","shippingDiscountTaxCompensationAmount","items"]},"sales-data-order-item-interface":{"type":"object","description":"Order item interface. An order is a document that a web store issues to a customer. Magento generates a sales order that lists the product items, billing and shipping addresses, and shipping and payment methods. A corresponding external document, known as a purchase order, is emailed to the customer.","properties":{"additionalData":{"type":"string","description":"Additional data."},"amountRefunded":{"type":"number","description":"Amount refunded."},"appliedRuleIds":{"type":"string","description":"Applied rule IDs."},"baseAmountRefunded":{"type":"number","description":"Base amount refunded."},"baseCost":{"type":"number","description":"Base cost."},"baseDiscountAmount":{"type":"number","description":"Base discount amount."},"baseDiscountInvoiced":{"type":"number","description":"Base discount invoiced."},"baseDiscountRefunded":{"type":"number","description":"Base discount refunded."},"baseDiscountTaxCompensationAmount":{"type":"number","description":"Base discount tax compensation amount."},"baseDiscountTaxCompensationInvoiced":{"type":"number","description":"Base discount tax compensation invoiced."},"baseDiscountTaxCompensationRefunded":{"type":"number","description":"Base discount tax compensation refunded."},"baseOriginalPrice":{"type":"number","description":"Base original price."},"basePrice":{"type":"number","description":"Base price."},"basePriceInclTax":{"type":"number","description":"Base price including tax."},"baseRowInvoiced":{"type":"number","description":"Base row invoiced."},"baseRowTotal":{"type":"number","description":"Base row total."},"baseRowTotalInclTax":{"type":"number","description":"Base row total including tax."},"baseTaxAmount":{"type":"number","description":"Base tax amount."},"baseTaxBeforeDiscount":{"type":"number","description":"Base tax before discount."},"baseTaxInvoiced":{"type":"number","description":"Base tax invoiced."},"baseTaxRefunded":{"type":"number","description":"Base tax refunded."},"baseWeeeTaxAppliedAmount":{"type":"number","description":"Base WEEE tax applied amount."},"baseWeeeTaxAppliedRowAmnt":{"type":"number","description":"Base WEEE tax applied row amount."},"baseWeeeTaxDisposition":{"type":"number","description":"Base WEEE tax disposition."},"baseWeeeTaxRowDisposition":{"type":"number","description":"Base WEEE tax row disposition."},"createdAt":{"type":"string","description":"Created-at timestamp."},"description":{"type":"string","description":"Description."},"discountAmount":{"type":"number","description":"Discount amount."},"discountInvoiced":{"type":"number","description":"Discount invoiced."},"discountPercent":{"type":"number","description":"Discount percent."},"discountRefunded":{"type":"number","description":"Discount refunded."},"eventId":{"type":"integer","description":"Event ID."},"extOrderItemId":{"type":"string","description":"External order item ID."},"freeShipping":{"type":"integer","description":"Free-shipping flag value."},"gwBasePrice":{"type":"number","description":"GW base price."},"gwBasePriceInvoiced":{"type":"number","description":"GW base price invoiced."},"gwBasePriceRefunded":{"type":"number","description":"GW base price refunded."},"gwBaseTaxAmount":{"type":"number","description":"GW base tax amount."},"gwBaseTaxAmountInvoiced":{"type":"number","description":"GW base tax amount invoiced."},"gwBaseTaxAmountRefunded":{"type":"number","description":"GW base tax amount refunded."},"gwId":{"type":"integer","description":"GW ID."},"gwPrice":{"type":"number","description":"GW price."},"gwPriceInvoiced":{"type":"number","description":"GW price invoiced."},"gwPriceRefunded":{"type":"number","description":"GW price refunded."},"gwTaxAmount":{"type":"number","description":"GW tax amount."},"gwTaxAmountInvoiced":{"type":"number","description":"GW tax amount invoiced."},"gwTaxAmountRefunded":{"type":"number","description":"GW tax amount refunded."},"discountTaxCompensationAmount":{"type":"number","description":"Discount tax compensation amount."},"discountTaxCompensationCanceled":{"type":"number","description":"Discount tax compensation canceled."},"discountTaxCompensationInvoiced":{"type":"number","description":"Discount tax compensation invoiced."},"discountTaxCompensationRefunded":{"type":"number","description":"Discount tax compensation refunded."},"isQtyDecimal":{"type":"integer","description":"Is-quantity-decimal flag value."},"isVirtual":{"type":"integer","description":"Is-virtual flag value."},"itemId":{"type":"integer","description":"Item ID."},"lockedDoInvoice":{"type":"integer","description":"Locked DO invoice flag value."},"lockedDoShip":{"type":"integer","description":"Locked DO ship flag value."},"name":{"type":"string","description":"Name."},"noDiscount":{"type":"integer","description":"No-discount flag value."},"orderId":{"type":"integer","description":"Order ID."},"originalPrice":{"type":"number","description":"Original price."},"parentItemId":{"type":"integer","description":"Parent item ID."},"price":{"type":"number","description":"Price."},"priceInclTax":{"type":"number","description":"Price including tax."},"productId":{"type":"integer","description":"Product ID."},"productType":{"type":"string","description":"Product type."},"qtyBackordered":{"type":"number","description":"Quantity backordered."},"qtyCanceled":{"type":"number","description":"Quantity canceled."},"qtyInvoiced":{"type":"number","description":"Quantity invoiced."},"qtyOrdered":{"type":"number","description":"Quantity ordered."},"qtyRefunded":{"type":"number","description":"Quantity refunded."},"qtyReturned":{"type":"number","description":"Quantity returned."},"qtyShipped":{"type":"number","description":"Quantity shipped."},"quoteItemId":{"type":"integer","description":"Quote item ID."},"rowInvoiced":{"type":"number","description":"Row invoiced."},"rowTotal":{"type":"number","description":"Row total."},"rowTotalInclTax":{"type":"number","description":"Row total including tax."},"rowWeight":{"type":"number","description":"Row weight."},"sku":{"type":"string","description":"SKU."},"storeId":{"type":"integer","description":"Store ID."},"taxAmount":{"type":"number","description":"Tax amount."},"taxBeforeDiscount":{"type":"number","description":"Tax before discount."},"taxCanceled":{"type":"number","description":"Tax canceled."},"taxInvoiced":{"type":"number","description":"Tax invoiced."},"taxPercent":{"type":"number","description":"Tax percent."},"taxRefunded":{"type":"number","description":"Tax refunded."},"updatedAt":{"type":"string","description":"Updated-at timestamp."},"weeeTaxApplied":{"type":"string","description":"WEEE tax applied."},"weeeTaxAppliedAmount":{"type":"number","description":"WEEE tax applied amount."},"weeeTaxAppliedRowAmount":{"type":"number","description":"WEEE tax applied row amount."},"weeeTaxDisposition":{"type":"number","description":"WEEE tax disposition."},"weeeTaxRowDisposition":{"type":"number","description":"WEEE tax row disposition."},"weight":{"type":"number","description":"Weight."},"parentItem":{"$ref":"#/definitions/sales-data-order-item-interface"},"productOption":{"$ref":"#/definitions/catalog-data-product-option-interface"},"extensionAttributes":{"$ref":"#/definitions/sales-data-order-item-extension-interface"}},"required":["baseDiscountTaxCompensationAmount","baseDiscountTaxCompensationInvoiced","baseDiscountTaxCompensationRefunded","discountTaxCompensationAmount","discountTaxCompensationCanceled","discountTaxCompensationInvoiced","discountTaxCompensationRefunded","sku"]},"catalog-data-product-option-interface":{"type":"object","description":"Product option interface","properties":{"extensionAttributes":{"$ref":"#/definitions/catalog-data-product-option-extension-interface"}}},"catalog-data-product-option-extension-interface":{"type":"object","description":"ExtensionInterface class for @see \\Magento\\Catalog\\Api\\Data\\ProductOptionInterface","properties":{"customOptions":{"type":"array","items":{"$ref":"#/definitions/catalog-data-custom-option-interface"}},"downloadableOption":{"$ref":"#/definitions/downloadable-data-downloadable-option-interface"},"bundleOptions":{"type":"array","items":{"$ref":"#/definitions/bundle-data-bundle-option-interface"}},"configurableItemOptions":{"type":"array","items":{"$ref":"#/definitions/configurable-product-data-configurable-item-option-value-interface"}}}},"sales-data-order-item-extension-interface":{"type":"object","description":"ExtensionInterface class for @see \\Magento\\Sales\\Api\\Data\\OrderItemInterface","properties":{"giftMessage":{"$ref":"#/definitions/gift-message-data-message-interface"}}},"sales-data-order-address-interface":{"type":"object","description":"Order address interface. An order is a document that a web store issues to a customer. Magento generates a sales order that lists the product items, billing and shipping addresses, and shipping and payment methods. A corresponding external document, known as a purchase order, is emailed to the customer.","properties":{"addressType":{"type":"string","description":"Address type."},"city":{"type":"string","description":"City."},"company":{"type":"string","description":"Company."},"countryId":{"type":"string","description":"Country ID."},"customerAddressId":{"type":"integer","description":"Country address ID."},"customerId":{"type":"integer","description":"Customer ID."},"email":{"type":"string","description":"Email address."},"entityId":{"type":"integer","description":"Order address ID."},"fax":{"type":"string","description":"Fax number."},"firstname":{"type":"string","description":"First name."},"lastname":{"type":"string","description":"Last name."},"middlename":{"type":"string","description":"Middle name."},"parentId":{"type":"integer","description":"Parent ID."},"postcode":{"type":"string","description":"Postal code."},"prefix":{"type":"string","description":"Prefix."},"region":{"type":"string","description":"Region."},"regionCode":{"type":"string","description":"Region code."},"regionId":{"type":"integer","description":"Region ID."},"street":{"type":"array","description":"Array of any street values. Otherwise, null.","items":{"type":"string"}},"suffix":{"type":"string","description":"Suffix."},"telephone":{"type":"string","description":"Telephone number."},"vatId":{"type":"string","description":"VAT ID."},"vatIsValid":{"type":"integer","description":"VAT-is-valid flag value."},"vatRequestDate":{"type":"string","description":"VAT request date."},"vatRequestId":{"type":"string","description":"VAT request ID."},"vatRequestSuccess":{"type":"integer","description":"VAT-request-success flag value."},"extensionAttributes":{"$ref":"#/definitions/sales-data-order-address-extension-interface"}},"required":["addressType","city","countryId","firstname","lastname","postcode","telephone"]},"sales-data-order-address-extension-interface":{"type":"object","description":"ExtensionInterface class for @see \\Magento\\Sales\\Api\\Data\\OrderAddressInterface"},"sales-data-order-payment-interface":{"type":"object","description":"Order payment interface. An order is a document that a web store issues to a customer. Magento generates a sales order that lists the product items, billing and shipping addresses, and shipping and payment methods. A corresponding external document, known as a purchase order, is emailed to the customer.","properties":{"accountStatus":{"type":"string","description":"Account status."},"additionalData":{"type":"string","description":"Additional data."},"additionalInformation":{"type":"array","description":"Array of additional information.","items":{"type":"string"}},"addressStatus":{"type":"string","description":"Address status."},"amountAuthorized":{"type":"number","description":"Amount authorized."},"amountCanceled":{"type":"number","description":"Amount canceled."},"amountOrdered":{"type":"number","description":"Amount ordered."},"amountPaid":{"type":"number","description":"Amount paid."},"amountRefunded":{"type":"number","description":"Amount refunded."},"anetTransMethod":{"type":"string","description":"Anet transaction method."},"baseAmountAuthorized":{"type":"number","description":"Base amount authorized."},"baseAmountCanceled":{"type":"number","description":"Base amount canceled."},"baseAmountOrdered":{"type":"number","description":"Base amount ordered."},"baseAmountPaid":{"type":"number","description":"Base amount paid."},"baseAmountPaidOnline":{"type":"number","description":"Base amount paid online."},"baseAmountRefunded":{"type":"number","description":"Base amount refunded."},"baseAmountRefundedOnline":{"type":"number","description":"Base amount refunded online."},"baseShippingAmount":{"type":"number","description":"Base shipping amount."},"baseShippingCaptured":{"type":"number","description":"Base shipping captured amount."},"baseShippingRefunded":{"type":"number","description":"Base shipping refunded amount."},"ccApproval":{"type":"string","description":"Credit card approval."},"ccAvsStatus":{"type":"string","description":"Credit card avs status."},"ccCidStatus":{"type":"string","description":"Credit card CID status."},"ccDebugRequestBody":{"type":"string","description":"Credit card debug request body."},"ccDebugResponseBody":{"type":"string","description":"Credit card debug response body."},"ccDebugResponseSerialized":{"type":"string","description":"Credit card debug response serialized."},"ccExpMonth":{"type":"string","description":"Credit card expiration month."},"ccExpYear":{"type":"string","description":"Credit card expiration year."},"ccLast4":{"type":"string","description":"Last four digits of the credit card."},"ccNumberEnc":{"type":"string","description":"Encrypted credit card number."},"ccOwner":{"type":"string","description":"Credit card number."},"ccSecureVerify":{"type":"string","description":"Credit card secure verify."},"ccSsIssue":{"type":"string","description":"Credit card SS issue."},"ccSsStartMonth":{"type":"string","description":"Credit card SS start month."},"ccSsStartYear":{"type":"string","description":"Credit card SS start year."},"ccStatus":{"type":"string","description":"Credit card status."},"ccStatusDescription":{"type":"string","description":"Credit card status description."},"ccTransId":{"type":"string","description":"Credit card transaction ID."},"ccType":{"type":"string","description":"Credit card type."},"echeckAccountName":{"type":"string","description":"eCheck account name."},"echeckAccountType":{"type":"string","description":"eCheck account type."},"echeckBankName":{"type":"string","description":"eCheck bank name."},"echeckRoutingNumber":{"type":"string","description":"eCheck routing number."},"echeckType":{"type":"string","description":"eCheck type."},"entityId":{"type":"integer","description":"Entity ID."},"lastTransId":{"type":"string","description":"Last transaction ID."},"method":{"type":"string","description":"Method."},"parentId":{"type":"integer","description":"Parent ID."},"poNumber":{"type":"string","description":"PO number."},"protectionEligibility":{"type":"string","description":"Protection eligibility."},"quotePaymentId":{"type":"integer","description":"Quote payment ID."},"shippingAmount":{"type":"number","description":"Shipping amount."},"shippingCaptured":{"type":"number","description":"Shipping captured."},"shippingRefunded":{"type":"number","description":"Shipping refunded."},"extensionAttributes":{"$ref":"#/definitions/sales-data-order-payment-extension-interface"}},"required":["accountStatus","additionalInformation","ccLast4","method"]},"sales-data-order-payment-extension-interface":{"type":"object","description":"ExtensionInterface class for @see \\Magento\\Sales\\Api\\Data\\OrderPaymentInterface","properties":{"vaultPaymentToken":{"$ref":"#/definitions/vault-data-payment-token-interface"}}},"vault-data-payment-token-interface":{"type":"object","description":"Gateway vault payment token interface.","properties":{"entityId":{"type":"integer","description":"Entity ID."},"customerId":{"type":"integer","description":"Customer ID."},"publicHash":{"type":"string","description":"Public hash"},"paymentMethodCode":{"type":"string","description":"Payment method code"},"type":{"type":"string","description":"Type"},"createdAt":{"type":"string","description":"Token creation timestamp"},"expireAt":{"type":"string","description":"Token expiration timestamp"},"gatewayToken":{"type":"string","description":"Gateway token ID"},"tokenDetails":{"type":"string","description":"Token details"},"isActive":{"type":"boolean","description":"Is active."},"isVisible":{"type":"boolean","description":"Is visible."}},"required":["publicHash","paymentMethodCode","type","gatewayToken","tokenDetails","isActive","isVisible"]},"sales-data-order-status-history-interface":{"type":"object","description":"Order status history interface. An order is a document that a web store issues to a customer. Magento generates a sales order that lists the product items, billing and shipping addresses, and shipping and payment methods. A corresponding external document, known as a purchase order, is emailed to the customer.","properties":{"comment":{"type":"string","description":"Comment."},"createdAt":{"type":"string","description":"Created-at timestamp."},"entityId":{"type":"integer","description":"Order status history ID."},"entityName":{"type":"string","description":"Entity name."},"isCustomerNotified":{"type":"integer","description":"Is-customer-notified flag value."},"isVisibleOnFront":{"type":"integer","description":"Is-visible-on-storefront flag value."},"parentId":{"type":"integer","description":"Parent ID."},"status":{"type":"string","description":"Status."},"extensionAttributes":{"$ref":"#/definitions/sales-data-order-status-history-extension-interface"}},"required":["comment","isCustomerNotified","isVisibleOnFront","parentId"]},"sales-data-order-status-history-extension-interface":{"type":"object","description":"ExtensionInterface class for @see \\Magento\\Sales\\Api\\Data\\OrderStatusHistoryInterface"},"sales-data-order-extension-interface":{"type":"object","description":"ExtensionInterface class for @see \\Magento\\Sales\\Api\\Data\\OrderInterface","properties":{"appliedTaxes":{"type":"array","items":{"$ref":"#/definitions/tax-data-order-tax-details-applied-tax-interface"}},"itemAppliedTaxes":{"type":"array","items":{"$ref":"#/definitions/tax-data-order-tax-details-item-interface"}},"convertingFromQuote":{"type":"boolean"},"giftMessage":{"$ref":"#/definitions/gift-message-data-message-interface"}}},"tax-data-order-tax-details-applied-tax-interface":{"type":"object","description":"","properties":{"code":{"type":"string","description":"Code"},"title":{"type":"string","description":"Title"},"percent":{"type":"number","description":"Tax Percent"},"amount":{"type":"number","description":"Tax amount"},"baseAmount":{"type":"number","description":"Tax amount in base currency"},"extensionAttributes":{"$ref":"#/definitions/tax-data-order-tax-details-applied-tax-extension-interface"}},"required":["amount","baseAmount"]},"tax-data-order-tax-details-applied-tax-extension-interface":{"type":"object","description":"ExtensionInterface class for @see \\Magento\\Tax\\Api\\Data\\OrderTaxDetailsAppliedTaxInterface"},"tax-data-order-tax-details-item-interface":{"type":"object","description":"","properties":{"type":{"type":"string","description":"Type (shipping, product, weee, gift wrapping, etc)"},"itemId":{"type":"integer","description":"Item id if this item is a product"},"associatedItemId":{"type":"integer","description":"Associated item id if this item is associated with another item, null otherwise"},"appliedTaxes":{"type":"array","description":"Applied taxes","items":{"$ref":"#/definitions/tax-data-order-tax-details-applied-tax-interface"}},"extensionAttributes":{"$ref":"#/definitions/tax-data-order-tax-details-item-extension-interface"}}},"tax-data-order-tax-details-item-extension-interface":{"type":"object","description":"ExtensionInterface class for @see \\Magento\\Tax\\Api\\Data\\OrderTaxDetailsItemInterface"},"sales-data-order-search-result-interface":{"type":"object","description":"Order search result interface. An order is a document that a web store issues to a customer. Magento generates a sales order that lists the product items, billing and shipping addresses, and shipping and payment methods. A corresponding external document, known as a purchase order, is emailed to the customer.","properties":{"items":{"type":"array","description":"Array of collection items.","items":{"$ref":"#/definitions/sales-data-order-interface"}},"searchCriteria":{"$ref":"#/definitions/framework-search-criteria-interface"},"totalCount":{"type":"integer","description":"Total count."}},"required":["items","searchCriteria","totalCount"]},"sales-data-order-status-history-search-result-interface":{"type":"object","description":"Order status history search result interface. An order is a document that a web store issues to a customer. Magento generates a sales order that lists the product items, billing and shipping addresses, and shipping and payment methods. A corresponding external document, known as a purchase order, is emailed to the customer.","properties":{"items":{"type":"array","description":"Array of collection items.","items":{"$ref":"#/definitions/sales-data-order-status-history-interface"}},"searchCriteria":{"$ref":"#/definitions/framework-search-criteria-interface"},"totalCount":{"type":"integer","description":"Total count."}},"required":["items","searchCriteria","totalCount"]},"sales-data-order-item-search-result-interface":{"type":"object","description":"Order item search result interface. An order is a document that a web store issues to a customer. Magento generates a sales order that lists the product items, billing and shipping addresses, and shipping and payment methods. A corresponding external document, known as a purchase order, is emailed to the customer.","properties":{"items":{"type":"array","description":"Array of collection items.","items":{"$ref":"#/definitions/sales-data-order-item-interface"}},"searchCriteria":{"$ref":"#/definitions/framework-search-criteria-interface"},"totalCount":{"type":"integer","description":"Total count."}},"required":["items","searchCriteria","totalCount"]},"sales-data-invoice-interface":{"type":"object","description":"Invoice interface. An invoice is a record of the receipt of payment for an order.","properties":{"baseCurrencyCode":{"type":"string","description":"Base currency code."},"baseDiscountAmount":{"type":"number","description":"Base discount amount."},"baseGrandTotal":{"type":"number","description":"Base grand total."},"baseDiscountTaxCompensationAmount":{"type":"number","description":"Base discount tax compensation amount."},"baseShippingAmount":{"type":"number","description":"Base shipping amount."},"baseShippingDiscountTaxCompensationAmnt":{"type":"number","description":"Base shipping discount tax compensation amount."},"baseShippingInclTax":{"type":"number","description":"Base shipping including tax."},"baseShippingTaxAmount":{"type":"number","description":"Base shipping tax amount."},"baseSubtotal":{"type":"number","description":"Base subtotal."},"baseSubtotalInclTax":{"type":"number","description":"Base subtotal including tax."},"baseTaxAmount":{"type":"number","description":"Base tax amount."},"baseTotalRefunded":{"type":"number","description":"Base total refunded."},"baseToGlobalRate":{"type":"number","description":"Base-to-global rate."},"baseToOrderRate":{"type":"number","description":"Base-to-order rate."},"billingAddressId":{"type":"integer","description":"Billing address ID."},"canVoidFlag":{"type":"integer","description":"Can void flag value."},"createdAt":{"type":"string","description":"Created-at timestamp."},"discountAmount":{"type":"number","description":"Discount amount."},"discountDescription":{"type":"string","description":"Discount description."},"emailSent":{"type":"integer","description":"Email-sent flag value."},"entityId":{"type":"integer","description":"Invoice ID."},"globalCurrencyCode":{"type":"string","description":"Global currency code."},"grandTotal":{"type":"number","description":"Grand total."},"discountTaxCompensationAmount":{"type":"number","description":"Discount tax compensation amount."},"incrementId":{"type":"string","description":"Increment ID."},"isUsedForRefund":{"type":"integer","description":"Is-used-for-refund flag value."},"orderCurrencyCode":{"type":"string","description":"Order currency code."},"orderId":{"type":"integer","description":"Order ID."},"shippingAddressId":{"type":"integer","description":"Shipping address ID."},"shippingAmount":{"type":"number","description":"Shipping amount."},"shippingDiscountTaxCompensationAmount":{"type":"number","description":"Shipping discount tax compensation amount."},"shippingInclTax":{"type":"number","description":"Shipping including tax."},"shippingTaxAmount":{"type":"number","description":"Shipping tax amount."},"state":{"type":"integer","description":"State."},"storeCurrencyCode":{"type":"string","description":"Store currency code."},"storeId":{"type":"integer","description":"Store ID."},"storeToBaseRate":{"type":"number","description":"Store-to-base rate."},"storeToOrderRate":{"type":"number","description":"Store-to-order rate."},"subtotal":{"type":"number","description":"Subtotal."},"subtotalInclTax":{"type":"number","description":"Subtotal including tax."},"taxAmount":{"type":"number","description":"Tax amount."},"totalQty":{"type":"number","description":"Total quantity."},"transactionId":{"type":"string","description":"Transaction ID."},"updatedAt":{"type":"string","description":"Updated-at timestamp."},"items":{"type":"array","description":"Array of invoice items.","items":{"$ref":"#/definitions/sales-data-invoice-item-interface"}},"comments":{"type":"array","description":"Array of any invoice comments. Otherwise, null.","items":{"$ref":"#/definitions/sales-data-invoice-comment-interface"}},"extensionAttributes":{"$ref":"#/definitions/sales-data-invoice-extension-interface"}},"required":["baseDiscountTaxCompensationAmount","baseShippingDiscountTaxCompensationAmnt","discountTaxCompensationAmount","orderId","shippingDiscountTaxCompensationAmount","totalQty","items"]},"sales-data-invoice-item-interface":{"type":"object","description":"Invoice item interface. An invoice is a record of the receipt of payment for an order. An invoice item is a purchased item in an invoice.","properties":{"additionalData":{"type":"string","description":"Additional data."},"baseCost":{"type":"number","description":"Base cost."},"baseDiscountAmount":{"type":"number","description":"Base discount amount."},"baseDiscountTaxCompensationAmount":{"type":"number","description":"Base discount tax compensation amount."},"basePrice":{"type":"number","description":"Base price."},"basePriceInclTax":{"type":"number","description":"Base price including tax."},"baseRowTotal":{"type":"number","description":"Base row total."},"baseRowTotalInclTax":{"type":"number","description":"Base row total including tax."},"baseTaxAmount":{"type":"number","description":"Base tax amount."},"description":{"type":"string","description":"Description."},"discountAmount":{"type":"number","description":"Discount amount."},"entityId":{"type":"integer","description":"Invoice item ID."},"discountTaxCompensationAmount":{"type":"number","description":"Discount tax compensation amount."},"name":{"type":"string","description":"Name."},"orderItemId":{"type":"integer","description":"Order item ID."},"parentId":{"type":"integer","description":"Parent ID."},"price":{"type":"number","description":"Price."},"priceInclTax":{"type":"number","description":"Price including tax."},"productId":{"type":"integer","description":"Product ID."},"qty":{"type":"number","description":"Quantity."},"rowTotal":{"type":"number","description":"Row total."},"rowTotalInclTax":{"type":"number","description":"Row total including tax."},"sku":{"type":"string","description":"SKU."},"taxAmount":{"type":"number","description":"Tax amount."},"extensionAttributes":{"$ref":"#/definitions/sales-data-invoice-item-extension-interface"}},"required":["baseDiscountTaxCompensationAmount","discountTaxCompensationAmount","orderItemId","qty","sku"]},"sales-data-invoice-item-extension-interface":{"type":"object","description":"ExtensionInterface class for @see \\Magento\\Sales\\Api\\Data\\InvoiceItemInterface"},"sales-data-invoice-comment-interface":{"type":"object","description":"Invoice comment interface. An invoice is a record of the receipt of payment for an order. An invoice can include comments that detail the invoice history.","properties":{"comment":{"type":"string","description":"Comment."},"createdAt":{"type":"string","description":"Created-at timestamp."},"entityId":{"type":"integer","description":"Invoice ID."},"isCustomerNotified":{"type":"integer","description":"Is-customer-notified flag value."},"isVisibleOnFront":{"type":"integer","description":"Is-visible-on-storefront flag value."},"parentId":{"type":"integer","description":"Parent ID."},"extensionAttributes":{"$ref":"#/definitions/sales-data-invoice-comment-extension-interface"}},"required":["comment","isCustomerNotified","isVisibleOnFront","parentId"]},"sales-data-invoice-comment-extension-interface":{"type":"object","description":"ExtensionInterface class for @see \\Magento\\Sales\\Api\\Data\\InvoiceCommentInterface"},"sales-data-invoice-extension-interface":{"type":"object","description":"ExtensionInterface class for @see \\Magento\\Sales\\Api\\Data\\InvoiceInterface"},"sales-data-invoice-search-result-interface":{"type":"object","description":"Invoice search result interface. An invoice is a record of the receipt of payment for an order.","properties":{"items":{"type":"array","description":"Array of collection items.","items":{"$ref":"#/definitions/sales-data-invoice-interface"}},"searchCriteria":{"$ref":"#/definitions/framework-search-criteria-interface"},"totalCount":{"type":"integer","description":"Total count."}},"required":["items","searchCriteria","totalCount"]},"sales-data-invoice-comment-search-result-interface":{"type":"object","description":"Invoice comment search result interface. An invoice is a record of the receipt of payment for an order. An invoice can include comments that detail the invoice history.","properties":{"items":{"type":"array","description":"Array of collection items.","items":{"$ref":"#/definitions/sales-data-invoice-comment-interface"}},"searchCriteria":{"$ref":"#/definitions/framework-search-criteria-interface"},"totalCount":{"type":"integer","description":"Total count."}},"required":["items","searchCriteria","totalCount"]},"sales-data-creditmemo-comment-search-result-interface":{"type":"object","description":"Credit memo comment search result interface. After a customer places and pays for an order and an invoice has been issued, the merchant can create a credit memo to refund all or part of the amount paid for any returned or undelivered items. The memo restores funds to the customer account so that the customer can make future purchases. A credit memo usually includes comments that detail why the credit memo amount was credited to the customer.","properties":{"items":{"type":"array","description":"Array of collection items.","items":{"$ref":"#/definitions/sales-data-creditmemo-comment-interface"}},"searchCriteria":{"$ref":"#/definitions/framework-search-criteria-interface"},"totalCount":{"type":"integer","description":"Total count."}},"required":["items","searchCriteria","totalCount"]},"sales-data-creditmemo-comment-interface":{"type":"object","description":"Credit memo comment interface. After a customer places and pays for an order and an invoice has been issued, the merchant can create a credit memo to refund all or part of the amount paid for any returned or undelivered items. The memo restores funds to the customer account so that the customer can make future purchases. A credit memo usually includes comments that detail why the credit memo amount was credited to the customer.","properties":{"comment":{"type":"string","description":"Comment."},"createdAt":{"type":"string","description":"Created-at timestamp."},"entityId":{"type":"integer","description":"Credit memo ID."},"isCustomerNotified":{"type":"integer","description":"Is-customer-notified flag value."},"isVisibleOnFront":{"type":"integer","description":"Is-visible-on-storefront flag value."},"parentId":{"type":"integer","description":"Parent ID."},"extensionAttributes":{"$ref":"#/definitions/sales-data-creditmemo-comment-extension-interface"}},"required":["comment","isCustomerNotified","isVisibleOnFront","parentId"]},"sales-data-creditmemo-comment-extension-interface":{"type":"object","description":"ExtensionInterface class for @see \\Magento\\Sales\\Api\\Data\\CreditmemoCommentInterface"},"sales-data-creditmemo-search-result-interface":{"type":"object","description":"Credit memo search result interface. After a customer places and pays for an order and an invoice has been issued, the merchant can create a credit memo to refund all or part of the amount paid for any returned or undelivered items. The memo restores funds to the customer account so that the customer can make future purchases.","properties":{"items":{"type":"array","description":"Array of collection items.","items":{"$ref":"#/definitions/sales-data-creditmemo-interface"}},"searchCriteria":{"$ref":"#/definitions/framework-search-criteria-interface"},"totalCount":{"type":"integer","description":"Total count."}},"required":["items","searchCriteria","totalCount"]},"sales-data-creditmemo-interface":{"type":"object","description":"Credit memo interface. After a customer places and pays for an order and an invoice has been issued, the merchant can create a credit memo to refund all or part of the amount paid for any returned or undelivered items. The memo restores funds to the customer account so that the customer can make future purchases.","properties":{"adjustment":{"type":"number","description":"Credit memo adjustment."},"adjustmentNegative":{"type":"number","description":"Credit memo negative adjustment."},"adjustmentPositive":{"type":"number","description":"Credit memo positive adjustment."},"baseAdjustment":{"type":"number","description":"Credit memo base adjustment."},"baseAdjustmentNegative":{"type":"number","description":"Credit memo negative base adjustment."},"baseAdjustmentPositive":{"type":"number","description":"Credit memo positive base adjustment."},"baseCurrencyCode":{"type":"string","description":"Credit memo base currency code."},"baseDiscountAmount":{"type":"number","description":"Credit memo base discount amount."},"baseGrandTotal":{"type":"number","description":"Credit memo base grand total."},"baseDiscountTaxCompensationAmount":{"type":"number","description":"Credit memo base discount tax compensation amount."},"baseShippingAmount":{"type":"number","description":"Credit memo base shipping amount."},"baseShippingDiscountTaxCompensationAmnt":{"type":"number","description":"Credit memo base shipping discount tax compensation amount."},"baseShippingInclTax":{"type":"number","description":"Credit memo base shipping including tax."},"baseShippingTaxAmount":{"type":"number","description":"Credit memo base shipping tax amount."},"baseSubtotal":{"type":"number","description":"Credit memo base subtotal."},"baseSubtotalInclTax":{"type":"number","description":"Credit memo base subtotal including tax."},"baseTaxAmount":{"type":"number","description":"Credit memo base tax amount."},"baseToGlobalRate":{"type":"number","description":"Credit memo base-to-global rate."},"baseToOrderRate":{"type":"number","description":"Credit memo base-to-order rate."},"billingAddressId":{"type":"integer","description":"Credit memo billing address ID."},"createdAt":{"type":"string","description":"Credit memo created-at timestamp."},"creditmemoStatus":{"type":"integer","description":"Credit memo status."},"discountAmount":{"type":"number","description":"Credit memo discount amount."},"discountDescription":{"type":"string","description":"Credit memo discount description."},"emailSent":{"type":"integer","description":"Credit memo email sent flag value."},"entityId":{"type":"integer","description":"Credit memo ID."},"globalCurrencyCode":{"type":"string","description":"Credit memo global currency code."},"grandTotal":{"type":"number","description":"Credit memo grand total."},"discountTaxCompensationAmount":{"type":"number","description":"Credit memo discount tax compensation amount."},"incrementId":{"type":"string","description":"Credit memo increment ID."},"invoiceId":{"type":"integer","description":"Credit memo invoice ID."},"orderCurrencyCode":{"type":"string","description":"Credit memo order currency code."},"orderId":{"type":"integer","description":"Credit memo order ID."},"shippingAddressId":{"type":"integer","description":"Credit memo shipping address ID."},"shippingAmount":{"type":"number","description":"Credit memo shipping amount."},"shippingDiscountTaxCompensationAmount":{"type":"number","description":"Credit memo shipping discount tax compensation amount."},"shippingInclTax":{"type":"number","description":"Credit memo shipping including tax."},"shippingTaxAmount":{"type":"number","description":"Credit memo shipping tax amount."},"state":{"type":"integer","description":"Credit memo state."},"storeCurrencyCode":{"type":"string","description":"Credit memo store currency code."},"storeId":{"type":"integer","description":"Credit memo store ID."},"storeToBaseRate":{"type":"number","description":"Credit memo store-to-base rate."},"storeToOrderRate":{"type":"number","description":"Credit memo store-to-order rate."},"subtotal":{"type":"number","description":"Credit memo subtotal."},"subtotalInclTax":{"type":"number","description":"Credit memo subtotal including tax."},"taxAmount":{"type":"number","description":"Credit memo tax amount."},"transactionId":{"type":"string","description":"Credit memo transaction ID."},"updatedAt":{"type":"string","description":"Credit memo updated-at timestamp."},"items":{"type":"array","description":"Array of credit memo items.","items":{"$ref":"#/definitions/sales-data-creditmemo-item-interface"}},"comments":{"type":"array","description":"Array of any credit memo comments. Otherwise, null.","items":{"$ref":"#/definitions/sales-data-creditmemo-comment-interface"}},"extensionAttributes":{"$ref":"#/definitions/sales-data-creditmemo-extension-interface"}},"required":["baseDiscountTaxCompensationAmount","baseShippingDiscountTaxCompensationAmnt","discountTaxCompensationAmount","orderId","shippingDiscountTaxCompensationAmount","items"]},"sales-data-creditmemo-item-interface":{"type":"object","description":"Credit memo item interface. After a customer places and pays for an order and an invoice has been issued, the merchant can create a credit memo to refund all or part of the amount paid for any returned or undelivered items. The memo restores funds to the customer account so that the customer can make future purchases. A credit memo item is an invoiced item for which a merchant creates a credit memo.","properties":{"additionalData":{"type":"string","description":"Additional data."},"baseCost":{"type":"number","description":"The base cost for a credit memo item."},"baseDiscountAmount":{"type":"number","description":"The base discount amount for a credit memo item."},"baseDiscountTaxCompensationAmount":{"type":"number","description":"The base discount tax compensation amount for a credit memo item."},"basePrice":{"type":"number","description":"The base price for a credit memo item."},"basePriceInclTax":{"type":"number","description":"Base price including tax."},"baseRowTotal":{"type":"number","description":"Base row total."},"baseRowTotalInclTax":{"type":"number","description":"Base row total including tax."},"baseTaxAmount":{"type":"number","description":"Base tax amount."},"baseWeeeTaxAppliedAmount":{"type":"number","description":"Base WEEE tax applied amount."},"baseWeeeTaxAppliedRowAmnt":{"type":"number","description":"Base WEEE tax applied row amount."},"baseWeeeTaxDisposition":{"type":"number","description":"Base WEEE tax disposition."},"baseWeeeTaxRowDisposition":{"type":"number","description":"Base WEEE tax row disposition."},"description":{"type":"string","description":"Description."},"discountAmount":{"type":"number","description":"Discount amount."},"entityId":{"type":"integer","description":"Credit memo item ID."},"discountTaxCompensationAmount":{"type":"number","description":"Discount tax compensation amount."},"name":{"type":"string","description":"Name."},"orderItemId":{"type":"integer","description":"Order item ID."},"parentId":{"type":"integer","description":"Parent ID."},"price":{"type":"number","description":"Price."},"priceInclTax":{"type":"number","description":"Price including tax."},"productId":{"type":"integer","description":"Product ID."},"qty":{"type":"number","description":"Quantity."},"rowTotal":{"type":"number","description":"Row total."},"rowTotalInclTax":{"type":"number","description":"Row total including tax."},"sku":{"type":"string","description":"SKU."},"taxAmount":{"type":"number","description":"Tax amount."},"weeeTaxApplied":{"type":"string","description":"WEEE tax applied."},"weeeTaxAppliedAmount":{"type":"number","description":"WEEE tax applied amount."},"weeeTaxAppliedRowAmount":{"type":"number","description":"WEEE tax applied row amount."},"weeeTaxDisposition":{"type":"number","description":"WEEE tax disposition."},"weeeTaxRowDisposition":{"type":"number","description":"WEEE tax row disposition."},"extensionAttributes":{"$ref":"#/definitions/sales-data-creditmemo-item-extension-interface"}},"required":["baseCost","baseDiscountAmount","baseDiscountTaxCompensationAmount","basePrice","entityId","discountTaxCompensationAmount","orderItemId","qty"]},"sales-data-creditmemo-item-extension-interface":{"type":"object","description":"ExtensionInterface class for @see \\Magento\\Sales\\Api\\Data\\CreditmemoItemInterface"},"sales-data-creditmemo-extension-interface":{"type":"object","description":"ExtensionInterface class for @see \\Magento\\Sales\\Api\\Data\\CreditmemoInterface"},"sales-data-shipment-interface":{"type":"object","description":"Shipment interface. A shipment is a delivery package that contains products. A shipment document accompanies the shipment. This document lists the products and their quantities in the delivery package.","properties":{"billingAddressId":{"type":"integer","description":"Billing address ID."},"createdAt":{"type":"string","description":"Created-at timestamp."},"customerId":{"type":"integer","description":"Customer ID."},"emailSent":{"type":"integer","description":"Email-sent flag value."},"entityId":{"type":"integer","description":"Shipment ID."},"incrementId":{"type":"string","description":"Increment ID."},"orderId":{"type":"integer","description":"Order ID."},"packages":{"type":"array","description":"Array of packages, if any. Otherwise, null.","items":{"$ref":"#/definitions/sales-data-shipment-package-interface"}},"shipmentStatus":{"type":"integer","description":"Shipment status."},"shippingAddressId":{"type":"integer","description":"Shipping address ID."},"shippingLabel":{"type":"string","description":"Shipping label."},"storeId":{"type":"integer","description":"Store ID."},"totalQty":{"type":"number","description":"Total quantity."},"totalWeight":{"type":"number","description":"Total weight."},"updatedAt":{"type":"string","description":"Updated-at timestamp."},"items":{"type":"array","description":"Array of items.","items":{"$ref":"#/definitions/sales-data-shipment-item-interface"}},"tracks":{"type":"array","description":"Array of tracks.","items":{"$ref":"#/definitions/sales-data-shipment-track-interface"}},"comments":{"type":"array","description":"Array of comments.","items":{"$ref":"#/definitions/sales-data-shipment-comment-interface"}},"extensionAttributes":{"$ref":"#/definitions/sales-data-shipment-extension-interface"}},"required":["orderId","items","tracks","comments"]},"sales-data-shipment-package-interface":{"type":"object","description":"Shipment package interface. A shipment is a delivery package that contains products. A shipment document accompanies the shipment. This document lists the products and their quantities in the delivery package.","properties":{"extensionAttributes":{"$ref":"#/definitions/sales-data-shipment-package-extension-interface"}}},"sales-data-shipment-package-extension-interface":{"type":"object","description":"ExtensionInterface class for @see \\Magento\\Sales\\Api\\Data\\ShipmentPackageInterface"},"sales-data-shipment-item-interface":{"type":"object","description":"Shipment item interface. A shipment is a delivery package that contains products. A shipment document accompanies the shipment. This document lists the products and their quantities in the delivery package. A product is an item in a shipment.","properties":{"additionalData":{"type":"string","description":"Additional data."},"description":{"type":"string","description":"Description."},"entityId":{"type":"integer","description":"Shipment item ID."},"name":{"type":"string","description":"Name."},"orderItemId":{"type":"integer","description":"Order item ID."},"parentId":{"type":"integer","description":"Parent ID."},"price":{"type":"number","description":"Price."},"productId":{"type":"integer","description":"Product ID."},"qty":{"type":"number","description":"Quantity."},"rowTotal":{"type":"number","description":"Row total."},"sku":{"type":"string","description":"SKU."},"weight":{"type":"number","description":"Weight."},"extensionAttributes":{"$ref":"#/definitions/sales-data-shipment-item-extension-interface"}},"required":["orderItemId","qty"]},"sales-data-shipment-item-extension-interface":{"type":"object","description":"ExtensionInterface class for @see \\Magento\\Sales\\Api\\Data\\ShipmentItemInterface"},"sales-data-shipment-track-interface":{"type":"object","description":"Shipment track interface. A shipment is a delivery package that contains products. A shipment document accompanies the shipment. This document lists the products and their quantities in the delivery package. Merchants and customers can track shipments.","properties":{"carrierCode":{"type":"string","description":"Carrier code."},"createdAt":{"type":"string","description":"Created-at timestamp."},"description":{"type":"string","description":"Description."},"entityId":{"type":"integer","description":"Shipment package ID."},"orderId":{"type":"integer","description":"The order_id for the shipment package."},"parentId":{"type":"integer","description":"Parent ID."},"qty":{"type":"number","description":"Quantity."},"title":{"type":"string","description":"Title."},"trackNumber":{"type":"string","description":"Track number."},"updatedAt":{"type":"string","description":"Updated-at timestamp."},"weight":{"type":"number","description":"Weight."},"extensionAttributes":{"$ref":"#/definitions/sales-data-shipment-track-extension-interface"}},"required":["carrierCode","description","orderId","parentId","qty","title","trackNumber","weight"]},"sales-data-shipment-track-extension-interface":{"type":"object","description":"ExtensionInterface class for @see \\Magento\\Sales\\Api\\Data\\ShipmentTrackInterface"},"sales-data-shipment-comment-interface":{"type":"object","description":"Shipment comment interface. A shipment is a delivery package that contains products. A shipment document accompanies the shipment. This document lists the products and their quantities in the delivery package. A shipment document can contain comments.","properties":{"comment":{"type":"string","description":"Comment."},"createdAt":{"type":"string","description":"Created-at timestamp."},"entityId":{"type":"integer","description":"Shipment comment ID."},"isCustomerNotified":{"type":"integer","description":"Is-customer-notified flag value."},"isVisibleOnFront":{"type":"integer","description":"Is-visible-on-storefront flag value."},"parentId":{"type":"integer","description":"Parent ID."},"extensionAttributes":{"$ref":"#/definitions/sales-data-shipment-comment-extension-interface"}},"required":["comment","isCustomerNotified","isVisibleOnFront","parentId"]},"sales-data-shipment-comment-extension-interface":{"type":"object","description":"ExtensionInterface class for @see \\Magento\\Sales\\Api\\Data\\ShipmentCommentInterface"},"sales-data-shipment-extension-interface":{"type":"object","description":"ExtensionInterface class for @see \\Magento\\Sales\\Api\\Data\\ShipmentInterface"},"sales-data-shipment-search-result-interface":{"type":"object","description":"Shipment search result interface. A shipment is a delivery package that contains products. A shipment document accompanies the shipment. This document lists the products and their quantities in the delivery package.","properties":{"items":{"type":"array","description":"Array of collection items.","items":{"$ref":"#/definitions/sales-data-shipment-interface"}},"searchCriteria":{"$ref":"#/definitions/framework-search-criteria-interface"},"totalCount":{"type":"integer","description":"Total count."}},"required":["items","searchCriteria","totalCount"]},"sales-data-shipment-comment-search-result-interface":{"type":"object","description":"Shipment comment search result interface. A shipment is a delivery package that contains products. A shipment document accompanies the shipment. This document lists the products and their quantities in the delivery package. A shipment document can contain comments.","properties":{"items":{"type":"array","description":"Array of collection items.","items":{"$ref":"#/definitions/sales-data-shipment-comment-interface"}},"searchCriteria":{"$ref":"#/definitions/framework-search-criteria-interface"},"totalCount":{"type":"integer","description":"Total count."}},"required":["items","searchCriteria","totalCount"]},"sales-data-transaction-interface":{"type":"object","description":"Transaction interface. A transaction is an interaction between a merchant and a customer such as a purchase, a credit, a refund, and so on.","properties":{"transactionId":{"type":"integer","description":"Transaction ID."},"parentId":{"type":"integer","description":"The parent ID for the transaction. Otherwise, null."},"orderId":{"type":"integer","description":"Order ID."},"paymentId":{"type":"integer","description":"Payment ID."},"txnId":{"type":"string","description":"Transaction business ID."},"parentTxnId":{"type":"string","description":"Parent transaction business ID."},"txnType":{"type":"string","description":"Transaction type."},"isClosed":{"type":"integer","description":"Is-closed flag value."},"additionalInformation":{"type":"array","description":"Array of additional information. Otherwise, null.","items":{"type":"string"}},"createdAt":{"type":"string","description":"Created-at timestamp."},"childTransactions":{"type":"array","description":"Array of child transactions.","items":{"$ref":"#/definitions/sales-data-transaction-interface"}},"extensionAttributes":{"$ref":"#/definitions/sales-data-transaction-extension-interface"}},"required":["transactionId","orderId","paymentId","txnId","parentTxnId","txnType","isClosed","createdAt","childTransactions"]},"sales-data-transaction-extension-interface":{"type":"object","description":"ExtensionInterface class for @see \\Magento\\Sales\\Api\\Data\\TransactionInterface"},"sales-data-transaction-search-result-interface":{"type":"object","description":"Transaction search result interface. A transaction is an interaction between a merchant and a customer such as a purchase, a credit, a refund, and so on.","properties":{"items":{"type":"array","description":"Array of collection items.","items":{"$ref":"#/definitions/sales-data-transaction-interface"}},"searchCriteria":{"$ref":"#/definitions/framework-search-criteria-interface"},"totalCount":{"type":"integer","description":"Total count."}},"required":["items","searchCriteria","totalCount"]},"checkout-data-shipping-information-interface":{"type":"object","description":"","properties":{"shippingAddress":{"$ref":"#/definitions/quote-data-address-interface"},"billingAddress":{"$ref":"#/definitions/quote-data-address-interface"},"shippingMethodCode":{"type":"string","description":"Shipping method code"},"shippingCarrierCode":{"type":"string","description":"Carrier code"},"extensionAttributes":{"$ref":"#/definitions/checkout-data-shipping-information-extension-interface"},"customAttributes":{"type":"array","description":"Custom attributes values.","items":{"$ref":"#/definitions/framework-attribute-interface"}}},"required":["shippingAddress","shippingMethodCode","shippingCarrierCode"]},"checkout-data-shipping-information-extension-interface":{"type":"object","description":"ExtensionInterface class for @see \\Magento\\Checkout\\Api\\Data\\ShippingInformationInterface"},"checkout-data-payment-details-interface":{"type":"object","description":"","properties":{"paymentMethods":{"type":"array","items":{"$ref":"#/definitions/quote-data-payment-method-interface"}},"totals":{"$ref":"#/definitions/quote-data-totals-interface"},"extensionAttributes":{"$ref":"#/definitions/checkout-data-payment-details-extension-interface"}},"required":["paymentMethods","totals"]},"checkout-data-payment-details-extension-interface":{"type":"object","description":"ExtensionInterface class for @see \\Magento\\Checkout\\Api\\Data\\PaymentDetailsInterface"},"checkout-data-totals-information-interface":{"type":"object","description":"","properties":{"address":{"$ref":"#/definitions/quote-data-address-interface"},"shippingMethodCode":{"type":"string","description":"Shipping method code"},"shippingCarrierCode":{"type":"string","description":"Carrier code"},"extensionAttributes":{"$ref":"#/definitions/checkout-data-totals-information-extension-interface"},"customAttributes":{"type":"array","description":"Custom attributes values.","items":{"$ref":"#/definitions/framework-attribute-interface"}}},"required":["address"]},"checkout-data-totals-information-extension-interface":{"type":"object","description":"ExtensionInterface class for @see \\Magento\\Checkout\\Api\\Data\\TotalsInformationInterface"},"sales-rule-data-rule-interface":{"type":"object","description":"Interface RuleInterface","properties":{"ruleId":{"type":"integer","description":"Rule id"},"name":{"type":"string","description":"Rule name"},"storeLabels":{"type":"array","description":"Display label","items":{"$ref":"#/definitions/sales-rule-data-rule-label-interface"}},"description":{"type":"string","description":"Description"},"websiteIds":{"type":"array","description":"A list of websites the rule applies to","items":{"type":"integer"}},"customerGroupIds":{"type":"array","description":"Ids of customer groups that the rule applies to","items":{"type":"integer"}},"fromDate":{"type":"string","description":"The start date when the coupon is active"},"toDate":{"type":"string","description":"The end date when the coupon is active"},"usesPerCustomer":{"type":"integer","description":"Number of uses per customer"},"isActive":{"type":"boolean","description":"The coupon is active"},"condition":{"$ref":"#/definitions/sales-rule-data-condition-interface"},"actionCondition":{"$ref":"#/definitions/sales-rule-data-condition-interface"},"stopRulesProcessing":{"type":"boolean","description":"To stop rule processing"},"isAdvanced":{"type":"boolean","description":"Is this field needed"},"productIds":{"type":"array","description":"Product ids","items":{"type":"integer"}},"sortOrder":{"type":"integer","description":"Sort order"},"simpleAction":{"type":"string","description":"Simple action of the rule"},"discountAmount":{"type":"number","description":"Discount amount"},"discountQty":{"type":"number","description":"Maximum qty discount is applied"},"discountStep":{"type":"integer","description":"Discount step"},"applyToShipping":{"type":"boolean","description":"The rule applies to shipping"},"timesUsed":{"type":"integer","description":"How many times the rule has been used"},"isRss":{"type":"boolean","description":"Whether the rule is in RSS"},"couponType":{"type":"string","description":"Coupon type"},"useAutoGeneration":{"type":"boolean","description":"To auto generate coupon"},"usesPerCoupon":{"type":"integer","description":"Limit of uses per coupon"},"simpleFreeShipping":{"type":"string","description":"To grant free shipping"},"extensionAttributes":{"$ref":"#/definitions/sales-rule-data-rule-extension-interface"}},"required":["websiteIds","customerGroupIds","usesPerCustomer","isActive","stopRulesProcessing","isAdvanced","sortOrder","discountAmount","discountStep","applyToShipping","timesUsed","isRss","couponType","useAutoGeneration","usesPerCoupon"]},"sales-rule-data-rule-label-interface":{"type":"object","description":"Interface RuleLabelInterface","properties":{"storeId":{"type":"integer","description":"StoreId"},"storeLabel":{"type":"string","description":"The label for the store"},"extensionAttributes":{"$ref":"#/definitions/sales-rule-data-rule-label-extension-interface"}},"required":["storeId","storeLabel"]},"sales-rule-data-rule-label-extension-interface":{"type":"object","description":"ExtensionInterface class for @see \\Magento\\SalesRule\\Api\\Data\\RuleLabelInterface"},"sales-rule-data-condition-interface":{"type":"object","description":"Interface ConditionInterface","properties":{"conditionType":{"type":"string","description":"Condition type"},"conditions":{"type":"array","description":"List of conditions","items":{"$ref":"#/definitions/sales-rule-data-condition-interface"}},"aggregatorType":{"type":"string","description":"The aggregator type"},"operator":{"type":"string","description":"The operator of the condition"},"attributeName":{"type":"string","description":"The attribute name of the condition"},"value":{"type":"string","description":"The value of the condition"},"extensionAttributes":{"$ref":"#/definitions/sales-rule-data-condition-extension-interface"}},"required":["conditionType","operator","value"]},"sales-rule-data-condition-extension-interface":{"type":"object","description":"ExtensionInterface class for @see \\Magento\\SalesRule\\Api\\Data\\ConditionInterface"},"sales-rule-data-rule-extension-interface":{"type":"object","description":"ExtensionInterface class for @see \\Magento\\SalesRule\\Api\\Data\\RuleInterface"},"sales-rule-data-rule-search-result-interface":{"type":"object","description":"","properties":{"items":{"type":"array","description":"Rules.","items":{"$ref":"#/definitions/sales-rule-data-rule-interface"}},"searchCriteria":{"$ref":"#/definitions/framework-search-criteria-interface"},"totalCount":{"type":"integer","description":"Total count."}},"required":["items","searchCriteria","totalCount"]},"sales-rule-data-coupon-interface":{"type":"object","description":"Interface CouponInterface","properties":{"couponId":{"type":"integer","description":"Coupon id"},"ruleId":{"type":"integer","description":"The id of the rule associated with the coupon"},"code":{"type":"string","description":"Coupon code"},"usageLimit":{"type":"integer","description":"Usage limit"},"usagePerCustomer":{"type":"integer","description":"Usage limit per customer"},"timesUsed":{"type":"integer","description":"The number of times the coupon has been used"},"expirationDate":{"type":"string","description":"Expiration date"},"isPrimary":{"type":"boolean","description":"The coupon is primary coupon for the rule that it's associated with"},"createdAt":{"type":"string","description":"When the coupon is created"},"type":{"type":"integer","description":"Of coupon"},"extensionAttributes":{"$ref":"#/definitions/sales-rule-data-coupon-extension-interface"}},"required":["ruleId","timesUsed","isPrimary"]},"sales-rule-data-coupon-extension-interface":{"type":"object","description":"ExtensionInterface class for @see \\Magento\\SalesRule\\Api\\Data\\CouponInterface"},"sales-rule-data-coupon-search-result-interface":{"type":"object","description":"","properties":{"items":{"type":"array","description":"Rules.","items":{"$ref":"#/definitions/sales-rule-data-coupon-interface"}},"searchCriteria":{"$ref":"#/definitions/framework-search-criteria-interface"},"totalCount":{"type":"integer","description":"Total count."}},"required":["items","searchCriteria","totalCount"]},"sales-rule-data-coupon-generation-spec-interface":{"type":"object","description":"CouponGenerationSpecInterface","properties":{"ruleId":{"type":"integer","description":"The id of the rule associated with the coupon"},"format":{"type":"string","description":"Format of generated coupon code"},"quantity":{"type":"integer","description":"Of coupons to generate"},"length":{"type":"integer","description":"Length of coupon code"},"prefix":{"type":"string","description":"The prefix"},"suffix":{"type":"string","description":"The suffix"},"delimiterAtEvery":{"type":"integer","description":"The spacing where the delimiter should exist"},"delimiter":{"type":"string","description":"The delimiter"},"extensionAttributes":{"$ref":"#/definitions/sales-rule-data-coupon-generation-spec-extension-interface"}},"required":["ruleId","format","quantity","length"]},"sales-rule-data-coupon-generation-spec-extension-interface":{"type":"object","description":"ExtensionInterface class for @see \\Magento\\SalesRule\\Api\\Data\\CouponGenerationSpecInterface"},"sales-rule-data-coupon-mass-delete-result-interface":{"type":"object","description":"Coupon mass delete results interface.","properties":{"failedItems":{"type":"array","description":"List of failed items.","items":{"type":"string"}},"missingItems":{"type":"array","description":"List of missing items.","items":{"type":"string"}}},"required":["failedItems","missingItems"]},"tax-data-tax-rate-interface":{"type":"object","description":"Tax rate interface.","properties":{"id":{"type":"integer","description":"Id"},"taxCountryId":{"type":"string","description":"Country id"},"taxRegionId":{"type":"integer","description":"Region id"},"regionName":{"type":"string","description":"Region name"},"taxPostcode":{"type":"string","description":"Postcode"},"zipIsRange":{"type":"integer","description":"Zip is range"},"zipFrom":{"type":"integer","description":"Zip range from"},"zipTo":{"type":"integer","description":"Zip range to"},"rate":{"type":"number","description":"Tax rate in percentage"},"code":{"type":"string","description":"Tax rate code"},"titles":{"type":"array","description":"Tax rate titles","items":{"$ref":"#/definitions/tax-data-tax-rate-title-interface"}},"extensionAttributes":{"$ref":"#/definitions/tax-data-tax-rate-extension-interface"}},"required":["taxCountryId","rate","code"]},"tax-data-tax-rate-title-interface":{"type":"object","description":"Tax rate title interface.","properties":{"storeId":{"type":"string","description":"Store id"},"value":{"type":"string","description":"Title value"},"extensionAttributes":{"$ref":"#/definitions/tax-data-tax-rate-title-extension-interface"}},"required":["storeId","value"]},"tax-data-tax-rate-title-extension-interface":{"type":"object","description":"ExtensionInterface class for @see \\Magento\\Tax\\Api\\Data\\TaxRateTitleInterface"},"tax-data-tax-rate-extension-interface":{"type":"object","description":"ExtensionInterface class for @see \\Magento\\Tax\\Api\\Data\\TaxRateInterface"},"tax-data-tax-rate-search-results-interface":{"type":"object","description":"Interface for tax rate search results.","properties":{"items":{"type":"array","description":"Items","items":{"$ref":"#/definitions/tax-data-tax-rate-interface"}},"searchCriteria":{"$ref":"#/definitions/framework-search-criteria-interface"},"totalCount":{"type":"integer","description":"Total count."}},"required":["items","searchCriteria","totalCount"]},"tax-data-tax-rule-interface":{"type":"object","description":"Tax rule interface.","properties":{"id":{"type":"integer","description":"Id"},"code":{"type":"string","description":"Tax rule code"},"priority":{"type":"integer","description":"Priority"},"position":{"type":"integer","description":"Sort order."},"customerTaxClassIds":{"type":"array","description":"Customer tax class id","items":{"type":"integer"}},"productTaxClassIds":{"type":"array","description":"Product tax class id","items":{"type":"integer"}},"taxRateIds":{"type":"array","description":"Tax rate ids","items":{"type":"integer"}},"calculateSubtotal":{"type":"boolean","description":"Calculate subtotal."},"extensionAttributes":{"$ref":"#/definitions/tax-data-tax-rule-extension-interface"}},"required":["code","priority","position","customerTaxClassIds","productTaxClassIds","taxRateIds"]},"tax-data-tax-rule-extension-interface":{"type":"object","description":"ExtensionInterface class for @see \\Magento\\Tax\\Api\\Data\\TaxRuleInterface"},"tax-data-tax-rule-search-results-interface":{"type":"object","description":"Interface for tax rule search results.","properties":{"items":{"type":"array","description":"Items","items":{"$ref":"#/definitions/tax-data-tax-rule-interface"}},"searchCriteria":{"$ref":"#/definitions/framework-search-criteria-interface"},"totalCount":{"type":"integer","description":"Total count."}},"required":["items","searchCriteria","totalCount"]},"tax-data-tax-class-interface":{"type":"object","description":"Tax class interface.","properties":{"classId":{"type":"integer","description":"Tax class ID."},"className":{"type":"string","description":"Tax class name."},"classType":{"type":"string","description":"Tax class type."},"extensionAttributes":{"$ref":"#/definitions/tax-data-tax-class-extension-interface"}},"required":["className","classType"]},"tax-data-tax-class-extension-interface":{"type":"object","description":"ExtensionInterface class for @see \\Magento\\Tax\\Api\\Data\\TaxClassInterface"},"tax-data-tax-class-search-results-interface":{"type":"object","description":"Interface for tax class search results.","properties":{"items":{"type":"array","description":"Items","items":{"$ref":"#/definitions/tax-data-tax-class-interface"}},"searchCriteria":{"$ref":"#/definitions/framework-search-criteria-interface"},"totalCount":{"type":"integer","description":"Total count."}},"required":["items","searchCriteria","totalCount"]}}} \ No newline at end of file From d2cae982857d3fa6fb320905fe71da8b5acd5b0b Mon Sep 17 00:00:00 2001 From: Mehryar Mansoor Date: Thu, 28 Jan 2016 21:02:47 -0800 Subject: [PATCH 070/902] Renaming API schema file --- swagger/index.html | 2 +- swagger/schemas/{latest.json => latest-2.0.schema.json} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename swagger/schemas/{latest.json => latest-2.0.schema.json} (100%) diff --git a/swagger/index.html b/swagger/index.html index 911056c3575..d207d521cc5 100644 --- a/swagger/index.html +++ b/swagger/index.html @@ -38,7 +38,7 @@ if (url && url.length > 1) { url = decodeURIComponent(url[1]); } else { - url = "http://devdocs.magento.com/swagger/schemas/2.0.0-rc-api-schema.json"; + url = "http://devdocs.magento.com/swagger/schemas/latest-2.0.schema.json"; } // Pre load translate... diff --git a/swagger/schemas/latest.json b/swagger/schemas/latest-2.0.schema.json similarity index 100% rename from swagger/schemas/latest.json rename to swagger/schemas/latest-2.0.schema.json From 3b5d59c6f0c995b66ab190838a04a75a2df2c84d Mon Sep 17 00:00:00 2001 From: Oleksandra Marchenko Date: Fri, 29 Jan 2016 12:52:41 +0200 Subject: [PATCH 071/902] Added HTML style guide --- common/images/h5d-sectioning-flowchart.png | Bin 0 -> 70037 bytes .../coding-standards/code-standard-html.md | 134 ++++++++++++++++++ 2 files changed, 134 insertions(+) create mode 100644 common/images/h5d-sectioning-flowchart.png create mode 100644 guides/v2.0/coding-standards/code-standard-html.md diff --git a/common/images/h5d-sectioning-flowchart.png b/common/images/h5d-sectioning-flowchart.png new file mode 100644 index 0000000000000000000000000000000000000000..2125a86df24d4fb96b21ac03c47111e6c2cef3c3 GIT binary patch literal 70037 zcma&NWmH_j(k?tma1sU&4ueB*cOTr{HMqOG>p*bV1ouF2ceg-rcXz*>^WJsW{c+c~ zzCW|4s=KS7>VCSq_TIfC73IOGNO(v90031=QcM{DfCU2pFz^U4ADR>RVSNAq`c+X@ zRlHt|9ze?+r3*OU`a2v1U=UJDb4;0B*-?;z3|LdmMw!T^cF=^DS^~s2PtOenUH!ch zvkd_OM%LwK{KA4P004VjS``2g$>`NsAoyXMV!dnJ&ICML-w`*^1yBi8bIGk9`y2IL zywMR*CnBc8v;u1O?A`iqy6JrJd802328-^RRB!omI z9izAatPo+v7$$+BZvX&~enm!bT+_dxnhzP+i!%&TT9=T|*LSl`M0q??CZd)LfZ_w2~w_|xi7 zA%Lut1OVXCAsbY|U|S>_+P^SdF>>K%FN8{!uCcix}3CMT!H#>U>?AKxEm-rujUuC9)ckC&E~-k+A=pVkfz4nC^CKkvOiAI11# zTwGjqoxGRh(B0hJJU>4_JUqO;zxxOHf6(szX&jK$_ck_1mOmCYu&YopWAkT?r+j+* z`uW2^+2Y0P>nm#7;QZNL+vfG<(_{Yl-sr&2^s*_9c7)bRWVbI@?KSyxgIs#{o(XaZH{Jz>CA z?4nj_t43j`MsJ0cN)91_@asZ&ta8N>*6zvsXCW|AosoKD{5TPT5V&Q3cEFx48~)Q2 z#BOZ3EH0IwG9XU2L>)UGArI7!*W$?sAk>;m%;v-UP+OJj@?i(W>6YU?Unv53oH*Dy zy+{Crhf)8^&EsM6Kw7Oead1-*{r|a0wK9=G9Sk)d=^f3(01k$1{sotJen3fdGZKTI zf+!GEyg>&d<~lvQ!YvABy1Bk#s12%%Fn9X?xt4k)oOlc z_Pyu!+9=(t z%zZzbvU0s4w;~B%S zULnJ2U(A!Z>R#7#`_-qH?FvR}Be8k9ftPYRk-tU>fYWXxPH_*MJiWlydH#Agba0Sy z?EwdBcmm}KMO;L|8_o~sodfv9ZEa%7&7tt%E{j5EmlP1$zmtfTNyz6ouv1)!a5xvV zP6y?%!WIG@8zF!B>@$Iqy6{tXB9~LiK9|$pdk%;je55|}=IWl#P4+t;HV&1vA^YT5 zJBfQM9Zf^GHJR(`Mh1Yn<2npJ*GU6~cO4=(;eJ@&At+tb3;+pZaiAO^*!O+`x;;SY z!7DIB!{db!CJoi)LzM>(0Be0=pM1!buCi6%4hSMqgZrA3xmX-dzcF3I(ZziUDy%#{^2}8i9SbwsU zV*;fmoVntks0hAFtqyo{co2iGlX@c+iz9)MSVhd(h>a4cSF@c6k2chO(Zks$D5gCO zZZbZZtsz?z6O+`{=4NZ_Pmg;8duL2i=~y*FIEQ8P-%og$et$mkJRLdW0C~CF$y%Lr z(Eqi4sxLs({ffWb(n9XMqeqm(w8d9*`*}u0@^~$Zj^-Q>AGz3q*N_`rHcUVhif%=X zEjCCoC-mtu4l$WN>X_WIZ*E_;!gZCNH5Oz?V#^vyfZd4cRB2S}Whf;(1M4HQP_rBT zL+v26sKkPTD~LRXK=eTr4$Sa=G#7^2DY(ZF25R+(iFl`*)-!Cy*q{@#MMQ)+L-o9nZ7yB#bB#C01Q8wTe>$}O1mO)A?$;oPbN-9K zVw{bN#AqCV(qD^sP5Q+B534B)bo=QXk!C4`NL}nHJExk|DfglW@$&f>i%2MdtRMsr ztT||Zm0dc|ghkGj3r?eiF^wFN^*;xn1E=V_U)Q(oh>(iruL#3QoF4FJQv@GIro zmUj>iX`Th|8Eym9k8=iqYVAa0FHZ{ofAG)Mvuzniy-xiAcPqg;ozbl(q-zTt*RuU| zo#AkV%bZ&{vTU^6gTe*T%~m&>grzyDiE{J z18?xBT|Gvqi&n0;!DD*9TyRh}mM(MG0QXE<7tF6jOk1jt6=F*o_k)0DT)94x+c@Ie zFWsKjlI$T!MhvQjF(lb_A2I>dwj2UE^mx=3A70WP&d3oaA|_;1Tf(8l=jiPA_2jeK z%Mftm>Az+y%~x}NcMd7ByvulPE-Z1{*%Fw$jgv>4AWf8oac*!b_N&X=324)=vs~w;o3Klf+{{y#+~MRF%2O zbcCaRz5Hf-z$Gr4KY^VjOH>*`!Q57TV2T#!k1iTGN3Fdtc`nNKr7HQjLEvIt4sEla z05$`_^kz$>(mN5Ax`>KMrWI*{erudllV2D;k^)xI!FiG^8&eVW*uSj0fsgE_J}1y$ z!9i0xN^!c!+xR-JaR&pKU~`>)Nzd#$dp88A5Vl4Rx7Z=WBd~`gwo)>U>a(ClI!H0f z0^eF*D1Zm`H#)h%wAW~p$(aSg(x%jQ3iS4bBMqP%$Y*^5{Sk)ef_Hpk{}uO&#c{D% zKVal6JF>-DNbHkNlP!ST0;~vk`)MQDdu*gO5mbNw#BJF5CHH;bdga`N?%v#)TtI!> z`wBPjnv>gp$zncMatY8?wAaDY$L4Ox@N8Og~EAI;y$~m z;betKe=yrfJM1CV#AZ5?Er7GEAN{?op$C><>RU-r7U)2flPl4=FF2Bbrc9g@0!m2` zN`@yroLeF&t@{D7Gol5Hq=bL|frDQp98oT}iGVbwNIZuIhV@bZo}IinlrgSvO#sAz zh*+0r&>z-X1=rjH{z$E<7KAhmJtA81Xcd(U7|cCpAc~;a?fT*EA>dsp5)uo%1ffJq z(o2j8unhq9leWwhfEO)2kSq{Ic{IVFO-fmtUmpuzaYaN?qmBzZ-FC^6!12dil~k|; z`E=BdZ>X8Gm_H-$=!pE@udo#>HewbsggEkO7q#c-t>H;RJcpqRBY3l&S(ObwLYQoG zRHG_WXVa&mC+qYG?z&=`=PlPrNpA;1wnL`t zPMO;{fwGS!(m`WbfyzW5X8voU6c_p}I#{f%&n_E;b8k5tL?1^Ul@bfW7)fFY--?tn z^qxI0l$zwoT2JpF_T8Fo-cBdTpRZ<5*7(Q^J_2N(H$g21xAD9R_e|fC{zOR71+Qa> z9THe|LP+;$>2in^5VOF|60goQe#g}#M%M=soSls%6V%x_Om~k$ARSa~kpSzR0-B{N&a&YE zw~>D3-E}SWqXZ|4jSfOCh0~RIw~Oe>!q*iT3<-pD-GcbVA$Sa?jv*8tZjw}pUO^v8 zN}H9&K6_Y)MPd)I9!R1`jvblZ(i~qpQme_tt?Q$*ix5d~p)8lZW9bzQif`*_=;>0p_7Q>+^#dd!mDi-M2_rqhpJg8W? zRWR5eHlQi7{nebl5Eh4TFTaN%cNqXb9|FJ+w*dKnTM=o| zTtgPo!sIzZTMk)5JY_oWX|u*ERCuBNhZvs{2kue=K`=5KLu33JA))%7(8Ndnc4u9p z0mL!D5@dBcg3GX)hem~cqD-+>?8tiVf@oz`48xoLnrz_Ag8*!4D}(>jA|~LuT84cK z2HJ)-Be7yN)|kupZ?ZpOv&Mwb@e4mo=$g0P*@%gx;6>2{5NNwkzaMef&_QU4X$#ZM7r-TB2g1c_+oj2cEjBf!)V8Xf5^hV+C%(<$brN}5oNOI7Ye#Ox!9Sj^lTV%&^OKwlDfT$# z9*;~R%h6aAey-a?{SWP@$%wHarv}3MERg;pI=BKa9h)8>OrT3VH&u|y)oQZD=}cK< zihRz&41@iiV~ad=Ss(6(t@pmtWhm3I+S#oj7Z}lO$~Oma%V2y zbXE8Q%*Dl|ff^gQIrf0Wa#rWj)p!s)>i~9%=1cIeApA3+;jJ$jmZ2*4Z$!AVJs$ z*qNj=5rd7?FT~#WlUrhF1CB3i0lJ%XH8-CYHFY!>bDa=0j*t<0+5?Y2(?g3O)YhP( zMCdvr!4>8e%^ORBbf^Q-i0;;3C|ifaW-;$k=;;UL@4~oq6mY($8Amf_8ZAO$i0~Nu z^XZp|ptLl6AuAif596QZO@qODAVM6Y)@CWBDLWr0vj=7J)RCM$zAx$}R;> z)wsF0zI|vUOT~R?#wjNX_$H0}Qyps21wKsH#r@KQKyPE5g<jq(;;5@#J{JOpVl6?(l9dkFi8RKG_17TglT|4;36 z`ZFFUUSuxqbJ)ZAxab^`zE3y9ZF~c;u{trZ&f@j6?~M$JYf82 z5R`j}=M?Y|fn!JHcLxsFahBPdklpOEG6shNr}SDkNKopb1W0ND5ln!RI(&zBTKB17#my$T~Q{*lqBvD73% ziE0IPf}l+YA}tzzsPpV*@lQ%kYWq(I0c56E55d{-zFnY8Gp9?(EO*F#OeDCHxVnmaq1^IyFNH_9^q4zxnqtZJv;96F5}nOZ{C? zpZmA4m;9nE{R`TVk4%BtAUdL&2bFZ46-!ulpv^gMEcq(C(^8Sm;tT2s!MSUEYd1pp z_0UfBc~({PtYrN)7rql+yQ!gMQ0wM*$_9qC*@)4>{0f$LKGg~|B1Fu@50{{2q3DS` zbAoclKbPQ0Oo%#$QF4SkOapG{nBsBq%*EY!sd~;wzs4VEo$;%~-TX@WCWgnebu~?^ zOVZ=^FlL?A*&lPpdS+SGh5NKLBJo5V9efZ{-6ml+QI+mOgJV%=V1;M~hym}=9MSEf zY5;%CLJJBsCd51@tP1aENI&l&%cTg(he{O_(*{X!shp3=OtQ1_etmcPX2d49I7$w# zi^OokOI2Xy`SY0yG5!Wd&OI-?A#a_Jo~V13Q=S|@&2B236>6nF)`+}$|Ehn4FQ~An zj|=*euTF9T54R{-`~oav&8kfjczJNVyhdbf&-UE~j-mfHa!Vb~*}}#l7lmAJ;8UG} zG$NdqVsR^i=#?E$(p{P9SbSP*bs@h`_Fq@6-R{0h3th0`>W@yLJ;Yx8loH6FU#15Q zqDeEkvyu`5q_PtB}=;q z+gsBl_HR?rz@FxnQz{A02kg!)J_$kecrutX_71iyRISwH+LKh}AYp9PLnH$eI(By= zR7xYiVp085ee!*L^dCiJBFj!R*-r_N@*r z?73HG%g*>87APXx7^0r|j$Y)ZkHYW^u*Vw?O&rH9nEeFNKY?Pv@~ddtCiMc-of|Lp zkp!!Qp_z3zeI%&Gt4Xnj~kyd`3#vwERPJ|d^ zFv}Hxp!fHU(ABotTTB029aY)4siK~Yd?(1tj2@< z5~M&#`UB@Zo)Mh#-VqY8I#iHo$ z;tKsfa5YDosMdqrQ)Fq;3rj@my*OHANinasry1JyM(0^Q;e42dW%B~>r_FN1=O@_s zkdsP*-~B5tOu%@>IwOf{QC+>*9wOzHHx=CHO=#tY;Pr~=Yy)fR=i(H@giob{S3feq ziA?J{zinmBrUSkP*U9m~^D)^g)0pNTo+bo81UdlQ8@rUE@~IM}Thrr)qiv^AEYxQn%4e zlyIb_0;W*Puatr-gyb5Wk?4yR+_wj25OEw(S@z_#9;?Y4$>s1xQVVXROco*~7}adl z3u&1y3-%0=`fL!wpCd60O59u!^l!_%7qK1%C6>$Jm3%~7C5(}JQv`}2%c$Wt1E{X_ zgA{w*k$Zq_a=4b3Zt-#(mVNztt-)uO8AJ0uz#84u4*YYq!4||(kdTiCI-st}GFml{ z1_R)yQFVDa?Aw>>0z<(>{#cx{ffh7I>?wUW-vuBf=crz`$dIJP6;qrm;$GWy|8*kp z<_Ck=_ca~dyi-fT9otjL`srUVu{Y2jXBuWp|EYTm2xaTNzriu-{+xz}eN)BAglgEm z1^ICkYhZKo7T?~AYJ1Gr3uxo8F^VyhQ&C6KJXsvUl7dNOhanEP&-qA#rj~D3=yJB*f zSz(Z~xyvybtwk*^4rOk<|FqTSd3AKKK0XcX_#*JtbqF&e4RoF8{=HgJ;9=u#XZ6b^ zO#-8GHayUIhm~~wDUojUcLZz9WLN~Z$X|cP_xC2mNNy3aJ_1s*Jp>>#IO0S9|CE&W zatF-~t=hfFvOJ%~pmU=-Ds179v#Km5Cy1l*okJv-ooYgV8E|J%QHVGX=vy$RAsdbg}N=`-(r(Kw=nn$)9Q| zP)EUTqjbFf^wvq#&1;5TY-cT>Mx`u6ET1-9 zmeZ4yjrz8@g{+sEVMd1v*k&@eW)(kYsN|xUElUGdES_b)S>MXLduS*^n{r1|Kst_DjWC>6?~pPPf0!n)VL!# zmbCg|Mfai!TxZp8x;lOxeRGduV78TsN~+Nrqx2ZC02yLs`bK_ucKEZ8^_hGtLDuZ) z6^8Wk7r`*wF!ze649QQhk zwNOp7t)5w&@YTd%jWF6GV6UBdorr*9ZkqyQC5rX#n@p=2IkJzPEgu%{-w@6(Z(jwWlUv`8J0~9 zLUUKDmY^jK7J};bSA%D`$gD?as0GG=WYuX~3!F*F5Eaj~7LZy;xK+JitJVzO#En)j z@T(1*f9$1{A*&ZT(>&SWnSR6&xwe=oFa2^34#XVHTrOV1NhCja&d29W!F}iJ+4n^A z2lN2CK1fEr+M!0nc>ncV+Vp}!LQJ1saphw*uk|Fu((V9cmxG9OCq$>KzX~1mn~oLw zQA93STlwu0<*DB*I+%5PjZJ3-7Yt^=2P`z9q_Lc9@oKNPvU>k(yRB;b(-vOv5m>BH z?J>UWS(NYY^D%lJlg)c=Wu5Gw&0ADdCF;h9P!df^X-*RmWwr8(3@%8Kwh@5wIr7G6_W zYDRrD+=j5xr*Fe(Ry276vI`pa_hn{MaM!v`jpER-c+ixzzYdUTg|n7&Hg!3D-i@*5a1sZ+hu!WTOA& zi@gt<4mLX*_&KOp9gp3no6RN>W-6QKShJk6=1q}uZ(Ug{i6_geN9j|0DP4^1I)*1Z zvq54>-02Y)taqE^Rwj)0AB<~I<`9P9FjRIOp@E>rfyDKvPD0ND8~de>$~V}kFCY7j zYwV3=_Vm}zW{0KOVs3KOR<-yAnwhFHvAkREq^Zol+>0m=5tc|t4ZM-Vd31Ip3d@hJ z;v1+Q3)GBKA79H9q>=T2la~xe)s@J{uM{`6;3Ip!>C7D|d|(1cNMu;+zXke-ZZ8y= z*{?=>kIrydhFpm{YByT}&Dj^mo0UghK9i75_Nkz2${6cO=5B}ZeiP`=J z+m?8p&5n#7zB=tt(#cR-(rJ5f3V)M4PK+fz!!ZJ7;rk{wxdFJ@He$~qj!jn>*LE|% z6J}p7*=w1moLe&d!ln&T`PdQr2)K*&lQ;WE)3Rny69+UsuLBspoeY?NWE-iasAir+S6qTHd%}FA@+IO#VIsBYkQs5{CzL@SJr}2UoM?XVS0ZoAxj8y zsjE5af8$+j&64wPm!*s*eJdlO&Wg`;0MjZ8qxnMLhy08c=B9Rg*NoD~phUKYj?^q$ z0q?&nPM@wpt62t_zA}Ct_~RM+9QVN=F#oT-=Kmo*8j$>7Su zs6(d6&XAix|1tin=?GTchPIU@O*;A#AG(DYI{S=&wM5XuOWxq`j?0a1IC?bm1cZ)8 z2#QosnsR^({QZ-V^ilhv1r1<|K$_@7L4c@uuz=}6A#}t^@!2E`^a)L04$>iMn7}l^ zT@ZNCI^t5Vn8!8h|5DS^d|zFsf6T`45AW3f3>7C92f5r@uEh>_n_w8~p-My#ibp)# z&WM9vrc!~;;cXKu7Fh?VCfixm<=sYCK53I7TYAen!z*aFScLS^5g`=+Ec@yP%b>XT zbmN0LaaVDKd&IJV<$;bh=SznFRPzJ2mI2PzjHy$_~6N zY1-rGURtJsZg~|P4yV3`4fLX%t#d|l1U-w`F0yj-;o1JBWk}b z<6*s(#(LDJ-YS%qY;>-gbgkll#^#(*>Bvo(oc^=VyYe%4g8TPdX#@Bv@5~sv0@)Hp z^kB&;t#x>ko{A@5E&FJ|(_(i2+illoaMZouH&uk`jiu}hC;s~gC6=!-Ca7YMGsi;^ zx{5bUeUHvhd_G^#hqWyTeG&cqSx$mS?#E= zgUs*-Oaa#$iO-NVrYco-dRg(LS7Fr0U`@eP=!G_K=Mj!CgX&652!s)ZBhCgRq7i(5 zZHCd^Kkft6g*B{(%1Mott1gz)*Dxo}+VM76(cBHBR&yM$>*X*V3m97vP9yx0`ei(; zND;0gVr?mT-^1s3^IP?xNKojRRJjgO%OiKAufyx8e7T3%u)VzqlC z#CUK2?tS9nxyy7(PazORA7xd!68<^_#`xIS?9L8^T4nDLk|9uQ8r3E4!4UT%xjQn| z21!NnJ?OK*%~%)zCa~5THz;i_XG`>R7Q7xxTWn;nWOc?dP%9`puYvMa!BcNYX%|Tj z;`W+=v4I33a@-c{>xH*2mm@+nu_Qsb8gj&z!Q42+nACSap$+*gP?9K_B})i5F0^ZVjy_fMVZ8^JM;d%vDaIFzes5lMZecsLgn zg`Wuaq1BK)3+sJ932|fNV*!@>Y+w5=-p7NcE~h{+RA)v~AKga8{@Hpg4V`L$w!a*d zi{d>;Vb(_&m>MH#7EfBih&g_SxRU{FY33O_cGLj+5hhps0IsIIFR`@kMmsUT0U>3~ zf0i#KnF0mYQYj+Xb-Bi!?u{z~=(0($2R+Y#%zCFGbfv}o00;VFZ_~763$Z{sdPG=Z zqS|^7KLLcw%RTwR;O8wNKZA%%5w1lzZODtwv5`CXs^8c$0fX=Fj7}bRs|BP~fi)3U zC#KMNs34MfpT3jJ7hSt#Lb~|otWj#LkD0+A%irC1N}XQzhw3=qJk563FV$%s z@RnP5)?4ndo)!@c$r&ea#tOci2!!-s-MF3x!f1pDz&wP&T%Llrl8J>DT$*EKTV z-W|D^Z_wMg4IzF^pg!)?!+G^tq3L1cGg)9?RDCFnq?jcluCGe3tti?KgfU&OzKDKD z{&~x(n(`r*>o4`T!7&iOHCziNbStg5fFL8l(I-u|;I5$n>n9R?f{&hMAkL5+oz&Tx zUOyQL!qb{Yy-1ecj-P3`jF;F`?>~^+@6hkxy$LJ^A~1mD?}eG&5B)F2s13$f(zwV* zdfFGCoMxpnx1|*` zP@r`$NcQg-Im{R$E+YON4v+mPC4DL?bk`BXdRpWEC8P%pzwAdC>8D*TB;KgYY{Q_o zu9A1P@dp!Io>Ho_>t{BAk-@Y$dF;-`1c(Ov%FrP?D#J}s=65le{q!ms;&0J7rS4CZ zw|o&!Fd3h@#Du&)A8-^diemuHITC=zFE3^%V#**X!c}xj7-!|q8l7Plk?(nY;gX| z&$K&ShaKJevey-m%Bl$bw5(7>1QZh=nX_;act;k*PHr|rKin5}LHN1g>CPHVnue>E zw^f57S3Hh}0U=))Cg1wBmv8L#v_EAePuC56`wzXB2YMG866=Qv(gs0FNni;lK6F-Z zv560aJtbp_vK0{)8h0YAk^c;#HSSVj8ZxE9DDj#UNeJ-|Gw+3KxO8hDoF#H(30HUO zFuYA0-w};pVS*OH4u-Oh$1Nq@`yUfHMyQU|xVTn2{l#T}D#MGt6uVLVs%ro1B?3dA zg5Lqlho6j?;14%#h~cA?{dkSndu-s~p~DDSph!Uu1D1!7B3V>nmG6id{46N@0(_`7 zd%?ZLXYnq!W~pz*z!qio|F~y&`|0?74LvGzR=TGn%=kCdV{;60*zkqrn)IXw9qSlR@-kJ z;|Em9JNHn?$Ha(ln%Yzr;gt@)Q+XD_5Qi%G9rhSEe>@H;zkQHPdk75s7ZX1 z`KpAMV_IZ%(m&3D`1GBe-5S2Nq8lLQ66F!*RduOBW$6rKjV|!_*~j_{_cLSvkH6b< z-=0oe#b-5Q2?4}f`NYr{Kw>B#*b8767(jga-{1d=|DVd=aQ{>PapI9_$0rI0O5lq1 zg?D~2;)(o$a0Ar%d!Z_PbF!F!?&%KMvR)3hDRkqs7kqY-W^19Mfjf9_`^-VmuMpfq zHc=)^V>UHXR$n#7e6YCaU{a;|v-T(qck|p-%^Bmqwt#nb1hEPix?#VKoA3Bbd(?c*_q(dkiz^~!eL$%#@nKRHU_2ES zlsr|^C09N<7+q>cUoEaaDH|7E!3na7$da|N1*~2(YBVwnk5)17{$qU)!h2z82Jz-U z^?k2_7YtsQ9nGV&3e1oo^vPsFsElo-1Y05GegEe4ddsi6fYiQV=fI$k7?+6yweT0Z zAx9JL?1dRG|EZz!oN4@Qkf^ zqt0hdN)po{&G|avEE|?ClCLx&5DO7&?^U__oFrnJcJ2U4B3Ew21K_!_#^KsfQKUEq z*=FkE=6{LyjiJb$u-iB4%Z>r*A^B&Z@iVP|?~Lby%_jQYP`?@lm&EJ;^3xV~`eM5V zzC-L~n0vr!ys}%L?ykaVv*%YIkmC2XyAK;CLWHsLMyr?zW+_|J9}E@IYVNP<&8eD`^k#0f-Yn!GP#-&9H12y!WTbnZSGykl_*u$a>cD(7*ND^ss=0E%;B zf{|Q}g7M<$&xkaV-ZwAb_V-95dGvkVDR<(8W*i9_J0Xz+XwC2hZRO~a_O8O3?WY55XX&cYK~Jb+Bq;Gmv1EpFt1QH! zd3%cO@Tz;bMuRdk3yVv#Apk-kE&?JTOBzp2H}M589*<&umj!Kx1@k1aXN`Tmv*#7{ zo3yzuN5Qdd-UPy2wsdhBqeb9Pi}wKsqT7${wHLRv9PppdK)<<_V^HhDJp7^TWU7%b z`I>VFfWbm}Q58Dn4k1plRfx6WZzq4s`+zj>b&2wK0Yg@G+XT#}gK?*`v*B@1y+*`T zQhZ?aMAe6nb0z&;;?P-S@R4NucLbd*zQXGYCnn@y)g+ZAdlLz|XOP5)sylNkh?bpC zdTx@v-c7k=5YS`RYus^q{ad3^DX)Wim2ER$-@b6IcrS%)#sQ(8ZU*$r@0OWC4RL5jK(( zBqoDw9L4+R&_$_<*vWS+sVLS}pKk!6alTbEm#u6hz`m80h&CWE(5l0SRcMs}@1VQ{ z`i+@Kd0O1*_mV~7AFV!Y453F{C;2I!R*Yfd?d)Q}g;CU`D{rvJG;BS8<|BcCK{8jO z_u#wv`9G7wUmZ-$c&~rKm<5qx#7dXI2N)AyWONmTNJ>gLST^aRAjt@7B!T=NhI4P) ziHWfx7A{I?uBBH8Fwg%|Qi6=!ANEytv`ks= zH6mm4^)3Q@#LFtb8jBmqsRf%MA@2Pebw_)Ro~-!X{unkqpV#aLY>`IokEY=*iA1eH+3_iNHIUG(jdkkrN+WT2vchfv2$xEEjuEn@fZJ;&Yf^dV;_R z6~Y(PBgqh`AWh1ux(BSgNs;rZ_UM60GQ===Ns(Ad?jlnUuR%eg)Z!Sz}W12j9EMO}4 zLNMA0UW5`cP2A~grnr9B5uySmTmW)WP+3^w_Lo;Y+}j1TB2m=Y(5 zIBb>!0d;l>;b6O#kKMnBY0kMSA%ut^pV$zt^v%ulKa z#0vF?O+8B3ia^|eL-_KqIyhR+YWU}WFa!j?Y+uj*tX)O6(LYST{wu=aT-{xcWB%t+ z{3-$gBTXMDH6G`%=3)yg0`omBReZn3)w-Tmm_#Uq&zS4?a#33p3k=kF%P^)d>tju&?7>%oy!likGt$^1Y_yfprBe6cLID5i?3SP%4uxv@%oQG%=6k z2DNvK|A$7B*sW?;OYOoY6D%nLe;SjeMV_m(Z26N%q)6pO@A4Q7{P&vuk1us`GMPlK z1JHn<>DY1Z?9uuH_{cbeTeJC~8CmD&_aKDEfgax0ob>-3l1Vn)`K*UPn)a=%mej`* z2vtE+su=Msk=3Ljz27$+`}$EGj`uVZa%hnj8D#NBT9jlH8C)?mD=*HIj$e1fb1*T^ z!v;W(@bLgfY9j86>mkfx5R6(B*zM!|1v)JCB}X55bx#BbruYYmp&?RY--4*H=|$4m zid<*U|1)=f(~{kCc!UkEv(Z6xM9nvbl@}VUQ{UjKxW6z1$VN^q>JO~_Ou=LNrq`tq zz8M6cq?V`cFkc5>l_jHoki(xL60}2!>8FQ#LK#`al0W&yg>gEF&@1-;VUkvn%5st8 zC*R{RzaDS?+VG=c(i4)T2Wx12d2GlxT-%wc*TM}e(?sQDsf;-!e;GCB$0lT**7Bt- zI*l4}A1a+k7Bo?r`LlMJ{d%5EFsw=!art6U_mT~wBrP(Dl40W(MAPKD+`*Htv9Zy| z607Y!o=6@H)(asZY)1KI1&iaWoDF9LN%EeJs(J^Rr#SsgS#} zKtnuyqr;2rw_TVH=T%pj!gY6p)b_uY?m)uRE(}aYIlEN8E4je+w5IO!oxlXJMLKB` zsVv^Pf=4CgCAL{q8(39gtpY#G|FT(#+9ICAvQ3loUmz71+?k#rN4#wG1qtv9Au-~+ zm{(cTVQJ~C71{VqKHk*_!#|Q;kMO>;#Y{B zNRo7fGCMjObL>^j%o3HoZlPB=^yRMVg`!@IU9Kk!^v&YM` z{mUq}rYe`c zbYd@vme{b5ATp7HC^)NOn)E~MOEw&Va2=$yu}e7d23t8v@iV0AhBF|DJXTh~1H#c6Yi6t_5-hm^ASse+H;qOy-R) zHe-;KJaPlUy=jpt{EYsj7+(zivSa6o+|C_AJmVtO?m==(LLSqHa?lg>1D@OF=1eV=~LaZ{7VhzF!Q!Hn@>i=#Vmo4V(@jOWz+D9E^`A4)=G1 zHL^vkA}X#x^-27j+-F|I<4$z=llL&eX6L2$$NvJBKxx0+G}163QIqT?%Yb_1^9y|d z1PdrJ0PMv<@)A$44{de40FTQ;JSESY=`m`tR};A>tbBx%91 z=A)l9b;YkFMV!HN^WzeB->f=Vr{V1=b0Z{O;RhGG!K(_kGY9F ztjVZSj~~PM5b+j4$Q%!kv>Xs}S`<7+%}3#*pZX(6Hgfpbx7<@D3z3>+p#0KQ4{(a~ zxt;^ck%qS~94VKgl%XadBzeI#O*?Wtx%|@cBMoD_fvkjnzz7!C&{vO3ld-pU{)~<~ z(MqlZr+^YiA`-<#5!^|`Ez;cb(v8pC?D$Wwo(iEz6Z)&XPz(B4LB5?~g%j{uG^YLbDj&w89s zO^+^El|f|Mk*U3Kmi!6)klx;2r|SkC!FJ`r1=3^`N7x(2T`=nCO{HZbID#m`WmUiR zE4=J_2Yl(j0!7qz(%7O1(ahEcOfKy7*q+s^M_p0IU=lmvM5$Fm&|pN7Px*9b2D`3l zS*^q4izA&5TSsYaP3@zd(f3lr>%DR0802H)cGT3=)@OCnfs6A4?z-U^JaKW~p6z>f ze0VJ|j2sej%Em8CC@_8*{(X-q*jKw2b!|fXmws@hwci^@E{zqe8YIT50b3hG?{ipI(wlnl@g7_|C5eD9FZo&w}>N-1WhC#!4bFH3q^3H z

        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 we stick to HTML5 in general?

        +

        Do we have tests for correspondence to these guidelines?

        + +**Contents** + +:TOC +{toc} + +## Indentations + +Use indentations to show parent/child relationships and emphasize hierarchy. Indent by four spaces at a time. +Do not use tabs or mix tabs and spaces for indentation. + +**Recommended** +{%highlight html%} + +
          +
        • One
        • +
        • Two
        • +
        +{%endhighlight%} + +## End of file +Add a blank line at the end of file. + +## Self-closing tags +Remember to close all self-closing tags. + +**Inappropriate** +{%highlight html%} +
        +image + +{%endhighlight%} + + +**Recommended** +{%highlight html%} +
        +image + +{%endhighlight%} + +

        Are self-closing tags ok in HTML5

        + +## Line length +Avoid code lines longer than 120 characters. When using an editor, it is inconvenient to scroll right and left to read the HTML code. Align tag attributes one under another to increase code readability. + +**Inappropriate** +{%highlight html%} + +{%endhighlight%} + +**Recommended** +{%highlight html%} + +{%endhighlight%} + +## Spaces around equals sign ("=") +Spaces around equals sign ("=") are acceptable, but not recommended, because the code without spaces is easier to read. + +**Not recommended** +{%highlight html%} + +{%endhighlight%} + +**Recommended** +{%highlight html%} + +{%endhighlight%} + +## Spaces and colon in attributes +For the sake of readability, using no space before the colon and one space after the colon, because this way makes code more readable. + +**Not recommended** +{%highlight html%} + + +{%endhighlight%} + +**Recommended** +{%highlight html%} + +{%endhighlight%} + +## Block-level elements +Use appropriate HTML5 elements for blocks. The following diagram shows, how to define, what HTML5 element to use for a block: + + + + +## Class names +Use semantic class names and IDs. Avoid presentational classes. + +**Inappropriate** +{%highlight html%} + +{%endhighlight%} + +**Recommended** +{%highlight html%} + + +{%endhighlight%} + +## Accessibility +All pages should be accessible for users with disabilities. For more information refer to [Web Content Accessibility Guidelines (WCAG) 2.0](https://www.w3.org/TR/WCAG20/). + +

        Do we keep up to this standard?

        + +## Microdata +All crucial pages (like product page) should contain [microdata](https://en.wikipedia.org/wiki/Microdata_(HTML)). Please pay attention to this recommendation when adding new functionality. + From 15ea81fc6a6232d05086a35a3c08f8bb2978006e Mon Sep 17 00:00:00 2001 From: Oleksandra Marchenko Date: Fri, 29 Jan 2016 13:44:43 +0200 Subject: [PATCH 072/902] Updated HTML style guide --- .../coding-standards/code-standard-html.md | 33 +++++++++---------- 1 file changed, 16 insertions(+), 17 deletions(-) diff --git a/guides/v2.0/coding-standards/code-standard-html.md b/guides/v2.0/coding-standards/code-standard-html.md index 3967579bd3e..218a9c81394 100644 --- a/guides/v2.0/coding-standards/code-standard-html.md +++ b/guides/v2.0/coding-standards/code-standard-html.md @@ -8,25 +8,26 @@ menu_order: 8 github_link: coding-standards/code-standard-html.md --- -This style guide defines Magento internal requirements for HTML code style for teams that develop LESS and CSS code. It is based on the [Google HTML/CSS Style Guide](https://google.github.io/styleguide/htmlcssguide.xml) with certain modifications that are described further. +This style guide defines Magento internal requirements for HTML code style for teams that develop LESS and CSS code. It is optional for third-party Magento developers. +The guide is based on the [Google HTML/CSS Style Guide](https://google.github.io/styleguide/htmlcssguide.xml) with certain modifications that are described further. -

        Do we stick to HTML5 in general?

        -

        Do we have tests for correspondence to these guidelines?

        **Contents** -:TOC -{toc} +* TOC +{:toc} ## Indentations -Use indentations to show parent/child relationships and emphasize hierarchy. Indent by four spaces at a time. -Do not use tabs or mix tabs and spaces for indentation. +Use only spaces for indentation: + +* Tab size: 4 spaces +* Indent size: 4 spaces +* Continuation indent: 4 spaces **Recommended** {%highlight html%} -
      -### Install the tool from GitHub for Magento Community Edition (CE) {#install-github} +### Install the tool from GitHub {#install-github} To install the Data Migration Tool from GitHub, use the following steps: 1. Log in to your Magento 2 server as a user with privileges to write to the Magento 2 file system or switch to the Magento file system owner. 2. Change to Magento 2 root directory. 3. Enter the following commands in the order shown: - composer config repositories.data-migration-tool git https://github.com/magento/data-migration-tool-ce + composer config repositories.data-migration-tool git https://github.com/magento/data-migration-tool composer require magento/data-migration-tool:dev-master 3. Wait while dependencies are updated. -### Install the tool from `repo.magento.com` for Magento CE {#install-repo} +### Install the tool from `repo.magento.com` {#install-repo} To install the Data Migration Tool, you must update `composer.json` in the Magento root installation directory to provide the location of the Data Migration Tool package. To install the Data Migration Tool, you must: @@ -46,7 +42,7 @@ To install the Data Migration Tool, you must: 3. Enter the following commands in the order shown: - composer config repositories.data-migration-tool git https://github.com/magento/data-migration-tool-ce + composer config repositories.data-migration-tool git https://github.com/magento/data-migration-tool composer require magento/data-migration-tool:dev-master 3. When prompted, enter your authentication keys. Your public key is your username; your private key is your password. diff --git a/guides/v2.0/migration/migration-tool-internal-spec.md b/guides/v2.0/migration/migration-tool-internal-spec.md index fc2cfd8cdeb..c8ee9e507b4 100644 --- a/guides/v2.0/migration/migration-tool-internal-spec.md +++ b/guides/v2.0/migration/migration-tool-internal-spec.md @@ -35,7 +35,7 @@ This section describes an implementation details of Data Migration Tool and how

      Repositories

      -Data Migration Tool repository migration-tool +Data Migration Tool repository migration-tool

      System requirements

      From 16b34011c1d75e1046488ead90452ee91fe67135 Mon Sep 17 00:00:00 2001 From: Oleksandra Marchenko Date: Fri, 29 Jan 2016 17:28:49 +0200 Subject: [PATCH 075/902] 46793_Added Dynamic rows topic --- common/images/ui-dynamic-row.png | Bin 0 -> 10767 bytes guides/v2.0/ui-components/ui_dynamic_rows.md | 105 +++++++++++++++++++ 2 files changed, 105 insertions(+) create mode 100644 common/images/ui-dynamic-row.png create mode 100644 guides/v2.0/ui-components/ui_dynamic_rows.md diff --git a/common/images/ui-dynamic-row.png b/common/images/ui-dynamic-row.png new file mode 100644 index 0000000000000000000000000000000000000000..2c63194316940b32ee27e0e2469e227ccec1b9fb GIT binary patch literal 10767 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 + +**Contents:** + +* TOC +{:toc} + +

      definition.xml?

      + +## Dynamic Rows JS Component Structure +Component Elements (classes, files, etc) + + +- The dynamic Rows component is implemented in the class `app\code\Magento\Ui\view\base\web\js\dynamic-rows\dynamic-rows.js` and has extended component to transfer data with grid `app\code\Magento\Ui\view\base\web\js\dynamic-rows\dynamic-rows-grid.js` +- Record component: `app\code\Magento\Ui\view\base\web\js\dynamic-rows\record.js` +- For Drag and Drop dynamic-rows use module: `app\code\Magento\Ui\view\base\web\js\dynamic-rows\dnd.js` +- Templates used by this component are: + - `app\code\Magento\Ui\view\base\web\templates\dynamic-rows\templates\default.html` + - `app\code\Magento\Ui\view\base\web\templates\dynamic-rows\templates\grid.html` + - `app\code\Magento\Ui\view\base\web\templates\dynamic-rows\templates\collapsible.html` +- Templates for fields: + - `app\code\Magento\Ui\view\base\web\templates\dynamic-rows\cells\action-delete.html`, + - `app\code\Magento\Ui\view\base\web\templates\dynamic-rows\cells\text.html`. +Also Dynamic rows uses Form field templates. + +## Integration + +

      What is this xml file? Is it something we should if we want to use the component? where should it be added?

      + +{%highlight xml%} + + + + + record + + + + + + true + true + Magento_Ui/js/lib/core/collection + + + + + + text + select + currentDataScopeName + currentLabel + + + Item + 0 + + + + + + + + +{%endhighlight%} + +## Configuration + +## Public methods +`setDisabled(state)` - disabled or enabled all grid +`state` - {Boolean} - Grid state +`setColumnDisabled(index, state)` - disabled or enabled some column in grid +`index `- {Number} - Column index +`state` - {Boolean} - Column state +`setVisible(state)` - set visibility to all grid +`state` - {Boolean} - Grid state +`setColumnVisibility(index, state)` - show or hide some column in grid +`index` - {Number} - Column index +`state` - {Boolean} - Column state +`reload()` - rerender records +`onUpdateRecordTemplate(templateName)` - rerender records with new template +`templateName` - {String} - new template name +`sort(position, elem)` - sort elements by position +`position` - {Number} +`elem` - {Object} +`deleteRecord(index)` - delete record by index +`index` - {Number} - index record +`addChild(data, index)` - render new record instance +`data` - {Object} - object with instance data +`index` - {Number} - index for new instance From 97a8b74a0dfc5d75fa9a5e026bc0dd4bf8d0c458 Mon Sep 17 00:00:00 2001 From: Oleksandra Marchenko Date: Fri, 29 Jan 2016 17:33:47 +0200 Subject: [PATCH 076/902] 46793: removed wrongly added files --- common/images/ui-dynamic-row.png | Bin 10767 -> 0 bytes guides/v2.0/ui-components/ui_dynamic_rows.md | 105 ------------------- 2 files changed, 105 deletions(-) delete mode 100644 common/images/ui-dynamic-row.png delete mode 100644 guides/v2.0/ui-components/ui_dynamic_rows.md diff --git a/common/images/ui-dynamic-row.png b/common/images/ui-dynamic-row.png deleted file mode 100644 index 2c63194316940b32ee27e0e2469e227ccec1b9fb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10767 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 - -**Contents:** - -* TOC -{:toc} - -

      definition.xml?

      - -## Dynamic Rows JS Component Structure -Component Elements (classes, files, etc) - - -- The dynamic Rows component is implemented in the class `app\code\Magento\Ui\view\base\web\js\dynamic-rows\dynamic-rows.js` and has extended component to transfer data with grid `app\code\Magento\Ui\view\base\web\js\dynamic-rows\dynamic-rows-grid.js` -- Record component: `app\code\Magento\Ui\view\base\web\js\dynamic-rows\record.js` -- For Drag and Drop dynamic-rows use module: `app\code\Magento\Ui\view\base\web\js\dynamic-rows\dnd.js` -- Templates used by this component are: - - `app\code\Magento\Ui\view\base\web\templates\dynamic-rows\templates\default.html` - - `app\code\Magento\Ui\view\base\web\templates\dynamic-rows\templates\grid.html` - - `app\code\Magento\Ui\view\base\web\templates\dynamic-rows\templates\collapsible.html` -- Templates for fields: - - `app\code\Magento\Ui\view\base\web\templates\dynamic-rows\cells\action-delete.html`, - - `app\code\Magento\Ui\view\base\web\templates\dynamic-rows\cells\text.html`. -Also Dynamic rows uses Form field templates. - -## Integration - -

      What is this xml file? Is it something we should if we want to use the component? where should it be added?

      - -{%highlight xml%} - - - - - record - - - - - - true - true - Magento_Ui/js/lib/core/collection - - - - - - text - select - currentDataScopeName - currentLabel - - - Item - 0 - - - - - - - - -{%endhighlight%} - -## Configuration - -## Public methods -`setDisabled(state)` - disabled or enabled all grid -`state` - {Boolean} - Grid state -`setColumnDisabled(index, state)` - disabled or enabled some column in grid -`index `- {Number} - Column index -`state` - {Boolean} - Column state -`setVisible(state)` - set visibility to all grid -`state` - {Boolean} - Grid state -`setColumnVisibility(index, state)` - show or hide some column in grid -`index` - {Number} - Column index -`state` - {Boolean} - Column state -`reload()` - rerender records -`onUpdateRecordTemplate(templateName)` - rerender records with new template -`templateName` - {String} - new template name -`sort(position, elem)` - sort elements by position -`position` - {Number} -`elem` - {Object} -`deleteRecord(index)` - delete record by index -`index` - {Number} - index record -`addChild(data, index)` - render new record instance -`data` - {Object} - object with instance data -`index` - {Number} - index for new instance From a71ae23e71014ba81ca378d621c20025aba564f8 Mon Sep 17 00:00:00 2001 From: Oleksandra Marchenko Date: Fri, 29 Jan 2016 17:52:23 +0200 Subject: [PATCH 077/902] 2496 Updated the form field template topic --- guides/v2.0/howdoi/checkout/checkout_edit_form.md | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/guides/v2.0/howdoi/checkout/checkout_edit_form.md b/guides/v2.0/howdoi/checkout/checkout_edit_form.md index 229afe13e0f..42072c6fcc9 100644 --- a/guides/v2.0/howdoi/checkout/checkout_edit_form.md +++ b/guides/v2.0/howdoi/checkout/checkout_edit_form.md @@ -9,7 +9,7 @@ github_link: howdoi/checkout/checkout_edit_form.md ---

      What's in this topic

      -This topic describes how to change the HTML templates of form fields in forms on the Checkout page. This refers to the forms used on both steps of the Checkout: Shipping Information step and Review and Payments Information step. By changing the template you can add additional elements displayed with the field, for example images, change the CSS class assigned to it, add attributes and so on. +This topic describes how to replace the HTML template for a form field on the Checkout page. You might need to replace the template in order to add elements displayed with the field, change the CSS class assigned to it, add attributes and so on.

      Overview

      @@ -31,7 +31,7 @@ There are more details about each step in the following sections. [Set Magento to the production mode]({{site.gdeurl}}config-guide/cli/config-cli-subcommands-mode.html) while you perform all customizations and debugging. -For the sake of compatibility, upgradability, and easy maintenance, do not edit the default Magento code, add your customizations in a separate module. For your checkout customization to be applied correctly, your custom module should [depend]({{site.gdeurl}}extension-dev-guide/composer-integration.html) on the Magento_Checkout module. +For the sake of compatibility, upgradability, and easy maintenance, do not edit the default Magento code. Instead, add your customizations in a separate module. For your checkout customization to be applied correctly, your custom module should [depend]({{site.gdeurl}}extension-dev-guide/composer-integration.html) on the Magento_Checkout module. ## Implement the HTML template for the field {#template} @@ -58,7 +58,7 @@ Example of a field template: {%endhighlight%}
      -

      Original templates of all form field types are located in the app/code/Magento/Ui/view/base/web/templates/form/element directory.

      +

      The original templates of all form field types are located in the app/code/Magento/Ui/view/base/web/templates/form/element directory.

      ## Specify the new template in layout {#layout} @@ -112,6 +112,9 @@ In this file, add content similar to the following: ## Modifying the custom template after it was applied {#modify} -If you modify your custom `.html` template after it was applied on the store pages, the changes will not apply until you do the following: delete all files in the `pub/static/frontend` and `var/view_preprocessing` directories, and then reload the pages. +If you modify your custom `.html` template after it was applied on the store pages, the changes will not apply until you do the following: + +1. Delete all files in the `pub/static/frontend` and `var/view_preprocessing` directories. +2. Reload the pages. From 0d00b6ccd3bea884c7a0a54b29da2ea7aa67f4bd Mon Sep 17 00:00:00 2001 From: stevjohnson Date: Fri, 29 Jan 2016 17:24:42 -0600 Subject: [PATCH 078/902] Minor updates to tech bulletin --- guides/v2.0/release-notes/tech_bull_201-upgrade.md | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/guides/v2.0/release-notes/tech_bull_201-upgrade.md b/guides/v2.0/release-notes/tech_bull_201-upgrade.md index 066e80d8abc..7e45d62bbef 100644 --- a/guides/v2.0/release-notes/tech_bull_201-upgrade.md +++ b/guides/v2.0/release-notes/tech_bull_201-upgrade.md @@ -174,10 +174,13 @@ To resolve the issue:

      You can upgrade to either magento/product-community-edition 2.0.2 or magento/product-community-edition 2.0.1; we recommend 2.0.2.

      +6. After the commands complete, enter the following command to update the database schema and data: -6. Verify your server is running version 2.0.2 in any of the ways discussed earlier in this resolution. + php bin/magento setup:upgrade +6. Verify your server is running version 2.0.1 or 2.0.2 in any of the ways discussed earlier in this resolution. + #### Resolution 2 (upgrade to 2.0.1 or 2.0.2 has failed) {#resolution2} To resolve the missing `.gitignore` files issue using this method, all of the following must be true: @@ -204,11 +207,14 @@ To resolve the issue: composer update 7. Wait while the command completes. +6. After the command completes, enter the following command to update the database schema and data: + + php bin/magento setup:upgrade 8. Delete the following files from `/var` directory: * `.update_error.flag` * `.maintenance.flag` -8. Verify your Magento version is 2.0.1 in any of the following ways: +8. Verify your Magento version is 2.0.1 or 2.0.2 in any of the following ways: * Using the `php /bin/magento --version` command * Log in to the Magento Admin. The version displays in the lower right corner of the page. From adfb0b4614a75533e93e3ba94697bfd06fb57710 Mon Sep 17 00:00:00 2001 From: stevjohnson Date: Sat, 30 Jan 2016 10:18:20 -0600 Subject: [PATCH 079/902] Update _config.yml with new site variables --- _config.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/_config.yml b/_config.yml index 8e744792780..490b4c78d5a 100644 --- a/_config.yml +++ b/_config.yml @@ -13,27 +13,27 @@ markdown_ext: "markdown,mkdown,mkdn,mkd,md" # 2.0.0 variables gdeurl: "/guides/v2.0/" -githuburl: "https://github.corp.ebay.com/Magento/devdocs_internal/tree/develop/guides/v2.0/" +githuburl: "https://github.com/magento/devdocs/tree/2.0/guides/v2.0/" mage2000url: "https://github.com/magento/magento2/blob/2.0/" # 1.x variables m1xgdeurl: "/guides/m1x/" -m1xgithuburl: "https://github.corp.ebay.com/Magento/devdocs_internal/tree/develop/guides/m1x/" +m1xgithuburl: "https://github.com/magento/devdocs/tree/m1x/guides/m1x/" # 2.1.0 variables gdeurl21: "/guides/v2.1/" -githuburl21: "https://github.corp.ebay.com/Magento/devdocs_internal/tree/develop/guides/v2.1/" +githuburl21: "https://github.com/magento/devdocs/tree/2.1/guides/v2.1/" mage2100url: "https://github.com/magento/magento2/blob/2.1/" # 2.2.0 variables gdeurl22: "/guides/v2.2/" -githuburl22: "https://github.corp.ebay.com/Magento/devdocs_internal/tree/develop/guides/v2.2/" +githuburl22: "https://github.com/magento/devdocs/tree/2.2/guides/v2.2/" mage2200url: "https://github.com/magento/magento2/blob/2.2/" # 2.3.0 variables gdeurl23: "/guides/v2.3/" -githuburl23: "https://github.corp.ebay.com/Magento/devdocs_internal/tree/develop/guides/v2.3/" +githuburl23: "https://github.com/magento/devdocs/tree/2.3/guides/v2.3/" mage2300url: "https://github.com/magento/magento2/blob/2.3/" # Other variables From a5d0543483a0d497e4620d9fe7064088be6bc5f8 Mon Sep 17 00:00:00 2001 From: stevjohnson Date: Sat, 30 Jan 2016 13:14:02 -0600 Subject: [PATCH 080/902] Start a POC of merging Marketplace Quick Start guide with PHP Developer Guide --- .../extension-dev-guide/developers_roadmap.md | 31 ++++++++++--------- .../developers_roadmap_composer.md | 17 ++++++++++ .../developers_roadmap_glossary.md | 18 +++++++++++ .../v2.0/extension-dev-guide/introduction.md | 23 ++++++++------ 4 files changed, 65 insertions(+), 24 deletions(-) create mode 100644 guides/v2.0/extension-dev-guide/developers_roadmap_composer.md create mode 100644 guides/v2.0/extension-dev-guide/developers_roadmap_glossary.md diff --git a/guides/v2.0/extension-dev-guide/developers_roadmap.md b/guides/v2.0/extension-dev-guide/developers_roadmap.md index ab0ec24c071..b8be45350ce 100644 --- a/guides/v2.0/extension-dev-guide/developers_roadmap.md +++ b/guides/v2.0/extension-dev-guide/developers_roadmap.md @@ -7,27 +7,28 @@ menu_title: Developer roadmap menu_order: 2 github_link: extension-dev-guide/developers_roadmap.md redirect_from: /guides/v1.0/extension-dev-guide/developers_roadmap.html - --- -##{{page.menu_title}} +##{{page.menu_title}} -This topic introduces the high-level workflow for a developer who wants to create, customize, or contribute to the Magento code and components. -

      Developer Resources

      -There are several resources that you might want to take a look at as you consider your workflow: +This section helps you understand how to develop, package, and distribute your component. -1. See the Sample extensions created by the Magento 2 Core team. -2. Magento 2 Developers Hub, at magento.com/developers/magento2. -3. The Magento 2 Documentation Library, with Guides such as Coding Standards, Frontend Developers Guide, Installation and Configuration, and other documents about issues like our backwards compatibility policy, versioning, and using Magento APIs. +Key points: +* `composer.json` and `registration.php` are required for *all* components. +* `.zip` your extension as discussed in the packaging topic. +* *(For distribution on Magento Marketplace only)*: The package you upload to Magento Marketplace should not be more than 30MB in size. -

      Workflow and related decisions

      -Now let's take a look at a high-level workflow, and consider some questions that you might have to decide before continuing. +#### For more information +* Introduction to Composer +* Glossary of common terms +* For more information -

      Developer's roadmap

      +#### Other helpful resources +* Sample extensions created by the Magento 2 Core team. +* Magento 2 Developers Hub, at magento.com/developers/magento2. +* *(For distribution on Magento Marketplace only)*: -
      -

      Take a look at a sample module created by the Magento Core Team.

      -

      The Magento core team is creating a collection of samples to demonstrate technologies introduced in Magento 2. You can edit your Magento 2 composer.json file to declare a dependency upon this package of sample modules, and then run composer update to download them. Look for more sample modules as we build them.

      -
      + * Marketplace Submission Guidelines + * Marketplace Review Workflow \ No newline at end of file diff --git a/guides/v2.0/extension-dev-guide/developers_roadmap_composer.md b/guides/v2.0/extension-dev-guide/developers_roadmap_composer.md new file mode 100644 index 00000000000..43dbc8e139a --- /dev/null +++ b/guides/v2.0/extension-dev-guide/developers_roadmap_composer.md @@ -0,0 +1,17 @@ +--- +layout: default +group: extension-dev-guide +subgroup: 1_Introduction +title: Composer and Magento +menu_title: Composer and Magento +menu_order: 5 +github_link: extension-dev-guide/developers_roadmap_composer.md +--- + +##{{page.menu_title}} + + +Outline: + +* About Composer +* About composer.json, including pointers to various ones on the Magento 2 GitHub \ No newline at end of file diff --git a/guides/v2.0/extension-dev-guide/developers_roadmap_glossary.md b/guides/v2.0/extension-dev-guide/developers_roadmap_glossary.md new file mode 100644 index 00000000000..9bbf98e5b61 --- /dev/null +++ b/guides/v2.0/extension-dev-guide/developers_roadmap_glossary.md @@ -0,0 +1,18 @@ +--- +layout: default +group: extension-dev-guide +subgroup: 1_Introduction +title: Glossary of common terms +menu_title: Glossary of common terms +menu_order: 10 +github_link: extension-dev-guide/developers_roadmap_glossary.md +--- + +##{{page.menu_title}} + + +Outline: + +* Definitions of module, theme, language package +* Definition of metapackage +* What the Component Manager is and how it helps customers update their components \ No newline at end of file diff --git a/guides/v2.0/extension-dev-guide/introduction.md b/guides/v2.0/extension-dev-guide/introduction.md index 678453d32d4..c371c32d29c 100644 --- a/guides/v2.0/extension-dev-guide/introduction.md +++ b/guides/v2.0/extension-dev-guide/introduction.md @@ -12,23 +12,28 @@ redirect_from: /guides/v1.0/extension-dev-guide/introduction.html ##{{page.menu_title}} -This guide is for developers that or are building a new module from scratch for custom extension of Magento functionality. This guide is also for those who want to create an extension for Magento Connect, although it does not cover the publishing process. +This guide is for developers that are building a new *component* from scratch for custom extension of Magento functionality. +##Magento is made up of the following types of components: -##Magento is made up of components: -* Modules -* Themes -* Language packages + * Modules (extend Magento capabilities) + * Themes (change the look and feel of your storefront and Admin) + * Language packages (localize the storefront and Admin) + * Libraries (common code) +A Magento *module* is a discrete chunk of code that accomplishes a particular business function or handles a Magento feature. A module is typically a collection `.php` and `.xml` files, and the bulk of your work in modules will be in these files. Modules interact with each other. A module also contains any user interface required for a user's interaction with the module, and any application interfaces that another module or code chunk might call, if you decide to expose any application interface to other Magento modules. -A Magento *module* is a discrete chunk of code that accomplishes a particular business function or handles a Magento feature. A module is typically a collection `.php` and `.xml` files, and the bulk of your work in modules will be in these files. Modules are interactive with each other. A module also contains any user interface required for a user’s interaction with the module, and any application interfaces that another module or code chunk might call, if you decide to expose any application interface to other Magento modules. +Themes can be applied to the module to change its appearance. So when you are building a module, you might also touch themes and language packages. -Themes can be applied to the module to change its appearance. So when you are building a module, you may also touch themes and language packages. +A *package* is a component that is wrapped up in a distributable form. Usually you will use Composer to do this. -A *package* is a module that is wrapped up in a distributable form. Usually you will use Composer to do this. +An *extension* is a component that are packaged for sale on Magento Marketplace. + +
      +

      Magento Marketplace is one way to distribute your components. This guide provide information about how to distribute your components using other means as well (such as a separate source control repository).

      +
      -An *extension* is a module or modules that are packaged for sale on Magento Connect.
      From bfb4f3b4334e2ce571543ca4ce3cdf03cb454fa3 Mon Sep 17 00:00:00 2001 From: stevjohnson Date: Sat, 30 Jan 2016 19:39:17 -0600 Subject: [PATCH 081/902] Add redirect for tech bulletin --- guides/v2.0/release-notes/tech_bull_201-upgrade.md | 1 + 1 file changed, 1 insertion(+) diff --git a/guides/v2.0/release-notes/tech_bull_201-upgrade.md b/guides/v2.0/release-notes/tech_bull_201-upgrade.md index 7e45d62bbef..7816e29a4b9 100644 --- a/guides/v2.0/release-notes/tech_bull_201-upgrade.md +++ b/guides/v2.0/release-notes/tech_bull_201-upgrade.md @@ -7,6 +7,7 @@ menu_title: Magento upgrade issues (Jan. 28, 2016) menu_node: menu_order: 1 github_link: release-notes/tech_bull_201-upgrade.md +redirect_from: /guides/v2.0/release-notes/tech_bull_jan_22_16.html --- ## Magento upgrade issues (Jan. 28, 2016) From a19ec4003e37ddc1bb9ece35fda191f26dede52b Mon Sep 17 00:00:00 2001 From: stevjohnson Date: Sun, 31 Jan 2016 10:42:08 -0600 Subject: [PATCH 082/902] Mock up for merging PHP Dev Guide and Marketplace Quick Start Guide --- .../bk-extension-dev-guide.md | 3 --- .../component-registration.md | 22 ++++++++-------- .../composer-integration.md | 14 +++++------ .../extension-dev-guide/developers_info.md | 25 +++++++++++++++++++ .../extension-dev-guide/developers_roadmap.md | 8 ++---- .../developers_roadmap_composer.md | 2 +- .../developers_roadmap_glossary.md | 2 +- .../module-file-structure.md | 6 ++--- guides/v2.0/extension-dev-guide/prepare.md | 14 +++++------ .../extension-dev-guide/prepare_file-str.md | 19 ++++++++++++++ .../extension-dev-guide/prepare_summary.md | 24 ++++++++++++++++++ .../v2.0/mktpl-quickstart/intro-moreinfo.md | 3 --- 12 files changed, 98 insertions(+), 44 deletions(-) create mode 100644 guides/v2.0/extension-dev-guide/developers_info.md create mode 100644 guides/v2.0/extension-dev-guide/prepare_file-str.md create mode 100644 guides/v2.0/extension-dev-guide/prepare_summary.md diff --git a/guides/v2.0/extension-dev-guide/bk-extension-dev-guide.md b/guides/v2.0/extension-dev-guide/bk-extension-dev-guide.md index 76cc07828f4..16f252873af 100644 --- a/guides/v2.0/extension-dev-guide/bk-extension-dev-guide.md +++ b/guides/v2.0/extension-dev-guide/bk-extension-dev-guide.md @@ -28,9 +28,6 @@ A Magento *module* is code that accomplishes a particular business function or h *Language packages* provide translations for strings that display on the storefront and Admin. -This guide focuses on Magento modules. - -

      You must follow a PSR compliant structure when building a module.

      diff --git a/guides/v2.0/extension-dev-guide/component-registration.md b/guides/v2.0/extension-dev-guide/component-registration.md index 0c805b370fa..562ef2738e7 100644 --- a/guides/v2.0/extension-dev-guide/component-registration.md +++ b/guides/v2.0/extension-dev-guide/component-registration.md @@ -2,8 +2,8 @@ layout: default group: extension-dev-guide subgroup: 3_Build -title: Component registration -menu_title: Component registration +title: Register your component +menu_title: Register your component menu_order: 4 github_link: extension-dev-guide/component-registration.md redirect_from: /guides/v1.0/extension-dev-guide/component-registration.html @@ -12,13 +12,12 @@ redirect_from: /guides/v1.0/extension-dev-guide/component-registration.html ##{{page.menu_title}} -Magento components, including modules, themes, and languages, must be registered in the Magento system through the Magento `ComponentRegistrar` class. +Magento components, including modules, themes, and language packages, must be registered in the Magento system through the Magento `ComponentRegistrar` class. Each component must have a file called `registration.php` in its root directory. For example, here is the `registration.php` file for Magento's [AdminNotification module]({{ site.mage2000url }}app/code/Magento/AdminNotification/registration.php). Depending on the type of component, registration is performed through `registration.php` by adding to it as follows: ###Modules - -Modules are registered with: +Register modules with: ComponentRegistrar::register(ComponentRegistrar::MODULE, '', __DIR__); @@ -35,7 +34,7 @@ where <VendorName> is the name of the company providing the module and <Mo ###Themes -Themes are registered with: +Register themes with: ComponentRegistrar::register(ComponentRegistrar::THEME, '//', __DIR__); @@ -48,8 +47,8 @@ where <area> is the functional area of the module (frontend, controller, and

       

      -###Languages -Languages are registered with: +###Language packages +Register language packages with: ComponentRegistrar::register(ComponentRegistrar::LANGUAGE, '_', __DIR__); @@ -60,9 +59,8 @@ where <VendorName> is the name of the company providing the package and <p

       

      -###Invoke registration.php in composer.json with autoload - -After you create your `registration.php` file and you are creating [your module's composer.json file](create_module.html#add-the-module8217s-composerjson-file), remember to invoke your `registration.php` file in the autoload section of `composer.json`: +###Invoke `registration.php` in `composer.json` with autoload +After you create your `registration.php` file and you are creating [your module's composer.json file](create_module.html#add-the-module8217s-composerjson-file), invoke your `registration.php` file in the `autoload` section of `composer.json`: { "name": "Acme-vendor/bar-component", @@ -74,7 +72,7 @@ After you create your `registration.php` file and you are creating [your module'

       

      -##Sample registration.php file +##Sample `registration.php` file {% highlight php startinline=true %} -Some third party components that the Magento system uses may be actually not present in the code base. Instead, they are listed as dependencies in the root `composer.json` file. - +[Composer](https://getcomposer.org/) is a dependency manager for PHP. Magento 2 uses Composer to package components and product editions. + +Some third-party components that the Magento system uses might not be present in the code base. Instead, they are listed as dependencies in the root `composer.json` file.

      Overview of composer.json files

      Certain Magento components and product editions are represented with `composer.json` files. @@ -141,9 +141,9 @@ Where: `suffix` is anything that allows distinguishing/disambiguating the component within that type.

      Magento-specific package types

      -Each Magento component can be categorized into one of the types listed in the preceding table. If any component does not fit into a specific category, it can be generalized to `magento-component`. +Each Magento component can be categorized into one of the types listed in the preceding table. If any component does not fit into a specific category, it can be generalized to `magento2-component`. Having an identifier type for each component allows the system to marshal the directories and files of each component to the correct locations, based on the Magento 2 directory structure.

      Composer Binary Location

      -Magento's bin/magento script uses composer from the vendor/composer directory in your Magento 2 installation, not your globally installed composer. Keep this in mind while customizing or updating composer or troubleshooting Composer issues while working with Magento 2. +Magento's `bin/magento` script uses composer from the `vendor/composer` directory in your Magento 2 installation, not your globally installed Composer. Keep this in mind while customizing or updating composer or troubleshooting Composer issues while working with Magento 2. diff --git a/guides/v2.0/extension-dev-guide/developers_info.md b/guides/v2.0/extension-dev-guide/developers_info.md new file mode 100644 index 00000000000..a0435f421d6 --- /dev/null +++ b/guides/v2.0/extension-dev-guide/developers_info.md @@ -0,0 +1,25 @@ +--- +layout: default +group: extension-dev-guide +subgroup: 1_Introduction +title: For more information +menu_title: For more information (new) +menu_order: 200 +github_link: extension-dev-guide/developers_info.md +--- + +##{{page.menu_title}} + + +For more information about component development, see the following: + +* PHP Developer Guide for step-by-step details of all aspects of development. +* Themes topic in the Frontend Developer Guide for information about themes. +* Translation dictionaries and language packages for language packages. + +For Magento Marketplace only: + +* Roadmap +* Review +* Submit an extension +* \ No newline at end of file diff --git a/guides/v2.0/extension-dev-guide/developers_roadmap.md b/guides/v2.0/extension-dev-guide/developers_roadmap.md index b8be45350ce..8c98ab796d1 100644 --- a/guides/v2.0/extension-dev-guide/developers_roadmap.md +++ b/guides/v2.0/extension-dev-guide/developers_roadmap.md @@ -3,7 +3,7 @@ layout: default group: extension-dev-guide subgroup: 1_Introduction title: Developer roadmap -menu_title: Developer roadmap +menu_title: Developer roadmap (updated) menu_order: 2 github_link: extension-dev-guide/developers_roadmap.md redirect_from: /guides/v1.0/extension-dev-guide/developers_roadmap.html @@ -27,8 +27,4 @@ Key points: #### Other helpful resources * Sample extensions created by the Magento 2 Core team. -* Magento 2 Developers Hub, at magento.com/developers/magento2. -* *(For distribution on Magento Marketplace only)*: - - * Marketplace Submission Guidelines - * Marketplace Review Workflow \ No newline at end of file +* Magento 2 Developers Hub, at magento.com/developers/magento2. \ No newline at end of file diff --git a/guides/v2.0/extension-dev-guide/developers_roadmap_composer.md b/guides/v2.0/extension-dev-guide/developers_roadmap_composer.md index 43dbc8e139a..ec1895f5d7f 100644 --- a/guides/v2.0/extension-dev-guide/developers_roadmap_composer.md +++ b/guides/v2.0/extension-dev-guide/developers_roadmap_composer.md @@ -3,7 +3,7 @@ layout: default group: extension-dev-guide subgroup: 1_Introduction title: Composer and Magento -menu_title: Composer and Magento +menu_title: Composer and Magento (new) menu_order: 5 github_link: extension-dev-guide/developers_roadmap_composer.md --- diff --git a/guides/v2.0/extension-dev-guide/developers_roadmap_glossary.md b/guides/v2.0/extension-dev-guide/developers_roadmap_glossary.md index 9bbf98e5b61..174ccbc29ea 100644 --- a/guides/v2.0/extension-dev-guide/developers_roadmap_glossary.md +++ b/guides/v2.0/extension-dev-guide/developers_roadmap_glossary.md @@ -3,7 +3,7 @@ layout: default group: extension-dev-guide subgroup: 1_Introduction title: Glossary of common terms -menu_title: Glossary of common terms +menu_title: Glossary of common terms (new) menu_order: 10 github_link: extension-dev-guide/developers_roadmap_glossary.md --- diff --git a/guides/v2.0/extension-dev-guide/module-file-structure.md b/guides/v2.0/extension-dev-guide/module-file-structure.md index 3fe21e6735b..a1c9a130dbe 100644 --- a/guides/v2.0/extension-dev-guide/module-file-structure.md +++ b/guides/v2.0/extension-dev-guide/module-file-structure.md @@ -2,12 +2,12 @@ layout: default group: extension-dev-guide subgroup: 3_Build -title: Component file structure -menu_title: Component file structure +title: Create your component file structure +menu_title: Create your component file structure menu_order: 2 github_link: extension-dev-guide/module-file-structure.md - --- + ##{{page.menu_title}} #### Contents diff --git a/guides/v2.0/extension-dev-guide/prepare.md b/guides/v2.0/extension-dev-guide/prepare.md index 9276c19ae75..9129c293906 100644 --- a/guides/v2.0/extension-dev-guide/prepare.md +++ b/guides/v2.0/extension-dev-guide/prepare.md @@ -3,7 +3,7 @@ layout: default group: extension-dev-guide subgroup: 2_Prepare title: Prepare -menu_title: Prepare +menu_title: Prepare (updated) menu_order: 1 menu_node: parent github_link: extension-dev-guide/prepare.md @@ -12,11 +12,9 @@ github_link: extension-dev-guide/prepare.md ##{{page.menu_title}} +Before you start building Magento modules, we suggest you use the following checklist: -Before you start building Magento modules, make sure you’ve got Magento and its dependencies set up and installed in your environment. Magento uses [Composer](http://getcomposer.org) to manage and package components. After you have Magento up and running, set Magento’s mode to [developer]({{ site.gdeurl }}/config-guide/bootstrap/magento-how-to-set.html). - -* [Install Magento and any required dependencies]({{ site.gdeurl }}/install-gde/bk-install-guide.html) -* [Composer integration](composer-integration.html) -* [Component registration](component-registration.html) -* [Set your mode to developer]({{ site.gdeurl }}/config-guide/cli/config-cli-subcommands-mode.html) - +- []: [Install Magento and any required dependencies]({{ site.gdeurl }}/install-gde/bk-install-guide.html) +- []: [Set Magento for developer mode]({{ site.gdeurl }}config-guide/cli/config-cli-subcommands-mode.html#config-mode) +- []: Decide which type of component you're creating and how to set it up in `composer.json`. +[]: [Understand the component file structure]({{ site.gdeurl }}extension-dev-guide/prepare_file-str.html) diff --git a/guides/v2.0/extension-dev-guide/prepare_file-str.md b/guides/v2.0/extension-dev-guide/prepare_file-str.md new file mode 100644 index 00000000000..aaba6aa8d1a --- /dev/null +++ b/guides/v2.0/extension-dev-guide/prepare_file-str.md @@ -0,0 +1,19 @@ +--- +layout: default +group: extension-dev-guide +subgroup: 2_Prepare +title: Component file structure summary +menu_title: Component file structure summary (new) +menu_order: 50 +menu_node: +github_link: extension-dev-guide/prepare_file-str.md + +--- + +##{{page.menu_title}} + + +Outline: + +* Shorter version of file structure for all component types +* Note about module root (`app/code`, `vendor`) \ No newline at end of file diff --git a/guides/v2.0/extension-dev-guide/prepare_summary.md b/guides/v2.0/extension-dev-guide/prepare_summary.md new file mode 100644 index 00000000000..dac3ad43bd5 --- /dev/null +++ b/guides/v2.0/extension-dev-guide/prepare_summary.md @@ -0,0 +1,24 @@ +--- +layout: default +group: extension-dev-guide +subgroup: 2_Prepare +title: Summary of developing and packaging components +menu_title: Summary of developing and packaging components (new) +menu_order: 50 +menu_node: +github_link: extension-dev-guide/prepare_summary.md + +--- + +##{{page.menu_title}} + + +To develop your component, use the following steps: + +1. Learn about using Composer with your component. +2. Build your component +3. Package a component +4. Validate your component +4. *For Magento Marketplace only*. Upload the components to the Magento Marketplace. + + See the Magento Marketplace User Guide for details. diff --git a/guides/v2.0/mktpl-quickstart/intro-moreinfo.md b/guides/v2.0/mktpl-quickstart/intro-moreinfo.md index b89f52f3b89..b8c42cff588 100644 --- a/guides/v2.0/mktpl-quickstart/intro-moreinfo.md +++ b/guides/v2.0/mktpl-quickstart/intro-moreinfo.md @@ -18,6 +18,3 @@ For more information about component development, see the following: * Translation dictionaries and language packages for language packages. * Magento Marketplace User Guide to upload your component to the Magento Marketplace. - - - From ea2362c6805eeec9756e333688940c1529ea122c Mon Sep 17 00:00:00 2001 From: stevjohnson Date: Sun, 31 Jan 2016 10:50:06 -0600 Subject: [PATCH 083/902] Fix formatting --- guides/v2.0/extension-dev-guide/prepare.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/guides/v2.0/extension-dev-guide/prepare.md b/guides/v2.0/extension-dev-guide/prepare.md index 9129c293906..f2a02141b8a 100644 --- a/guides/v2.0/extension-dev-guide/prepare.md +++ b/guides/v2.0/extension-dev-guide/prepare.md @@ -14,7 +14,7 @@ github_link: extension-dev-guide/prepare.md Before you start building Magento modules, we suggest you use the following checklist: -- []: [Install Magento and any required dependencies]({{ site.gdeurl }}/install-gde/bk-install-guide.html) -- []: [Set Magento for developer mode]({{ site.gdeurl }}config-guide/cli/config-cli-subcommands-mode.html#config-mode) -- []: Decide which type of component you're creating and how to set it up in `composer.json`. -[]: [Understand the component file structure]({{ site.gdeurl }}extension-dev-guide/prepare_file-str.html) +* [Install Magento and any required dependencies]({{ site.gdeurl }}/install-gde/bk-install-guide.html) +* [Set Magento for developer mode]({{ site.gdeurl }}config-guide/cli/config-cli-subcommands-mode.html#config-mode) +* Decide which type of component you're creating and how to set it up in `composer.json`. +* [Understand the component file structure]({{ site.gdeurl }}extension-dev-guide/prepare_file-str.html) From 2d5daa0b66a8549a5a76056b4c27a2a5de2b3423 Mon Sep 17 00:00:00 2001 From: Oleksandra Marchenko Date: Mon, 1 Feb 2016 15:16:58 +0200 Subject: [PATCH 084/902] Update the HTML style guide --- guides/v2.0/coding-standards/code-standard-html.md | 2 +- guides/v2.0/coding-standards/code-standard-javascript.md | 2 +- guides/v2.0/coding-standards/code-standard-php.md | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/guides/v2.0/coding-standards/code-standard-html.md b/guides/v2.0/coding-standards/code-standard-html.md index 218a9c81394..601934126e9 100644 --- a/guides/v2.0/coding-standards/code-standard-html.md +++ b/guides/v2.0/coding-standards/code-standard-html.md @@ -8,7 +8,7 @@ menu_order: 8 github_link: coding-standards/code-standard-html.md --- -This style guide defines Magento internal requirements for HTML code style for teams that develop LESS and CSS code. It is optional for third-party Magento developers. +This style guide defines Magento internal requirements for HTML code style for teams that develop LESS and CSS code. We recommend that developers who create Magento extensions and customizations also use these standards. The guide is based on the [Google HTML/CSS Style Guide](https://google.github.io/styleguide/htmlcssguide.xml) with certain modifications that are described further. diff --git a/guides/v2.0/coding-standards/code-standard-javascript.md b/guides/v2.0/coding-standards/code-standard-javascript.md index dd4dc7419fb..c314b579332 100644 --- a/guides/v2.0/coding-standards/code-standard-javascript.md +++ b/guides/v2.0/coding-standards/code-standard-javascript.md @@ -17,7 +17,7 @@ The Magento system uses the jQuery library including the standard and custom JSHint tool Use JSHint to ensure the quality of your JavaScript code. diff --git a/guides/v2.0/coding-standards/code-standard-php.md b/guides/v2.0/coding-standards/code-standard-php.md index 573f5d365c2..d361362dbf3 100644 --- a/guides/v2.0/coding-standards/code-standard-php.md +++ b/guides/v2.0/coding-standards/code-standard-php.md @@ -12,4 +12,4 @@ redirect_from: /guides/v1.0/coding-standards/code-standard-php.html

      The Magento core development team uses the Basic Coding Standard and Coding Style Guide. Magento recommends that developers who create Magento extensions and customizations also use these standards.

      Where possible, use PHP_CodeSniffer to automatically enforce these standards. Otherwise, standards and requirements must be applied through rigorous code review.

      - \ No newline at end of file + From 67dc13be34ee3c6fb3478d7038122439cd4ef091 Mon Sep 17 00:00:00 2001 From: Oleksandra Marchenko Date: Mon, 1 Feb 2016 15:59:27 +0200 Subject: [PATCH 085/902] corrected line endings --- .../coding-standards/bk-coding-standards.md | 25 +++++++++++-------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/guides/v2.0/coding-standards/bk-coding-standards.md b/guides/v2.0/coding-standards/bk-coding-standards.md index b2e0609d933..6945dc6a3e4 100644 --- a/guides/v2.0/coding-standards/bk-coding-standards.md +++ b/guides/v2.0/coding-standards/bk-coding-standards.md @@ -13,15 +13,18 @@ redirect_from: /guides/v1.0/coding-standards/bk-coding-standards.html -

      Like many large projects, Magento has coding standards.

      -

      To code extensions, follow the Magento standards for code:

      - +Like many large projects, Magento has coding standards. + +To code extensions, follow the Magento standards for code: + + +- [Code demarcation standard]({{ site.gdeurl }}coding-standards/code-standard-demarcation.html) +- [PHP coding standard]({{ site.gdeurl }}coding-standards/code-standard-php.html) +- [JavaScript coding standard]({{ site.gdeurl }}coding-standards/code-standard-javascript.html) +- [jQuery widget coding standard]({{ site.gdeurl }}coding-standards/code-standard-jquery-widgets.html) +- [DocBlock standard]({{ site.gdeurl }}coding-standards/docblock-standard-general.html) +- [JavaScript DocBlock standard]({{ site.gdeurl }}coding-standards/docblock-standard-javascript.html) +- [LESS coding standard]({{ site.gdeurl }}coding-standards/code-standard-less.html) +- [HTML style guide]({{site.gdeurl}}coding-standards/code-standard-html.html) + From a2be77040e2df1c4702198e37825380bdccd0177 Mon Sep 17 00:00:00 2001 From: Oleksandra Marchenko Date: Mon, 1 Feb 2016 16:33:27 +0200 Subject: [PATCH 086/902] Updated FDG prerequisites --- .../v2.0/frontend-dev-guide/bk-frontend-dev-guide.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/guides/v2.0/frontend-dev-guide/bk-frontend-dev-guide.md b/guides/v2.0/frontend-dev-guide/bk-frontend-dev-guide.md index 8ae64dc9b80..660db51c10d 100644 --- a/guides/v2.0/frontend-dev-guide/bk-frontend-dev-guide.md +++ b/guides/v2.0/frontend-dev-guide/bk-frontend-dev-guide.md @@ -40,12 +40,12 @@ Frontend developers can use this guide to create custom themes to tailor the Mag To implement what is discussed in this guide, you need a working Magento installation and the following browser versions installed on your device: -* Internet Explorer 9 or later (Windows) -* Mozilla Firefox latest, latest-2 (any operating system) -* Google Chrome latest, latest-2 (any operating system) -* Apple Safari 5 or later (Mac OS) -* Apple Safari Mobile for iPad, iPad Mini, iPad with Retina Display (iOS 6 or later), for Desktop Frontend -* Apple Safari Mobile for iPhone 4 or later; iOS 6 or later, for Mobile Frontend +* Internet Explorer 9 or later (Windows) for storefront; Internet Explorer 11 or later (Windows) for Admin +* Mozilla Firefox latest, latest-1 (any operating system) +* Google Chrome latest, latest-1 (any operating system) +* Apple Safari latest, latest-1 (Mac OS) +* Apple Safari Mobile for iPad 2, iPad Mini, iPad with Retina Display (iOS 7 or later), for desktop frontend +* Apple Safari Mobile for iPhone 4 or later; iOS 7 or later, for mobile frontend To use this guide, you must be familiar with: From 58eeaa913c819c727e785b4bf1f8a4d3302e80b5 Mon Sep 17 00:00:00 2001 From: stevjohnson Date: Mon, 1 Feb 2016 09:49:03 -0600 Subject: [PATCH 087/902] Remove mention of Redis for session caching --- guides/v2.0/architecture/tech-stack.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guides/v2.0/architecture/tech-stack.md b/guides/v2.0/architecture/tech-stack.md index ab06db22703..0dd30a1538a 100644 --- a/guides/v2.0/architecture/tech-stack.md +++ b/guides/v2.0/architecture/tech-stack.md @@ -75,7 +75,7 @@ Magento’s highly modular structure includes the following open-source technolo Optional stack components include: * Varnish (caching) -* Redis (used for session or page caching) +* Redis (used for page caching) * Solr (search engine) Magento is compatible with but not supported for: From ba12c44ea2f6e165e650278dd26063b313ad8903 Mon Sep 17 00:00:00 2001 From: Oleksandra Marchenko Date: Mon, 1 Feb 2016 18:01:21 +0200 Subject: [PATCH 088/902] Updated the Add a new input form to checkout topic --- guides/v2.0/howdoi/checkout/checkout_form.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/guides/v2.0/howdoi/checkout/checkout_form.md b/guides/v2.0/howdoi/checkout/checkout_form.md index f8d37eac3ee..6cc927ea6a6 100644 --- a/guides/v2.0/howdoi/checkout/checkout_form.md +++ b/guides/v2.0/howdoi/checkout/checkout_form.md @@ -95,6 +95,13 @@ Example: {%endhighlight%} +### Modifying the custom template after it was applied + +If you modify your custom `.html` template after it was applied on the store pages, the changes will not apply until you do the following: + +1. Delete all files in the pub/static/frontend and var/view_preprocessing directories. +2. Reload the pages. + ## Declare the form in the checkout page layout {#layout} Certain default checkout templates declare regions where additional content can be inserted. You can add your custom form in any of these regions. These regions are provided with corresponding comments in the default Checkout page layout file `/view/frontend/layout/checkout_index_index.xml`. Also you locate the regions in the `.html` templates of the blocks used in this layout file. From 8098e89ac74f1edb91024973522759f3bbc67dda Mon Sep 17 00:00:00 2001 From: Oleksandra Marchenko Date: Mon, 1 Feb 2016 18:32:23 +0200 Subject: [PATCH 089/902] added the note --- guides/v2.0/coding-standards/code-standard-less.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/guides/v2.0/coding-standards/code-standard-less.md b/guides/v2.0/coding-standards/code-standard-less.md index eadb725d027..b1b9ef7c50b 100644 --- a/guides/v2.0/coding-standards/code-standard-less.md +++ b/guides/v2.0/coding-standards/code-standard-less.md @@ -317,6 +317,8 @@ Class names should be lowercase, start with a letter (except helper classes), wo Helper class names should be lowercase and start with underscore ("_"). +Some parts of Magento code might not comply with this standard. But the old notation without ("_") is being gradually removed. + **Example**: ._active { From a0678451553d624fe72f8f9bc0a5f373c687bf5e Mon Sep 17 00:00:00 2001 From: stevjohnson Date: Mon, 1 Feb 2016 12:52:37 -0600 Subject: [PATCH 090/902] Update the list of required elements --- guides/v2.0/extension-dev-guide/developers_info.md | 3 +-- .../v2.0/extension-dev-guide/developers_roadmap.md | 14 +++++++++----- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/guides/v2.0/extension-dev-guide/developers_info.md b/guides/v2.0/extension-dev-guide/developers_info.md index a0435f421d6..9341ca23ed0 100644 --- a/guides/v2.0/extension-dev-guide/developers_info.md +++ b/guides/v2.0/extension-dev-guide/developers_info.md @@ -21,5 +21,4 @@ For Magento Marketplace only: * Roadmap * Review -* Submit an extension -* \ No newline at end of file +* Submit an extension \ No newline at end of file diff --git a/guides/v2.0/extension-dev-guide/developers_roadmap.md b/guides/v2.0/extension-dev-guide/developers_roadmap.md index 8c98ab796d1..bbf7ed55c15 100644 --- a/guides/v2.0/extension-dev-guide/developers_roadmap.md +++ b/guides/v2.0/extension-dev-guide/developers_roadmap.md @@ -16,15 +16,19 @@ This section helps you understand how to develop, package, and distribute your c Key points: -* `composer.json` and `registration.php` are required for *all* components. -* `.zip` your extension as discussed in the packaging topic. +* Minimum required elements: + + * `composer.json` + * `registration.php` + * Modules: `module.xml` + * Themes: `theme.xml` + * Language packages: `language.xml` +* `.zip` your extension. * *(For distribution on Magento Marketplace only)*: The package you upload to Magento Marketplace should not be more than 30MB in size. -#### For more information +#### Helpful links * Introduction to Composer * Glossary of common terms * For more information - -#### Other helpful resources * Sample extensions created by the Magento 2 Core team. * Magento 2 Developers Hub, at magento.com/developers/magento2. \ No newline at end of file From 5b3789ffba48ced3a1ffe39d08bcc83cae906d33 Mon Sep 17 00:00:00 2001 From: stevjohnson Date: Mon, 1 Feb 2016 14:05:12 -0600 Subject: [PATCH 091/902] Remove the option to install or remove individual sample data modules --- _includes/install/sampledata/sample-data-composer.md | 10 +++++----- _includes/install/sampledata/sample-data-other-cmds.md | 6 +++--- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/_includes/install/sampledata/sample-data-composer.md b/_includes/install/sampledata/sample-data-composer.md index 86725d6043e..a7330d76a16 100644 --- a/_includes/install/sampledata/sample-data-composer.md +++ b/_includes/install/sampledata/sample-data-composer.md @@ -35,10 +35,10 @@ Before you install sample data, you must update Magento's `composer.json` to get ### Install released version sample data {#sample-data-rel-inst} To install sample data using the command line, enter the following command as the Magento file system owner: - php /bin/magento sampledata:deploy [module-list] - -where `[module-list]` is an optional space-separated list of sample data modules to install. Omit this parameter to install all sample data modules. + php /bin/magento sampledata:deploy + You are required to authenticate to complete the action. ### Authentication error @@ -51,10 +51,10 @@ The following error might display: If the error displays, change to your Magento installation directory and run `composer update`, which will prompt you for your authentication keys. -

      Complete list of modules

      + diff --git a/_includes/install/sampledata/sample-data-other-cmds.md b/_includes/install/sampledata/sample-data-other-cmds.md index d18544855ce..8cbfbb0cf07 100644 --- a/_includes/install/sampledata/sample-data-other-cmds.md +++ b/_includes/install/sampledata/sample-data-other-cmds.md @@ -12,13 +12,13 @@ This topic discusses how to:

      Remove sample data

      Enter the following command: - magento sampledata:remove [module-list] + magento sampledata:remove -where `[module-list]` is an optional space-separated list of sample data modules to install. Omit this parameter to remove all sample data modules. + Wait while sample data is removed. From e6f2e34cf7d85a01eb79226f62e16dffc1102c77 Mon Sep 17 00:00:00 2001 From: stevjohnson Date: Mon, 1 Feb 2016 19:05:14 -0600 Subject: [PATCH 092/902] Add new CE > EE troubleshooting topic, few minor corrections --- .../comp-mgr/trouble/cman/ce-ee-upgrade.md | 29 +++++++++++++++++++ .../v2.0/comp-mgr/trouble/cman/gitignore.md | 4 +-- guides/v2.0/comp-mgr/trouble/tshoot.md | 10 ++++++- .../comp-mgr/upgrader/ce-ee-upgrade-start.md | 12 ++++++-- 4 files changed, 50 insertions(+), 5 deletions(-) create mode 100644 guides/v2.0/comp-mgr/trouble/cman/ce-ee-upgrade.md diff --git a/guides/v2.0/comp-mgr/trouble/cman/ce-ee-upgrade.md b/guides/v2.0/comp-mgr/trouble/cman/ce-ee-upgrade.md new file mode 100644 index 00000000000..c667ce8e4b0 --- /dev/null +++ b/guides/v2.0/comp-mgr/trouble/cman/ce-ee-upgrade.md @@ -0,0 +1,29 @@ +--- +layout: default +group: compman +subgroup: ZZ_Troubleshooting +title: Error upgrading from CE to EE +menu_title: Error upgrading from CE to EE +menu_node: +menu_order: 500 +github_link: comp-mgr/trouble/cman/ce-ee-upgrade.md +--- + +### Problem: Error upgrading from CE to EE {#ce-ee} +Your upgrade from Magento Community Edition (CE) to Enterprise Edition (EE) might fail with the following error: + + [2016-01-19 23:33:24 UTC] An error occurred while executing job + "setup:upgrade {"command":"setup:upgrade"}": Could not complete + setup:upgrade {"command":"setup:upgrade"} successfully: Source + class "\Cybersource" for "CybersourceLogger" generation does not exist. + +If this error displays, resolve it as follows: + +1. Log in to your Magento server as the Magento file system owner. +2. Enter the following commands in the order shown: + + cd + composer update +3. After the command completes, verify your upgrade was successful: + + php bin/magento --version diff --git a/guides/v2.0/comp-mgr/trouble/cman/gitignore.md b/guides/v2.0/comp-mgr/trouble/cman/gitignore.md index c9fce22428b..fbdc7ff8b3e 100644 --- a/guides/v2.0/comp-mgr/trouble/cman/gitignore.md +++ b/guides/v2.0/comp-mgr/trouble/cman/gitignore.md @@ -2,8 +2,8 @@ layout: default group: compman subgroup: ZZ_Troubleshooting -title: Missing `.gitignore` files -menu_title: Missing `.gitignore` files +title: Missing .gitignore files +menu_title: Missing .gitignore files menu_node: menu_order: 5 github_link: comp-mgr/trouble/cman/gitignore.md diff --git a/guides/v2.0/comp-mgr/trouble/tshoot.md b/guides/v2.0/comp-mgr/trouble/tshoot.md index d45f9b381c8..91fd1985ab3 100644 --- a/guides/v2.0/comp-mgr/trouble/tshoot.md +++ b/guides/v2.0/comp-mgr/trouble/tshoot.md @@ -9,9 +9,17 @@ menu_order: 1 github_link: comp-mgr/trouble/tshoot.md --- -The following topics discuss Component Manager and System upgrade errors and suggested solutions: +The following topics discuss Component Manager and System Upgrade errors and suggested solutions: +### Both Component Manager and System Upgrade * Troubleshoot cron * Troubleshoot component dependencies * Troubleshoot the updater application * Troubleshoot backup + +### System Upgrade only +* "We're sorry, we can't take that action right now" +* Missing .gitignore files +* Roll back after upgrade failure +* CE to EE upgrade failure + diff --git a/guides/v2.0/comp-mgr/upgrader/ce-ee-upgrade-start.md b/guides/v2.0/comp-mgr/upgrader/ce-ee-upgrade-start.md index 08102310155..f26f4d447ec 100644 --- a/guides/v2.0/comp-mgr/upgrader/ce-ee-upgrade-start.md +++ b/guides/v2.0/comp-mgr/upgrader/ce-ee-upgrade-start.md @@ -46,12 +46,20 @@ To run System Upgrade: From the list, click the version to which to upgrade. Typically, you'll choose the most recent version (indicated by **(latest)**.) -#### Error - The following error can indicate one of several issues, including that you haven't entered your authentication keys in the Magento Admin: +#### Errors +* The following error can indicate one of several issues, including that you haven't entered your authentication keys in the Magento Admin: For suggested solutions to other causes indicated by this message, see troubleshooting. +* The following error might display: + + [2016-01-19 23:33:24 UTC] An error occurred while executing job "setup:upgrade {"command":"setup:upgrade"}": Could not complete setup:upgrade {"command":"setup:upgrade"} successfully: Source class "\Cybersource" for "CybersourceLogger" generation does not exist. + + For more information, see Error upgrading from CE to EE. + + +

      Continue your upgrade

      From here, your upgrade is the same as any other upgrade. Continue with Step 1. Select versions to upgrade. From 99576598b4c6c919b65c06d297680d640986e93e Mon Sep 17 00:00:00 2001 From: stevjohnson Date: Mon, 1 Feb 2016 19:07:54 -0600 Subject: [PATCH 093/902] Minor update --- guides/v2.0/comp-mgr/upgrader/ce-ee-upgrade-start.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/guides/v2.0/comp-mgr/upgrader/ce-ee-upgrade-start.md b/guides/v2.0/comp-mgr/upgrader/ce-ee-upgrade-start.md index f26f4d447ec..16fda5d440c 100644 --- a/guides/v2.0/comp-mgr/upgrader/ce-ee-upgrade-start.md +++ b/guides/v2.0/comp-mgr/upgrader/ce-ee-upgrade-start.md @@ -55,7 +55,10 @@ To run System Upgrade: * The following error might display: - [2016-01-19 23:33:24 UTC] An error occurred while executing job "setup:upgrade {"command":"setup:upgrade"}": Could not complete setup:upgrade {"command":"setup:upgrade"} successfully: Source class "\Cybersource" for "CybersourceLogger" generation does not exist. + [2016-01-19 23:33:24 UTC] An error occurred while executing job + "setup:upgrade {"command":"setup:upgrade"}": Could not complete + setup:upgrade {"command":"setup:upgrade"} successfully: Source + class "\Cybersource" for "CybersourceLogger" generation does not exist. For more information, see Error upgrading from CE to EE. From 1549ef0c8d7bd8b393032c086305e79078843e79 Mon Sep 17 00:00:00 2001 From: stevjohnson Date: Tue, 2 Feb 2016 04:48:08 -0600 Subject: [PATCH 094/902] Add version information for Magento 2 and migration tool --- guides/v2.0/migration/migration-tool-install.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/guides/v2.0/migration/migration-tool-install.md b/guides/v2.0/migration/migration-tool-install.md index 5af33330de6..53bd73af19a 100644 --- a/guides/v2.0/migration/migration-tool-install.md +++ b/guides/v2.0/migration/migration-tool-install.md @@ -22,6 +22,12 @@ Before you continue, make sure you completed all tasks discussed in +

      You must clone the same branch of both repositories. For example, if you cloned the Magento 2 develop branch, you must clone the Data Migration Tool's develop branch also.

      +
      + To install the Data Migration Tool from GitHub, use the following steps: 1. Log in to your Magento 2 server as a user with privileges to write to the Magento 2 file system or switch to the Magento file system owner. @@ -35,6 +41,10 @@ To install the Data Migration Tool from GitHub, use the following steps: ### Install the tool from `repo.magento.com` {#install-repo} To install the Data Migration Tool, you must update `composer.json` in the Magento root installation directory to provide the location of the Data Migration Tool package. +
      +

      You must use the same version of both Magento 2 and the Data Migration Tool. For example, if you're using Magento version 2.0.2, you must also use Data Migration Tool version 2.0.2. To find the version of the software, open its root composer.json and look for the value of version.

      +
      + To install the Data Migration Tool, you must: 1. Log in to your Magento 2 server as a user with privileges to write to the Magento 2 file system or switch to the Magento file system owner. From 0e8071927291e46fddd3265ac69ff984a0e080b0 Mon Sep 17 00:00:00 2001 From: stevjohnson Date: Tue, 2 Feb 2016 04:55:01 -0600 Subject: [PATCH 095/902] Change devdocs feedback DL to magento.com domain --- README.md | 2 +- _config.yml | 2 +- guides/v2.0/bk-get-started-magento.md | 2 +- guides/v2.0/howdoi/bk-how-do-i.md | 4 ++-- guides/v2.0/howdoi/howdoi_bios.md | 2 +- guides/v2.0/howdoi/howdoi_contribute.md | 2 +- guides/v2.0/release-notes/changes_1.0.0-beta.md | 2 +- 7 files changed, 8 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 8b27659f932..9bb2cd13813 100644 --- a/README.md +++ b/README.md @@ -20,6 +20,6 @@ If you have questions, open an issue and ask us. We're looking forward to hearin * -* E-mail us +* E-mail us * Visit our documentation site, built on GitHub using [Jekyll](http://jekyllrb.com/). diff --git a/_config.yml b/_config.yml index 490b4c78d5a..526ff5a99ab 100644 --- a/_config.yml +++ b/_config.yml @@ -1,7 +1,7 @@ # Site settings encoding: "utf-8" title: Magento 2 Developer Documentation -email: mailto:DL-Magento-Doc-Feedback@ebay.com +email: mailto:DL-Magento-Doc-Feedback@magento.com description: > # this means to ignore newlines until "baseurl:" Magento 2 Developer Guide. baseurl: "/" diff --git a/guides/v2.0/bk-get-started-magento.md b/guides/v2.0/bk-get-started-magento.md index 8fedee0796e..cc126fb5cd9 100644 --- a/guides/v2.0/bk-get-started-magento.md +++ b/guides/v2.0/bk-get-started-magento.md @@ -32,7 +32,7 @@ For more information, see our Contact us Feel free to contact the documentation team directly at -DL-Magento-Doc-Feedback@ebay.com +DL-Magento-Doc-Feedback@magento.com #### Related topics diff --git a/guides/v2.0/howdoi/bk-how-do-i.md b/guides/v2.0/howdoi/bk-how-do-i.md index 251ac513204..106a8dabc02 100644 --- a/guides/v2.0/howdoi/bk-how-do-i.md +++ b/guides/v2.0/howdoi/bk-how-do-i.md @@ -16,11 +16,11 @@ Please help us keep this list up-to-date by providing feedback in any of the fol * Click **Edit this page in GitHub** to open a pull request with a solution of your own. * Open an issue in the devdocs GitHub repository. -* Send us a tweet or e-mail. +* Send us a tweet or e-mail. If you'd like to contribute a new topic to the How Do I list, add your name and a topic to our sign-up sheet. -To sign up to contribute, all you need to do is to submit a pull request on the sign-up page or e-mail us. +To sign up to contribute, all you need to do is to submit a pull request on the sign-up page or e-mail us. Use this template if you'd like. You can get a copy of the .md file on Github. diff --git a/guides/v2.0/howdoi/howdoi_bios.md b/guides/v2.0/howdoi/howdoi_bios.md index d2dac231f13..f3eb457fcb1 100644 --- a/guides/v2.0/howdoi/howdoi_bios.md +++ b/guides/v2.0/howdoi/howdoi_bios.md @@ -18,7 +18,7 @@ Thanks so much to the following community members, partners, and Magento fans wh To join these contributors, please sign up on the Contributor's page, and the follow the easy instructions to submit a pull request to submit your work! -Always feel free to e-mail us with any questions. +Always feel free to e-mail us with any questions. diff --git a/guides/v2.0/howdoi/howdoi_contribute.md b/guides/v2.0/howdoi/howdoi_contribute.md index f9cd81baed0..859b862b421 100644 --- a/guides/v2.0/howdoi/howdoi_contribute.md +++ b/guides/v2.0/howdoi/howdoi_contribute.md @@ -14,7 +14,7 @@ Please sign up to write a How Do I topic for us! We'll put your name (or company's name) at the top of the page, right under the title, and link it to your blog or website! And you'll get your face and bio in the ring of honor as one of our featured contributors. -To add your name to this table, all you need to do is to submit a pull request on this page or e-mail us. +To add your name to this table, all you need to do is to submit a pull request on this page or e-mail us. Use this template if you'd like. You can get a copy of the .md file on Github. diff --git a/guides/v2.0/release-notes/changes_1.0.0-beta.md b/guides/v2.0/release-notes/changes_1.0.0-beta.md index 9f261f13f8f..30ca8e808a2 100644 --- a/guides/v2.0/release-notes/changes_1.0.0-beta.md +++ b/guides/v2.0/release-notes/changes_1.0.0-beta.md @@ -331,6 +331,6 @@ The Magento developer documentation team loves feedback! Please provide feedback * Create an issue * Click **Edit this page on GitHub** on any topic to create a pull request * Drop us a line on Twitter (`@MagentoDevDocs`) -* Send us e-mail +* Send us e-mail Our contribution guidelines provide more detail about providing feedback on the code and documentation. From bb069ef4317e4bba5247bbcee6e05c104f8c859c Mon Sep 17 00:00:00 2001 From: Oleksandra Marchenko Date: Tue, 2 Feb 2016 15:10:13 +0200 Subject: [PATCH 096/902] Minor enhancements --- .../code-standard-javascript.md | 151 +++++++++--------- .../code-standard-jquery-widgets.md | 8 +- .../coding-standards/code-standard-less.md | 4 +- .../docblock-standard-general.md | 2 +- .../docblock-standard-javascript.md | 2 +- 5 files changed, 86 insertions(+), 81 deletions(-) diff --git a/guides/v2.0/coding-standards/code-standard-javascript.md b/guides/v2.0/coding-standards/code-standard-javascript.md index c314b579332..c3e21d10b7a 100644 --- a/guides/v2.0/coding-standards/code-standard-javascript.md +++ b/guides/v2.0/coding-standards/code-standard-javascript.md @@ -4,7 +4,7 @@ group: coding-standards subgroup: Coding standards title: JavaScript coding standard menu_title: JavaScript coding standard -menu_order: 3 +menu_order: 4 github_link: coding-standards/code-standard-javascript.md redirect_from: /guides/v1.0/coding-standards/code-standard-javascript.html --- @@ -19,39 +19,44 @@ Some parts of Magento code might not comply with this coding standard. This coding standard is recommended for third-party Magento developers. -

      JSHint tool

      +**Contents:** + +* TOC +{:toc} + +## JSHint tool {#fedg_js-coding_JSHint} Use JSHint to ensure the quality of your JavaScript code. JSHint is a community-driven tool that detects errors and potential problems in JavaScript code. Its flexibility enables you to customize it to your coding standard and expected code execution environment. jQuery core passes JSHint. -

      Formatting

      +## Formatting {#fedg_js-coding-format} See one of the following sections: -* Anonymous functions -* End of file -* Function arguments -* Indentation -* Indent wrapped lines -* Line length -* Line termination -* Multiline string literals -* Parentheses -* Statements and conditions -* Strings - -

      Anonymous functions

      +* [Anonymous functions](#fedg_js-coding_codestyle_anon) +* [End of file](#fedg_js-coding-format_eof) +* [Function arguments](#fedg_js-coding_codestyle_funcargs) +* [Indentation](#fedg_js-coding-format_indent) +* [Indent wrapped lines](#fedg_js-coding_codestyle_indent) +* [Line length](#fedg_js-coding-format_length) +* [Line termination](#fedg_js-coding-format_terminate) +* [Multiline string literals](#fedg_js-coding-format_multilit) +* [Parentheses](#fedg_js-coding-format_multilit) +* [Statements and conditions](#fedg_js-coding_codestyle_stmt) +* [Strings](#strings) + +### Anonymous functions {#fedg_js-coding_codestyle_anon} When you declare an anonymous function in the list of arguments for a function call, indent the body of the function four spaces from the left edge of the statement, or four spaces from the left edge of the function keyword. This makes the body of the anonymous function easier to read. -

      End of file

      +### End of file {#fedg_js-coding-format_eof} The last line in a file also must end with a single linefeed (LF) character. In other words, a file always ends with an empty line. This reduces quantity of the changed lines in a diff and makes code safer in files concatenation process. -

      Function arguments

      +### Function arguments {#fedg_js-coding_codestyle_funcargs} When possible, list all function arguments on the same line. If doing so exceeds the 120-column limit, you must line-wrap the arguments in a readable way. @@ -64,17 +69,17 @@ The following patterns are the most common patterns for argument wrapping: -

      Indentation

      +### Indentation {#fedg_js-coding-format_indent} Indentation should consist of four spaces. Tabs are not allowed. -

      Indent wrapped lines

      +### Indent wrapped lines {#fedg_js-coding_codestyle_indent} You should indent all wrapped lines to be left-aligned to the expression above, or indented four spaces. -

      Line length

      +### Line length {#fedg_js-coding-format_length} Source code line length must not exceed 120 characters. Recommended line length is 80 characters. @@ -86,7 +91,7 @@ Recommended line length is 80 characters.
    -

    Line termination

    +### Line termination {#fedg_js-coding-format_terminate} Line termination follows the UNIX text file convention. Lines must end with a single linefeed (LF) character. @@ -98,7 +103,7 @@ Linefeed characters are represented as ordinal 10, or hexadecimal (0x0A). -

    Multiline string literals

    +### Multiline string literals {#fedg_js-coding-format_multilit} Use string concatenation: var myString = 'JavaScript was originally developed in Netscape, by Brendan Eich. ' + @@ -108,7 +113,7 @@ Use string concatenation: 'Netscape also wanted a lightweight interpreted language that would complement Java ' + 'by appealing to nonprofessional programmers, like Microsoft’s VB.[9] (see JavaScript and Java)'; -

    Parentheses

    +### Parentheses {#fedg_js-coding_codestyle_parens} Use sparingly and in general only where required by the syntax and semantics. Never use parentheses for: @@ -117,7 +122,7 @@ Never use parentheses for: * After keywords such as `return`, `throw` * For `case`, `in`, or `new`, and others like them -

    Semicolons

    +### Semicolons {#semicolons} Always put semicolons as statement terminators. The following example shows how missing semicolons can be particularly dangerous: @@ -175,19 +180,19 @@ Do not put statements on the same line as conditions. blah(); } -

    Strings

    +### Strings {#strings} For consistency, single-quotes are preferred to double quotes. This is helpful when creating strings that include HTML: var msg = '<span class="text">Hello World!</div>'; -

    Naming conventions

    +## Naming conventions {#fedg_js-coding_naming} See one of the following sections: * Constants * File names -

    Constants

    +### Constants {#fedg_js-coding_naming_const} Constants may contain both alphanumeric characters and underscores (`_`). All letters used in a constant name must be capitalized, while all words in a constant name must be separated by an underscore. @@ -220,7 +225,7 @@ For non-primitives, use the `@const` annotation. hour: 60 * 60 day: 60 * 60 * 24 -

    File names

    +### File names {#fedg_js-coding_naming_files} File names should be all lowercase to avoid confusion on case-sensitive platforms. File names should contain only alphanumeric characters, and dash character (`-`) as words separator, end with `.js`: @@ -228,14 +233,14 @@ File names should contain only alphanumeric characters, and dash character (`-`) * **Correct**: `dialog-popup-base-features.js` * **Incorrect**: `dialog_popup_base_features.js` -

    Code style

    +## Code style {#fedg_js-coding_codestyle} See one of the following sections: -* Curly braces -* Functions and methods -* Variables and properties +* [Curly braces](#fedg_js-coding_codestyle_curl) +* [Functions and methods](##fedg_js-coding_naming_fns) +* [Variables and properties -

    Curly braces

    +### Curly braces {#fedg_js-coding_codestyle_curl} Because of implicit semicolon insertion, always start your curly braces on the same line as whatever they are opening. For example: @@ -246,7 +251,7 @@ For example: // ... } -

    Functions and methods

    +### Functions and methods {#fedg_js-coding_naming_fns} Function names may contain only alphanumeric characters. Underscores are not permitted. @@ -277,7 +282,7 @@ For object methods that are declared with the `private` or `protected` modifier, This is the only acceptable use of an underscore in a method name. Public methods should never contain an underscore. -

    Variables and properties

    +### Variables and properties {#fedg_js-coding_naming_vars} Variable names may contain only alphanumeric characters. Underscores (`_`) are not permitted. @@ -298,22 +303,22 @@ Terse variable names such as `i` or `n` are discouraged for all, but the smalles If a loop contains more than 20 lines of code, the index variables should have more descriptive names. -

    Coding constructs

    +## Coding constructs {#coding-constructs} See one of the following sections: -* Array and object literals -* Binary and ternary operators -* Boolean expressions -* Boolean operators (&& and ||) -* Conditional (ternary) operators (? and :) -* Exceptions and custom exceptions -* Function declarations within blocks -* Standard features -* Method definitions -* Closures +* [Array and object literals](#fedg_js-coding_codestyle_literals) +* [Binary and ternary operators](#fedg_js-coding_codestyle_binary-ternary) +* [Boolean expressions](#boolean) +* [Boolean operators](#operators) +* [Conditional (ternary) operators (? and :)](#conditional) +* [Exceptions and custom exceptions](#exceptions) +* [Function declarations within blocks](#functions-in-blocks) +* [Standard features](#standard-features) +* [Method definitions](#methods) +* [Closures](#closures) -

    Array and object literals

    +### Array and object literals {#fedg_js-coding_codestyle_literals} Use array and object literals instead of array and object constructors. The following example is correct. Always use the more readable array literal: @@ -339,7 +344,7 @@ Object constructors don't have the same problems, but for readability and consis 'strange key': 3 }; -

    Binary and ternary operators

    +### Binary and ternary operators {#fedg_js-coding_codestyle_binary-ternary} Always put the operator on the preceding line, so that you don't have to think about implicit semi-colon insertion issues. @@ -420,7 +425,7 @@ undefined != false -

    Boolean operators (&& and ||)

    +### Boolean operators (&& and ||) {#operators} These binary Boolean operators are short-circuited, and evaluate to the last evaluated term. The following code samples are equal: @@ -478,7 +483,7 @@ if (kid) { -

    Conditional (ternary) operators (? and :)

    +### Conditional (ternary) operators (? and :) {#conditional} The following code samples are equal: @@ -504,7 +509,7 @@ The following code samples are equal:
    -

    Custom toString() method

    +### Custom toString() method {#tostring-method} **Must always succeed without side effects.** You can control how your objects are converted to string by defining a custom `toString()` method. @@ -519,7 +524,7 @@ Otherwise you can run into serious problems. For example: * The assert tries to output the name of the object in which it failed. * `toString()` is called. -

    Function declarations within blocks

    +### Function declarations within blocks {#functions-in-blocks} ECMAScript allows function declarations only in the root statement list of a script or a function. To define a function within a block, use a variable initialized with a function expression. @@ -543,7 +548,7 @@ Without custom exceptions, returning error information from a function that also These basically amount to a primitive exception handling hack. Feel free to use custom exceptions when appropriate. -

    Standard features

    +### Standard features {#standard-features} For maximum portability and compatibility, use standard features whenever possible. For example, `string.charAt(3)` instead of `string[3]`, and element access with DOM functions instead of using an application-specific shorthand. @@ -566,7 +571,7 @@ Or you can also use this style: } }; -

    Closures

    +### Closures {#closures} Keep in mind is that a closure keeps a pointer to its enclosing scope. As a result, attaching a closure to a DOM element can create a circular reference and thus, a memory leak. @@ -591,24 +596,24 @@ Because elements also keep references to the closure, it is a cycle that will no return function() { /* uses a and b */ } } -

    General recommendations

    +## General recommendations {#general-recommendations} See one of the following sections: -* Do not use eval -* Do not use with() -* Use this with caution -* Array and object initializers -* Do not use associative arrays -* Use deferred initialization -* Do not modify built-in objects -* Declare variables +* [Do not use eval](#eval) +* [Do not use with()](#with) +* [Use this with caution](#this) +* [Array and object initializers](#fedg_js-coding_codestyle_arrayinit) +* [Do not use associative arrays](#fedg_js-coding_codestyle_arrayinit) +* [Use deferred initialization](#deferred-init) +* [Do not modify built-in objects](#prototypes) +* [Declare variables](#variables-scope) -

    Do not use eval()

    +### Do not use eval() {#eval} Avoid using `eval()`. The `eval()` function makes for confusing semantics and is dangerous to use if the string passed to `eval()` contains user input. Usually better options exist allowing to omit `eval()`, so its usage is generally not permitted. However, it is accepted for unserializing tasks (for example, to evaluate RPC responses), as it makes them much easier. -

    Do not use with()

    +### Do not use with() {#with} Do not use the `with()` statement. Using `with()` clouds the semantics of your program, because its object can have properties that collide with local variables, which can drastically change the meaning of your program. @@ -624,7 +629,7 @@ Answer: anything. The local variable x could be clobbered by a property of foo, and perhaps it even has a setter, in which case assigning 3 could cause lots of other code to execute. -

    Use this with caution

    +### Use this with caution {#this} Semantic of this can be tricky. It can refer to either: @@ -636,7 +641,7 @@ Semantic of this can be tricky. It can refer to either: To avoid confusion, use this only in object constructors, methods, and in closures setting up. -

    Array and object initializers

    +### Array and object initializers {#fedg_js-coding_codestyle_arrayinit} Single-line array and object initializers are allowed when they fit on a line as follows: var arr = [1, 2, 3]; // No space after [ or before ]. @@ -665,22 +670,22 @@ For example: }; -

    Do not use associative arrays

    +### Do not use associative arrays {#associative-arrays} Do not use associative arrays. If you need a map/hash, use Object instead of Array, because the features you need are actually Object features. `Array` just happens to extend `Object`. -

    Use deferred initialization

    +### Use deferred initialization {#deferred-init} It is sometimes impossible to initialize variables at the point of declaration, so deferred initialization is a good solution. -

    Use explicit scope

    +### Use explicit scope {#explicit-scope} Always use explicit scope. This increases code portability and clarity. For example, do not rely on window being in the scope chain. You might want to use your function in another application, for which this window is not the content window. -

    Do not modify built-in objects

    +### Do not modify built-in objects {#prototypes}
    • Modifying built-ins like Object.prototype and Array.prototype is strictly forbidden. @@ -692,7 +697,7 @@ For example, do not rely on window being in the scope chain. You might want to u
    -

    Declare variables

    +### Declare variables {#variables-scope} If you do not declare a variable, it is placed in the global context, potentially clobbering existing values. It also makes hard to define the variable scope. For example, it can be Document, Window or local scope. diff --git a/guides/v2.0/coding-standards/code-standard-jquery-widgets.md b/guides/v2.0/coding-standards/code-standard-jquery-widgets.md index 2da870fac4d..c6eab4f09d9 100644 --- a/guides/v2.0/coding-standards/code-standard-jquery-widgets.md +++ b/guides/v2.0/coding-standards/code-standard-jquery-widgets.md @@ -4,7 +4,7 @@ group: coding-standards subgroup: Coding standards title: jQuery widget coding standard menu_title: jQuery widget coding standard -menu_order: 4 +menu_order: 6 github_link: coding-standards/code-standard-jquery-widgets.md redirect_from: /guides/v1.0/coding-standards/code-standard-jquery-widgets.html --- @@ -553,9 +553,9 @@ $.widget("mage.form," {

    Architecture

    -
    -

    Use the underscore prefix only to declare private widget methods

    -
    + +

    Use the underscore prefix only to declare private widget methods

    +

    Widget properties names should not start with underscore because those properties would not be accessible using the jQuery Widget Factory public API.

    diff --git a/guides/v2.0/coding-standards/code-standard-less.md b/guides/v2.0/coding-standards/code-standard-less.md index b1b9ef7c50b..2f128bba23c 100644 --- a/guides/v2.0/coding-standards/code-standard-less.md +++ b/guides/v2.0/coding-standards/code-standard-less.md @@ -10,7 +10,7 @@ github_link: coding-standards/code-standard-less.md This standard defines Magento internal requirements for code formatting and style for teams that develop LESS and CSS code. -Some parts of Magento code might not comply with this coding standard. +Some parts of Magento code might not comply with this coding standard yet, but we are working to gradually improve this. This coding standard is optional for third-party Magento developers. @@ -317,7 +317,7 @@ Class names should be lowercase, start with a letter (except helper classes), wo Helper class names should be lowercase and start with underscore ("_"). -Some parts of Magento code might not comply with this standard. But the old notation without ("_") is being gradually removed. +Some parts of Magento code might not comply with this standard yet. You might still find helper names with no underscores. We are working to gradually remove the inconsistency. **Example**: diff --git a/guides/v2.0/coding-standards/docblock-standard-general.md b/guides/v2.0/coding-standards/docblock-standard-general.md index 3a5faee23dc..801ae46eab1 100644 --- a/guides/v2.0/coding-standards/docblock-standard-general.md +++ b/guides/v2.0/coding-standards/docblock-standard-general.md @@ -4,7 +4,7 @@ group: coding-standards subgroup: Coding standards title: DocBlock standard menu_title: DocBlock standard -menu_order: 5 +menu_order: 3 github_link: coding-standards/docblock-standard-general.md redirect_from: /guides/v1.0/coding-standards/docblock-standard-general.html --- diff --git a/guides/v2.0/coding-standards/docblock-standard-javascript.md b/guides/v2.0/coding-standards/docblock-standard-javascript.md index 4ecf2a81f3f..75b4633ff1c 100644 --- a/guides/v2.0/coding-standards/docblock-standard-javascript.md +++ b/guides/v2.0/coding-standards/docblock-standard-javascript.md @@ -4,7 +4,7 @@ group: coding-standards subgroup: Coding standards title: JavaScript DocBlock standard menu_title: JavaScript DocBlock standard -menu_order: 6 +menu_order: 5 github_link: coding-standards/docblock-standard-javascript.md redirect_from: /guides/v1.0/coding-standards/docblock-standard-javascript.html --- From 598122b0b3f5ec00970a01d357b702d4a23ee44d Mon Sep 17 00:00:00 2001 From: Oleksandra Marchenko Date: Tue, 2 Feb 2016 16:27:32 +0200 Subject: [PATCH 097/902] Added changes after review --- guides/v2.0/howdoi/checkout/checkout_form.md | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/guides/v2.0/howdoi/checkout/checkout_form.md b/guides/v2.0/howdoi/checkout/checkout_form.md index 6cc927ea6a6..ca7eabbfd19 100644 --- a/guides/v2.0/howdoi/checkout/checkout_form.md +++ b/guides/v2.0/howdoi/checkout/checkout_form.md @@ -11,11 +11,11 @@ github_link: howdoi/checkout/checkout_form.md This topic describes how to add a custom input form (implemented as a UI component) to the Checkout page. -Most of the elements, including the default forms on the Checkout page are implemented as UI components. And our recommendation is your custom form to be a UI component, extending the default [Magento_Ui/js/form/form]({{site.mage2000url}}app/code/Magento/Ui/view/base/web/js/form/form.js) component. +Most of the elements, including the default forms on the Checkout page are implemented as UI components. And we recommend your custom form to be a UI component, extending the default [Magento_Ui/js/form/form]({{site.mage2000url}}app/code/Magento/Ui/view/base/web/js/form/form.js) component. ## Overview -Magento provides ability to add a custom form to any of the checkout steps: Shipping Information, Review and Payment Information, or custom. In order to add a custom form that is a UI component, take the following steps: +Magento provides the ability to add a custom form to any of the checkout steps: Shipping Information, Review and Payment Information, or custom. In order to add a custom form that is a UI component, take the following steps: 1. [Create the JS implementation of the form UI component](#component). 2. [Create the knockout.js HTML template for rendering the form](#template). @@ -23,9 +23,9 @@ Magento provides ability to add a custom form to any of the checkout steps: Ship ## Prerequisites -[Set Magento to the production mode]({{site.gdeurl}}config-guide/cli/config-cli-subcommands-mode.html) while you perform all customizations and debugging. +[Set Magento to developer mode]({{site.gdeurl}}config-guide/cli/config-cli-subcommands-mode.html) while you perform all customizations and debugging. -For the sake of compatibility, upgradability, and easy maintenance, do not edit the default Magento code, add your customizations in a separate module. For your checkout customization to be applied correctly, your custom module should [depend]({{site.gdeurl}}extension-dev-guide/composer-integration.html) on the Magento_Checkout module. +For the sake of compatibility, upgradability, and easy maintenance, do not edit the default Magento code. Instead, add your customizations in a separate module. For your checkout customization to be applied correctly, your custom module should [depend]({{site.gdeurl}}extension-dev-guide/composer-integration.html) on the Magento_Checkout module. ## Create the JS implementation of the form UI component {#component} @@ -99,14 +99,15 @@ Example: If you modify your custom `.html` template after it was applied on the store pages, the changes will not apply until you do the following: -1. Delete all files in the pub/static/frontend and var/view_preprocessing directories. +1. Delete all files in the `pub/static/frontend` and `var/view_preprocessing` directories. 2. Reload the pages. ## Declare the form in the checkout page layout {#layout} -Certain default checkout templates declare regions where additional content can be inserted. You can add your custom form in any of these regions. These regions are provided with corresponding comments in the default Checkout page layout file `/view/frontend/layout/checkout_index_index.xml`. Also you locate the regions in the `.html` templates of the blocks used in this layout file. +Certain default checkout templates declare regions where additional content can be inserted. You can add your custom form in any of these regions. These regions are provided with corresponding comments in the default Checkout page layout file `/view/frontend/layout/checkout_index_index.xml`. -For example, the shipping JS component (see [app/code/Magento/Checkout/view/frontend/web/template/shipping.html]({{site.mage2000url}}app/code/Magento/Checkout/view/frontend/web/template/shipping.html)) provides the `before-form` region and corresponding UI container. +Also you locate the regions in the `.html` templates of the blocks used in this layout file. +For example, the shipping JS component (see `/view/frontend/web/template/shipping.html`) provides the `before-form` region and corresponding UI container. Any content added here is rendered before the Shipping Address form on the Shipping Information step. To add content to this region, create a `checkout_index_index.xml` layout update in the `/view/frontend/layout/`. It should be similar to the following: @@ -149,9 +150,9 @@ Any content added here is rendered before the Shipping Address form on the Shipp ### Static forms -If the form fields are not generated dynamically, they can be defined in layout. +If the form fields are not generated dynamically, they can be defined in a layout. -The following code sample shows configuration of the form that contains four fields: text input, select, checkbox, and date. This form uses checkout data provider (`checkoutProvider`) that is introduced in the Magento_Checkout module: +The following code sample shows configuration of the form that contains four fields: text input, select, checkbox, and date. This form uses checkout data provider (`checkoutProvider`) that is introduced in the `Magento_Checkout` module:

    Do we need to add a link or any other details

    From 863fd1a5e58f4f79768c4108347d289fd1119420 Mon Sep 17 00:00:00 2001 From: Oleksandra Marchenko Date: Tue, 2 Feb 2016 16:52:09 +0200 Subject: [PATCH 098/902] Updated FDG prereq. againg --- guides/v2.0/frontend-dev-guide/bk-frontend-dev-guide.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/guides/v2.0/frontend-dev-guide/bk-frontend-dev-guide.md b/guides/v2.0/frontend-dev-guide/bk-frontend-dev-guide.md index 660db51c10d..b92775ea0b7 100644 --- a/guides/v2.0/frontend-dev-guide/bk-frontend-dev-guide.md +++ b/guides/v2.0/frontend-dev-guide/bk-frontend-dev-guide.md @@ -40,12 +40,13 @@ Frontend developers can use this guide to create custom themes to tailor the Mag To implement what is discussed in this guide, you need a working Magento installation and the following browser versions installed on your device: -* Internet Explorer 9 or later (Windows) for storefront; Internet Explorer 11 or later (Windows) for Admin +* Internet Explorer 9 or later (Windows) for storefront; Internet Explorer Edge, 11 or later (Windows) for Admin * Mozilla Firefox latest, latest-1 (any operating system) * Google Chrome latest, latest-1 (any operating system) * Apple Safari latest, latest-1 (Mac OS) -* Apple Safari Mobile for iPad 2, iPad Mini, iPad with Retina Display (iOS 7 or later), for desktop frontend -* Apple Safari Mobile for iPhone 4 or later; iOS 7 or later, for mobile frontend +* Apple Safari Mobile for iPad 2, iPad Mini, iPad with Retina Display (iOS 7 or later), for desktop storefront +* Apple Safari Mobile for iPhone 4 or later; iOS 7 or later, for mobile storefront +* Chrome for mobile latest-1 (Android 4 or later) for mobile storefront To use this guide, you must be familiar with: From 6993ae57286f95f076ed4e0e28c5aaa350608055 Mon Sep 17 00:00:00 2001 From: stevjohnson Date: Tue, 2 Feb 2016 09:25:40 -0600 Subject: [PATCH 099/902] Fix data migration tool installation --- .../v2.0/migration/migration-tool-install.md | 48 +++++++------------ 1 file changed, 17 insertions(+), 31 deletions(-) diff --git a/guides/v2.0/migration/migration-tool-install.md b/guides/v2.0/migration/migration-tool-install.md index 53bd73af19a..550606759c0 100644 --- a/guides/v2.0/migration/migration-tool-install.md +++ b/guides/v2.0/migration/migration-tool-install.md @@ -25,18 +25,23 @@ Before you continue, make sure you completed all tasks discussed in -

    You must clone the same branch of both repositories. For example, if you cloned the Magento 2 develop branch, you must clone the Data Migration Tool's develop branch also.

    +

    You must use the same version of both Magento 2 and the Data Migration Tool. For example, if you're using Magento version 2.0.2, you must also use Data Migration Tool version 2.0.2. To find the version of the software, open its root composer.json and look for the value of version.

    To install the Data Migration Tool from GitHub, use the following steps: 1. Log in to your Magento 2 server as a user with privileges to write to the Magento 2 file system or
    switch to the Magento file system owner. 2. Change to Magento 2 root directory. -3. Enter the following commands in the order shown: +3. Clone the the Data Migration Tool repository: - composer config repositories.data-migration-tool git https://github.com/magento/data-migration-tool - composer require magento/data-migration-tool:dev-master -3. Wait while dependencies are updated. + git clone git@github.com:magento/data-migration-tool-ce.git +4. Check out the corresponding *tag* (it must match the Magento 2 software): + + git checkout tags/ -v + + For example, for 2.0.2, enter: + + git checkout tags/2.0.2 -b 2.0.2 ### Install the tool from `repo.magento.com` {#install-repo} To install the Data Migration Tool, you must update `composer.json` in the Magento root installation directory to provide the location of the Data Migration Tool package. @@ -45,7 +50,7 @@ To install the Data Migration Tool, you must update `composer.json` in the Magen

    You must use the same version of both Magento 2 and the Data Migration Tool. For example, if you're using Magento version 2.0.2, you must also use Data Migration Tool version 2.0.2. To find the version of the software, open its root composer.json and look for the value of version.

    -To install the Data Migration Tool, you must: +To install the Data Migration Tool: 1. Log in to your Magento 2 server as a user with privileges to write to the Magento 2 file system or switch to the Magento file system owner. 2. Change to Magento 2 root directory. @@ -53,37 +58,18 @@ To install the Data Migration Tool, you must: 3. Enter the following commands in the order shown: composer config repositories.data-migration-tool git https://github.com/magento/data-migration-tool - composer require magento/data-migration-tool:dev-master -3. When prompted, enter your authentication keys. Your public key is your username; your private key is your password. - -To update `composer.json`: - -1. Log in to your Magento server as the switch to the Magento file system owner or as a user with privileges to write to the Magento 2 file system. - -2. Go to Magento 2 root directory. + composer require magento/data-migration-tool: -7. Enter the following command to reference Magento repo in `composer.json`: + For example, for version 2.0.2, enter: - composer config repositories.magento composer https://repo.magento.com - -8. Enter the following command to require the current version of the package: - - composer require magento/data-migration-tool: - - where `` is either an exact version or next significant release syntax. - - Exact version example: - - composer require magento/data-migration-tool:2.0.0 - - Next significant release example: + composer config repositories.data-migration-tool git https://github.com/magento/data-migration-tool + composer require magento/data-migration-tool: - composer require magento/data-migration-tool:~2.0.0 + where `` ix the version corresponding to your Magento 2 version +3. When prompted, enter your authentication keys. Your public key is your username; your private key is your password. -9. Wait while dependencies are installed. ###Related topics * Configure migration - * Preconditions From 85b02cef18d88bd09725d616049eb5426ad8e731 Mon Sep 17 00:00:00 2001 From: stevjohnson Date: Tue, 2 Feb 2016 11:35:13 -0600 Subject: [PATCH 100/902] Updates to migration guide --- guides/v2.0/migration/migration-manually.md | 7 ++++--- guides/v2.0/migration/migration-tool-install.md | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/guides/v2.0/migration/migration-manually.md b/guides/v2.0/migration/migration-manually.md index 61a84e3722a..5c8b2bf8bf9 100644 --- a/guides/v2.0/migration/migration-manually.md +++ b/guides/v2.0/migration/migration-manually.md @@ -15,9 +15,10 @@ redirect_from: /guides/v1.0/migration/migration-manually.html There are three types of data that need to be manually migrated: -* Media -* Storefront design -* ACLs +* Media +* Storefront design +* Admin users +* ACLs ### Media This section discusses how to manually migrate media files. diff --git a/guides/v2.0/migration/migration-tool-install.md b/guides/v2.0/migration/migration-tool-install.md index 550606759c0..45b72539f1e 100644 --- a/guides/v2.0/migration/migration-tool-install.md +++ b/guides/v2.0/migration/migration-tool-install.md @@ -34,7 +34,7 @@ To install the Data Migration Tool from GitHub, use the following steps: 2. Change to Magento 2 root directory. 3. Clone the the Data Migration Tool repository: - git clone git@github.com:magento/data-migration-tool-ce.git + git clone git@github.com:magento/data-migration-tool.git 4. Check out the corresponding *tag* (it must match the Magento 2 software): git checkout tags/ -v From 0b24c91de0c0379bcdf28ad2d0766b3edc60edf1 Mon Sep 17 00:00:00 2001 From: stevjohnson Date: Tue, 2 Feb 2016 12:10:06 -0600 Subject: [PATCH 101/902] Verifying migration tool edits --- .../v2.0/migration/migration-tool-install.md | 22 +++++++++---------- .../migration/migration-tool-preconditions.md | 2 +- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/guides/v2.0/migration/migration-tool-install.md b/guides/v2.0/migration/migration-tool-install.md index 45b72539f1e..8134afd9987 100644 --- a/guides/v2.0/migration/migration-tool-install.md +++ b/guides/v2.0/migration/migration-tool-install.md @@ -18,16 +18,13 @@ Before you continue, make sure you completed all tasks discussed in

    You should install the Data Migration Tool the same way you installed the Magento software, as follows:

    +
  • If you cloned the Magento 2 GitHub repository because you're contributing code to Magento 2, install the Data Migration tool using GitHub.
  • +
  • You must use the same version of both Magento 2 and the Data Migration Tool. For example, if you're using Magento version 2.0.2, you must also use Data Migration Tool version 2.0.2.
  • ### Install the tool from GitHub {#install-github} This section discusses how to install the migration tool if you cloned the Magento 2 and migration tool GitHub repositories. -
    -

    You must use the same version of both Magento 2 and the Data Migration Tool. For example, if you're using Magento version 2.0.2, you must also use Data Migration Tool version 2.0.2. To find the version of the software, open its root composer.json and look for the value of version.

    -
    - To install the Data Migration Tool from GitHub, use the following steps: 1. Log in to your Magento 2 server as a user with privileges to write to the Magento 2 file system or switch to the Magento file system owner. @@ -35,8 +32,13 @@ To install the Data Migration Tool from GitHub, use the following steps: 3. Clone the the Data Migration Tool repository: git clone git@github.com:magento/data-migration-tool.git -4. Check out the corresponding *tag* (it must match the Magento 2 software): +4. Verify your Magento 2 version using the following commands: + cd + git branch +4. Check out the corresponding *tag* of the Data Migration Tool (it must match the Magento 2 software): + + cd git checkout tags/ -v For example, for 2.0.2, enter: @@ -46,15 +48,13 @@ To install the Data Migration Tool from GitHub, use the following steps: ### Install the tool from `repo.magento.com` {#install-repo} To install the Data Migration Tool, you must update `composer.json` in the Magento root installation directory to provide the location of the Data Migration Tool package. -
    -

    You must use the same version of both Magento 2 and the Data Migration Tool. For example, if you're using Magento version 2.0.2, you must also use Data Migration Tool version 2.0.2. To find the version of the software, open its root composer.json and look for the value of version.

    -
    - To install the Data Migration Tool: 1. Log in to your Magento 2 server as a user with privileges to write to the Magento 2 file system or switch to the Magento file system owner. -2. Change to Magento 2 root directory. +4. Verify your Magento 2 version using the following commands: + php /bin/magento --version +2. Change to Magento 2 root directory. 3. Enter the following commands in the order shown: composer config repositories.data-migration-tool git https://github.com/magento/data-migration-tool diff --git a/guides/v2.0/migration/migration-tool-preconditions.md b/guides/v2.0/migration/migration-tool-preconditions.md index 828dd30cb31..a43d2feeb9d 100644 --- a/guides/v2.0/migration/migration-tool-preconditions.md +++ b/guides/v2.0/migration/migration-tool-preconditions.md @@ -32,7 +32,7 @@ Before you start your migration, you must do all of the following: * Migrate Magento 1 extension code to Magento 2 - Reach out to your extension providers to see if they have been ported yet + Reach out to your extension providers to see if they have been ported yet. For assistance, you can also use the Magento code migration tool. ###Related topics From 18e5f58c67f8e2b8a6672249e622dfd313729d38 Mon Sep 17 00:00:00 2001 From: stevjohnson Date: Tue, 2 Feb 2016 12:30:12 -0600 Subject: [PATCH 102/902] Update --- guides/v2.0/migration/migration-tool-install.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guides/v2.0/migration/migration-tool-install.md b/guides/v2.0/migration/migration-tool-install.md index 8134afd9987..8fd6e1703d3 100644 --- a/guides/v2.0/migration/migration-tool-install.md +++ b/guides/v2.0/migration/migration-tool-install.md @@ -63,7 +63,7 @@ To install the Data Migration Tool: For example, for version 2.0.2, enter: composer config repositories.data-migration-tool git https://github.com/magento/data-migration-tool - composer require magento/data-migration-tool: + composer require magento/data-migration-tool:2.0.2 where `` ix the version corresponding to your Magento 2 version 3. When prompted, enter your authentication keys. Your public key is your username; your private key is your password. From d8bd07457ae093d82a0e0cf8e8a90f59c6ebdc58 Mon Sep 17 00:00:00 2001 From: stevjohnson Date: Tue, 2 Feb 2016 15:13:54 -0600 Subject: [PATCH 103/902] Updates --- .../install/web/install-web_3-web-conf.md | 5 +++-- .../cli/install-cli-subcommands-deployment.md | 19 ++++++++++++++++++- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/_includes/install/web/install-web_3-web-conf.md b/_includes/install/web/install-web_3-web-conf.md index 7dccab4aacd..5ee32f2481e 100644 --- a/_includes/install/web/install-web_3-web-conf.md +++ b/_includes/install/web/install-web_3-web-conf.md @@ -40,7 +40,7 @@
    - @@ -55,5 +55,6 @@ 12. Click **Next**. + - +*[sensitive data]: Magento uses your encryption key to encrypt the following: Credit card information, user names and passwords specified in the Magento Admin configuration. Magento does *not* encrypt Admin and customer user names and passwords, address, phone number; and other types of personally identification except for credit card numbers. \ No newline at end of file diff --git a/guides/v2.0/install-gde/install/cli/install-cli-subcommands-deployment.md b/guides/v2.0/install-gde/install/cli/install-cli-subcommands-deployment.md index 2e9f871020a..18a8cca862b 100644 --- a/guides/v2.0/install-gde/install/cli/install-cli-subcommands-deployment.md +++ b/guides/v2.0/install-gde/install/cli/install-cli-subcommands-deployment.md @@ -103,7 +103,7 @@ The following table discusses the meanings of installation parameters and values - + + From 44d5863276ba8f6afebafff6eeb3d1b24a5c8c56 Mon Sep 17 00:00:00 2001 From: stevjohnson Date: Tue, 2 Feb 2016 15:18:14 -0600 Subject: [PATCH 104/902] Fix bad links in checkout howdoi --- guides/v2.0/howdoi/checkout/checkout_overview.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/guides/v2.0/howdoi/checkout/checkout_overview.md b/guides/v2.0/howdoi/checkout/checkout_overview.md index 655f86d021d..47c8b21d8d6 100644 --- a/guides/v2.0/howdoi/checkout/checkout_overview.md +++ b/guides/v2.0/howdoi/checkout/checkout_overview.md @@ -22,9 +22,9 @@ You can customize the default checkout in many ways. Here the following customiz - [Customize the view of an existing step]({{site.gdeurl}}howdoi/checkout/checkout_new_step.html) - [Add a custom payment method to checkout]({{site.gdeurl}}howdoi/checkout/checkout_payment.html) - [Add custom validations before order placement]({{site.gdeurl}}howdoi/checkout/checkout_order.html) - - [Add custom shipping carrier validations]({{site.gdeurl}}checkout/checkout_carrier.html) - - [Add custom input mask for ZIP code]({{site.gdeurl}}checkout/checkout_zip.html) - - [Add a custom template for a form field on Checkout page]({{site.gdeurl}}checkout/checkout_edit_form.html) + - [Add custom shipping carrier validations]({{site.gdeurl}}howdoi/checkout/checkout_carrier.html) + - [Add custom input mask for ZIP code]({{site.gdeurl}}howdoi/checkout/checkout_zip.html) + - [Add a custom template for a form field on Checkout page]({{site.gdeurl}}howdoi/checkout/checkout_edit_form.html) From 7841908a3d9d36492c953111a651d32ae7554d78 Mon Sep 17 00:00:00 2001 From: stevjohnson Date: Tue, 2 Feb 2016 15:58:14 -0600 Subject: [PATCH 105/902] Issue#499. Update information about sensitive data in several topics --- _config.yml | 2 +- _includes/install/sens-data.md | 15 +++++++++++++++ _includes/install/web/install-web_3-web-conf.md | 6 ++---- guides/m1x/install/installing_install.html | 2 +- .../install/cli/install-cli-install.md | 4 +++- .../cli/install-cli-subcommands-deployment.md | 14 +------------- 6 files changed, 23 insertions(+), 20 deletions(-) create mode 100644 _includes/install/sens-data.md diff --git a/_config.yml b/_config.yml index 526ff5a99ab..ed99b274971 100644 --- a/_config.yml +++ b/_config.yml @@ -18,7 +18,7 @@ mage2000url: "https://github.com/magento/magento2/blob/2.0/" # 1.x variables m1xgdeurl: "/guides/m1x/" -m1xgithuburl: "https://github.com/magento/devdocs/tree/m1x/guides/m1x/" +m1xgithuburl: "https://github.com/magento/devdocs/tree/2.0/guides/m1x/" # 2.1.0 variables gdeurl21: "/guides/v2.1/" diff --git a/_includes/install/sens-data.md b/_includes/install/sens-data.md new file mode 100644 index 00000000000..e4d7abba6be --- /dev/null +++ b/_includes/install/sens-data.md @@ -0,0 +1,15 @@ +
    + +#### What is sensitive data? {#sens-data} +Magento uses your encryption key to encrypt the following: + +* Credit card information +* User names and passwords specified in the Magento Admin configuration +* CAPTCHA values sent over the network + +Magento does *not* encrypt: + +* Administrative and customer user names and passwords (these passwords are hashed) +* Address +* Phone number +* Other types of personally identification except for credit card numbers \ No newline at end of file diff --git a/_includes/install/web/install-web_3-web-conf.md b/_includes/install/web/install-web_3-web-conf.md index 5ee32f2481e..19455f26fc1 100644 --- a/_includes/install/web/install-web_3-web-conf.md +++ b/_includes/install/web/install-web_3-web-conf.md @@ -40,7 +40,7 @@
    - @@ -55,6 +55,4 @@ 12. Click **Next**. - - -*[sensitive data]: Magento uses your encryption key to encrypt the following: Credit card information, user names and passwords specified in the Magento Admin configuration. Magento does *not* encrypt Admin and customer user names and passwords, address, phone number; and other types of personally identification except for credit card numbers. \ No newline at end of file +{% include install/sens-data.md %} \ No newline at end of file diff --git a/guides/m1x/install/installing_install.html b/guides/m1x/install/installing_install.html index 6d06cf793a0..4cd136a4ffa 100644 --- a/guides/m1x/install/installing_install.html +++ b/guides/m1x/install/installing_install.html @@ -494,7 +494,7 @@

    Installing Magento CE or EE

    - diff --git a/guides/v2.0/install-gde/install/cli/install-cli-install.md b/guides/v2.0/install-gde/install/cli/install-cli-install.md index 638743df09a..c97ead998a2 100644 --- a/guides/v2.0/install-gde/install/cli/install-cli-install.md +++ b/guides/v2.0/install-gde/install/cli/install-cli-install.md @@ -260,7 +260,7 @@ The following table discusses the meanings of installation option names and valu - + @@ -314,6 +314,8 @@ The following table discusses the meanings of installation option names and valu +{% include install/sens-data.md %} +

    Sample localhost installations

    **Example 1** diff --git a/guides/v2.0/install-gde/install/cli/install-cli-subcommands-deployment.md b/guides/v2.0/install-gde/install/cli/install-cli-subcommands-deployment.md index 18a8cca862b..db1eb921641 100644 --- a/guides/v2.0/install-gde/install/cli/install-cli-subcommands-deployment.md +++ b/guides/v2.0/install-gde/install/cli/install-cli-subcommands-deployment.md @@ -134,19 +134,7 @@ The following table discusses the meanings of installation parameters and values
    Encryption Key

    Magento uses an encryption key to encrypt personally identifiable customer information in the database.

    +

    Magento uses an encryption key to encrypt sensitive data in the database.

    Click I want to use a Magento generated key to have Magento generate an encryption key for you.

    Click I want to use my own encryption key if you already have an encryption key.

    --key

    If you have one, specify a key to encrypt sensitive data in the Magento database. (This includes passwords and personally identifiable customer information.) If you don't have one, Magento generates one for you.

    If you have one, specify a key to encrypt sensitive data in the Magento database. (This includes passwords and personally identifiable customer information.) If you don't have one, Magento generates one for you.

    No

    Encryption Key

    Magento uses an encryption key to encrypt sensitive data in the database.

    +

    Magento uses an encryption key to encrypt sensitive data in the database.

    Click I want to use a Magento generated key to have Magento generate an encryption key for you.

    Click I want to use my own encryption key if you already have an encryption key.

    Encryption KeyIf you have one, enter a key to encrypt sensitive data (such as passwords and personally identifiable customer information) in the Magento database. If you don't have one, Magento generates one for you.
    +
    If you have one, enter a key to encrypt sensitive data in the Magento database. If you don't have one, Magento generates one for you.
    The encryption key is stored in [your Magento install dir]/app/etc/local.xml.

    --key

    If you have one, specify a key to encrypt personally identifiable data in the Magento database. If you don't have one, Magento generates one for you.

    If you have one, specify a key to encrypt sensitive data in the Magento database. If you don't have one, Magento generates one for you.

    No

    -

    sensitive data

    : - -Magento uses your encryption key to encrypt the following: - -* Credit card information -* User names and passwords specified in the Magento Admin configuration - -Magento does *not* encrypt: - -* Administrative and customer user names and passwords -* address -* phone number -* Other types of personally identification except for credit card numbers +{% include install/sens-data.md %} If applicable, continue your Magento software installation: From afaa171116a8f375bf857e90cf833d2fb2206e1e Mon Sep 17 00:00:00 2001 From: stevjohnson Date: Tue, 2 Feb 2016 16:54:52 -0600 Subject: [PATCH 106/902] Fix incorrect redirect --- guides/v2.0/install-gde/prereq/integrator_install.md | 1 - 1 file changed, 1 deletion(-) diff --git a/guides/v2.0/install-gde/prereq/integrator_install.md b/guides/v2.0/install-gde/prereq/integrator_install.md index af6a331439a..d6078f7f8b7 100644 --- a/guides/v2.0/install-gde/prereq/integrator_install.md +++ b/guides/v2.0/install-gde/prereq/integrator_install.md @@ -7,7 +7,6 @@ menu_title: (Integrator) Get the Composer metapackage menu_order: 1 menu_node: parent github_link: install-gde/prereq/integrator_install.md -redirect_from: /guides/v2.0/install-gde/install/file-system-perms.html ---
    From 7d1193e8919305f6bf4f4feee03421212018df76 Mon Sep 17 00:00:00 2001 From: Aleksey Kiseliov Date: Wed, 3 Feb 2016 14:22:47 +0200 Subject: [PATCH 107/902] Update installer-privileges_before.html --- guides/m1x/install/installer-privileges_before.html | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/guides/m1x/install/installer-privileges_before.html b/guides/m1x/install/installer-privileges_before.html index 72d51a34331..27df584cf2b 100644 --- a/guides/m1x/install/installer-privileges_before.html +++ b/guides/m1x/install/installer-privileges_before.html @@ -59,7 +59,9 @@

    Recommended Privileges and Ownership Before You Install Ma
  • All directories have 700 permissions (drwx------).
    700 permissions give full control (that is, read/write/execute) to the owner and no permissions to anyone else.
  • All files have 600 permissions (-rw-------).
    -600 permissions mean the owner can read and write but other users have no permissions.
  • +600 permissions mean the owner can read and write but other users have no permissions. +
  • If you use PHP-FPM (FastCGI Process Manager), make sure it is configured to run the same user as the Apache web server (Nginx web server).
    +This allows web server to access content generated by Magento (Uploaded files, images, etc.).
  • Note: On a dedicated system, all commands discussed in this article must be entered as a user with root privileges.

    After you extract the Magento installation package, set ownership and permissions as follows:

    1. Dedicated Magento server only. Find the web server user: From 38fcaa63a0b18c2198ee0e2243b519157cb99648 Mon Sep 17 00:00:00 2001 From: stevjohnson Date: Wed, 3 Feb 2016 06:53:04 -0600 Subject: [PATCH 108/902] Update migration install --- .../v2.0/migration/migration-tool-install.md | 36 ++++++++++++------- 1 file changed, 24 insertions(+), 12 deletions(-) diff --git a/guides/v2.0/migration/migration-tool-install.md b/guides/v2.0/migration/migration-tool-install.md index 8fd6e1703d3..3d9a9142ce7 100644 --- a/guides/v2.0/migration/migration-tool-install.md +++ b/guides/v2.0/migration/migration-tool-install.md @@ -29,22 +29,32 @@ To install the Data Migration Tool from GitHub, use the following steps: 1. Log in to your Magento 2 server as a user with privileges to write to the Magento 2 file system or switch to the Magento file system owner. 2. Change to Magento 2 root directory. -3. Clone the the Data Migration Tool repository: - - git clone git@github.com:magento/data-migration-tool.git 4. Verify your Magento 2 version using the following commands: cd git branch -4. Check out the corresponding *tag* of the Data Migration Tool (it must match the Magento 2 software): - cd - git checkout tags/ -v +4. If your current branch is `develop`, you must change to a tagged version. We recommend the latest available version. - For example, for 2.0.2, enter: + For example, to change to the 2.0.2 version, enter: git checkout tags/2.0.2 -b 2.0.2 +5. If you changed branches, you must update the Magento 2 database and schema as follows: + + php /bin/magento setup:upgrade +3. Enter the following commands: + + composer config repositories.data-migration-tool git https://github.com/magento/data-migration-tool + composer require magento/data-migration-tool: + + where `` must match the version of the Magento 2 codebase. + + For example, for version 2.0.2, enter: + + composer config repositories.data-migration-tool git https://github.com/magento/data-migration-tool + composer require magento/data-migration-tool:2.0.2 + ### Install the tool from `repo.magento.com` {#install-repo} To install the Data Migration Tool, you must update `composer.json` in the Magento root installation directory to provide the location of the Data Migration Tool package. @@ -57,15 +67,17 @@ To install the Data Migration Tool: 2. Change to Magento 2 root directory. 3. Enter the following commands in the order shown: - composer config repositories.data-migration-tool git https://github.com/magento/data-migration-tool - composer require magento/data-migration-tool: + composer config repositories.magento composer https://repo.magento.com + composer require magento/data-migration-tool: + + where `` is the version of the Magento 2 codebase. For example, for version 2.0.2, enter: - composer config repositories.data-migration-tool git https://github.com/magento/data-migration-tool - composer require magento/data-migration-tool:2.0.2 + composer config repositories.magento composer https://repo.magento.com + composer require magento/data-migration-tool:2.0.2 + - where `` ix the version corresponding to your Magento 2 version 3. When prompted, enter your authentication keys. Your public key is your username; your private key is your password. From 5c7733b733f87d957ed80257ca8df6b62c032668 Mon Sep 17 00:00:00 2001 From: stevjohnson Date: Wed, 3 Feb 2016 12:35:49 -0600 Subject: [PATCH 109/902] MAGETWO-48563. Update the migration guide with correct installation procedures. Add topic to the install guide that shows how to get a released tag. --- .../install-gde/install/cli/dev_downgrade.md | 40 +++++++++++++ .../install-gde/install/cli/dev_options.md | 1 + .../install-gde/install/cli/dev_reinstall.md | 2 +- .../install/cli/dev_update-magento.md | 2 +- .../install/cli/install-cli-uninstall.md | 2 +- guides/v2.0/install-gde/prereq/dev_install.md | 31 ++++++++-- .../v2.0/migration/migration-tool-install.md | 60 +++++++++++-------- 7 files changed, 106 insertions(+), 32 deletions(-) create mode 100644 guides/v2.0/install-gde/install/cli/dev_downgrade.md diff --git a/guides/v2.0/install-gde/install/cli/dev_downgrade.md b/guides/v2.0/install-gde/install/cli/dev_downgrade.md new file mode 100644 index 00000000000..307f7177db6 --- /dev/null +++ b/guides/v2.0/install-gde/install/cli/dev_downgrade.md @@ -0,0 +1,40 @@ +--- +layout: default +group: install_cli +subgroup: 99_contrib +title: Change to a released version +menu_title: Change to a released version +menu_order: 200 +menu_node: +github_link: install-gde/install/cli/dev_downgrade.md +--- + +This topic discusses how a contributing developer can change versions of the Magento software after cloning the `develop` branch. This might be necessary, for example, to use the Magento Data Migration Tool or perform some tasks that require a specific Magento version other than `develop`. + +The `develop` branch is the default branch, which means you get it by default when you clone the Magento 2 GitHub repository. For some tasks, such as data migration, you must use a release tag. + +To change versions after cloning: + +1. Log in to your Magento server as, or switch to, the Magento file system owner. +2. Use the following command to uninstall the Magento software: + + php /bin/magento setup:uninstall +3. Either remove your old Magento clone directory or update the Magento software. +4. If you haven't already done so, clone the Magento 2 GitHub repository'sas follows: + + git clone git@github.com:magento/magento2.git + + Change to release tag as follows: + + git checkout tags/ [-b ] + + For example, to check out the 2.0.2 release tag in a new branch named `2.0.2`, enter + + git checkout tags/2.0.2 -b 2.0.2 + +5. Install the Magento software using the command line or Setup Wizard. + + + +*[contributing developer]: A developer who contributes code to the Magento 2 CE codebase +*[contributing developers]: Developers who contribute code to the Magento 2 CE codebase \ No newline at end of file diff --git a/guides/v2.0/install-gde/install/cli/dev_options.md b/guides/v2.0/install-gde/install/cli/dev_options.md index aaf3287168f..e97aea0dbe0 100644 --- a/guides/v2.0/install-gde/install/cli/dev_options.md +++ b/guides/v2.0/install-gde/install/cli/dev_options.md @@ -13,6 +13,7 @@ redirect_from: guides/v2.0/install-gde/install/dev_updater.md The following topics apply to you *only* if you used `git clone` to install the Magento CE GitHub repository. This usually means you contribute code to the Magento CE codebase. * To update the Magento software, use `git pull origin` and `composer update` +* To change versions from `develop` to a release version like `2.0.2`, you must uninstall the Magento software and install the released version. * To add, remove, or update components, modify `composer.json` and run `composer update` * To reinstall the Magento software, modify the product version in `composer.json`, run `composer update`, then reinstall the Magento software diff --git a/guides/v2.0/install-gde/install/cli/dev_reinstall.md b/guides/v2.0/install-gde/install/cli/dev_reinstall.md index 077135432da..101000eb356 100644 --- a/guides/v2.0/install-gde/install/cli/dev_reinstall.md +++ b/guides/v2.0/install-gde/install/cli/dev_reinstall.md @@ -13,7 +13,7 @@ A contributing developer reinstalls Magento by updating `composer.json` to speci To reinstall the Magento software as a contributing developer: -2. Log in to your Magento server as a user with permissions to modify files in the Magento file system (for example, the switch to the Magento file system owner). +2. Log in to your Magento server as a user with permissions to modify files in the Magento file system (for example, the switch to the Magento file system owner. 3. Make a backup copy of `composer.json` in your Magento installation directory: cd diff --git a/guides/v2.0/install-gde/install/cli/dev_update-magento.md b/guides/v2.0/install-gde/install/cli/dev_update-magento.md index c6bba11bd36..f4b4e91fd5d 100644 --- a/guides/v2.0/install-gde/install/cli/dev_update-magento.md +++ b/guides/v2.0/install-gde/install/cli/dev_update-magento.md @@ -14,7 +14,7 @@ This topic discusses how a contributing developer can update the Magento applica To update the Magento software if you're a contributing developer: -1. Log in to your Magento server as a user with permissions to modify files in the Magento file system (for example, the switch to the Magento file system owner). +1. Log in to your Magento server as a user with permissions to modify files in the Magento file system (for example, the switch to the Magento file system owner. 3. Save any changes you made to `composer.json` because the following steps will overwrite it: cd diff --git a/guides/v2.0/install-gde/install/cli/install-cli-uninstall.md b/guides/v2.0/install-gde/install/cli/install-cli-uninstall.md index 9bf83420413..bade6984e8c 100644 --- a/guides/v2.0/install-gde/install/cli/install-cli-uninstall.md +++ b/guides/v2.0/install-gde/install/cli/install-cli-uninstall.md @@ -49,7 +49,7 @@ The way you reinstall the Magento application from the command line depends on y

      Reinstall as a system integrator

      To reinstall the Magento software as a system integrator: -1. Log in to your Magento server as a user with permissions to modify files in the Magento file system (for example, the switch to the Magento file system owner). +1. Log in to your Magento server as a user with permissions to modify files in the Magento file system (for example, the switch to the Magento file system owner. 2. Enter the following commands in the order shown: cd diff --git a/guides/v2.0/install-gde/prereq/dev_install.md b/guides/v2.0/install-gde/prereq/dev_install.md index 3fc71a4350a..3a1a37c9fb7 100644 --- a/guides/v2.0/install-gde/prereq/dev_install.md +++ b/guides/v2.0/install-gde/prereq/dev_install.md @@ -34,9 +34,11 @@ The audience for this topic is anyone who contributes to the Magento codebase. I This section discusses how to get current code by cloning the Magento GitHub's develop branch. You can clone either a release branch or the `develop` branch: * Release branches like `2.0` or `.2.0.1` are more stable + + You *must* use a released branch with the Data Migration Tool. * `develop` is more recent -Currently, the `develop` branch is the default but you can clone a release branch like `2.0.1` using the optional `-b ` argument. +Currently, the `develop` branch is the default but you can checkout a release branch like `2.0.2` after cloning.

      Creating an authorization file

      The Magento 2 GitHub repository requires you to authenticate. The `composer install` commands fails if you do not. To authenticate, generate authentication keys, after which you create an `auth.json` file in the home directory of the Magento file system owner. @@ -85,7 +87,7 @@ To clone the Magento GitHub repository using the SSH protocol: An example follows: - git clone [-b ] git@github.com:magento/magento2.git + git clone git@github.com:magento/magento2.git 3. Wait for the repository to clone on your server. @@ -95,6 +97,13 @@ To clone the Magento GitHub repository using the SSH protocol: Permission denied (publickey). fatal: The remote end hung up unexpectedly

    +4. Optionally switch to a release tag as follows: + + git checkout tags/ [-b ] + + For example, to check out the 2.0.2 release tag in a new branch named `2.0.2`, enter + + git checkout tags/2.0.2 -b 2.0.2 4. Continue with Update installation dependencies. @@ -122,11 +131,23 @@ To clone the Magento GitHub repository using the HTTPS protocol: An example follows - git clone [-b ] https://github.com/magento/magento2.git + git clone https://github.com/magento/magento2.git +3. Wait for the repository to clone on your server. - Use `-b 2.0` to clone the 2.0 release branch; omit it to clone the `develop` branch, which is the default. +
    +

    If the following error displays, make sure you shared your SSH key with GitHub:

    +
    Cloning into 'magento2'...
    +Permission denied (publickey).
    +fatal: The remote end hung up unexpectedly
    +
    -3. Wait for the repository to clone on your server. +4. Optionally switch to a release tag as follows: + + git checkout tags/ [-b ] + + For example, to check out the 2.0.2 release tag in a branch named `2.0.2`, enter + + git checkout tags/2.0.2 -b 2.0.2 #### Next step diff --git a/guides/v2.0/migration/migration-tool-install.md b/guides/v2.0/migration/migration-tool-install.md index 3d9a9142ce7..dc552bd5fbf 100644 --- a/guides/v2.0/migration/migration-tool-install.md +++ b/guides/v2.0/migration/migration-tool-install.md @@ -10,39 +10,50 @@ github_link: migration/migration-tool-install.md redirect_from: /guides/v1.0/migration/migration-tool-install.html --- -## Install the Data Migration Tool -This section discusses how to install the Magento Data Migration Tool. You can install it from either `repo.magento.com` or from the GitHub repository. +#### Contents +* [Prerequisite](#data-migrate-prereq) +* [Install the Data Migration Tool](#data-migrate-install) -Before you continue, make sure you completed all tasks discussed in Preconditions. +## Prerequisite {#data-migrate-prereq} +Before you continue, make sure you are using the *same released version* of both Magento 2 and the Data Migration Tool. For example, if you're using Magento version 2.0.2, you must also use Data Migration Tool version 2.0.2. -
    -

    You should install the Data Migration Tool the same way you installed the Magento software, as follows:

    -
    • If you installed the Magento 2 compressed archive or using composer create-project, install the Data Migration tool using repo.magento.com.
    • -
    • If you cloned the Magento 2 GitHub repository because you're contributing code to Magento 2, install the Data Migration tool using GitHub.
    • -
    • You must use the same version of both Magento 2 and the Data Migration Tool. For example, if you're using Magento version 2.0.2, you must also use Data Migration Tool version 2.0.2.
    -
    +To find the version of the Magento software: -### Install the tool from GitHub {#install-github} -This section discusses how to install the migration tool if you cloned the Magento 2 and migration tool GitHub repositories. +* If you downloaded the Magento software using a Composer metapackage, enter the following command: -To install the Data Migration Tool from GitHub, use the following steps: - -1. Log in to your Magento 2 server as a user with privileges to write to the Magento 2 file system or switch to the Magento file system owner. -2. Change to Magento 2 root directory. -4. Verify your Magento 2 version using the following commands: + php /bin/magento --version +* If you cloned the Magento 2 GitHub repository, enter the following commands: cd git branch -4. If your current branch is `develop`, you must change to a tagged version. We recommend the latest available version. + If you're currently in the `develop` branch, you must change to a released branch before you continue. + +
    + +

    If you haven't installed the Magento software yet, install it now.

    +

    If you're cloning the GitHub repository, make sure you clone a released branch as discussed in (Contributor) Clone the Magento repository.

    +
    + +## Install the Data Migration Tool {#data-migrate-install} +This section discusses how to install the Magento Data Migration Tool. You can install it from either `repo.magento.com` or from the GitHub repository. + +Before you continue, make sure you completed all tasks discussed in Preconditions. - For example, to change to the 2.0.2 version, enter: +You can install the Data Migration Tool in any of the following ways: - git checkout tags/2.0.2 -b 2.0.2 +* [Install from GitHub](#install-github) +* [Install from `repo.magento.com`](#install-repo) + +### Install the tool from GitHub {#install-github} +This section discusses how to install the migration tool if you cloned the Magento 2 and migration tool GitHub repositories. -5. If you changed branches, you must update the Magento 2 database and schema as follows: +Before you continue, make sure you [verified the version](#data-migrate-prereq) of the Magento 2 software. - php /bin/magento setup:upgrade +To install the Data Migration Tool from GitHub, use the following steps: + +1. Log in to your Magento server as, or switch to, the Magento file system owner. +2. Change to Magento 2 root directory. 3. Enter the following commands: composer config repositories.data-migration-tool git https://github.com/magento/data-migration-tool @@ -58,9 +69,11 @@ To install the Data Migration Tool from GitHub, use the following steps: ### Install the tool from `repo.magento.com` {#install-repo} To install the Data Migration Tool, you must update `composer.json` in the Magento root installation directory to provide the location of the Data Migration Tool package. +Before you continue, make sure you [verified the version](#data-migrate-prereq) of the Magento 2 software. + To install the Data Migration Tool: -1. Log in to your Magento 2 server as a user with privileges to write to the Magento 2 file system or switch to the Magento file system owner. +1. Log in to your Magento server as, or switch to, the Magento file system owner. 4. Verify your Magento 2 version using the following commands: php /bin/magento --version @@ -70,14 +83,13 @@ To install the Data Migration Tool: composer config repositories.magento composer https://repo.magento.com composer require magento/data-migration-tool: - where `` is the version of the Magento 2 codebase. + where `` must match the version of the Magento 2 codebase. For example, for version 2.0.2, enter: composer config repositories.magento composer https://repo.magento.com composer require magento/data-migration-tool:2.0.2 - 3. When prompted, enter your authentication keys. Your public key is your username; your private key is your password. From d273cdfff61fdb9e271922aea942ed52182af979 Mon Sep 17 00:00:00 2001 From: stevjohnson Date: Wed, 3 Feb 2016 13:28:00 -0600 Subject: [PATCH 110/902] Ready for spell check --- guides/v2.0/install-gde/install/cli/dev_downgrade.md | 7 +++---- guides/v2.0/migration/migration-tool-install.md | 2 +- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/guides/v2.0/install-gde/install/cli/dev_downgrade.md b/guides/v2.0/install-gde/install/cli/dev_downgrade.md index 307f7177db6..37a1b65557e 100644 --- a/guides/v2.0/install-gde/install/cli/dev_downgrade.md +++ b/guides/v2.0/install-gde/install/cli/dev_downgrade.md @@ -9,9 +9,9 @@ menu_node: github_link: install-gde/install/cli/dev_downgrade.md --- -This topic discusses how a contributing developer can change versions of the Magento software after cloning the `develop` branch. This might be necessary, for example, to use the Magento Data Migration Tool or perform some tasks that require a specific Magento version other than `develop`. +This topic discusses how a contributing developer can change versions of the Magento software after cloning the `develop` branch. This might be necessary to perform some tasks that require a specific Magento version other than `develop`. -The `develop` branch is the default branch, which means you get it by default when you clone the Magento 2 GitHub repository. For some tasks, such as data migration, you must use a release tag. +The `develop` branch is the default branch, which means you get it by default when you clone the Magento 2 GitHub repository. For some tasks, such as data migration from Magento 1.x to Magento 2.x, you must switch to a release tag. To change versions after cloning: @@ -23,8 +23,7 @@ To change versions after cloning: 4. If you haven't already done so, clone the Magento 2 GitHub repository'sas follows: git clone git@github.com:magento/magento2.git - - Change to release tag as follows: +5. Change to release tag as follows: git checkout tags/ [-b ] diff --git a/guides/v2.0/migration/migration-tool-install.md b/guides/v2.0/migration/migration-tool-install.md index dc552bd5fbf..64ff5ba33cb 100644 --- a/guides/v2.0/migration/migration-tool-install.md +++ b/guides/v2.0/migration/migration-tool-install.md @@ -32,7 +32,7 @@ To find the version of the Magento software:

    If you haven't installed the Magento software yet, install it now.

    -

    If you're cloning the GitHub repository, make sure you clone a released branch as discussed in (Contributor) Clone the Magento repository.

    +

    If you're cloning the GitHub repository, make sure you check out a release tag as discussed in (Contributor) Clone the Magento repository.

    ## Install the Data Migration Tool {#data-migrate-install} From e1b513d0301ce4e5f394dffaa3f5dd91945def24 Mon Sep 17 00:00:00 2001 From: Steve Johnson Date: Wed, 3 Feb 2016 11:42:27 -0800 Subject: [PATCH 111/902] Spell check complete --- guides/v2.0/install-gde/install/cli/dev_downgrade.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guides/v2.0/install-gde/install/cli/dev_downgrade.md b/guides/v2.0/install-gde/install/cli/dev_downgrade.md index 37a1b65557e..2cd55e75ee6 100644 --- a/guides/v2.0/install-gde/install/cli/dev_downgrade.md +++ b/guides/v2.0/install-gde/install/cli/dev_downgrade.md @@ -20,7 +20,7 @@ To change versions after cloning: php /bin/magento setup:uninstall 3. Either remove your old Magento clone directory or update the Magento software. -4. If you haven't already done so, clone the Magento 2 GitHub repository'sas follows: +4. If you haven't already done so, clone the Magento 2 GitHub repository follows: git clone git@github.com:magento/magento2.git 5. Change to release tag as follows: From 3c42ceedc211e05125e376d8ec71245810bf7123 Mon Sep 17 00:00:00 2001 From: stevjohnson Date: Wed, 3 Feb 2016 15:52:01 -0600 Subject: [PATCH 112/902] Update --- guides/v2.0/install-gde/install/cli/dev_downgrade.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guides/v2.0/install-gde/install/cli/dev_downgrade.md b/guides/v2.0/install-gde/install/cli/dev_downgrade.md index 2cd55e75ee6..f640f0a218d 100644 --- a/guides/v2.0/install-gde/install/cli/dev_downgrade.md +++ b/guides/v2.0/install-gde/install/cli/dev_downgrade.md @@ -20,7 +20,7 @@ To change versions after cloning: php /bin/magento setup:uninstall 3. Either remove your old Magento clone directory or update the Magento software. -4. If you haven't already done so, clone the Magento 2 GitHub repository follows: +4. If you haven't already done so, clone the Magento 2 GitHub repository as follows: git clone git@github.com:magento/magento2.git 5. Change to release tag as follows: From 1e7528c7a6fa8cb8999b7fc33b2e00165bc23a02 Mon Sep 17 00:00:00 2001 From: stevjohnson Date: Thu, 4 Feb 2016 05:31:32 -0600 Subject: [PATCH 113/902] Add supported storefront and Admin browsers --- _includes/browsers/admin-browser-requirement.md | 11 +++++++++++ .../browsers/storefront-browser-requirement.md | 11 +++++++++++ .../frontend-dev-guide/bk-frontend-dev-guide.md | 8 +------- .../system-requirements_admin-browser.md | 13 +++++++++++++ .../system-requirements_front-browser.md | 13 +++++++++++++ 5 files changed, 49 insertions(+), 7 deletions(-) create mode 100644 _includes/browsers/admin-browser-requirement.md create mode 100644 _includes/browsers/storefront-browser-requirement.md create mode 100644 guides/v2.0/install-gde/system-requirements_admin-browser.md create mode 100644 guides/v2.0/install-gde/system-requirements_front-browser.md diff --git a/_includes/browsers/admin-browser-requirement.md b/_includes/browsers/admin-browser-requirement.md new file mode 100644 index 00000000000..34b16dff494 --- /dev/null +++ b/_includes/browsers/admin-browser-requirement.md @@ -0,0 +1,11 @@ +
    + +* Internet Explorer Edge, 11 or later (Windows) +* Mozilla Firefox latest, latest–1 (any operating system) +* Google Chrome latest, latest–1 (any operating system) +* Apple Safari latest, latest–1 (Mac OS) +* Apple Safari Mobile for iPad 2, iPad Mini, iPad with Retina Display (iOS 7 or later), for desktop storefront +* Apple Safari Mobile for iPhone 4 or later; iOS 7 or later, for mobile storefront +* Chrome for mobile latest–1 (Android 4 or later) for mobile storefront + +where *latest–1* means one major version earlier than the latest released version. \ No newline at end of file diff --git a/_includes/browsers/storefront-browser-requirement.md b/_includes/browsers/storefront-browser-requirement.md new file mode 100644 index 00000000000..1e38adc013c --- /dev/null +++ b/_includes/browsers/storefront-browser-requirement.md @@ -0,0 +1,11 @@ +
    + +* Internet Explorer 9 or later (Windows) +* Mozilla Firefox latest, latest–1 (any operating system) +* Google Chrome latest, latest–1 (any operating system) +* Apple Safari latest, latest–1 (Mac OS) +* Apple Safari Mobile for iPad 2, iPad Mini, iPad with Retina Display (iOS 7 or later), for desktop storefront +* Apple Safari Mobile for iPhone 4 or later; iOS 7 or later, for mobile storefront +* Chrome for mobile latest–1 (Android 4 or later) for mobile storefront + +where *latest–1* means one major version earlier than the latest released version. \ No newline at end of file diff --git a/guides/v2.0/frontend-dev-guide/bk-frontend-dev-guide.md b/guides/v2.0/frontend-dev-guide/bk-frontend-dev-guide.md index b92775ea0b7..6b11ba46f67 100644 --- a/guides/v2.0/frontend-dev-guide/bk-frontend-dev-guide.md +++ b/guides/v2.0/frontend-dev-guide/bk-frontend-dev-guide.md @@ -40,13 +40,7 @@ Frontend developers can use this guide to create custom themes to tailor the Mag To implement what is discussed in this guide, you need a working Magento installation and the following browser versions installed on your device: -* Internet Explorer 9 or later (Windows) for storefront; Internet Explorer Edge, 11 or later (Windows) for Admin -* Mozilla Firefox latest, latest-1 (any operating system) -* Google Chrome latest, latest-1 (any operating system) -* Apple Safari latest, latest-1 (Mac OS) -* Apple Safari Mobile for iPad 2, iPad Mini, iPad with Retina Display (iOS 7 or later), for desktop storefront -* Apple Safari Mobile for iPhone 4 or later; iOS 7 or later, for mobile storefront -* Chrome for mobile latest-1 (Android 4 or later) for mobile storefront +{% include browsers/storefront-browser-requirement.md %} To use this guide, you must be familiar with: diff --git a/guides/v2.0/install-gde/system-requirements_admin-browser.md b/guides/v2.0/install-gde/system-requirements_admin-browser.md new file mode 100644 index 00000000000..95ece3ab867 --- /dev/null +++ b/guides/v2.0/install-gde/system-requirements_admin-browser.md @@ -0,0 +1,13 @@ +--- +layout: default +group: install_pre +subgroup: Getting Started +title: Supported Magento Admin browsers +menu_title: Supported Magento Admin browsers +menu_node: +menu_order: 3 +github_link: install-gde/system-requirements_admin-browser.md +--- + +## Supported Magento Admin browsers +{% include browsers/admin-browser-requirement.md %} \ No newline at end of file diff --git a/guides/v2.0/install-gde/system-requirements_front-browser.md b/guides/v2.0/install-gde/system-requirements_front-browser.md new file mode 100644 index 00000000000..44960b86450 --- /dev/null +++ b/guides/v2.0/install-gde/system-requirements_front-browser.md @@ -0,0 +1,13 @@ +--- +layout: default +group: install_pre +subgroup: Getting Started +title: Supported storefront browsers +menu_title: Supported storefront browsers +menu_node: +menu_order: 2 +github_link: install-gde/system-requirements_front-browser.md +--- + +## Supported storefront browsers +{% include browsers/storefront-browser-requirement.md %} \ No newline at end of file From 1a74316233cc293762ab17fdbbbe490a4271ec65 Mon Sep 17 00:00:00 2001 From: stevjohnson Date: Thu, 4 Feb 2016 07:12:23 -0600 Subject: [PATCH 114/902] Consolidate into one list --- .../browsers/storefront-browser-requirement.md | 11 ----------- ...browser-requirement.md => supported-browsers.md} | 8 +++++++- .../frontend-dev-guide/bk-frontend-dev-guide.md | 2 +- .../system-requirements_admin-browser.md | 13 ------------- .../install-gde/system-requirements_browsers.md | 13 +++++++++++++ .../system-requirements_front-browser.md | 13 ------------- 6 files changed, 21 insertions(+), 39 deletions(-) delete mode 100644 _includes/browsers/storefront-browser-requirement.md rename _includes/browsers/{admin-browser-requirement.md => supported-browsers.md} (75%) delete mode 100644 guides/v2.0/install-gde/system-requirements_admin-browser.md create mode 100644 guides/v2.0/install-gde/system-requirements_browsers.md delete mode 100644 guides/v2.0/install-gde/system-requirements_front-browser.md diff --git a/_includes/browsers/storefront-browser-requirement.md b/_includes/browsers/storefront-browser-requirement.md deleted file mode 100644 index 1e38adc013c..00000000000 --- a/_includes/browsers/storefront-browser-requirement.md +++ /dev/null @@ -1,11 +0,0 @@ -
    - -* Internet Explorer 9 or later (Windows) -* Mozilla Firefox latest, latest–1 (any operating system) -* Google Chrome latest, latest–1 (any operating system) -* Apple Safari latest, latest–1 (Mac OS) -* Apple Safari Mobile for iPad 2, iPad Mini, iPad with Retina Display (iOS 7 or later), for desktop storefront -* Apple Safari Mobile for iPhone 4 or later; iOS 7 or later, for mobile storefront -* Chrome for mobile latest–1 (Android 4 or later) for mobile storefront - -where *latest–1* means one major version earlier than the latest released version. \ No newline at end of file diff --git a/_includes/browsers/admin-browser-requirement.md b/_includes/browsers/supported-browsers.md similarity index 75% rename from _includes/browsers/admin-browser-requirement.md rename to _includes/browsers/supported-browsers.md index 34b16dff494..e0707034b7a 100644 --- a/_includes/browsers/admin-browser-requirement.md +++ b/_includes/browsers/supported-browsers.md @@ -1,6 +1,12 @@
    -* Internet Explorer Edge, 11 or later (Windows) +Internet Explorer/Edge (Windows) + +* Storefront: Explorer 9 or later +* Magento Admin: Internet Explorer Edge, 11 or later (Windows) + +All other browsers (both storefront and Admin) + * Mozilla Firefox latest, latest–1 (any operating system) * Google Chrome latest, latest–1 (any operating system) * Apple Safari latest, latest–1 (Mac OS) diff --git a/guides/v2.0/frontend-dev-guide/bk-frontend-dev-guide.md b/guides/v2.0/frontend-dev-guide/bk-frontend-dev-guide.md index 6b11ba46f67..dccd6d73e9d 100644 --- a/guides/v2.0/frontend-dev-guide/bk-frontend-dev-guide.md +++ b/guides/v2.0/frontend-dev-guide/bk-frontend-dev-guide.md @@ -40,7 +40,7 @@ Frontend developers can use this guide to create custom themes to tailor the Mag To implement what is discussed in this guide, you need a working Magento installation and the following browser versions installed on your device: -{% include browsers/storefront-browser-requirement.md %} +{% include browsers/supported-browsers.md %} To use this guide, you must be familiar with: diff --git a/guides/v2.0/install-gde/system-requirements_admin-browser.md b/guides/v2.0/install-gde/system-requirements_admin-browser.md deleted file mode 100644 index 95ece3ab867..00000000000 --- a/guides/v2.0/install-gde/system-requirements_admin-browser.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -layout: default -group: install_pre -subgroup: Getting Started -title: Supported Magento Admin browsers -menu_title: Supported Magento Admin browsers -menu_node: -menu_order: 3 -github_link: install-gde/system-requirements_admin-browser.md ---- - -## Supported Magento Admin browsers -{% include browsers/admin-browser-requirement.md %} \ No newline at end of file diff --git a/guides/v2.0/install-gde/system-requirements_browsers.md b/guides/v2.0/install-gde/system-requirements_browsers.md new file mode 100644 index 00000000000..dbbae9d1d93 --- /dev/null +++ b/guides/v2.0/install-gde/system-requirements_browsers.md @@ -0,0 +1,13 @@ +--- +layout: default +group: install_pre +subgroup: Getting Started +title: Supported browsers +menu_title: Supported browsers +menu_node: +menu_order: 3 +github_link: install-gde/system-requirements_admin-browser.md +--- + +## Supported browsers +{% include browsers/supported-browsers.md %} \ No newline at end of file diff --git a/guides/v2.0/install-gde/system-requirements_front-browser.md b/guides/v2.0/install-gde/system-requirements_front-browser.md deleted file mode 100644 index 44960b86450..00000000000 --- a/guides/v2.0/install-gde/system-requirements_front-browser.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -layout: default -group: install_pre -subgroup: Getting Started -title: Supported storefront browsers -menu_title: Supported storefront browsers -menu_node: -menu_order: 2 -github_link: install-gde/system-requirements_front-browser.md ---- - -## Supported storefront browsers -{% include browsers/storefront-browser-requirement.md %} \ No newline at end of file From d58564864f540dd78a40f4df25bbe2411766ef81 Mon Sep 17 00:00:00 2001 From: stevjohnson Date: Thu, 4 Feb 2016 08:06:19 -0600 Subject: [PATCH 115/902] Update browser names --- _includes/browsers/supported-browsers.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/_includes/browsers/supported-browsers.md b/_includes/browsers/supported-browsers.md index e0707034b7a..116d997cbd3 100644 --- a/_includes/browsers/supported-browsers.md +++ b/_includes/browsers/supported-browsers.md @@ -1,9 +1,9 @@
    -Internet Explorer/Edge (Windows) +Microsoft Internet Explorer and Microsoft Edge (Windows) -* Storefront: Explorer 9 or later -* Magento Admin: Internet Explorer Edge, 11 or later (Windows) +* Storefront: Internet Explorer 9 or later +* Magento Admin: Microsoft Edge, 11 or later (Windows) All other browsers (both storefront and Admin) @@ -12,6 +12,6 @@ All other browsers (both storefront and Admin) * Apple Safari latest, latest–1 (Mac OS) * Apple Safari Mobile for iPad 2, iPad Mini, iPad with Retina Display (iOS 7 or later), for desktop storefront * Apple Safari Mobile for iPhone 4 or later; iOS 7 or later, for mobile storefront -* Chrome for mobile latest–1 (Android 4 or later) for mobile storefront +* Google Chrome for mobile latest–1 (Android 4 or later) for mobile storefront where *latest–1* means one major version earlier than the latest released version. \ No newline at end of file From 0106ca48825cd6d423c7c2bdfef8fd684f94e843 Mon Sep 17 00:00:00 2001 From: stevjohnson Date: Thu, 4 Feb 2016 08:22:44 -0600 Subject: [PATCH 116/902] Shorter browser names --- _includes/browsers/supported-browsers.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/_includes/browsers/supported-browsers.md b/_includes/browsers/supported-browsers.md index 116d997cbd3..519e446b8b6 100644 --- a/_includes/browsers/supported-browsers.md +++ b/_includes/browsers/supported-browsers.md @@ -1,17 +1,17 @@
    -Microsoft Internet Explorer and Microsoft Edge (Windows) +Internet Explorer and Microsoft Edge (Windows) * Storefront: Internet Explorer 9 or later * Magento Admin: Microsoft Edge, 11 or later (Windows) All other browsers (both storefront and Admin) -* Mozilla Firefox latest, latest–1 (any operating system) -* Google Chrome latest, latest–1 (any operating system) -* Apple Safari latest, latest–1 (Mac OS) -* Apple Safari Mobile for iPad 2, iPad Mini, iPad with Retina Display (iOS 7 or later), for desktop storefront -* Apple Safari Mobile for iPhone 4 or later; iOS 7 or later, for mobile storefront -* Google Chrome for mobile latest–1 (Android 4 or later) for mobile storefront +* Firefox latest, latest–1 (any operating system) +* Chrome latest, latest–1 (any operating system) +* Safari latest, latest–1 (Mac OS) +* Safari Mobile for iPad 2, iPad Mini, iPad with Retina Display (iOS 7 or later), for desktop storefront +* Safari Mobile for iPhone 4 or later; iOS 7 or later, for mobile storefront +* Chrome for mobile latest–1 (Android 4 or later) for mobile storefront where *latest–1* means one major version earlier than the latest released version. \ No newline at end of file From 70df5cd168fb0dcd0d4ba6017aad0d37af7bd431 Mon Sep 17 00:00:00 2001 From: Dmitry Shevtsov Date: Thu, 4 Feb 2016 16:40:39 +0200 Subject: [PATCH 117/902] MAGEDOC-2414: Troubleshooting: Possible issues and their solutions - topic created - one issue added --- guides/v2.0/mtf/mtf_changelog.md | 1 - guides/v2.0/mtf/mtf_installation.md | 1 - guides/v2.0/mtf/mtf_introduction.md | 2 +- .../mtf_quickstart_environmemt.md | 3 +-- guides/v2.0/mtf/mtf_update.md | 1 - guides/v2.0/mtf/troubleshooting.md | 24 +++++++++++++++++++ 6 files changed, 26 insertions(+), 6 deletions(-) create mode 100644 guides/v2.0/mtf/troubleshooting.md diff --git a/guides/v2.0/mtf/mtf_changelog.md b/guides/v2.0/mtf/mtf_changelog.md index 7e611d91f71..1f03cc77bd2 100644 --- a/guides/v2.0/mtf/mtf_changelog.md +++ b/guides/v2.0/mtf/mtf_changelog.md @@ -5,7 +5,6 @@ subgroup: Z_Changelog title: Changelog of Magento Testing Framework menu_title: CHANGELOG menu_node: parent -menu_order: 5 github_link: mtf/mtf_changelog.md redirect_from: /guides/v1.0/mtf/mtf_changelog.html --- diff --git a/guides/v2.0/mtf/mtf_installation.md b/guides/v2.0/mtf/mtf_installation.md index 1f67d406b96..79ffc7c5cb8 100644 --- a/guides/v2.0/mtf/mtf_installation.md +++ b/guides/v2.0/mtf/mtf_installation.md @@ -5,7 +5,6 @@ subgroup: B_Installation title: Installation of the Magento Testing Framework Entities menu_title: INSTALLATION menu_node: parent -menu_order: 2 github_link: mtf/mtf_installation.md ---

    Preface

    diff --git a/guides/v2.0/mtf/mtf_introduction.md b/guides/v2.0/mtf/mtf_introduction.md index 175385e332f..4d34560fa94 100644 --- a/guides/v2.0/mtf/mtf_introduction.md +++ b/guides/v2.0/mtf/mtf_introduction.md @@ -2,7 +2,7 @@ layout: default group: mtf-guide subgroup: A_Introduction -title: Introduction to Magento Testing Framework +title: Introduction to the Magento Testing Framework menu_title: INTRODUCTION menu_node: parent github_link: mtf/mtf_introduction.md diff --git a/guides/v2.0/mtf/mtf_quickstart/mtf_quickstart_environmemt.md b/guides/v2.0/mtf/mtf_quickstart/mtf_quickstart_environmemt.md index adc118f0f96..70bb700cbe5 100644 --- a/guides/v2.0/mtf/mtf_quickstart/mtf_quickstart_environmemt.md +++ b/guides/v2.0/mtf/mtf_quickstart/mtf_quickstart_environmemt.md @@ -18,10 +18,9 @@ The Selenium Server will drive a browser to execute your tests. You can download the Selenium Server from [Selenium project website][].
    -    

    Install Java to work with Selenium.

    +    

    Install Java to work with Selenium Server.

    - Specific versions of the Selenium Server are compatible with specific versions of browsers. Read more about compatibility of browser version and Selenium server version. Enter in terminal: diff --git a/guides/v2.0/mtf/mtf_update.md b/guides/v2.0/mtf/mtf_update.md index b802bd27aaa..253d2de88ac 100644 --- a/guides/v2.0/mtf/mtf_update.md +++ b/guides/v2.0/mtf/mtf_update.md @@ -4,7 +4,6 @@ group: mtf-guide subgroup: U_Update title: Update the Magento Testing Framework menu_title: UPDATE -menu_order: 4 menu_node: parent github_link: mtf/mtf_update.md redirect_from: /guides/v1.0/mtf/mtf_update.html diff --git a/guides/v2.0/mtf/troubleshooting.md b/guides/v2.0/mtf/troubleshooting.md new file mode 100644 index 00000000000..bebba6c11a7 --- /dev/null +++ b/guides/v2.0/mtf/troubleshooting.md @@ -0,0 +1,24 @@ +--- +layout: default +group: mtf-guide +subgroup: V_Troubleshooting +title: Troubleshoot the Magento Testing Framework issues +menu_title: TROUBLESHOOTING +menu_node: parent +github_link: mtf/troubleshooting.md +--- +

    Known issues and their solutions

    + +* TOC +{:toc} + +### Installation issues {#install-issues} + +#### Selenium Server issue + +Error message: + + PHPUnit_Extensions_Selenium2TestCase_WebDriverException: Unable to connect to host 127.0.0.1 on port 7055 after 45000 ms. Firefox console output: in selenium server console output + +* **Reason**: a Selenium server is [incompatible with your browser version](http://docs.seleniumhq.org/about/platforms.jsp#browsers) +* **Solution**: [download the latest Selenium Standalone Server version](http://docs.seleniumhq.org/download/) \ No newline at end of file From 87d58bb39ebb072449a8f7fb1a9a95fda9d1ae8e Mon Sep 17 00:00:00 2001 From: stevjohnson Date: Thu, 4 Feb 2016 09:22:31 -0600 Subject: [PATCH 118/902] Update to rollback topic --- _includes/install/install-roadmap.md | 5 ++- .../install-gde/install/cli/dev_downgrade.md | 37 +++++++++++++++++++ 2 files changed, 41 insertions(+), 1 deletion(-) diff --git a/_includes/install/install-roadmap.md b/_includes/install/install-roadmap.md index f8fae17782a..3c6915e4f57 100644 --- a/_includes/install/install-roadmap.md +++ b/_includes/install/install-roadmap.md @@ -37,6 +37,9 @@ Topics include: * Upgrading (or *patching* the Magento application) * Updating components (including install, uninstall, update, enable, disable) +* *Contributing developers only*: Contributing developers—update, reinstall Magento ### Deploy to production -Deploy Magento to production \ No newline at end of file +Deploy Magento to production + +*[Contributing developers]: A developer who contributes code to the Magento 2 CE codebase \ No newline at end of file diff --git a/guides/v2.0/install-gde/install/cli/dev_downgrade.md b/guides/v2.0/install-gde/install/cli/dev_downgrade.md index f640f0a218d..0f30fd6eec7 100644 --- a/guides/v2.0/install-gde/install/cli/dev_downgrade.md +++ b/guides/v2.0/install-gde/install/cli/dev_downgrade.md @@ -9,10 +9,25 @@ menu_node: github_link: install-gde/install/cli/dev_downgrade.md --- +## Change to a released version + This topic discusses how a contributing developer can change versions of the Magento software after cloning the `develop` branch. This might be necessary to perform some tasks that require a specific Magento version other than `develop`. The `develop` branch is the default branch, which means you get it by default when you clone the Magento 2 GitHub repository. For some tasks, such as data migration from Magento 1.x to Magento 2.x, you must switch to a release tag. +You have the following options: + +* *(Easier)*. If you haven't done any customizations, you should uninstall the Magento software and reinstall it with the released version. Uninstalling not only drops the database tables, it also clears the Magento `var` directory, enabling you to start over with no issues. + + See [Change versions by uninstalling the Magento software](#downgrade-uninstall) +* If you have done customizations and don't want to lose them, back up the Magento system, switch to the released branch, and install in a new database instance. + + See [Change versions by installing the Magento software in a new database instance](#downgrade-db) + + You can migrate your customizations (both in the file system and in the database) from the backups you made or directly using database and file system tools. + +### Change versions by uninstalling the Magento software {#downgrade-uninstall} + To change versions after cloning: 1. Log in to your Magento server as, or switch to, the Magento file system owner. @@ -33,6 +48,28 @@ To change versions after cloning: 5. Install the Magento software using the command line or Setup Wizard. +### Change versions by installing the Magento software in a new database instance {#downgrade-db} + +To change versions after cloning: + +1. Log in to your Magento server as, or switch to, the Magento file system owner. +2. Back up the Magento file system, database, and media files: + + php /bin/magento setup:backup --code --media --db +3. Change to release tag as follows: + + git checkout tags/ [-b ] + + For example, to check out the 2.0.2 release tag in a new branch named `2.0.2`, enter + + git checkout tags/2.0.2 -b 2.0.2 + +4. Manually clear Magento `var` directories: + + rm -rf /var/cache/* /var/page_cache/* /var/generation/* + +5. Install the Magento software using the command line or Setup Wizard. + *[contributing developer]: A developer who contributes code to the Magento 2 CE codebase From 23b530d210f9137a85176f45b2a5124772ab798b Mon Sep 17 00:00:00 2001 From: stevjohnson Date: Thu, 4 Feb 2016 09:25:32 -0600 Subject: [PATCH 119/902] Update --- guides/v2.0/install-gde/install/cli/dev_downgrade.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/guides/v2.0/install-gde/install/cli/dev_downgrade.md b/guides/v2.0/install-gde/install/cli/dev_downgrade.md index 0f30fd6eec7..c3ae36a7e4c 100644 --- a/guides/v2.0/install-gde/install/cli/dev_downgrade.md +++ b/guides/v2.0/install-gde/install/cli/dev_downgrade.md @@ -19,10 +19,10 @@ You have the following options: * *(Easier)*. If you haven't done any customizations, you should uninstall the Magento software and reinstall it with the released version. Uninstalling not only drops the database tables, it also clears the Magento `var` directory, enabling you to start over with no issues. - See [Change versions by uninstalling the Magento software](#downgrade-uninstall) + For more information, see [Change versions by uninstalling the Magento software](#downgrade-uninstall) * If you have done customizations and don't want to lose them, back up the Magento system, switch to the released branch, and install in a new database instance. - See [Change versions by installing the Magento software in a new database instance](#downgrade-db) + For more information, see [Change versions by installing the Magento software in a new database instance](#downgrade-db) You can migrate your customizations (both in the file system and in the database) from the backups you made or directly using database and file system tools. @@ -53,7 +53,7 @@ To change versions after cloning: To change versions after cloning: 1. Log in to your Magento server as, or switch to, the Magento file system owner. -2. Back up the Magento file system, database, and media files: +2. Back up the Magento file system, database, and media files: php /bin/magento setup:backup --code --media --db 3. Change to release tag as follows: From 2cbd337e771c64e1e0811346b5d5b41a5f427d9c Mon Sep 17 00:00:00 2001 From: Nikola Lazic Date: Thu, 4 Feb 2016 11:59:57 -0600 Subject: [PATCH 120/902] Remove reference to PII Clarify thet PII is not encrypted --- _includes/install/sens-data.md | 2 +- .../install/cli/install-cli-subcommands-deployment.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/_includes/install/sens-data.md b/_includes/install/sens-data.md index e4d7abba6be..744fc16f162 100644 --- a/_includes/install/sens-data.md +++ b/_includes/install/sens-data.md @@ -12,4 +12,4 @@ Magento does *not* encrypt: * Administrative and customer user names and passwords (these passwords are hashed) * Address * Phone number -* Other types of personally identification except for credit card numbers \ No newline at end of file +* Other types of personally identifiable information except for credit card numbers diff --git a/guides/v2.0/install-gde/install/cli/install-cli-subcommands-deployment.md b/guides/v2.0/install-gde/install/cli/install-cli-subcommands-deployment.md index db1eb921641..2d1d2d6e426 100644 --- a/guides/v2.0/install-gde/install/cli/install-cli-subcommands-deployment.md +++ b/guides/v2.0/install-gde/install/cli/install-cli-subcommands-deployment.md @@ -103,7 +103,7 @@ The following table discusses the meanings of installation parameters and values

    --key

    -

    If you have one, specify a key to encrypt sensitive data in the Magento database. (This includes passwords and personally identifiable customer information.) If you don't have one, Magento generates one for you.

    +

    If you have one, specify a key to encrypt sensitive data in the Magento database. If you don't have one, Magento generates one for you.

    No

    From 9eda64342c4420dc3c70634e54de4b58dc19c3b7 Mon Sep 17 00:00:00 2001 From: stevjohnson Date: Fri, 5 Feb 2016 08:04:17 -0600 Subject: [PATCH 122/902] Update browser support --- _includes/browsers/supported-browsers.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_includes/browsers/supported-browsers.md b/_includes/browsers/supported-browsers.md index 519e446b8b6..5fa931bbdb5 100644 --- a/_includes/browsers/supported-browsers.md +++ b/_includes/browsers/supported-browsers.md @@ -3,7 +3,7 @@ Internet Explorer and Microsoft Edge (Windows) * Storefront: Internet Explorer 9 or later -* Magento Admin: Microsoft Edge, 11 or later (Windows) +* Magento Admin: Internet Explorer 11 or later, Microsoft Edge All other browsers (both storefront and Admin) From 260051748bf12b95dda1f52fc5a02f0b010d9133 Mon Sep 17 00:00:00 2001 From: stevjohnson Date: Fri, 5 Feb 2016 08:45:38 -0600 Subject: [PATCH 123/902] Add upgrade section --- .../v2.0/migration/migration-tool-install.md | 4 +- .../v2.0/migration/migration-tool-upgrade.md | 67 +++++++++++++++++++ 2 files changed, 69 insertions(+), 2 deletions(-) create mode 100644 guides/v2.0/migration/migration-tool-upgrade.md diff --git a/guides/v2.0/migration/migration-tool-install.md b/guides/v2.0/migration/migration-tool-install.md index 64ff5ba33cb..e91a3982400 100644 --- a/guides/v2.0/migration/migration-tool-install.md +++ b/guides/v2.0/migration/migration-tool-install.md @@ -11,10 +11,10 @@ redirect_from: /guides/v1.0/migration/migration-tool-install.html --- #### Contents -* [Prerequisite](#data-migrate-prereq) +* [Prerequisite for install](#data-migrate-prereq) * [Install the Data Migration Tool](#data-migrate-install) -## Prerequisite {#data-migrate-prereq} +## Prerequisite for install {#data-migrate-prereq} Before you continue, make sure you are using the *same released version* of both Magento 2 and the Data Migration Tool. For example, if you're using Magento version 2.0.2, you must also use Data Migration Tool version 2.0.2. To find the version of the Magento software: diff --git a/guides/v2.0/migration/migration-tool-upgrade.md b/guides/v2.0/migration/migration-tool-upgrade.md new file mode 100644 index 00000000000..ef47ce0bc98 --- /dev/null +++ b/guides/v2.0/migration/migration-tool-upgrade.md @@ -0,0 +1,67 @@ +--- +layout: default +group: migration +subgroup: C_Data migration tool +title: Upgrade the Data Migration Tool +menu_title: Upgrade the Data Migration Tool +menu_node: +menu_order: 100 +github_link: migration/migration-tool-upgrade.md +--- + +#### Contents +* [Overview of upgrade](#data-migrate-upgr-over) +* [Prerequisites for upgrade](#data-migrate-upgr-prereq) +* [Upgrade the Data Migration Tool](#data-migrate-upgr) + +## Overview of upgrade {#data-migrate-upgr-over} +This section discusses how to upgrade the version of the Data Migration Tool to match the Magento software version. + +The versions of the Data Migration Tool and your Magento software must exactly match. For example, if you're using version 2.0.2 of the Magento software, you must use version 2.0.2 of the Data Migration Tool. + +To find the version of the Magento software: + +* If you downloaded the Magento software using a Composer metapackage, enter the following command: + + php /bin/magento --version +* If you cloned the Magento 2 GitHub repository, enter the following commands: + + cd + git branch + + If you're currently in the `develop` branch, you must change to a released branch before you continue. + +## Prerequisites {#data-migrate-prereq} +Before you upgrade, you must: + +* Upgrade your Magento software +* Back up the `vendor/magento/data-migration-tool` directory + +### Upgrade the Magento software {#data-migrate-upgr-magento} +If you haven't already done so, run the System Upgrade utility to upgrade the Magento software. + +### Back up the `vendor/magento/data-migration-tool` directory +Before you upgrade the Data Migration Tool, back up at least the `vendor/magento/data-migration-tool` directory. During upgrade, it is deleted and replaced by updated code. + +If you want, you can back up the entire Magento codebase and database using the following command: + + php /bin/magento setup:backup --code --db + +
    +

    The vendor/magento/data-migration-tool directory contains your custom code. Failure to back it up means you'll lose your customizations during upgrade.

    +
    + +## Upgrade the Data Migration Tool {#data-migrate-upgr} +To upgrade the Data Migration Tool: + +1. Log in to your Magento server as, or switch to, the Magento file system owner. +2. Change to Magento 2 root directory. +3. Enter the following command: + + composer update +4. Wait while the command completes. + +###Related topics + +* Configure migration +* Preconditions From f347b34c31cb2fb975126863c6548f52204c8b74 Mon Sep 17 00:00:00 2001 From: stevjohnson Date: Fri, 5 Feb 2016 08:49:05 -0600 Subject: [PATCH 124/902] Updated Edge support --- _includes/browsers/supported-browsers.md | 2 +- .../install/cli/dev_update-magento.md | 44 ------------------- 2 files changed, 1 insertion(+), 45 deletions(-) delete mode 100644 guides/v2.0/install-gde/install/cli/dev_update-magento.md diff --git a/_includes/browsers/supported-browsers.md b/_includes/browsers/supported-browsers.md index 5fa931bbdb5..26d6895aa41 100644 --- a/_includes/browsers/supported-browsers.md +++ b/_includes/browsers/supported-browsers.md @@ -3,7 +3,7 @@ Internet Explorer and Microsoft Edge (Windows) * Storefront: Internet Explorer 9 or later -* Magento Admin: Internet Explorer 11 or later, Microsoft Edge +* Magento Admin: Internet Explorer 11 or later, Microsoft Edge, latest–1 All other browsers (both storefront and Admin) diff --git a/guides/v2.0/install-gde/install/cli/dev_update-magento.md b/guides/v2.0/install-gde/install/cli/dev_update-magento.md deleted file mode 100644 index c6bba11bd36..00000000000 --- a/guides/v2.0/install-gde/install/cli/dev_update-magento.md +++ /dev/null @@ -1,44 +0,0 @@ ---- -layout: default -group: install_cli -subgroup: 99_contrib -title: Update the Magento application -menu_title: Update the Magento application -menu_order: 2 -menu_node: -github_link: install-gde/install/cli/dev_update-magento.md -redirect_from: /guides/v2.0/install-gde/install/cli/instgde-install-magento-update-db ---- - -This topic discusses how a contributing developer can update the Magento application without reinstalling it. To perform an upgrade if you're *not* a contributing developer, see Updating the Magento application and components. - -To update the Magento software if you're a contributing developer: - -1. Log in to your Magento server as a user with permissions to modify files in the Magento file system (for example, the switch to the Magento file system owner). -3. Save any changes you made to `composer.json` because the following steps will overwrite it: - - cd - cp composer.json composer.json.old - -3. Update your local repository to get the latest code: - - git pull origin develop - -
    - -

    If git pull origin develop fails, see troubleshooting.

    -
    - -3. Diff and merge your `composer.json.old` with `composer.json` installed with the Magento software. -4. Enter the following command: - - composer update - -5. Update the Magento database: - - php /bin/magento setup:upgrade - - - -*[contributing developer]: A developer who contributes code to the Magento 2 CE codebase -*[contributing developers]: Developers who contribute code to the Magento 2 CE codebase \ No newline at end of file From 675ab742f2ee8f036afaef60ef7ceae05cf235f8 Mon Sep 17 00:00:00 2001 From: Ryan Street Date: Fri, 5 Feb 2016 08:30:04 -0800 Subject: [PATCH 125/902] Update deploy-to-prod.md changed production best practices error. --- guides/v2.0/howdoi/deploy/deploy-to-prod.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/guides/v2.0/howdoi/deploy/deploy-to-prod.md b/guides/v2.0/howdoi/deploy/deploy-to-prod.md index fe17c19cb60..621cbfa4b5f 100644 --- a/guides/v2.0/howdoi/deploy/deploy-to-prod.md +++ b/guides/v2.0/howdoi/deploy/deploy-to-prod.md @@ -102,6 +102,6 @@ This section provides guidelines for deploying a Magento installation to product Best practices in production: * Use Varnish to accelerate HTTP traffic, including providing page caching -* Use the `magento deploy:mode:set` command to enable developer mode +* Use the `magento deploy:mode:set` command to enable production mode * Use the `pub` directory as the Magento docroot to prevent running the Setup Wizard, Component Manager, or System Upgrade in production. (Set up virtual hosts to point to `/pub`.) -* Set up your `robots.txt` to *allow* search engines to index your production site. \ No newline at end of file +* Set up your `robots.txt` to *allow* search engines to index your production site. From 42a2b1d1948bd9861e0c0575662c7957c5cdc56d Mon Sep 17 00:00:00 2001 From: stevjohnson Date: Fri, 5 Feb 2016 12:37:04 -0600 Subject: [PATCH 126/902] Publish browser support --- _includes/browsers/supported-browsers.md | 1 + 1 file changed, 1 insertion(+) diff --git a/_includes/browsers/supported-browsers.md b/_includes/browsers/supported-browsers.md index 26d6895aa41..7e1ca55a75c 100644 --- a/_includes/browsers/supported-browsers.md +++ b/_includes/browsers/supported-browsers.md @@ -7,6 +7,7 @@ Internet Explorer and Microsoft Edge (Windows) All other browsers (both storefront and Admin) +* Magento Admin: Internet Explorer 11 or later, Microsoft Edge, latest–1 * Firefox latest, latest–1 (any operating system) * Chrome latest, latest–1 (any operating system) * Safari latest, latest–1 (Mac OS) From 6cf8294e500e3091c006066af0c56c5adbcc9d2f Mon Sep 17 00:00:00 2001 From: stevjohnson Date: Fri, 5 Feb 2016 14:10:30 -0600 Subject: [PATCH 127/902] Updates to migration upgrade --- _includes/migration/find-version.md | 26 +++++++++++++++++++ .../v2.0/migration/migration-tool-install.md | 12 +-------- .../v2.0/migration/migration-tool-upgrade.md | 14 ++-------- 3 files changed, 29 insertions(+), 23 deletions(-) create mode 100644 _includes/migration/find-version.md diff --git a/_includes/migration/find-version.md b/_includes/migration/find-version.md new file mode 100644 index 00000000000..a0603b9ce06 --- /dev/null +++ b/_includes/migration/find-version.md @@ -0,0 +1,26 @@ +
    + +### Find the Magento software version {#magento-version} +To find the version of the Magento software: + +* If you downloaded the Magento software using a Composer metapackage, enter the following command: + + php /bin/magento --version +* If you cloned the Magento 2 GitHub repository, enter the following commands: + + cd + git branch + + If you're currently in the `develop` branch, you must change to a released branch before you continue. + +### Find the Data Migration Tool version {#migration-tool-version} + +To find the version of the migration tool: + +1. Change to your Magento install directory. +2. Open `composer.json` in a text editor. +3. In the `require` section, locate the value of `"magento/data-migration-tool"`. + + This is the version of your Data Migration Tool. + + If `"magento/data-migration-tool"` is absent, you haven't installed the Data Migration Tool yet. \ No newline at end of file diff --git a/guides/v2.0/migration/migration-tool-install.md b/guides/v2.0/migration/migration-tool-install.md index e91a3982400..37f56d5a9a4 100644 --- a/guides/v2.0/migration/migration-tool-install.md +++ b/guides/v2.0/migration/migration-tool-install.md @@ -17,17 +17,7 @@ redirect_from: /guides/v1.0/migration/migration-tool-install.html ## Prerequisite for install {#data-migrate-prereq} Before you continue, make sure you are using the *same released version* of both Magento 2 and the Data Migration Tool. For example, if you're using Magento version 2.0.2, you must also use Data Migration Tool version 2.0.2. -To find the version of the Magento software: - -* If you downloaded the Magento software using a Composer metapackage, enter the following command: - - php /bin/magento --version -* If you cloned the Magento 2 GitHub repository, enter the following commands: - - cd - git branch - - If you're currently in the `develop` branch, you must change to a released branch before you continue. +{% include migration/find-version.md %}
    diff --git a/guides/v2.0/migration/migration-tool-upgrade.md b/guides/v2.0/migration/migration-tool-upgrade.md index ef47ce0bc98..17214da4686 100644 --- a/guides/v2.0/migration/migration-tool-upgrade.md +++ b/guides/v2.0/migration/migration-tool-upgrade.md @@ -19,17 +19,7 @@ This section discusses how to upgrade the version of the Data Migration Tool to The versions of the Data Migration Tool and your Magento software must exactly match. For example, if you're using version 2.0.2 of the Magento software, you must use version 2.0.2 of the Data Migration Tool. -To find the version of the Magento software: - -* If you downloaded the Magento software using a Composer metapackage, enter the following command: - - php /bin/magento --version -* If you cloned the Magento 2 GitHub repository, enter the following commands: - - cd - git branch - - If you're currently in the `develop` branch, you must change to a released branch before you continue. +{% include migration/find-version.md %} ## Prerequisites {#data-migrate-prereq} Before you upgrade, you must: @@ -58,7 +48,7 @@ To upgrade the Data Migration Tool: 2. Change to Magento 2 root directory. 3. Enter the following command: - composer update + composer update magento/data-migration-tool 4. Wait while the command completes. ###Related topics From 39ca674226cfa4e5feb63ba4a34ee4bbd16abe88 Mon Sep 17 00:00:00 2001 From: stevjohnson Date: Sat, 6 Feb 2016 08:48:30 -0600 Subject: [PATCH 128/902] Issue#508. Fix description of --base-url-secure --- guides/v2.0/install-gde/install/cli/install-cli-install.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/guides/v2.0/install-gde/install/cli/install-cli-install.md b/guides/v2.0/install-gde/install/cli/install-cli-install.md index c97ead998a2..f1cd40f8c24 100644 --- a/guides/v2.0/install-gde/install/cli/install-cli-install.md +++ b/guides/v2.0/install-gde/install/cli/install-cli-install.md @@ -218,7 +218,8 @@ The following table discusses the meanings of installation option names and valu

    --base-url-secure

    -

    Secure base URL to use to access your Magento Admin using SSL.

    + Secure base URL to use to access your Magento Admin and storefront in the following format: + http[s]://<host or ip>/<your Magento install dir>/

    To have a fully secure site, you must enable both --use-secure=1 and --base-url-secure=1.

    No

    From 31a390a92abf51aeb5c2b5e941095b9024c9b00a Mon Sep 17 00:00:00 2001 From: stevjohnson Date: Sat, 6 Feb 2016 14:35:54 -0600 Subject: [PATCH 129/902] Fix formatting --- guides/v2.0/install-gde/install/cli/install-cli-install.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guides/v2.0/install-gde/install/cli/install-cli-install.md b/guides/v2.0/install-gde/install/cli/install-cli-install.md index f1cd40f8c24..ab1c68b58c8 100644 --- a/guides/v2.0/install-gde/install/cli/install-cli-install.md +++ b/guides/v2.0/install-gde/install/cli/install-cli-install.md @@ -218,7 +218,7 @@ The following table discusses the meanings of installation option names and valu

    --base-url-secure

    - Secure base URL to use to access your Magento Admin and storefront in the following format: + Secure base URL to use to access your Magento Admin and storefront in the following format: http[s]://<host or ip>/<your Magento install dir>/

    To have a fully secure site, you must enable both --use-secure=1 and --base-url-secure=1.

    No

    From b0b1acd54026ccd9a5084188e2107dc51bf19f6c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Lavorel?= Date: Sun, 7 Feb 2016 14:20:40 +0100 Subject: [PATCH 130/902] Correct grunt configuration path --- guides/v2.0/frontend-dev-guide/css-topics/css_debug.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guides/v2.0/frontend-dev-guide/css-topics/css_debug.md b/guides/v2.0/frontend-dev-guide/css-topics/css_debug.md index 4ae02ae2c2e..50c7a59f6bb 100644 --- a/guides/v2.0/frontend-dev-guide/css-topics/css_debug.md +++ b/guides/v2.0/frontend-dev-guide/css-topics/css_debug.md @@ -80,7 +80,7 @@ npm update
  • -Add your theme to Grunt configuration. To do this, in the dev/tools/grunt/configs/theme.js file, add your theme to module.exports like following: +Add your theme to Grunt configuration. To do this, in the dev/tools/grunt/configs/themes.js file, add your theme to module.exports like following:
     module.exports = {
         <theme>: {
    
    From 63fab4adbbbae9189f076f5e7a703118407736b2 Mon Sep 17 00:00:00 2001
    From: stevjohnson 
    Date: Sun, 7 Feb 2016 08:53:01 -0600
    Subject: [PATCH 131/902] Remove comparison of MySQL Full Text and Solr
    
    ---
     .../v2.0/config-guide/solr/solr-overview.md   | 71 +------------------
     1 file changed, 1 insertion(+), 70 deletions(-)
    
    diff --git a/guides/v2.0/config-guide/solr/solr-overview.md b/guides/v2.0/config-guide/solr/solr-overview.md
    index fa07cfe2280..bdc8af93087 100644
    --- a/guides/v2.0/config-guide/solr/solr-overview.md
    +++ b/guides/v2.0/config-guide/solr/solr-overview.md
    @@ -34,7 +34,6 @@ Solr enables you to provide your web store users with a powerful full-text searc
     See one of the following sections for more information:
     
     *	Intended audience and purpose of this topic
    -*	Comparing the search options
     *	More information about the Solr solution
     
     

    Intended audience and purpose of this topic

    @@ -46,75 +45,7 @@ This topic discusses a simple Solr configuration that uses the example Solr conf

    The example Solr configuration is not intended to be used in a production site. It's for testing and development only. Because it's simple to use, it's a great way for you to learn more about Solr.

  • -

    Comparing the search options

    -The following table provides a quick comparison between Magento with the default MySQL full text search and Magento with Solr search. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    FeatureMagento with MySQL full-text searchMagento with Solr search
    Full text searchYes and also supports two additional search modes: -
    • Like
    • -
    • Combined (like and full text)
    Yes†
    Search recommendationsYesYes
    Faceted search (used in layered navigation)YesYes
    Range (such as price range)YesYes
    Sort-by options (for example, sort by relevance)YesYes
    Zero results tips or results correctionNoYes
    SuggestionsNoYes
    ClusteringNoYes
    Attribute weight based on attribute settingsYesYes
    Search localized charactersNoYes
    Word delimiter (for example, searching for spider man or spiderman return spider-man)NoYes
    -†—"Like" searching is supported by MySQL full text search but not by Solr. +

    More information about the Solr solution

    Solr runs as a standalone full-text search server in a servlet container such as Jetty (which is used by the Solr example configuration) and Tomcat. From 0f8aa0485b4d19c2100e61d3db6a7e2ab5d1a3f9 Mon Sep 17 00:00:00 2001 From: Oleksandra Marchenko Date: Mon, 8 Feb 2016 13:02:04 +0200 Subject: [PATCH 132/902] Removed internal comment --- guides/v2.0/howdoi/checkout/checkout_form.md | 1 - 1 file changed, 1 deletion(-) diff --git a/guides/v2.0/howdoi/checkout/checkout_form.md b/guides/v2.0/howdoi/checkout/checkout_form.md index ca7eabbfd19..7bc38fe8ceb 100644 --- a/guides/v2.0/howdoi/checkout/checkout_form.md +++ b/guides/v2.0/howdoi/checkout/checkout_form.md @@ -154,7 +154,6 @@ If the form fields are not generated dynamically, they can be defined in a layou The following code sample shows configuration of the form that contains four fields: text input, select, checkbox, and date. This form uses checkout data provider (`checkoutProvider`) that is introduced in the `Magento_Checkout` module: -

    Do we need to add a link or any other details

    {%highlight xml%} From 044d2f798ddfcab5a6dca8101cc4e56073abd41d Mon Sep 17 00:00:00 2001 From: Jeanne Frontain Date: Mon, 8 Feb 2016 12:19:54 -0600 Subject: [PATCH 133/902] completed incomplete sentence --- .../components/modules/mod_conventions.md | 2 +- guides/v2.0/architecture/release_types.md | 101 ++++++++++++++++++ guides/v2.0/architecture/version_store.md | 57 ++++++++++ .../v2.0/architecture/versioning overview.md | 65 +++++++++++ 4 files changed, 224 insertions(+), 1 deletion(-) create mode 100644 guides/v2.0/architecture/release_types.md create mode 100644 guides/v2.0/architecture/version_store.md create mode 100644 guides/v2.0/architecture/versioning overview.md diff --git a/guides/v2.0/architecture/archi_perspectives/components/modules/mod_conventions.md b/guides/v2.0/architecture/archi_perspectives/components/modules/mod_conventions.md index 38d241a90a7..3a0fba76fff 100644 --- a/guides/v2.0/architecture/archi_perspectives/components/modules/mod_conventions.md +++ b/guides/v2.0/architecture/archi_perspectives/components/modules/mod_conventions.md @@ -22,7 +22,7 @@ Be sure to research additional Magento conventions, beyond those applicable to m The following table shows the *recommended* location within the Magento file system for specific components. -(Modules must include a `registration.php` file that +(Modules must include a `registration.php` file in its root folder.) We refer to a component’s root directory as the top-level directory in which you develop component code. Typically, this directory is located in one of the following directories relative to the Magento root directory: diff --git a/guides/v2.0/architecture/release_types.md b/guides/v2.0/architecture/release_types.md new file mode 100644 index 00000000000..1b6bca188e3 --- /dev/null +++ b/guides/v2.0/architecture/release_types.md @@ -0,0 +1,101 @@ +--- +layout: default +group: arch-guide +subgroup: Architectural Basics +title: Release types and version numbers +menu_title: Release types and version numbers +menu_order: 5 + +level3_menu_node: level3child +level3_subgroup: versioning + +github_link: architecture/release_types.md +--- + +

    Release types and version numbers

    + +This topic describes how and when the software version numbers will be changed with releases. + +The software version always changes with any release of Magento source code. + +

    Development releases

    +In every development release ("pre-release" version), **the same value of version number will be propagated in all Magento components and their dependencies**. + +Magento may update the `x.y.z` version in way prescribed by Semantic Versioning, but also could release the same `x.y.z` with different stability and/or index numbers, For example, `0.1.0-alpha1 -> 0.1.0-alpha2`, `0.1.0-alpha3` or `2.0.0-alpha3 -> 2.1.0-beta1 -> 2.1.0-beta2` + + + + + + + + + + + + + + + + + +
    Previous ReleaseNext Release
    Component Version
    +"name": "magento/foo",
    +"version": 0.1.0-alpha87
    +"name": "magento/foo",
    +"version": 0.1.0-alpha88
    Dependency in Other Components
    "require": {
    +    "magento/foo": "0.1.0-alpha87"
    +}
    +
    "require": {
    +    "magento/foo": "0.1.0-alpha88"
    +}
    +
    + +

    Stable releases

    + +In every stable release, the same value of version number is propagated in all components, but dependencies have a wildcard (*) pattern. + +The `x.y.z` numbers will change according to Semantic Versioning policy provisions. For example, `1.0.0 -> 1.0.1 -> 1.1.0 -> 1.5.0 -> 1.5.1 -> 2.0.0 -> 2.1.0`. Also, Magento may decide to change the "minor" version instead of the "patch" version. + + + + + + + + + + + + + + + + + + + +
    Previous ReleaseNext Release
    Component Version
    "name": "magento/foo",
    +"version": ~1.2
    +
    +

    This is equivalent to >= 1.2 < 2.0.0.

    "name": "magento/foo",
    +"version": 1.3.0
    +
    Dependency in Other Components
    "require": {
    +    "magento/foo": "1.2.*"
    +}
    +
    "require": {
    +    "magento/foo": "1.3.*"
    +}
    +
    + + + + +

    Related topics

    +Backward compatibility + +Architectural basics + + + + diff --git a/guides/v2.0/architecture/version_store.md b/guides/v2.0/architecture/version_store.md new file mode 100644 index 00000000000..8a2dc116090 --- /dev/null +++ b/guides/v2.0/architecture/version_store.md @@ -0,0 +1,57 @@ +--- +layout: default +group: arch-guide +subgroup: Architectural Basics +title: Where is version information stored? +menu_title: Where is version information stored? +menu_order: 4 + +level3_menu_node: level3child +level3_subgroup: versioning + + +github_link: architecture/versioning.md +redirect_from: /guides/v1.0/architecture/version_store.html +--- + +

    Where is version information stored?

    + + +Both software version numbers and product version numbers are found in the `version` field of the component's or metapackage's `composer.json` file. + + +For example, you can declare software version as a version of the component: + +
    +
    +"name": "acme/foo",
    +
    +"version": 1.2.0
    +
    +
    + +Or you can use it to declare a dependency on a particular version of a component: + +
    +
    +"require": {
    +    
    +   "acme/foo": "1.2.*",
    +    
    +   "acme/bar": "2.2.0"
    +
    +}
    +
    +
    + + + + +

    Related topics

    +Backward compatibility + +Architectural basics + + + + diff --git a/guides/v2.0/architecture/versioning overview.md b/guides/v2.0/architecture/versioning overview.md new file mode 100644 index 00000000000..6d48593e8c9 --- /dev/null +++ b/guides/v2.0/architecture/versioning overview.md @@ -0,0 +1,65 @@ +--- +layout: default +group: arch-guide +subgroup: Architectural Basics +title: Versioning policy overview +menu_title: Versioning policy overview +menu_order: 2 + +level3_menu_node: level3child +level3_subgroup: versioning + +github_link: architecture/versioning_overview.md + +--- + +

    Versioning policy overview

    + +Magento uses software versioning to indicate the compatibility of changes in the code. By comparing two versions of the same component, you can tell whether it has any backward-incompatible changes in the public API or other significant code changes. + +Versioning also helps: + +* track software dependencies. Managing dependencies can be a challenging task in a large, generously populated software environment like Magento, which ships with over 100 core modules. + + +* support compatibility verification and ease troubleshooting. Well known and tested combinations of Magento 2 platform modules can reduce the number of combinations that require testing in your installation. + + +

    Supported specifications

    + +Magento software versioning complies with these widely used specifications: + +* [Semantic Versioning 2.0.0](http://semver.org/) +* [Versioning specification of Composer system](https://getcomposer.org/doc/04-schema.md#version) +* [PHP version_compare()](http://php.net/version_compare) + +

    Version formats

    + +Stable release versions are in the format `MAJOR.MINOR.PATCH`, where: + +* MAJOR indicates incompatible API changes + +* MINOR indicates backward-compatible functionality has been added + +* PATCH indicates backward-compatible bug fixes + + +The pre-release version format is: `MAJOR.MINOR.PATCH-n`, where `alpha`, `beta` or `rc` are stability indications, as described in the `version_compare()` specification, and +`n` is an increment number to distinguish releases of the non-stable versions. + + +

    Public APIs

    + +Source code is considered part of the public API only if it is explicitly marked as such using the `@api` docblock tag. This designation indicates that the code can be used or customized by other components, such as formal interfaces and dependency injection points. Note that if you mark private code with `@api`, any change in this private interface will trigger a version change. + +For PHP code, compatibility of `@api` can be tracked on the level of structural elements (class signatures, interfaces, methods, etc.). For other source code, compatibility is tracked only on the file level (for example, the file has been deleted or renamed). + + +

    Related topics

    +Backward compatibility + +Architectural basics + + + + From ff6a59e6cfb29f8443da719efd9ed9b78f562249 Mon Sep 17 00:00:00 2001 From: Jeanne Frontain Date: Mon, 8 Feb 2016 12:27:54 -0600 Subject: [PATCH 134/902] completed incomplete sentence --- .../archi_perspectives/components/modules/mod_conventions.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guides/v2.0/architecture/archi_perspectives/components/modules/mod_conventions.md b/guides/v2.0/architecture/archi_perspectives/components/modules/mod_conventions.md index 3a0fba76fff..da268217dd7 100644 --- a/guides/v2.0/architecture/archi_perspectives/components/modules/mod_conventions.md +++ b/guides/v2.0/architecture/archi_perspectives/components/modules/mod_conventions.md @@ -22,7 +22,7 @@ Be sure to research additional Magento conventions, beyond those applicable to m The following table shows the *recommended* location within the Magento file system for specific components. -(Modules must include a `registration.php` file in its root folder.) +(A module must include a `registration.php` file in its root folder.) We refer to a component’s root directory as the top-level directory in which you develop component code. Typically, this directory is located in one of the following directories relative to the Magento root directory: From 6c021104fd675fbb60f6419193460adc32d9087c Mon Sep 17 00:00:00 2001 From: Rodion Savchuk Date: Tue, 9 Feb 2016 15:19:02 +0200 Subject: [PATCH 135/902] Added File Uploader Component section --- .../ui-components/ui-secondary-uploader.md | 115 ++++++++++++++++++ 1 file changed, 115 insertions(+) create mode 100644 guides/v2.0/ui-components/ui-secondary-uploader.md diff --git a/guides/v2.0/ui-components/ui-secondary-uploader.md b/guides/v2.0/ui-components/ui-secondary-uploader.md new file mode 100644 index 00000000000..b03c639e6a4 --- /dev/null +++ b/guides/v2.0/ui-components/ui-secondary-uploader.md @@ -0,0 +1,115 @@ +--- +layout: default +group: UI Library +subgroup: C_Listing/Grid Secondary Components +title: File Uploader Component +menu_title: File Uploader Component +menu_node: +menu_order: 13 +github_link: ui-components/ui-secondary-uploader.md +redirect_from: /guides/v2.0/ui-library/ui-secondary-uploader.html +--- + +

    Overview

    + +UI File Uploader component is an adapter for jQuery-File-Upload plugin used in Magento. Component is used to integrate file upload functionality with UI components. + + +The following image is an illustration of a grid with a sticky header: + + +

    Component elements

    + +* Constructor: `app/code/Magento/Ui/view/base/web/js/form/element/file-uploader.js` +* JQuery file upload plugin: `jquery/fileUploader/jquery.fileupload-fp` +* Default template: `app/code/Magento/Ui/view/base/web/templates/form/element/uploader/uploader.html` +* Preview template: `app/code/Magento/Ui/view/base/web/templates/form/element/uploader/preview.html` + +

    Component options

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TitleDescriptionRequired For Correct WorkTypeDefault Value
    previewTmplPath to the files' preview templateNoStringapp/code/Magento/Ui/view/base/web/templates/form/element/uploader/preview.html +
    maxFileSizeDefines maximum size of a file (in bytesNoNumberInfinite
    isMultipleFilesFlag which indicates whether multiple files can be uploaded or notNoBooleanfalse
    allowedExtensionsList of allowed file extensionsNoString/Array*
    dropZoneCSS selector of a drop zone element relative to a file input elementNoString[data-role=drop-zone]
    uploaderConfigConfiguration which will be passed to jquery-file-upload pluginYesObject
    uploaderConfig.urlRoute to server controller which will handle file uploading processYesStringnull
    + +

    Integration

    + +Here is an example of how File Uploader component integrates with Form component: + +{% highlight xml %} +
    + ... +
    + ... + + + + Sound Check + true + fileUploader + + + + + + +
    +
    +{% endhighlight %} \ No newline at end of file From a32ecc846c2a4455c9bd31605f8c087f1d7f2613 Mon Sep 17 00:00:00 2001 From: Rodion Savchuk Date: Tue, 9 Feb 2016 17:01:25 +0200 Subject: [PATCH 136/902] Edited --- guides/v2.0/ui-components/ui-secondary-uploader.md | 4 ---- 1 file changed, 4 deletions(-) diff --git a/guides/v2.0/ui-components/ui-secondary-uploader.md b/guides/v2.0/ui-components/ui-secondary-uploader.md index b03c639e6a4..9c536d595b8 100644 --- a/guides/v2.0/ui-components/ui-secondary-uploader.md +++ b/guides/v2.0/ui-components/ui-secondary-uploader.md @@ -14,10 +14,6 @@ redirect_from: /guides/v2.0/ui-library/ui-secondary-uploader.html UI File Uploader component is an adapter for jQuery-File-Upload plugin used in Magento. Component is used to integrate file upload functionality with UI components. - -The following image is an illustration of a grid with a sticky header: - -

    Component elements

    * Constructor: `app/code/Magento/Ui/view/base/web/js/form/element/file-uploader.js` From 6cacbb73dc3f016c06615e2a69d7c992060bdc9e Mon Sep 17 00:00:00 2001 From: Jeanne Frontain Date: Tue, 9 Feb 2016 09:39:51 -0600 Subject: [PATCH 137/902] completed incomplete sentence --- .../archi_perspectives/components/modules/mod_conventions.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guides/v2.0/architecture/archi_perspectives/components/modules/mod_conventions.md b/guides/v2.0/architecture/archi_perspectives/components/modules/mod_conventions.md index 38d241a90a7..da268217dd7 100644 --- a/guides/v2.0/architecture/archi_perspectives/components/modules/mod_conventions.md +++ b/guides/v2.0/architecture/archi_perspectives/components/modules/mod_conventions.md @@ -22,7 +22,7 @@ Be sure to research additional Magento conventions, beyond those applicable to m The following table shows the *recommended* location within the Magento file system for specific components. -(Modules must include a `registration.php` file that +(A module must include a `registration.php` file in its root folder.) We refer to a component’s root directory as the top-level directory in which you develop component code. Typically, this directory is located in one of the following directories relative to the Magento root directory: From 4681174aa17c90df847abf14f39315096b96adad Mon Sep 17 00:00:00 2001 From: stevjohnson Date: Tue, 9 Feb 2016 11:57:59 -0600 Subject: [PATCH 138/902] Temporary fix for broken 1.x sample data links --- guides/m1x/ce18-ee113/ht_magento-ce-sample.data.html | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/guides/m1x/ce18-ee113/ht_magento-ce-sample.data.html b/guides/m1x/ce18-ee113/ht_magento-ce-sample.data.html index 3a35515cd4f..984d7c6b918 100644 --- a/guides/m1x/ce18-ee113/ht_magento-ce-sample.data.html +++ b/guides/m1x/ce18-ee113/ht_magento-ce-sample.data.html @@ -24,7 +24,7 @@

    Getting the Sample Data

    Archives for each version have exactly the same content (they differ only by compression method).

    From f3b259a6a4afbe666412d64d54c98781da5669c7 Mon Sep 17 00:00:00 2001 From: Oleksandra Marchenko Date: Tue, 9 Feb 2016 20:17:17 +0200 Subject: [PATCH 139/902] Added a file for Modal ui component --- guides/v2.0/ui-modal.md | 59 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 guides/v2.0/ui-modal.md diff --git a/guides/v2.0/ui-modal.md b/guides/v2.0/ui-modal.md new file mode 100644 index 00000000000..35ba275f570 --- /dev/null +++ b/guides/v2.0/ui-modal.md @@ -0,0 +1,59 @@ +--- +layout: default +group: UI Library +subgroup: F_UI Library Modal Component +title: Modal Component +menu_title: Modal Component +menu_node: parent +github_link: ui-components/ui-modal.md +--- +

    What's in this topic

    + +This topic describes the modal UI component. + +* TOC +{:toc} + +## Modal component: Overview + +The modal component allows to show it contents (child elements) in modal, by using the [modal widget]([{site.gdeurl}}javascript-dev-guide/widgets/widget_modal.html) under the hood. +Every option that is configurable in modal widget, can be configured from Modal component. +Modal component also allows to configure modal buttons to perform methods from other UI Components, as Button component does. +Modal component also introduce toolbarSection - placeholder inside modal's header, which can be updated with any content. + +

    Does it have any dependencies with other components?

    +

    Any related topic in http://devdocs.magento.com/guides/v2.0/pattern-library/bk-pattern.html?

    + +## Structure + +The modal ui component comprises the following files: + +- JS component: `/view/base/web/js/modal/modal-component.js` +- Template: `/view/base/web/templates/modal/modal-component.html` + +## Configuration settings + + + + + + + + + + + + + + + + + + + + + + + +
    state
    \ No newline at end of file From 029dc26733eb6aa56d2d23314c29357755b6124b Mon Sep 17 00:00:00 2001 From: stevjohnson Date: Tue, 9 Feb 2016 13:07:03 -0600 Subject: [PATCH 140/902] Fix magento/framework version --- guides/v2.0/extension-dev-guide/package_module.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guides/v2.0/extension-dev-guide/package_module.md b/guides/v2.0/extension-dev-guide/package_module.md index dd8042653d7..49f2e898128 100644 --- a/guides/v2.0/extension-dev-guide/package_module.md +++ b/guides/v2.0/extension-dev-guide/package_module.md @@ -124,7 +124,7 @@ The following example is a `composer.json` file for a module: ], "require": { "php": "~5.5.0|~5.6.0|~7.0.0", - "magento/framework": "~1.0.0" + "magento/framework": "~100.0.4" }, "autoload": { "files": [ "registration.php" ], From b2d2a99619b2ec0f1678c2e0ba3729b431312756 Mon Sep 17 00:00:00 2001 From: Max Bucknell Date: Wed, 10 Feb 2016 09:23:02 +0000 Subject: [PATCH 141/902] Add troubleshooting guide for http_resp_hdr_len --- .../v2.0/config-guide/varnish/config-varnish.md | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/guides/v2.0/config-guide/varnish/config-varnish.md b/guides/v2.0/config-guide/varnish/config-varnish.md index d10425c3944..7a5c999bdb6 100644 --- a/guides/v2.0/config-guide/varnish/config-varnish.md +++ b/guides/v2.0/config-guide/varnish/config-varnish.md @@ -92,6 +92,21 @@ We know of the following issues with Varnish: .first_byte_timeout = 600s; } +* Possible error on some pages: + + Error 503 Backend fetch failed + Backend fetch failed + Guru Meditation: + XID: 303394517 + + If you experience this error, it is possible that Magento is sending a list of + cache tags longer than the default allowed 8192 characters. To fix this, you + must edit the `http_resp_hdr_len` launch parameter. + + On CentOS, this can be changed in the `/etc/sysconfig/varnish` file by adding + the line: + + -p http_resp_hdr_len=64000 \ #### Next step -Install Varnish \ No newline at end of file +Install Varnish From 75554ae9d00598884197294214fb7f2aa3fe1749 Mon Sep 17 00:00:00 2001 From: Matt Walters Date: Wed, 10 Feb 2016 14:08:38 +0000 Subject: [PATCH 142/902] SCSS Path Fix --- guides/m1x/ce19-ee114/RWD_dev-guide.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/guides/m1x/ce19-ee114/RWD_dev-guide.html b/guides/m1x/ce19-ee114/RWD_dev-guide.html index 176e3c2b16a..9e23af673a9 100644 --- a/guides/m1x/ce19-ee114/RWD_dev-guide.html +++ b/guides/m1x/ce19-ee114/RWD_dev-guide.html @@ -469,8 +469,8 @@

    Understanding the Sass Structure

    Adding Your Own Sass Partials

    To customize styles for an existing Magento theme, you should edit existing Sass partials. However, if you are building a highly custom theme, you will likely want to create new partial files to contain styles for new functionality that you are introducing. Here is how to do that:

      -
    1. Add your partials to a new file named skin/frontend/custompackage/customtheme/module/_new-module.scss.
    2. -
    3. Create a new skin/frontend/custompackage/customtheme/_custom_core.scss file with the following line to import your new partial: +
    4. Add your partials to a new file named skin/frontend/custompackage/customtheme/scss/module/_new-module.scss.
    5. +
    6. Create a new skin/frontend/custompackage/customtheme/scss/_custom_core.scss file with the following line to import your new partial:
      @import "module/new-module";
      Note: Although you could edit core.scss to import your new partials, you should create _custom_core.scss to clearly distinguish which partial files are custom versus native.
    7. Add this line to the bottom of styles.scss and styles-ie8.scss files: From 7a317fda7b5c2597a5f8fb4085c1c0fcc6d6341e Mon Sep 17 00:00:00 2001 From: stevjohnson Date: Wed, 10 Feb 2016 08:30:33 -0600 Subject: [PATCH 143/902] Absorb Marketplace Quickstart Guide in PHP Dev Guide, create redirects --- _includes/install/sens-data.md | 2 +- common/images/2.1_only_large.png | Bin 3834 -> 0 bytes common/images/2.1_only_small.png | Bin 2845 -> 0 bytes .../bk-extension-dev-guide.md | 8 ++-- .../dev-filesys.md | 3 +- .../dev-intro.md | 3 +- .../dev-modtypes.md | 3 +- .../dev-summary.md | 3 +- .../dev-test.md | 3 +- .../extension-dev-guide/developers_info.md | 24 ------------ .../extension-dev-guide/developers_roadmap.md | 35 ++++++++++-------- .../developers_roadmap_composer.md | 17 --------- .../developers_roadmap_glossary.md | 18 --------- .../intro-composer-gloss.md | 3 +- .../intro-composer.md | 3 +- .../module-file-structure.md | 1 - .../package_mktpl.md} | 7 ++-- .../mktpl-quickstart/bk-marketplace-qs.md | 31 ---------------- .../v2.0/mktpl-quickstart/intro-moreinfo.md | 20 ---------- 19 files changed, 42 insertions(+), 142 deletions(-) delete mode 100644 common/images/2.1_only_large.png delete mode 100644 common/images/2.1_only_small.png rename guides/v2.0/{mktpl-quickstart => extension-dev-guide}/dev-filesys.md (86%) rename guides/v2.0/{mktpl-quickstart => extension-dev-guide}/dev-intro.md (85%) rename guides/v2.0/{mktpl-quickstart => extension-dev-guide}/dev-modtypes.md (93%) rename guides/v2.0/{mktpl-quickstart => extension-dev-guide}/dev-summary.md (90%) rename guides/v2.0/{mktpl-quickstart => extension-dev-guide}/dev-test.md (92%) delete mode 100644 guides/v2.0/extension-dev-guide/developers_info.md delete mode 100644 guides/v2.0/extension-dev-guide/developers_roadmap_composer.md delete mode 100644 guides/v2.0/extension-dev-guide/developers_roadmap_glossary.md rename guides/v2.0/{mktpl-quickstart => extension-dev-guide}/intro-composer-gloss.md (96%) rename guides/v2.0/{mktpl-quickstart => extension-dev-guide}/intro-composer.md (91%) rename guides/v2.0/{mktpl-quickstart/mktpl-intro.md => extension-dev-guide/package_mktpl.md} (80%) delete mode 100644 guides/v2.0/mktpl-quickstart/bk-marketplace-qs.md delete mode 100644 guides/v2.0/mktpl-quickstart/intro-moreinfo.md diff --git a/_includes/install/sens-data.md b/_includes/install/sens-data.md index 744fc16f162..58ab7f29456 100644 --- a/_includes/install/sens-data.md +++ b/_includes/install/sens-data.md @@ -4,7 +4,7 @@ Magento uses your encryption key to encrypt the following: * Credit card information -* User names and passwords specified in the Magento Admin configuration +* User names and passwords specified in the Magento Admin configuration (for example, logins to payment gateways) * CAPTCHA values sent over the network Magento does *not* encrypt: diff --git a/common/images/2.1_only_large.png b/common/images/2.1_only_large.png deleted file mode 100644 index e2377a10e66030f126e1d494c7495682b487e0c1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3834 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 Si2C^RZ_gHQ-DX3m(wT+B?yOe^=cwz5bPyGhaR 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 F`yaHazl8t* diff --git a/guides/v2.0/extension-dev-guide/bk-extension-dev-guide.md b/guides/v2.0/extension-dev-guide/bk-extension-dev-guide.md index 16f252873af..78313154be2 100644 --- a/guides/v2.0/extension-dev-guide/bk-extension-dev-guide.md +++ b/guides/v2.0/extension-dev-guide/bk-extension-dev-guide.md @@ -18,9 +18,9 @@ This guide contains information for developers who want to extend, or customize, Magento is made up of the following types of components: -* Modules -* Themes -* Language packages +* Modules +* Themes +* Language packages A Magento *module* is code that accomplishes a particular business function or handles a Magento feature. A module is a collection `.php` and `.xml` files, but may also contain other files such as `.phtml` and image files. Modules are interactive with each other. A module also contains any user interface required for a user's interaction with the module, and any application interfaces that another module or code chunk might call, if you decide to expose any application interface to other Magento modules. @@ -32,5 +32,3 @@ A Magento *module* is code that accomplishes a particular business function or h

      You must follow a PSR compliant structure when building a module.

    -####Related topic -Modules in the Magento Architecture Guide. diff --git a/guides/v2.0/mktpl-quickstart/dev-filesys.md b/guides/v2.0/extension-dev-guide/dev-filesys.md similarity index 86% rename from guides/v2.0/mktpl-quickstart/dev-filesys.md rename to guides/v2.0/extension-dev-guide/dev-filesys.md index 97b15d64784..0b78df8d9bd 100644 --- a/guides/v2.0/mktpl-quickstart/dev-filesys.md +++ b/guides/v2.0/extension-dev-guide/dev-filesys.md @@ -6,7 +6,8 @@ title: Set up your component's file structure menu_title: Set up your component's file structure menu_order: 5 menu_node: -github_link: mktpl-quickstart/dev-filesys.md +github_link: extension-dev-guide/dev-filesys.md +redirect_from: /guides/v2.0/mktpl-quickstart/dev-filesys.html --- ##{{page.menu_title}} diff --git a/guides/v2.0/mktpl-quickstart/dev-intro.md b/guides/v2.0/extension-dev-guide/dev-intro.md similarity index 85% rename from guides/v2.0/mktpl-quickstart/dev-intro.md rename to guides/v2.0/extension-dev-guide/dev-intro.md index 40c7055dd4f..8fa51d29911 100644 --- a/guides/v2.0/mktpl-quickstart/dev-intro.md +++ b/guides/v2.0/extension-dev-guide/dev-intro.md @@ -6,7 +6,8 @@ title: Develop your component menu_title: Develop your component menu_order: 1 menu_node: parent -github_link: mktpl-quickstart/dev-intro.md +github_link: extension-dev-guide/dev-intro.md +redirect_from: /guides/v2.0/mktpl-quickstart/dev-intro.html --- ##{{page.menu_title}} diff --git a/guides/v2.0/mktpl-quickstart/dev-modtypes.md b/guides/v2.0/extension-dev-guide/dev-modtypes.md similarity index 93% rename from guides/v2.0/mktpl-quickstart/dev-modtypes.md rename to guides/v2.0/extension-dev-guide/dev-modtypes.md index b9f6b955e18..2837f6e88ce 100644 --- a/guides/v2.0/mktpl-quickstart/dev-modtypes.md +++ b/guides/v2.0/extension-dev-guide/dev-modtypes.md @@ -6,7 +6,8 @@ title: Component types menu_title: Component types menu_order: 2 menu_node: -github_link: mktpl-quickstart/dev-modtypes.md +github_link: extension-dev-guide/dev-modtypes.md +redirect_from: /guides/v2.0/mktpl-quickstart/dev-modtypes.html --- #### Contents diff --git a/guides/v2.0/mktpl-quickstart/dev-summary.md b/guides/v2.0/extension-dev-guide/dev-summary.md similarity index 90% rename from guides/v2.0/mktpl-quickstart/dev-summary.md rename to guides/v2.0/extension-dev-guide/dev-summary.md index a07956c7812..a177effebcd 100644 --- a/guides/v2.0/mktpl-quickstart/dev-summary.md +++ b/guides/v2.0/extension-dev-guide/dev-summary.md @@ -6,7 +6,8 @@ title: Summary of developing and packaging components menu_title: Summary of developing and packaging components menu_order: 10 menu_node: -github_link: mktpl-quickstart/dev-summary.md +github_link: extension-dev-guide/dev-summary.md +redirect_from: /guides/v2.0/mktpl-quickstart/dev-summary.html --- ##{{page.menu_title}} diff --git a/guides/v2.0/mktpl-quickstart/dev-test.md b/guides/v2.0/extension-dev-guide/dev-test.md similarity index 92% rename from guides/v2.0/mktpl-quickstart/dev-test.md rename to guides/v2.0/extension-dev-guide/dev-test.md index 25e066cfa1f..78403b3ff9f 100644 --- a/guides/v2.0/mktpl-quickstart/dev-test.md +++ b/guides/v2.0/extension-dev-guide/dev-test.md @@ -6,7 +6,8 @@ title: Test your component menu_title: Test your component menu_order: 100 menu_node: -github_link: mktpl-quickstart/dev-test.md +github_link: extension-dev-guide/dev-test.md +redirect_from: /guides/v2.0/mktpl-quickstart/dev-test.html --- ##{{page.menu_title}} diff --git a/guides/v2.0/extension-dev-guide/developers_info.md b/guides/v2.0/extension-dev-guide/developers_info.md deleted file mode 100644 index 9341ca23ed0..00000000000 --- a/guides/v2.0/extension-dev-guide/developers_info.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -layout: default -group: extension-dev-guide -subgroup: 1_Introduction -title: For more information -menu_title: For more information (new) -menu_order: 200 -github_link: extension-dev-guide/developers_info.md ---- - -##{{page.menu_title}} - - -For more information about component development, see the following: - -* PHP Developer Guide for step-by-step details of all aspects of development. -* Themes topic in the Frontend Developer Guide for information about themes. -* Translation dictionaries and language packages for language packages. - -For Magento Marketplace only: - -* Roadmap -* Review -* Submit an extension \ No newline at end of file diff --git a/guides/v2.0/extension-dev-guide/developers_roadmap.md b/guides/v2.0/extension-dev-guide/developers_roadmap.md index bbf7ed55c15..47a4e493976 100644 --- a/guides/v2.0/extension-dev-guide/developers_roadmap.md +++ b/guides/v2.0/extension-dev-guide/developers_roadmap.md @@ -3,32 +3,37 @@ layout: default group: extension-dev-guide subgroup: 1_Introduction title: Developer roadmap -menu_title: Developer roadmap (updated) +menu_title: Developer roadmap menu_order: 2 github_link: extension-dev-guide/developers_roadmap.md -redirect_from: /guides/v1.0/extension-dev-guide/developers_roadmap.html +redirect_from: + - /guides/v1.0/extension-dev-guide/developers_roadmap.html + - /guides/v2.0/mktpl-quickstart/intro-moreinfo.html --- ##{{page.menu_title}} -This section helps you understand how to develop, package, and distribute your component. +This topic introduces the high-level workflow for a developer who wants to create or customize the Magento application. Developers can also package and distribute their customizations to merchants. Key points: * Minimum required elements: - * `composer.json` - * `registration.php` - * Modules: `module.xml` - * Themes: `theme.xml` - * Language packages: `language.xml` -* `.zip` your extension. -* *(For distribution on Magento Marketplace only)*: The package you upload to Magento Marketplace should not be more than 30MB in size. + * Declare component dependencies in `composer.json`. + * Register the component using `registration.php`. + * Component-specific XML definition files: + + * Modules: `module.xml` + * Themes: `theme.xml` + * Language packages: `language.xml` +* Distribute your component: + + * Package your component in `.zip` format. + * If you upload the component to Magento Marketplace, it should be less than 30MB in size. #### Helpful links -* Introduction to Composer -* Glossary of common terms -* For more information -* Sample extensions created by the Magento 2 Core team. -* Magento 2 Developers Hub, at magento.com/developers/magento2. \ No newline at end of file +* Introduction to Composer +* Glossary of common terms +* Sample extensions created by the Magento 2 Core team +* Magento 2 Developers Hub \ No newline at end of file diff --git a/guides/v2.0/extension-dev-guide/developers_roadmap_composer.md b/guides/v2.0/extension-dev-guide/developers_roadmap_composer.md deleted file mode 100644 index ec1895f5d7f..00000000000 --- a/guides/v2.0/extension-dev-guide/developers_roadmap_composer.md +++ /dev/null @@ -1,17 +0,0 @@ ---- -layout: default -group: extension-dev-guide -subgroup: 1_Introduction -title: Composer and Magento -menu_title: Composer and Magento (new) -menu_order: 5 -github_link: extension-dev-guide/developers_roadmap_composer.md ---- - -##{{page.menu_title}} - - -Outline: - -* About Composer -* About composer.json, including pointers to various ones on the Magento 2 GitHub \ No newline at end of file diff --git a/guides/v2.0/extension-dev-guide/developers_roadmap_glossary.md b/guides/v2.0/extension-dev-guide/developers_roadmap_glossary.md deleted file mode 100644 index 174ccbc29ea..00000000000 --- a/guides/v2.0/extension-dev-guide/developers_roadmap_glossary.md +++ /dev/null @@ -1,18 +0,0 @@ ---- -layout: default -group: extension-dev-guide -subgroup: 1_Introduction -title: Glossary of common terms -menu_title: Glossary of common terms (new) -menu_order: 10 -github_link: extension-dev-guide/developers_roadmap_glossary.md ---- - -##{{page.menu_title}} - - -Outline: - -* Definitions of module, theme, language package -* Definition of metapackage -* What the Component Manager is and how it helps customers update their components \ No newline at end of file diff --git a/guides/v2.0/mktpl-quickstart/intro-composer-gloss.md b/guides/v2.0/extension-dev-guide/intro-composer-gloss.md similarity index 96% rename from guides/v2.0/mktpl-quickstart/intro-composer-gloss.md rename to guides/v2.0/extension-dev-guide/intro-composer-gloss.md index f97caab282c..0b7db923aef 100644 --- a/guides/v2.0/mktpl-quickstart/intro-composer-gloss.md +++ b/guides/v2.0/extension-dev-guide/intro-composer-gloss.md @@ -6,7 +6,8 @@ title: Glossary of common terms menu_title: Glossary of common terms menu_order: 5 menu_node: -github_link: mktpl-quickstart/intro-composer-gloss.md +github_link: extension-dev-guide/intro-composer-gloss.md +redirect_from: /guides/v2.0/mktpl-quickstart/intro-composer-gloss.html --- ##{{page.menu_title}} diff --git a/guides/v2.0/mktpl-quickstart/intro-composer.md b/guides/v2.0/extension-dev-guide/intro-composer.md similarity index 91% rename from guides/v2.0/mktpl-quickstart/intro-composer.md rename to guides/v2.0/extension-dev-guide/intro-composer.md index 0e0519f6639..ce1ba79432f 100644 --- a/guides/v2.0/mktpl-quickstart/intro-composer.md +++ b/guides/v2.0/extension-dev-guide/intro-composer.md @@ -6,7 +6,8 @@ title: Introduction to Composer menu_title: Introduction to Composer menu_order: 2 menu_node: -github_link: mktpl-quickstart/intro-composer.md +github_link: extension-dev-guide/intro-composer.md +redirect_from: /guides/v2.0/mktpl-quickstart/intro-composer.html --- {% include install/composer-overview.html %} diff --git a/guides/v2.0/extension-dev-guide/module-file-structure.md b/guides/v2.0/extension-dev-guide/module-file-structure.md index a1c9a130dbe..7040a52c7b7 100644 --- a/guides/v2.0/extension-dev-guide/module-file-structure.md +++ b/guides/v2.0/extension-dev-guide/module-file-structure.md @@ -31,7 +31,6 @@ A typical file structure for a Magento 2 module:

    A filesystem view of a typical file structure

    ####Typical directories - Typical module directories are: * `Block`: contains PHP view classes as part of MVC vertical implementation of module logic. diff --git a/guides/v2.0/mktpl-quickstart/mktpl-intro.md b/guides/v2.0/extension-dev-guide/package_mktpl.md similarity index 80% rename from guides/v2.0/mktpl-quickstart/mktpl-intro.md rename to guides/v2.0/extension-dev-guide/package_mktpl.md index 72c4b10abf2..9bb56a5f8b8 100644 --- a/guides/v2.0/mktpl-quickstart/mktpl-intro.md +++ b/guides/v2.0/extension-dev-guide/package_mktpl.md @@ -4,9 +4,10 @@ group: quickstart subgroup: 03_Market title: Upload your component to the Magento Marketplace menu_title: Upload your component to the Magento Marketplace -menu_order: 1 -menu_node: parent -github_link: mktpl-quickstart/mktpl-intro.md +menu_order: 100 +menu_node: +github_link: extension-dev-guide/package_mktpl.md +redirect_from: /guides/v2.0/mktpl-quickstart/mktpl-intro.html --- ##{{page.menu_title}} diff --git a/guides/v2.0/mktpl-quickstart/bk-marketplace-qs.md b/guides/v2.0/mktpl-quickstart/bk-marketplace-qs.md deleted file mode 100644 index 1657b62bd78..00000000000 --- a/guides/v2.0/mktpl-quickstart/bk-marketplace-qs.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -layout: default -group: quickstart -subgroup: 01_Introduction -title: Introduction -menu_title: Introduction -menu_order: 1 -menu_node: parent -github_link: mktpl-quickstart/bk-marketplace-qs.md ---- - -##{{page.menu_title}} - -This quick start helps you understand how to develop, package, and upload your component to the Magento Marketplace. - -Key points: - -* `composer.json` and `registration.php` are required for *all* components. -* The package you upload to Magento Marketplace should not be more than 30MB in size. -* `.zip` your extension as discussed in the packaging topic. - -
    -

    The Magento Marketplace is not generally available at this time.

    -
    - -#### For more information -* Introduction to Composer -* Glossary of common terms -* For more information - - diff --git a/guides/v2.0/mktpl-quickstart/intro-moreinfo.md b/guides/v2.0/mktpl-quickstart/intro-moreinfo.md deleted file mode 100644 index b8c42cff588..00000000000 --- a/guides/v2.0/mktpl-quickstart/intro-moreinfo.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -layout: default -group: quickstart -subgroup: 01_Introduction -title: For more information -menu_title: For more information -menu_order: 100 -menu_node: -github_link: mktpl-quickstart/intro-moreinfo.md ---- - -##{{page.menu_title}} - -For more information about component development, see the following: - -* PHP Developer Guide for step-by-step details of all aspects of development. -* Themes topic in the Frontend Developer Guide for information about themes. -* Translation dictionaries and language packages for language packages. -* Magento Marketplace User Guide to upload your component to the Magento Marketplace. - From bf182b1c903e8b6ff31b46082c1e13f52ee860a9 Mon Sep 17 00:00:00 2001 From: stevjohnson Date: Wed, 10 Feb 2016 09:04:23 -0600 Subject: [PATCH 144/902] Finalize PHP Dev Guide TOC --- guides/v2.0/extension-dev-guide/bk-extension-dev-guide.md | 2 +- guides/v2.0/extension-dev-guide/dev-filesys.md | 2 +- guides/v2.0/extension-dev-guide/dev-intro.md | 2 +- guides/v2.0/extension-dev-guide/dev-modtypes.md | 2 +- guides/v2.0/extension-dev-guide/dev-summary.md | 2 +- guides/v2.0/extension-dev-guide/dev-test.md | 2 +- guides/v2.0/extension-dev-guide/developers_roadmap.md | 2 +- guides/v2.0/extension-dev-guide/intro-composer-gloss.md | 2 +- guides/v2.0/extension-dev-guide/intro-composer.md | 2 +- guides/v2.0/extension-dev-guide/package.md | 2 +- guides/v2.0/extension-dev-guide/package_mktpl.md | 4 ++-- guides/v2.0/extension-dev-guide/package_module.md | 2 +- 12 files changed, 13 insertions(+), 13 deletions(-) diff --git a/guides/v2.0/extension-dev-guide/bk-extension-dev-guide.md b/guides/v2.0/extension-dev-guide/bk-extension-dev-guide.md index 78313154be2..7b182a63a9f 100644 --- a/guides/v2.0/extension-dev-guide/bk-extension-dev-guide.md +++ b/guides/v2.0/extension-dev-guide/bk-extension-dev-guide.md @@ -1,7 +1,7 @@ --- layout: default group: extension-dev-guide -subgroup: 1_Introduction +subgroup: 01_Introduction title: Introduction menu_title: Introduction menu_order: 1 diff --git a/guides/v2.0/extension-dev-guide/dev-filesys.md b/guides/v2.0/extension-dev-guide/dev-filesys.md index 0b78df8d9bd..a59c110dafd 100644 --- a/guides/v2.0/extension-dev-guide/dev-filesys.md +++ b/guides/v2.0/extension-dev-guide/dev-filesys.md @@ -1,6 +1,6 @@ --- layout: default -group: quickstart +group: extension-dev-guide subgroup: 02_Dev title: Set up your component's file structure menu_title: Set up your component's file structure diff --git a/guides/v2.0/extension-dev-guide/dev-intro.md b/guides/v2.0/extension-dev-guide/dev-intro.md index 8fa51d29911..5f33c6b91ce 100644 --- a/guides/v2.0/extension-dev-guide/dev-intro.md +++ b/guides/v2.0/extension-dev-guide/dev-intro.md @@ -1,6 +1,6 @@ --- layout: default -group: quickstart +group: extension-dev-guide subgroup: 02_Dev title: Develop your component menu_title: Develop your component diff --git a/guides/v2.0/extension-dev-guide/dev-modtypes.md b/guides/v2.0/extension-dev-guide/dev-modtypes.md index 2837f6e88ce..dd644e383c0 100644 --- a/guides/v2.0/extension-dev-guide/dev-modtypes.md +++ b/guides/v2.0/extension-dev-guide/dev-modtypes.md @@ -1,6 +1,6 @@ --- layout: default -group: quickstart +group: extension-dev-guide subgroup: 02_Dev title: Component types menu_title: Component types diff --git a/guides/v2.0/extension-dev-guide/dev-summary.md b/guides/v2.0/extension-dev-guide/dev-summary.md index a177effebcd..37c0050b7b4 100644 --- a/guides/v2.0/extension-dev-guide/dev-summary.md +++ b/guides/v2.0/extension-dev-guide/dev-summary.md @@ -1,6 +1,6 @@ --- layout: default -group: quickstart +group: extension-dev-guide subgroup: 02_Dev title: Summary of developing and packaging components menu_title: Summary of developing and packaging components diff --git a/guides/v2.0/extension-dev-guide/dev-test.md b/guides/v2.0/extension-dev-guide/dev-test.md index 78403b3ff9f..17456058a59 100644 --- a/guides/v2.0/extension-dev-guide/dev-test.md +++ b/guides/v2.0/extension-dev-guide/dev-test.md @@ -1,6 +1,6 @@ --- layout: default -group: quickstart +group: extension-dev-guide subgroup: 02_Dev title: Test your component menu_title: Test your component diff --git a/guides/v2.0/extension-dev-guide/developers_roadmap.md b/guides/v2.0/extension-dev-guide/developers_roadmap.md index 47a4e493976..526c828b904 100644 --- a/guides/v2.0/extension-dev-guide/developers_roadmap.md +++ b/guides/v2.0/extension-dev-guide/developers_roadmap.md @@ -1,7 +1,7 @@ --- layout: default group: extension-dev-guide -subgroup: 1_Introduction +subgroup: 01_Introduction title: Developer roadmap menu_title: Developer roadmap menu_order: 2 diff --git a/guides/v2.0/extension-dev-guide/intro-composer-gloss.md b/guides/v2.0/extension-dev-guide/intro-composer-gloss.md index 0b7db923aef..fa0cba665ea 100644 --- a/guides/v2.0/extension-dev-guide/intro-composer-gloss.md +++ b/guides/v2.0/extension-dev-guide/intro-composer-gloss.md @@ -1,6 +1,6 @@ --- layout: default -group: quickstart +group: extension-dev-guide subgroup: 01_Introduction title: Glossary of common terms menu_title: Glossary of common terms diff --git a/guides/v2.0/extension-dev-guide/intro-composer.md b/guides/v2.0/extension-dev-guide/intro-composer.md index ce1ba79432f..970f648ab10 100644 --- a/guides/v2.0/extension-dev-guide/intro-composer.md +++ b/guides/v2.0/extension-dev-guide/intro-composer.md @@ -1,6 +1,6 @@ --- layout: default -group: quickstart +group: extension-dev-guide subgroup: 01_Introduction title: Introduction to Composer menu_title: Introduction to Composer diff --git a/guides/v2.0/extension-dev-guide/package.md b/guides/v2.0/extension-dev-guide/package.md index 42dc8c86be6..4f560da2c7f 100644 --- a/guides/v2.0/extension-dev-guide/package.md +++ b/guides/v2.0/extension-dev-guide/package.md @@ -1,7 +1,7 @@ --- layout: default group: extension-dev-guide -subgroup: 5_Package +subgroup: 05_Package title: Package menu_title: Package menu_order: 1 diff --git a/guides/v2.0/extension-dev-guide/package_mktpl.md b/guides/v2.0/extension-dev-guide/package_mktpl.md index 9bb56a5f8b8..afd48ccb0f7 100644 --- a/guides/v2.0/extension-dev-guide/package_mktpl.md +++ b/guides/v2.0/extension-dev-guide/package_mktpl.md @@ -1,7 +1,7 @@ --- layout: default -group: quickstart -subgroup: 03_Market +group: extension-dev-guide +subgroup: 05_Package title: Upload your component to the Magento Marketplace menu_title: Upload your component to the Magento Marketplace menu_order: 100 diff --git a/guides/v2.0/extension-dev-guide/package_module.md b/guides/v2.0/extension-dev-guide/package_module.md index 49f2e898128..c81f22da04f 100644 --- a/guides/v2.0/extension-dev-guide/package_module.md +++ b/guides/v2.0/extension-dev-guide/package_module.md @@ -1,7 +1,7 @@ --- layout: default group: extension-dev-guide -subgroup: 5_Package +subgroup: 05_Package title: Package a component menu_title: Package a component menu_order: 2 From ba6bee091e9ba92bfea86683cbae547c8e7ae2df Mon Sep 17 00:00:00 2001 From: stevjohnson Date: Wed, 10 Feb 2016 09:12:50 -0600 Subject: [PATCH 145/902] Fix redirect --- guides/v2.0/extension-dev-guide/bk-extension-dev-guide.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/guides/v2.0/extension-dev-guide/bk-extension-dev-guide.md b/guides/v2.0/extension-dev-guide/bk-extension-dev-guide.md index 7b182a63a9f..0186b73c504 100644 --- a/guides/v2.0/extension-dev-guide/bk-extension-dev-guide.md +++ b/guides/v2.0/extension-dev-guide/bk-extension-dev-guide.md @@ -7,7 +7,9 @@ menu_title: Introduction menu_order: 1 menu_node: parent github_link: extension-dev-guide/bk-extension-dev-guide.md -redirect_from: /guides/v1.0/extension-dev-guide/bk-extension-dev-guide.html +redirect_from: + - /guides/v1.0/extension-dev-guide/bk-extension-dev-guide.html + - /guides/v2.0/mktpl-quickstart/bk-marketplace-qs.html --- ##{{page.menu_title}} From f1f9d0958aeacdd8e114d61b643cb459471529c2 Mon Sep 17 00:00:00 2001 From: "Savchuk, Rodion(rsavchuk)" Date: Wed, 10 Feb 2016 18:06:03 +0200 Subject: [PATCH 146/902] Update migration-tool-upgrade.md --- guides/v2.0/migration/migration-tool-upgrade.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guides/v2.0/migration/migration-tool-upgrade.md b/guides/v2.0/migration/migration-tool-upgrade.md index 17214da4686..2fb73b56f36 100644 --- a/guides/v2.0/migration/migration-tool-upgrade.md +++ b/guides/v2.0/migration/migration-tool-upgrade.md @@ -38,7 +38,7 @@ If you want, you can back up the entire Magento codebase and database using the php /bin/magento setup:backup --code --db
    -

    The vendor/magento/data-migration-tool directory contains your custom code. Failure to back it up means you'll lose your customizations during upgrade.

    +

    The vendor/magento/data-migration-tool directory contains your custom code. Failure to back it up means you can lose your customizations during upgrade.

    ## Upgrade the Data Migration Tool {#data-migrate-upgr} From 7f93650180a48b209752353fd2a50d37ef3462b1 Mon Sep 17 00:00:00 2001 From: "Savchuk, Rodion(rsavchuk)" Date: Wed, 10 Feb 2016 18:07:28 +0200 Subject: [PATCH 147/902] Update migration-tool-upgrade.md --- guides/v2.0/migration/migration-tool-upgrade.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guides/v2.0/migration/migration-tool-upgrade.md b/guides/v2.0/migration/migration-tool-upgrade.md index 2fb73b56f36..a06fe57707b 100644 --- a/guides/v2.0/migration/migration-tool-upgrade.md +++ b/guides/v2.0/migration/migration-tool-upgrade.md @@ -31,7 +31,7 @@ Before you upgrade, you must: If you haven't already done so, run the System Upgrade utility to upgrade the Magento software. ### Back up the `vendor/magento/data-migration-tool` directory -Before you upgrade the Data Migration Tool, back up at least the `vendor/magento/data-migration-tool` directory. During upgrade, it is deleted and replaced by updated code. +Before you upgrade the Data Migration Tool, back up at least the `vendor/magento/data-migration-tool` directory. During upgrade, it could be deleted and replaced by updated code. If you want, you can back up the entire Magento codebase and database using the following command: From 01d6287609d09b330f209517b04694fbba91fb80 Mon Sep 17 00:00:00 2001 From: "Savchuk, Rodion(rsavchuk)" Date: Wed, 10 Feb 2016 18:17:25 +0200 Subject: [PATCH 148/902] Update find-version.md --- _includes/migration/find-version.md | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/_includes/migration/find-version.md b/_includes/migration/find-version.md index a0603b9ce06..796edd96e51 100644 --- a/_includes/migration/find-version.md +++ b/_includes/migration/find-version.md @@ -15,12 +15,8 @@ To find the version of the Magento software: ### Find the Data Migration Tool version {#migration-tool-version} -To find the version of the migration tool: - -1. Change to your Magento install directory. -2. Open `composer.json` in a text editor. -3. In the `require` section, locate the value of `"magento/data-migration-tool"`. +To find the version of the migration tool open composer.json of migration tool package (`vendor/magento/data-migration-tool`) and find the value of "version". This is the version of your Data Migration Tool. - If `"magento/data-migration-tool"` is absent, you haven't installed the Data Migration Tool yet. \ No newline at end of file + If `"magento/data-migration-tool"` is absent, you haven't installed the Data Migration Tool yet. From b52589f421a808d00af916b756ccc5b7baf0b7c2 Mon Sep 17 00:00:00 2001 From: Oleksandra Marchenko Date: Wed, 10 Feb 2016 20:06:57 +0200 Subject: [PATCH 149/902] Added content to the Modal UI topic --- guides/v2.0/ui-components/ui-modal.md | 197 ++++++++++++++++++++++++++ guides/v2.0/ui-modal.md | 59 -------- 2 files changed, 197 insertions(+), 59 deletions(-) create mode 100644 guides/v2.0/ui-components/ui-modal.md delete mode 100644 guides/v2.0/ui-modal.md diff --git a/guides/v2.0/ui-components/ui-modal.md b/guides/v2.0/ui-components/ui-modal.md new file mode 100644 index 00000000000..55d34270fb0 --- /dev/null +++ b/guides/v2.0/ui-components/ui-modal.md @@ -0,0 +1,197 @@ +--- +layout: default +group: UI Library +subgroup: F_UI Library Modal Component +title: Modal Component +menu_title: Modal Component +menu_node: parent +github_link: ui-components/ui-modal.md +--- +

    What's in this topic

    + +This topic describes the modal UI component. + +* TOC +{:toc} + +## Modal component: Overview + +The modal UI component implements a secondary window that opens on top of the main window. It uses the [modal widget]([{site.gdeurl}}javascript-dev-guide/widgets/widget_modal.html) under the hood. + +Similar to the widget implementation, the component allows to configure window type and action buttons. Additionally, the component allows to link modal buttons to methods of the other UI components (by using the button component). + +The modal component also introduces `toolbarSection`: a placeholder inside the window's header, where any content cab be added. + +

    Where can it be used: backend/storefront?

    +

    Any related topic in http://devdocs.magento.com/guides/v2.0/pattern-library/bk-pattern.html?

    + +## Structure + +The modal ui component comprises the following files: + +- JS component: `/view/base/web/js/modal/modal-component.js` +- Template: `/view/base/web/templates/modal/modal-component.html` + +## Options + +

    What about isTemplate and dataScope, are they hard-coded?

    +Modal options are set in the configuration xml as follows: + + +{%highlight xml%} + + + + + %value% + %value% + ... + + false + + + + +{%endhighlight%} + +You can configure the following: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionDescriptionTypeOptional/MandatoryDefault value
    stateIs linked to the open/closed modal state as true/false. +

    Does it just display the state or set the state?

    BooleanOptionalUndefined
    optionsOptions are passed to the modal widget initialization as isObjectOptional{}
    titleThe title of the modal window. Set as follows: +
    +<item name="options" xsi:type="array">
    +    <item name="title" xsi:type="string">%window_title%</item>
    +</item>
    +
    + +
    StringOptionalUndefined
    typeThe type of the modal window. Can be one of the following: +slide, popup or custom + +Set as follows: +
    +<item name="options" xsi:type="array">
    +    <item name="type" xsi:type="string">%slide|popup|custom%</item>
    +</item>
    +
    +

    What is custom?

    +
    StringOptionalslide
    buttonsModal buttons. +

    Are they the action buttons of the modal window?

    +
    ObjectOptionalUndefined
    textThe button label. + +Set as follows: +
    +<item name="options" xsi:type="array">
    +    <item name="buttons" xsi:type="array">
    +         <item name="%button_number%" xsi:type="array">
    +             <item name="text" xsi:type="string">%label%</item>
    +         </item>
    +    </item>
    +</item>
    +
    + +
    StringOptionalUndefined
    classThe CSS class for the button. + +Set as follows: +
    +<item name="options" xsi:type="array">
    +    <item name="buttons" xsi:type="array">
    +         <item name="%button_number%" xsi:type="array">
    +             <item name="class" xsi:type="string">%class%</item>
    +         </item>
    +    </item>
    +</item>
    +
    + +
    StringOptionalUndefined
    actionsButton actions, +which will be performed synchronously and in order on button click. + +Set as follows: +
    +<item name="options" xsi:type="array">
    +    <item name="buttons" xsi:type="array">
    +         <item name="%button_number%" xsi:type="array">
    +             <item name="actions" xsi:type="string">%label%</item>
    +         </item>
    +    </item>
    +</item>
    +
    + +
    StringOptionalUndefined
    + +## Public API (JS) + +- `openModal()` - open the modal window +- `closeModal()` - close the modal window +- `toggleModal()` - toggle modal +- `setPrevValues(elem)` +- `elem` - component, all child of which will revert 'value' to the state, which was captured on modal open +- `actionCancel()` - cancels modal: return previous 'value' for every changed component in modal's content and closes modal +- `actionDone()` - approves changes in the modal: validates it contents and, if valid, closes modal \ No newline at end of file diff --git a/guides/v2.0/ui-modal.md b/guides/v2.0/ui-modal.md deleted file mode 100644 index 35ba275f570..00000000000 --- a/guides/v2.0/ui-modal.md +++ /dev/null @@ -1,59 +0,0 @@ ---- -layout: default -group: UI Library -subgroup: F_UI Library Modal Component -title: Modal Component -menu_title: Modal Component -menu_node: parent -github_link: ui-components/ui-modal.md ---- -

    What's in this topic

    - -This topic describes the modal UI component. - -* TOC -{:toc} - -## Modal component: Overview - -The modal component allows to show it contents (child elements) in modal, by using the [modal widget]([{site.gdeurl}}javascript-dev-guide/widgets/widget_modal.html) under the hood. -Every option that is configurable in modal widget, can be configured from Modal component. -Modal component also allows to configure modal buttons to perform methods from other UI Components, as Button component does. -Modal component also introduce toolbarSection - placeholder inside modal's header, which can be updated with any content. - -

    Does it have any dependencies with other components?

    -

    Any related topic in http://devdocs.magento.com/guides/v2.0/pattern-library/bk-pattern.html?

    - -## Structure - -The modal ui component comprises the following files: - -- JS component: `/view/base/web/js/modal/modal-component.js` -- Template: `/view/base/web/templates/modal/modal-component.html` - -## Configuration settings - - - - - - - - - - - - - - - - - - - - - - - -
    state
    \ No newline at end of file From 4bc49033f772dcbb0b17104e8c277ddbd4436a60 Mon Sep 17 00:00:00 2001 From: stevjohnson Date: Wed, 10 Feb 2016 15:04:08 -0600 Subject: [PATCH 150/902] Reorganize, retire redundant topics --- _includes/php-dev/component-versioning.md | 11 +++++++++ .../extension-dev-guide/XSD-XML-validation.md | 2 +- .../v2.0/extension-dev-guide/api-concepts.md | 2 +- guides/v2.0/extension-dev-guide/attributes.md | 2 +- .../backward-compatibility.md | 2 +- .../bk-extension-dev-guide.md | 7 ++++++ guides/v2.0/extension-dev-guide/build.md | 2 +- .../extension-dev-guide/code-generation.md | 2 +- .../component-registration.md | 2 +- .../composer-integration.md | 19 +++++++++++---- .../extension-dev-guide/create_component.md | 2 +- guides/v2.0/extension-dev-guide/depend-inj.md | 2 +- .../v2.0/extension-dev-guide/dev-filesys.md | 22 ----------------- guides/v2.0/extension-dev-guide/dev-intro.md | 22 ----------------- .../v2.0/extension-dev-guide/dev-modtypes.md | 18 ++++---------- .../v2.0/extension-dev-guide/dev-summary.md | 13 +++++----- guides/v2.0/extension-dev-guide/dev-test.md | 2 +- .../extension-dev-guide/developers_roadmap.md | 2 +- .../v2.0/extension-dev-guide/enable-module.md | 2 +- guides/v2.0/extension-dev-guide/indexing.md | 2 +- .../intro-composer-gloss.md | 12 +++++++--- .../extension-dev-guide/intro-composer.md | 9 ++++--- .../extension-dev-guide/message-queues.md | 2 +- .../extension-dev-guide/module-development.md | 2 +- .../module-file-structure.md | 4 ++-- .../extension-dev-guide/module-load-order.md | 2 +- guides/v2.0/extension-dev-guide/plugins.md | 2 +- guides/v2.0/extension-dev-guide/prepare.md | 6 ++--- .../extension-dev-guide/prepare_file-str.md | 19 ++++++++------- .../extension-dev-guide/prepare_summary.md | 24 ------------------- .../required-configuration-files.md | 2 +- guides/v2.0/extension-dev-guide/routing.md | 2 +- .../service-contracts/design-patterns.md | 2 +- .../service-contracts/service-contracts.md | 2 +- .../service-to-web-service.md | 2 +- .../v2.0/extension-dev-guide/test-module.md | 2 +- guides/v2.0/extension-dev-guide/validate.md | 2 +- 37 files changed, 99 insertions(+), 135 deletions(-) create mode 100644 _includes/php-dev/component-versioning.md delete mode 100644 guides/v2.0/extension-dev-guide/dev-filesys.md delete mode 100644 guides/v2.0/extension-dev-guide/dev-intro.md delete mode 100644 guides/v2.0/extension-dev-guide/prepare_summary.md diff --git a/_includes/php-dev/component-versioning.md b/_includes/php-dev/component-versioning.md new file mode 100644 index 00000000000..7a078b836f9 --- /dev/null +++ b/_includes/php-dev/component-versioning.md @@ -0,0 +1,11 @@ +
    + +Components have the following types of versions: + +* Marketing version; in other words, the version the merchant interacts with. + + Your initial version might be 1.0.0 or 2.0.0, for example. You should follow our versioning policy guidelines when setting your version. + +* Composer version; in other words, the version of each module, theme, language package, third-party package, and dependencies. + +Using Magento code as an example, Magento CE marketing version 2.0.0 includes component versions such as 100.0.1, 100.0.2, and so on. These versioning strategy prevents collisions between the marketing version and component versions. \ No newline at end of file diff --git a/guides/v2.0/extension-dev-guide/XSD-XML-validation.md b/guides/v2.0/extension-dev-guide/XSD-XML-validation.md index 5aa8e002950..25bfb8da478 100644 --- a/guides/v2.0/extension-dev-guide/XSD-XML-validation.md +++ b/guides/v2.0/extension-dev-guide/XSD-XML-validation.md @@ -1,7 +1,7 @@ --- layout: default group: extension-dev-guide -subgroup: 3_Build +subgroup: 03_Build title: URN schema validation menu_title: URN schema validation menu_order: 6 diff --git a/guides/v2.0/extension-dev-guide/api-concepts.md b/guides/v2.0/extension-dev-guide/api-concepts.md index 6737677d819..3f58237139a 100644 --- a/guides/v2.0/extension-dev-guide/api-concepts.md +++ b/guides/v2.0/extension-dev-guide/api-concepts.md @@ -1,7 +1,7 @@ --- layout: default group: extension-dev-guide -subgroup: 6_Module Development +subgroup: 99_Module Development title: Public interfaces & APIs menu_title: Public interfaces & APIs menu_order: 3 diff --git a/guides/v2.0/extension-dev-guide/attributes.md b/guides/v2.0/extension-dev-guide/attributes.md index b01779a1f79..f8ae2d36b76 100644 --- a/guides/v2.0/extension-dev-guide/attributes.md +++ b/guides/v2.0/extension-dev-guide/attributes.md @@ -1,7 +1,7 @@ --- layout: default group: extension-dev-guide -subgroup: 6_Module Development +subgroup: 99_Module Development title: EAV and extension attributes menu_title: EAV and extension attributes menu_order: 7 diff --git a/guides/v2.0/extension-dev-guide/backward-compatibility.md b/guides/v2.0/extension-dev-guide/backward-compatibility.md index d5549d6827b..7a900b0a64f 100644 --- a/guides/v2.0/extension-dev-guide/backward-compatibility.md +++ b/guides/v2.0/extension-dev-guide/backward-compatibility.md @@ -1,7 +1,7 @@ --- layout: default group: extension-dev-guide -subgroup: 6_Module Development +subgroup: 99_Module Development title: PHP developer guide menu_title: Backward compatibility menu_order: 12 diff --git a/guides/v2.0/extension-dev-guide/bk-extension-dev-guide.md b/guides/v2.0/extension-dev-guide/bk-extension-dev-guide.md index 0186b73c504..66d230e0d38 100644 --- a/guides/v2.0/extension-dev-guide/bk-extension-dev-guide.md +++ b/guides/v2.0/extension-dev-guide/bk-extension-dev-guide.md @@ -10,6 +10,7 @@ github_link: extension-dev-guide/bk-extension-dev-guide.md redirect_from: - /guides/v1.0/extension-dev-guide/bk-extension-dev-guide.html - /guides/v2.0/mktpl-quickstart/bk-marketplace-qs.html + - /guides/v2.0/mktpl-quickstart/intro-moreinfo.html --- ##{{page.menu_title}} @@ -34,3 +35,9 @@ A Magento *module* is code that accomplishes a particular business function or h

    You must follow a PSR compliant structure when building a module.

    +#### Related topics + +* Developer roadmap +* Introduction to Composer +* Glossary of common terms + diff --git a/guides/v2.0/extension-dev-guide/build.md b/guides/v2.0/extension-dev-guide/build.md index 99c6d658c49..925564b7946 100644 --- a/guides/v2.0/extension-dev-guide/build.md +++ b/guides/v2.0/extension-dev-guide/build.md @@ -1,7 +1,7 @@ --- layout: default group: extension-dev-guide -subgroup: 3_Build +subgroup: 03_Build title: Build menu_title: Build menu_order: 1 diff --git a/guides/v2.0/extension-dev-guide/code-generation.md b/guides/v2.0/extension-dev-guide/code-generation.md index 2337939a3fa..d82b325e09b 100644 --- a/guides/v2.0/extension-dev-guide/code-generation.md +++ b/guides/v2.0/extension-dev-guide/code-generation.md @@ -1,7 +1,7 @@ --- layout: default group: extension-dev-guide -subgroup: 6_Module Development +subgroup: 99_Module Development title: Code generation menu_title: Code generation menu_order: 6 diff --git a/guides/v2.0/extension-dev-guide/component-registration.md b/guides/v2.0/extension-dev-guide/component-registration.md index 562ef2738e7..e3de15fe214 100644 --- a/guides/v2.0/extension-dev-guide/component-registration.md +++ b/guides/v2.0/extension-dev-guide/component-registration.md @@ -1,7 +1,7 @@ --- layout: default group: extension-dev-guide -subgroup: 3_Build +subgroup: 03_Build title: Register your component menu_title: Register your component menu_order: 4 diff --git a/guides/v2.0/extension-dev-guide/composer-integration.md b/guides/v2.0/extension-dev-guide/composer-integration.md index 4d9eaff4a50..e8a1ad2ae4c 100644 --- a/guides/v2.0/extension-dev-guide/composer-integration.md +++ b/guides/v2.0/extension-dev-guide/composer-integration.md @@ -1,9 +1,9 @@ --- layout: default group: extension-dev-guide -subgroup: 2_Prepare -title: Component types in composer.json -menu_title: Component types in composer.json (renamed) +subgroup: 03_Build +title: Create composer.json +menu_title: Create composer.json menu_order: 2 github_link: extension-dev-guide/composer-integration.md redirect_from: /guides/v1.0/extension-dev-guide/composer-integration.html @@ -11,12 +11,18 @@ redirect_from: /guides/v1.0/extension-dev-guide/composer-integration.html --- ##{{page.menu_title}} +#### Contents + +* [Overview of composer.json files](#composerjson-overview) +* [Versioning](#component-version) +* [Composer binary location](#composer-binary) + [Composer](https://getcomposer.org/) is a dependency manager for PHP. Magento 2 uses Composer to package components and product editions. Some third-party components that the Magento system uses might not be present in the code base. Instead, they are listed as dependencies in the root `composer.json` file. -

    Overview of composer.json files

    +## Overview of composer.json files {#composerjson-overview} Certain Magento components and product editions are represented with `composer.json` files. @@ -145,5 +151,8 @@ Each Magento component can be categorized into one of the types listed in the pr Having an identifier type for each component allows the system to marshal the directories and files of each component to the correct locations, based on the Magento 2 directory structure. -

    Composer Binary Location

    +## Versioning {#component-version} +{% include php-dev/component-versioning.md %} + +## Composer binary location {#composer-binary} Magento's `bin/magento` script uses composer from the `vendor/composer` directory in your Magento 2 installation, not your globally installed Composer. Keep this in mind while customizing or updating composer or troubleshooting Composer issues while working with Magento 2. diff --git a/guides/v2.0/extension-dev-guide/create_component.md b/guides/v2.0/extension-dev-guide/create_component.md index 325c33930ca..debe1c8765b 100644 --- a/guides/v2.0/extension-dev-guide/create_component.md +++ b/guides/v2.0/extension-dev-guide/create_component.md @@ -1,7 +1,7 @@ --- layout: default group: extension-dev-guide -subgroup: 3_Build +subgroup: 03_Build title: Name your component menu_title: Name your component menu_order: 7 diff --git a/guides/v2.0/extension-dev-guide/depend-inj.md b/guides/v2.0/extension-dev-guide/depend-inj.md index 76b45b93c30..9c2ecf26051 100644 --- a/guides/v2.0/extension-dev-guide/depend-inj.md +++ b/guides/v2.0/extension-dev-guide/depend-inj.md @@ -1,7 +1,7 @@ --- layout: default group: extension-dev-guide -subgroup: 6_Module Development +subgroup: 99_Module Development title: Dependency injection menu_title: Dependency injection menu_order: 5 diff --git a/guides/v2.0/extension-dev-guide/dev-filesys.md b/guides/v2.0/extension-dev-guide/dev-filesys.md deleted file mode 100644 index a59c110dafd..00000000000 --- a/guides/v2.0/extension-dev-guide/dev-filesys.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -layout: default -group: extension-dev-guide -subgroup: 02_Dev -title: Set up your component's file structure -menu_title: Set up your component's file structure -menu_order: 5 -menu_node: -github_link: extension-dev-guide/dev-filesys.md -redirect_from: /guides/v2.0/mktpl-quickstart/dev-filesys.html ---- - -##{{page.menu_title}} - -One of the first things you can do to get started with component development is to understand and set up the file system. Each type of component has a *different file structure*, although all components require certain files. - -In addition, you can choose the component root directory to start development. The following sections have more information. - -{% include php-dev/component-root.md %} - -#### Related topic -Component file structure \ No newline at end of file diff --git a/guides/v2.0/extension-dev-guide/dev-intro.md b/guides/v2.0/extension-dev-guide/dev-intro.md deleted file mode 100644 index 5f33c6b91ce..00000000000 --- a/guides/v2.0/extension-dev-guide/dev-intro.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -layout: default -group: extension-dev-guide -subgroup: 02_Dev -title: Develop your component -menu_title: Develop your component -menu_order: 1 -menu_node: parent -github_link: extension-dev-guide/dev-intro.md -redirect_from: /guides/v2.0/mktpl-quickstart/dev-intro.html ---- - -##{{page.menu_title}} - -The following topics help you get started developing your Magento component: - -* Component types -* Set up your component's file structure -* Summary of developing and packaging components -* Test your component - - diff --git a/guides/v2.0/extension-dev-guide/dev-modtypes.md b/guides/v2.0/extension-dev-guide/dev-modtypes.md index dd644e383c0..e56e7fef845 100644 --- a/guides/v2.0/extension-dev-guide/dev-modtypes.md +++ b/guides/v2.0/extension-dev-guide/dev-modtypes.md @@ -1,9 +1,9 @@ --- layout: default group: extension-dev-guide -subgroup: 02_Dev -title: Component types -menu_title: Component types +subgroup: 02_Prepare +title: Component types and versioning +menu_title: Component types and versioning menu_order: 2 menu_node: github_link: extension-dev-guide/dev-modtypes.md @@ -22,16 +22,8 @@ redirect_from: /guides/v2.0/mktpl-quickstart/dev-modtypes.html

    Each component type has a different directory structure and different contents for composer.json.

    -

    Versioning

    -Components have the following types of versions: - -* Marketing version; in other words, the version the merchant interacts with. - - Your initial version might be 1.0.0 or 2.0.0, for example. You should follow our versioning policy guidelines when setting your version. - -* Composer version; in other words, the version of each module, theme, language package, third-party package, and dependencies. - -Using Magento code as an example, Magento CE marketing version 2.0.0 includes component versions such as 100.0.1, 100.0.2, and so on. These versioning strategy prevents collisions between the marketing version and component versions. +## Versioning {#component-version} +{% include php-dev/component-versioning.md %} #### Next Set up your component's file structure \ No newline at end of file diff --git a/guides/v2.0/extension-dev-guide/dev-summary.md b/guides/v2.0/extension-dev-guide/dev-summary.md index 37c0050b7b4..34d15db9cc0 100644 --- a/guides/v2.0/extension-dev-guide/dev-summary.md +++ b/guides/v2.0/extension-dev-guide/dev-summary.md @@ -1,17 +1,18 @@ --- layout: default group: extension-dev-guide -subgroup: 02_Dev -title: Summary of developing and packaging components -menu_title: Summary of developing and packaging components -menu_order: 10 +subgroup: 02_Prepare +title: Roadmap for developing and packaging components +menu_title: Roadmap for developing and packaging components +menu_order: 50 menu_node: github_link: extension-dev-guide/dev-summary.md -redirect_from: /guides/v2.0/mktpl-quickstart/dev-summary.html +redirect_from: + - /guides/v2.0/mktpl-quickstart/dev-intro.html + - /guides/v2.0/mktpl-quickstart/dev-summary.html --- ##{{page.menu_title}} - To develop your component, use the following steps: 1. Learn about using Composer with your component. diff --git a/guides/v2.0/extension-dev-guide/dev-test.md b/guides/v2.0/extension-dev-guide/dev-test.md index 17456058a59..52e8fcf354d 100644 --- a/guides/v2.0/extension-dev-guide/dev-test.md +++ b/guides/v2.0/extension-dev-guide/dev-test.md @@ -1,7 +1,7 @@ --- layout: default group: extension-dev-guide -subgroup: 02_Dev +subgroup: 02_Prepare title: Test your component menu_title: Test your component menu_order: 100 diff --git a/guides/v2.0/extension-dev-guide/developers_roadmap.md b/guides/v2.0/extension-dev-guide/developers_roadmap.md index 526c828b904..4095bd29131 100644 --- a/guides/v2.0/extension-dev-guide/developers_roadmap.md +++ b/guides/v2.0/extension-dev-guide/developers_roadmap.md @@ -32,7 +32,7 @@ Key points: * Package your component in `.zip` format. * If you upload the component to Magento Marketplace, it should be less than 30MB in size. -#### Helpful links +#### Related topics * Introduction to Composer * Glossary of common terms * Sample extensions created by the Magento 2 Core team diff --git a/guides/v2.0/extension-dev-guide/enable-module.md b/guides/v2.0/extension-dev-guide/enable-module.md index d4e2ab43c2b..4bbc5016261 100644 --- a/guides/v2.0/extension-dev-guide/enable-module.md +++ b/guides/v2.0/extension-dev-guide/enable-module.md @@ -1,7 +1,7 @@ --- layout: default group: extension-dev-guide -subgroup: 3_Build +subgroup: 03_Build title: Enable a component menu_title: Enable a component menu_order: 9 diff --git a/guides/v2.0/extension-dev-guide/indexing.md b/guides/v2.0/extension-dev-guide/indexing.md index bcf2a8b1ae1..bd7dd43be01 100644 --- a/guides/v2.0/extension-dev-guide/indexing.md +++ b/guides/v2.0/extension-dev-guide/indexing.md @@ -1,7 +1,7 @@ --- layout: default group: extension-dev-guide -subgroup: 6_Module Development +subgroup: 99_Module Development title: Indexing menu_title: Indexing menu_order: 10 diff --git a/guides/v2.0/extension-dev-guide/intro-composer-gloss.md b/guides/v2.0/extension-dev-guide/intro-composer-gloss.md index fa0cba665ea..b2f44be26a2 100644 --- a/guides/v2.0/extension-dev-guide/intro-composer-gloss.md +++ b/guides/v2.0/extension-dev-guide/intro-composer-gloss.md @@ -12,7 +12,13 @@ redirect_from: /guides/v2.0/mktpl-quickstart/intro-composer-gloss.html ##{{page.menu_title}} -### Component +#### List of terms + +* [Component](#gloss-component) +* [Metapackage](#gloss-meta) +* [Component Manager](#gloss-compman) + +### Component {#gloss-component} We refer to what you're coding as *components*. (Composer refers to them as *packages*; the terms component and package are equivalent.) A Magento component can be classified into the following *types*: * Module (extend Magento capabilities) @@ -32,7 +38,7 @@ You can *package* your components as follows:

    Magento Marketplace uses the blanket term product to refer to a component or a metapackage.

    -### Metapackage +### Metapackage {#gloss-meta} Magento Marketplace requires more than one component to be packaged as a *metapackage*, which consists of only a `composer.json` that specifies individual components and their dependencies. (Magento Marketplace also refers to a metapackage as an *extension*.) A metapackage requires or suggests components that we refer to as *shared packages*. You can use a shared package in multiple metapackages if you wish. (If you use shared packages, Marketplace requires that *all* components in a metapackage be shared packages.) @@ -49,7 +55,7 @@ Merchants do not need to understand that, under the covers, some packages are sh * metapackages * component types in composer.json. -

    Component Manager

    +### Component Manager {#gloss-compman} Merchants use the Component Manager (part of the Magento Admin) to do any of the following: * Install, uninstall diff --git a/guides/v2.0/extension-dev-guide/intro-composer.md b/guides/v2.0/extension-dev-guide/intro-composer.md index 970f648ab10..cf79b41ed0d 100644 --- a/guides/v2.0/extension-dev-guide/intro-composer.md +++ b/guides/v2.0/extension-dev-guide/intro-composer.md @@ -12,10 +12,13 @@ redirect_from: /guides/v2.0/mktpl-quickstart/intro-composer.html {% include install/composer-overview.html %} -## `composer.json` -The key to developing any Magento component is its `composer.json`, which specifies version and dependency information for a component, among other things. You can look at examples in the Magento codebase, such as: +## Links to Magento code +The key to developing any Magento component is its `composer.json`, which specifies version and dependency information for a component, among other things. You can look at Magento 2 code, such as: -* Metapackage (old metapackage for Community Edition from packages.magento.com) +* Metapackage + + * If you installed Magento 2 using a metapackage, look at `/composer.json`. + * If you haven't installed Magento 2 yet, you can get a general idea by looking at an old metapackage for Community Edition from `packages.magento.com` * Customer module * Luma theme * en_us language package diff --git a/guides/v2.0/extension-dev-guide/message-queues.md b/guides/v2.0/extension-dev-guide/message-queues.md index 0ca6d06a47c..76ace05ca4d 100644 --- a/guides/v2.0/extension-dev-guide/message-queues.md +++ b/guides/v2.0/extension-dev-guide/message-queues.md @@ -1,7 +1,7 @@ --- layout: default group: extension-dev-guide -subgroup: 6_Module Development +subgroup: 99_Module Development title: Message Queues menu_title: Message Queues (Enterprise Edition Only) menu_order: 15 diff --git a/guides/v2.0/extension-dev-guide/module-development.md b/guides/v2.0/extension-dev-guide/module-development.md index 7b382458d97..7cb7f794735 100644 --- a/guides/v2.0/extension-dev-guide/module-development.md +++ b/guides/v2.0/extension-dev-guide/module-development.md @@ -1,7 +1,7 @@ --- layout: default group: extension-dev-guide -subgroup: 6_Module Development +subgroup: 99_Module Development title: Component development menu_title: Component development menu_order: 1 diff --git a/guides/v2.0/extension-dev-guide/module-file-structure.md b/guides/v2.0/extension-dev-guide/module-file-structure.md index 7040a52c7b7..4567f7d2a4d 100644 --- a/guides/v2.0/extension-dev-guide/module-file-structure.md +++ b/guides/v2.0/extension-dev-guide/module-file-structure.md @@ -1,10 +1,10 @@ --- layout: default group: extension-dev-guide -subgroup: 3_Build +subgroup: 03_Build title: Create your component file structure menu_title: Create your component file structure -menu_order: 2 +menu_order: 3 github_link: extension-dev-guide/module-file-structure.md --- diff --git a/guides/v2.0/extension-dev-guide/module-load-order.md b/guides/v2.0/extension-dev-guide/module-load-order.md index c9e3f215d68..93bb20a012b 100644 --- a/guides/v2.0/extension-dev-guide/module-load-order.md +++ b/guides/v2.0/extension-dev-guide/module-load-order.md @@ -1,7 +1,7 @@ --- layout: default group: extension-dev-guide -subgroup: 3_Build +subgroup: 03_Build title: Component load order menu_title: Component load order menu_order: 8 diff --git a/guides/v2.0/extension-dev-guide/plugins.md b/guides/v2.0/extension-dev-guide/plugins.md index 702b9363340..ce7a4e6e31b 100644 --- a/guides/v2.0/extension-dev-guide/plugins.md +++ b/guides/v2.0/extension-dev-guide/plugins.md @@ -1,7 +1,7 @@ --- layout: default group: extension-dev-guide -subgroup: 6_Module Development +subgroup: 99_Module Development title: Magento plug-ins menu_title: Magento plug-ins menu_order: 8 diff --git a/guides/v2.0/extension-dev-guide/prepare.md b/guides/v2.0/extension-dev-guide/prepare.md index f2a02141b8a..c0f538b8377 100644 --- a/guides/v2.0/extension-dev-guide/prepare.md +++ b/guides/v2.0/extension-dev-guide/prepare.md @@ -1,9 +1,9 @@ --- layout: default group: extension-dev-guide -subgroup: 2_Prepare -title: Prepare -menu_title: Prepare (updated) +subgroup: 02_Prepare +title: Prepare (development quick start) +menu_title: Prepare (development quick start) menu_order: 1 menu_node: parent github_link: extension-dev-guide/prepare.md diff --git a/guides/v2.0/extension-dev-guide/prepare_file-str.md b/guides/v2.0/extension-dev-guide/prepare_file-str.md index aaba6aa8d1a..eeab27d68a7 100644 --- a/guides/v2.0/extension-dev-guide/prepare_file-str.md +++ b/guides/v2.0/extension-dev-guide/prepare_file-str.md @@ -1,19 +1,22 @@ --- layout: default group: extension-dev-guide -subgroup: 2_Prepare -title: Component file structure summary -menu_title: Component file structure summary (new) -menu_order: 50 +subgroup: 02_Prepare +title: About component file structure +menu_title: About component file structure +menu_order: 10 menu_node: github_link: extension-dev-guide/prepare_file-str.md - +redirect_from: /guides/v2.0/mktpl-quickstart/dev-filesys.html --- ##{{page.menu_title}} +One of the first things you can do to get started with component development is to understand and set up the file system. Each type of component has a *different file structure*, although all components require certain files. + +In addition, you can choose the component root directory to start development. The following sections have more information. -Outline: +{% include php-dev/component-root.md %} -* Shorter version of file structure for all component types -* Note about module root (`app/code`, `vendor`) \ No newline at end of file +#### Related topic +using Composer with your component. -2. Build your component -3. Package a component -4. Validate your component -4. *For Magento Marketplace only*. Upload the components to the Magento Marketplace. - - See the Magento Marketplace User Guide for details. diff --git a/guides/v2.0/extension-dev-guide/required-configuration-files.md b/guides/v2.0/extension-dev-guide/required-configuration-files.md index e2f8835e667..b04af5569b2 100644 --- a/guides/v2.0/extension-dev-guide/required-configuration-files.md +++ b/guides/v2.0/extension-dev-guide/required-configuration-files.md @@ -1,7 +1,7 @@ --- layout: default group: extension-dev-guide -subgroup: 3_Build +subgroup: 03_Build title: Define your configuration files menu_title: Define your configuration files menu_order: 3 diff --git a/guides/v2.0/extension-dev-guide/routing.md b/guides/v2.0/extension-dev-guide/routing.md index 8cf80c0b7b1..8801fc0d725 100644 --- a/guides/v2.0/extension-dev-guide/routing.md +++ b/guides/v2.0/extension-dev-guide/routing.md @@ -1,7 +1,7 @@ --- layout: default group: extension-dev-guide -subgroup: 6_Module Development +subgroup: 99_Module Development title: Routing menu_title: Routing menu_order: 9 diff --git a/guides/v2.0/extension-dev-guide/service-contracts/design-patterns.md b/guides/v2.0/extension-dev-guide/service-contracts/design-patterns.md index 4790c792c8e..57f5dd25686 100644 --- a/guides/v2.0/extension-dev-guide/service-contracts/design-patterns.md +++ b/guides/v2.0/extension-dev-guide/service-contracts/design-patterns.md @@ -1,7 +1,7 @@ --- layout: default group: extension-dev-guide -subgroup: 6_Module Development +subgroup: 99_Module Development title: Service contract design patterns menu_title: Service contract design patterns menu_order: 4 diff --git a/guides/v2.0/extension-dev-guide/service-contracts/service-contracts.md b/guides/v2.0/extension-dev-guide/service-contracts/service-contracts.md index a11a6c89db6..4794fbb820e 100644 --- a/guides/v2.0/extension-dev-guide/service-contracts/service-contracts.md +++ b/guides/v2.0/extension-dev-guide/service-contracts/service-contracts.md @@ -1,7 +1,7 @@ --- layout: default group: extension-dev-guide -subgroup: 6_Module Development +subgroup: 99_Module Development title: Service contracts menu_title: Service contracts menu_order: 2 diff --git a/guides/v2.0/extension-dev-guide/service-contracts/service-to-web-service.md b/guides/v2.0/extension-dev-guide/service-contracts/service-to-web-service.md index 2f482fc0e32..b4ed68c7bad 100644 --- a/guides/v2.0/extension-dev-guide/service-contracts/service-to-web-service.md +++ b/guides/v2.0/extension-dev-guide/service-contracts/service-to-web-service.md @@ -1,7 +1,7 @@ --- layout: default group: extension-dev-guide -subgroup: 6_Module Development +subgroup: 99_Module Development title: Configure services as web APIs menu_title: Configure services as web APIs menu_order: 11 diff --git a/guides/v2.0/extension-dev-guide/test-module.md b/guides/v2.0/extension-dev-guide/test-module.md index 4729fd4b3da..3113f0d27f5 100644 --- a/guides/v2.0/extension-dev-guide/test-module.md +++ b/guides/v2.0/extension-dev-guide/test-module.md @@ -1,7 +1,7 @@ --- layout: default group: extension-dev-guide -subgroup: 4_Validate +subgroup: 06_Validate title: Test your component menu_title: Test your component menu_order: 2 diff --git a/guides/v2.0/extension-dev-guide/validate.md b/guides/v2.0/extension-dev-guide/validate.md index 6b0a1c0d84e..e73a7257afa 100644 --- a/guides/v2.0/extension-dev-guide/validate.md +++ b/guides/v2.0/extension-dev-guide/validate.md @@ -1,7 +1,7 @@ --- layout: default group: extension-dev-guide -subgroup: 4_Validate +subgroup: 06_Validate title: Validate menu_title: Validate menu_order: 1 From b81af7eb05c04587b1affd382f1dd3246eb33497 Mon Sep 17 00:00:00 2001 From: stevjohnson Date: Wed, 10 Feb 2016 15:40:30 -0600 Subject: [PATCH 151/902] Update --- guides/v2.0/extension-dev-guide/enable-module.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/guides/v2.0/extension-dev-guide/enable-module.md b/guides/v2.0/extension-dev-guide/enable-module.md index 4bbc5016261..8dee14f9649 100644 --- a/guides/v2.0/extension-dev-guide/enable-module.md +++ b/guides/v2.0/extension-dev-guide/enable-module.md @@ -2,8 +2,8 @@ layout: default group: extension-dev-guide subgroup: 03_Build -title: Enable a component -menu_title: Enable a component +title: Enable your component +menu_title: Enable your component menu_order: 9 github_link: extension-dev-guide/enable-module.md From dbe6e5586f64d8ac271471d0663d4e1e57bd4a72 Mon Sep 17 00:00:00 2001 From: stevjohnson Date: Wed, 10 Feb 2016 18:27:17 -0600 Subject: [PATCH 152/902] Updates --- guides/v2.0/extension-dev-guide/dev-test.md | 29 ------------- .../v2.0/extension-dev-guide/test-module.md | 43 ++++++++++++++++--- 2 files changed, 36 insertions(+), 36 deletions(-) delete mode 100644 guides/v2.0/extension-dev-guide/dev-test.md diff --git a/guides/v2.0/extension-dev-guide/dev-test.md b/guides/v2.0/extension-dev-guide/dev-test.md deleted file mode 100644 index 52e8fcf354d..00000000000 --- a/guides/v2.0/extension-dev-guide/dev-test.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -layout: default -group: extension-dev-guide -subgroup: 02_Prepare -title: Test your component -menu_title: Test your component -menu_order: 100 -menu_node: -github_link: extension-dev-guide/dev-test.md -redirect_from: /guides/v2.0/mktpl-quickstart/dev-test.html ---- - -##{{page.menu_title}} - -During development, you should test your component thoroughly to make sure it works as expected. - -Before you publish your component, you should test installing it using the Magento Component Manager (part of the Magento Admin). - -One way to do this follows: - -1. Package your component in a GitHub repository that's accessible by the machine on which you run the Magento Admin. -2. On that machine, create a static route from `https://repo.magento.com` to your GitHub repository. - - To create a static route, add a line similar to the following to your `hosts` file: - - https://repo.magento.com - -3. Install your component exactly like a merchant. -4. Verify the component installed properly. diff --git a/guides/v2.0/extension-dev-guide/test-module.md b/guides/v2.0/extension-dev-guide/test-module.md index 3113f0d27f5..65bc50314f9 100644 --- a/guides/v2.0/extension-dev-guide/test-module.md +++ b/guides/v2.0/extension-dev-guide/test-module.md @@ -7,31 +7,60 @@ menu_title: Test your component menu_order: 2 menu_node: github_link: extension-dev-guide/test-module.md - +redirect_from: /guides/v2.0/mktpl-quickstart/dev-test.html --- ##{{page.menu_title}} +#### Contents + +* [PHPUnit](#test-phpunit) +* [Functional testing](#test-functional) +* [Test installing your component](#test-install) + +##PHPUnit {#test-phpunit} + +PHPUnit is a PHP testing framework ideal for Magento programmers. Test your component with [PHPUnit](https://phpunit.de/){:target="_blank"}, available on GitHub at [https://github.com/sebastianbergmann/phpunit](https://github.com/sebastianbergmann/phpunit){:target="_blank"}. + +## Functional testing {#test-functional} +For further testing with Magento testing frameworks, see +[Magento Testing Framework]({{ site.gdeurl }}mtf/mtf_introduction.html). + +## Test using Community Edition {#test-comm} Test your component by deploying Magento Community Edition and adding the component to the project's composer.json. {% highlight JSON %} "require": { "magento/magento-composer-installer": "*", "magento/product-community-edition": "2.0.0", - "foovendor/module-one": "0.1.1" + "yourvendorname/module-one": "0.1.1" }, {% endhighlight %} Remember to [register](component-registration.html) your component as well, adding the location of your component. Confirm that your component works as expected and Magento functionality is not compromised. -For further testing with Magento testing frameworks, see -[Magento Testing Framework]({{ site.gdeurl }}mtf/mtf_introduction.html). +## Test installing your component {#test-install} +Before you publish your component, you should test installing it using the Magento Component Manager (part of the Magento Admin). + +One way to do this follows: + +1. Package your component in a GitHub repository that's accessible by the machine on which you run the Magento Admin. +2. On that machine, create a static route from `https://repo.magento.com` to your GitHub repository. + + To create a static route, add a line similar to the following to your `hosts` file: + + https://repo.magento.com + +3. Install your component exactly like a merchant. +4. Verify the component installed properly. + + + + -##PHPUnit -PHPUnit is a PHP testing framework ideal for Magento programmers. Test your component with [PHPUnit](https://phpunit.de/){:target="_blank"}, available on GitHub at [https://github.com/sebastianbergmann/phpunit](https://github.com/sebastianbergmann/phpunit){:target="_blank"}. -##More Information +##More information For more information on testing in PHP and validating Magento components, see the following: * [PHP Reflection](http://php.net/manual/en/book.reflection.php){:target="_blank"} From 8ef875181fa33513ca199d4d22bf6740bf1877a5 Mon Sep 17 00:00:00 2001 From: stevjohnson Date: Wed, 10 Feb 2016 20:25:46 -0600 Subject: [PATCH 153/902] PR#519. Modified, created new topic --- .../config-guide/varnish/config-varnish.md | 39 +++++++++++----- .../varnish/tshoot-varnish-503.md | 45 +++++++++++++++++++ 2 files changed, 74 insertions(+), 10 deletions(-) create mode 100644 guides/v2.0/config-guide/varnish/tshoot-varnish-503.md diff --git a/guides/v2.0/config-guide/varnish/config-varnish.md b/guides/v2.0/config-guide/varnish/config-varnish.md index 7a5c999bdb6..3c657b145a8 100644 --- a/guides/v2.0/config-guide/varnish/config-varnish.md +++ b/guides/v2.0/config-guide/varnish/config-varnish.md @@ -23,6 +23,7 @@ github_link: config-guide/varnish/config-varnish.md * Use Varnish: * How Magento cache clearing works with Varnish * How Varnish caching works +* [Troubleshooting 503 (Service Unavailable) errors]({{ site.gdeurl }}config-guide/varnish/tshoot-varnish-503.html)

    Overview of the Varnish solution

    Varnish Cache is an open source web application accelerator (also referred to as an *HTTP accelerator* or *caching HTTP reverse proxy*). Varnish stores (or caches) files or fragments of files in memory; this enables Varnish to reduce the response time and network bandwidth consumption on future, equivalent requests. Unlike web servers like Apache and nginx, Varnish was designed for use exclusively with the HTTP protocol. @@ -77,6 +78,8 @@ We know of the following issues with Varnish: As an alternative, use SSL termination or an SSL termination proxy. * If you manually delete the contents of the `/var/cache` directory, you must restart Varnish. + + * Possible error installing Magento: Error 503 Service Unavailable @@ -92,21 +95,37 @@ We know of the following issues with Varnish: .first_byte_timeout = 600s; } -* Possible error on some pages: +## Troubleshooting 503 (Service Unavailable) errors {#varnish-503} +If the length of cache tags used by Magento exceed Varnish's default of 8192 errors, you can see HTTP 503 (Service Unavailable) errors in the browser. The errors might display simiar to the following: - Error 503 Backend fetch failed - Backend fetch failed - Guru Meditation: - XID: 303394517 + Error 503 Backend fetch failed + Backend fetch failed + +To resolve this issue, increase the default value of `http_resp_hdr_len` in your Varnish configuration file as follows: + +1. As a user with `root` privileges, open your Vanish configuration file in a text editor: + + * CentOS: `/etc/sysconfig/varnish` + * Ubuntu: `/etc/default/varnish` - If you experience this error, it is possible that Magento is sending a list of - cache tags longer than the default allowed 8192 characters. To fix this, you - must edit the `http_resp_hdr_len` launch parameter. +2. Search for the `http_resp_hdr_len` parameter. +3. If the parameter doesn't exist, add it after `thread_pool_max`. +4. Set `http_resp_hdr_len` to a value larger than 8192. - On CentOS, this can be changed in the `/etc/sysconfig/varnish` file by adding - the line: + For example: -p http_resp_hdr_len=64000 \ + A snippet follows: + + # DAEMON_OPTS is used by the init script. + DAEMON_OPTS="-a ${VARNISH_LISTEN_ADDRESS}:${VARNISH_LISTEN_PORT} \ + -f ${VARNISH_VCL_CONF} \ + -T ${VARNISH_ADMIN_LISTEN_ADDRESS}:${VARNISH_ADMIN_LISTEN_PORT} \ + -p thread_pool_min=${VARNISH_MIN_THREADS} \ + -p thread_pool_max=${VARNISH_MAX_THREADS} \ + -p http_resp_hdr_len=64000 \ + -S ${VARNISH_SECRET_FILE} \ + -s ${VARNISH_STORAGE}" #### Next step Install Varnish diff --git a/guides/v2.0/config-guide/varnish/tshoot-varnish-503.md b/guides/v2.0/config-guide/varnish/tshoot-varnish-503.md new file mode 100644 index 00000000000..bd79ad9c6eb --- /dev/null +++ b/guides/v2.0/config-guide/varnish/tshoot-varnish-503.md @@ -0,0 +1,45 @@ +--- +layout: default +group: config-guide +subgroup: CM_Varnish +title: Troubleshooting 503 (Service Unavailable) errors +menu_title: Troubleshooting 503 (Service Unavailable) errors +menu_order: 500 +menu_node: +github_link: config-guide/varnish/tshoot-varnish-503.md +--- + +## Troubleshooting 503 (Service Unavailable) errors {#varnish-503} +If the length of cache tags used by Magento exceed Varnish's default of 8192 errors, you can see HTTP 503 (Service Unavailable) errors in the browser. The errors might display simiar to the following: + + Error 503 Backend fetch failed + Backend fetch failed + +To resolve this issue, increase the default value of `http_resp_hdr_len` in your Varnish configuration file as follows: + +1. As a user with `root` privileges, open your Vanish configuration file in a text editor: + + * CentOS: `/etc/sysconfig/varnish` + * Ubuntu: `/etc/default/varnish` + +2. Search for the `http_resp_hdr_len` parameter. +3. If the parameter doesn't exist, add it after `thread_pool_max`. +4. Set `http_resp_hdr_len` to a value larger than 8192. + + For example: + + -p http_resp_hdr_len=64000 \ + A snippet follows: + + # DAEMON_OPTS is used by the init script. + DAEMON_OPTS="-a ${VARNISH_LISTEN_ADDRESS}:${VARNISH_LISTEN_PORT} \ + -f ${VARNISH_VCL_CONF} \ + -T ${VARNISH_ADMIN_LISTEN_ADDRESS}:${VARNISH_ADMIN_LISTEN_PORT} \ + -p thread_pool_min=${VARNISH_MIN_THREADS} \ + -p thread_pool_max=${VARNISH_MAX_THREADS} \ + -p http_resp_hdr_len=64000 \ + -S ${VARNISH_SECRET_FILE} \ + -s ${VARNISH_STORAGE}" + +#### Next step +Install Varnish From 6bc854061c928c69394619a42d373da8b8d7a44f Mon Sep 17 00:00:00 2001 From: stevjohnson Date: Wed, 10 Feb 2016 20:32:41 -0600 Subject: [PATCH 154/902] Add cross-ref to 503 topic --- common/images/404.svg | 47 +++++++++++++++++++ .../varnish/config-varnish-final.md | 4 ++ 2 files changed, 51 insertions(+) create mode 100644 common/images/404.svg diff --git a/common/images/404.svg b/common/images/404.svg new file mode 100644 index 00000000000..ccc1db09e44 --- /dev/null +++ b/common/images/404.svg @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + diff --git a/guides/v2.0/config-guide/varnish/config-varnish-final.md b/guides/v2.0/config-guide/varnish/config-varnish-final.md index 0f4399a6625..7a3f36a42c4 100644 --- a/guides/v2.0/config-guide/varnish/config-varnish-final.md +++ b/guides/v2.0/config-guide/varnish/config-varnish-final.md @@ -67,6 +67,10 @@ Make sure the `/var/page_cache` directory is empty: If the directory is empty, congratulations! You successfully configured Varnish and Magento to work together! 5. If you cleared the `var/page_cache/` directory, restart Varnish. +
    +

    If you encounter 503 (Service Unavailable) errors, see Troubleshooting 503 (Service Unavailable) errors.

    +
    + #### Next steps * How Magento cache clearing works with Varnish * How Varnish caching works \ No newline at end of file From ee356ec90b83d4405853365388b16c6bc696ebd9 Mon Sep 17 00:00:00 2001 From: stevjohnson Date: Wed, 10 Feb 2016 20:33:22 -0600 Subject: [PATCH 155/902] Remove next step from 503 topic --- guides/v2.0/config-guide/varnish/tshoot-varnish-503.md | 3 --- 1 file changed, 3 deletions(-) diff --git a/guides/v2.0/config-guide/varnish/tshoot-varnish-503.md b/guides/v2.0/config-guide/varnish/tshoot-varnish-503.md index bd79ad9c6eb..8aa451f3662 100644 --- a/guides/v2.0/config-guide/varnish/tshoot-varnish-503.md +++ b/guides/v2.0/config-guide/varnish/tshoot-varnish-503.md @@ -40,6 +40,3 @@ To resolve this issue, increase the default value of `http_resp_hdr_len` in your -p http_resp_hdr_len=64000 \ -S ${VARNISH_SECRET_FILE} \ -s ${VARNISH_STORAGE}" - -#### Next step -Install Varnish From 5bf32276d18bc0ff336091582ca32e1e3661ca73 Mon Sep 17 00:00:00 2001 From: stevjohnson Date: Wed, 10 Feb 2016 20:36:35 -0600 Subject: [PATCH 156/902] Fix formatting --- guides/v2.0/config-guide/varnish/tshoot-varnish-503.md | 1 + 1 file changed, 1 insertion(+) diff --git a/guides/v2.0/config-guide/varnish/tshoot-varnish-503.md b/guides/v2.0/config-guide/varnish/tshoot-varnish-503.md index 8aa451f3662..361f43b877d 100644 --- a/guides/v2.0/config-guide/varnish/tshoot-varnish-503.md +++ b/guides/v2.0/config-guide/varnish/tshoot-varnish-503.md @@ -29,6 +29,7 @@ To resolve this issue, increase the default value of `http_resp_hdr_len` in your For example: -p http_resp_hdr_len=64000 \ + A snippet follows: # DAEMON_OPTS is used by the init script. From 56a201acce15c884d7b553c291a2f1424ac21034 Mon Sep 17 00:00:00 2001 From: "Savchuk, Rodion(rsavchuk)" Date: Thu, 11 Feb 2016 10:33:50 +0200 Subject: [PATCH 157/902] Update find-version.md --- _includes/migration/find-version.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/_includes/migration/find-version.md b/_includes/migration/find-version.md index 796edd96e51..ed448ec1083 100644 --- a/_includes/migration/find-version.md +++ b/_includes/migration/find-version.md @@ -15,7 +15,11 @@ To find the version of the Magento software: ### Find the Data Migration Tool version {#migration-tool-version} -To find the version of the migration tool open composer.json of migration tool package (`vendor/magento/data-migration-tool`) and find the value of "version". +To find the version of the migration tool: + +* Change to your Data Migration Tool directory: `vendor/magento/data-migration-tool`. +* Open `composer.json` in a text editor. +* Find the value of "version" This is the version of your Data Migration Tool. From 5c4b86a53d6133aff929317a90ddb82729d34849 Mon Sep 17 00:00:00 2001 From: "Savchuk, Rodion(rsavchuk)" Date: Thu, 11 Feb 2016 10:43:57 +0200 Subject: [PATCH 158/902] Update find-version.md --- _includes/migration/find-version.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/_includes/migration/find-version.md b/_includes/migration/find-version.md index ed448ec1083..33792466bb2 100644 --- a/_includes/migration/find-version.md +++ b/_includes/migration/find-version.md @@ -22,5 +22,3 @@ To find the version of the migration tool: * Find the value of "version" This is the version of your Data Migration Tool. - - If `"magento/data-migration-tool"` is absent, you haven't installed the Data Migration Tool yet. From de65e91a1643b82a1c2c3a76802a22f4d1524514 Mon Sep 17 00:00:00 2001 From: fahadonline Date: Thu, 11 Feb 2016 13:54:59 +0500 Subject: [PATCH 159/902] Its "themes.js" not "theme.js" There does not appear to be any "theme.js" file in "dev/tools/grunt/configs/", it seems the correct one is "themes.js". --- guides/v2.0/frontend-dev-guide/css-topics/css_debug.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guides/v2.0/frontend-dev-guide/css-topics/css_debug.md b/guides/v2.0/frontend-dev-guide/css-topics/css_debug.md index 4ae02ae2c2e..50c7a59f6bb 100644 --- a/guides/v2.0/frontend-dev-guide/css-topics/css_debug.md +++ b/guides/v2.0/frontend-dev-guide/css-topics/css_debug.md @@ -80,7 +80,7 @@ npm update
  • -Add your theme to Grunt configuration. To do this, in the dev/tools/grunt/configs/theme.js file, add your theme to module.exports like following: +Add your theme to Grunt configuration. To do this, in the dev/tools/grunt/configs/themes.js file, add your theme to module.exports like following:
     module.exports = {
         <theme>: {
    
    From f4f63c37093719b6eb561848e0b14c80e5c8ddfb Mon Sep 17 00:00:00 2001
    From: "Savchuk, Rodion(rsavchuk)" 
    Date: Thu, 11 Feb 2016 11:13:36 +0200
    Subject: [PATCH 160/902] Update migration-tool-install.md
    
    ---
     guides/v2.0/migration/migration-tool-install.md | 3 ---
     1 file changed, 3 deletions(-)
    
    diff --git a/guides/v2.0/migration/migration-tool-install.md b/guides/v2.0/migration/migration-tool-install.md
    index 37f56d5a9a4..34a2f0e14b6 100644
    --- a/guides/v2.0/migration/migration-tool-install.md
    +++ b/guides/v2.0/migration/migration-tool-install.md
    @@ -64,9 +64,6 @@ Before you continue, make sure you [verified the version](#data-migrate-prereq)
     To install the Data Migration Tool:
     
     1.	Log in to your Magento server as, or switch to, the Magento file system owner.
    -4.	Verify your Magento 2 version using the following commands:
    -
    -		php /bin/magento --version
     2.	Change to Magento 2 root directory.
     3.	Enter the following commands in the order shown:
     
    
    From 9d215d4dce67a995c51f39c54a7ba5ed6baa3782 Mon Sep 17 00:00:00 2001
    From: "Savchuk, Rodion(rsavchuk)" 
    Date: Thu, 11 Feb 2016 13:00:27 +0200
    Subject: [PATCH 161/902] Update migration-tool-upgrade.md
    
    ---
     guides/v2.0/migration/migration-tool-upgrade.md | 11 +++++++++--
     1 file changed, 9 insertions(+), 2 deletions(-)
    
    diff --git a/guides/v2.0/migration/migration-tool-upgrade.md b/guides/v2.0/migration/migration-tool-upgrade.md
    index a06fe57707b..ee25f8ba8e9 100644
    --- a/guides/v2.0/migration/migration-tool-upgrade.md
    +++ b/guides/v2.0/migration/migration-tool-upgrade.md
    @@ -46,9 +46,16 @@ To upgrade the Data Migration Tool:
     
     1.	Log in to your Magento server as, or switch to, the Magento file system owner.
     2.	Change to Magento 2 root directory.
    -3.	Enter the following command:
    +3. Enter the following command:
     
    -		composer update magento/data-migration-tool
    +	`composer require magento/data-migration-tool:`
    +
    +where  must match the version of the Magento 2 codebase.
    +
    +For example, for version 2.0.2, enter:
    +
    +	`composer require magento/data-migration-tool:2.0.2`
    +	
     4.	Wait while the command completes.
     
     ###Related topics
    
    From 05ed1834d1a788fe09e7e23085f5865d710ec7d6 Mon Sep 17 00:00:00 2001
    From: "Savchuk, Rodion(rsavchuk)" 
    Date: Thu, 11 Feb 2016 14:10:58 +0200
    Subject: [PATCH 162/902] Update migration-tool-upgrade.md
    
    ---
     guides/v2.0/migration/migration-tool-upgrade.md | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/guides/v2.0/migration/migration-tool-upgrade.md b/guides/v2.0/migration/migration-tool-upgrade.md
    index ee25f8ba8e9..61f44885497 100644
    --- a/guides/v2.0/migration/migration-tool-upgrade.md
    +++ b/guides/v2.0/migration/migration-tool-upgrade.md
    @@ -50,7 +50,7 @@ To upgrade the Data Migration Tool:
     
     	`composer require magento/data-migration-tool:`
     
    -where  must match the version of the Magento 2 codebase.
    +where `` must match the version of the Magento 2 codebase.
     
     For example, for version 2.0.2, enter:
     
    
    From d548cd9f3be7e675d250f18808efc2126ad579d3 Mon Sep 17 00:00:00 2001
    From: "Savchuk, Rodion(rsavchuk)" 
    Date: Thu, 11 Feb 2016 14:13:52 +0200
    Subject: [PATCH 163/902] Update migration-tool-upgrade.md
    
    ---
     guides/v2.0/migration/migration-tool-upgrade.md | 7 +++----
     1 file changed, 3 insertions(+), 4 deletions(-)
    
    diff --git a/guides/v2.0/migration/migration-tool-upgrade.md b/guides/v2.0/migration/migration-tool-upgrade.md
    index 61f44885497..65c13b39991 100644
    --- a/guides/v2.0/migration/migration-tool-upgrade.md
    +++ b/guides/v2.0/migration/migration-tool-upgrade.md
    @@ -46,16 +46,15 @@ To upgrade the Data Migration Tool:
     
     1.	Log in to your Magento server as, or switch to, the Magento file system owner.
     2.	Change to Magento 2 root directory.
    -3. Enter the following command:
    +3. 	Enter the following command:
     
     	`composer require magento/data-migration-tool:`
     
    -where `` must match the version of the Magento 2 codebase.
    +	where `` must match the version of the Magento 2 codebase.
     
    -For example, for version 2.0.2, enter:
    +	For example, for version 2.0.2, enter:
     
     	`composer require magento/data-migration-tool:2.0.2`
    -	
     4.	Wait while the command completes.
     
     ###Related topics
    
    From d97245f836c6533eac929b93d7d2f9905f487f42 Mon Sep 17 00:00:00 2001
    From: stevjohnson 
    Date: Thu, 11 Feb 2016 07:20:19 -0600
    Subject: [PATCH 164/902] Update PR#519
    
    ---
     .../v2.0/config-guide/varnish/tshoot-varnish-503.md  | 12 +++++++-----
     1 file changed, 7 insertions(+), 5 deletions(-)
    
    diff --git a/guides/v2.0/config-guide/varnish/tshoot-varnish-503.md b/guides/v2.0/config-guide/varnish/tshoot-varnish-503.md
    index 361f43b877d..690265ae8b5 100644
    --- a/guides/v2.0/config-guide/varnish/tshoot-varnish-503.md
    +++ b/guides/v2.0/config-guide/varnish/tshoot-varnish-503.md
    @@ -2,15 +2,15 @@
     layout: default
     group: config-guide
     subgroup: CM_Varnish
    -title: Troubleshooting 503 (Service Unavailable) errors
    -menu_title: Troubleshooting 503 (Service Unavailable) errors
    +title: Troubleshooting 503 (Backend Fetch Failed) errors
    +menu_title: Troubleshooting 503 (Backend Fetch Failed) errors
     menu_order: 500
     menu_node: 
     github_link: config-guide/varnish/tshoot-varnish-503.md
     ---
     
    -## Troubleshooting 503 (Service Unavailable) errors {#varnish-503}
    -If the length of cache tags used by Magento exceed Varnish's default of 8192 errors, you can see HTTP 503 (Service Unavailable) errors in the browser. The errors might display simiar to the following:
    +## Troubleshooting 503 (Backend Fetch Failed) errors {#varnish-503}
    +If the length of cache tags used by Magento exceed Varnish's default of 8192 characters, you can see HTTP 503 (Backend Fetch Failed) errors in the browser. The errors might display simiar to the following:
     
     	Error 503 Backend fetch failed
     	Backend fetch failed
    @@ -24,7 +24,9 @@ To resolve this issue, increase the default value of `http_resp_hdr_len` in your
     
     2.	Search for the `http_resp_hdr_len` parameter.
     3.	If the parameter doesn't exist, add it after `thread_pool_max`.
    -4.	Set `http_resp_hdr_len` to a value larger than 8192.
    +4.	Set `http_resp_hdr_len` to a value equal to the product count of your largest category multiplied by 30. (Each product tag is about 21 characters in length.)
    +
    +	For example, setting the value to 64000 should work if your largest category has 3,050 products.
     
     	For example:
     
    
    From 43124f95656f99ab2f717ed591a8c49e17745bcb Mon Sep 17 00:00:00 2001
    From: Jay Williams 
    Date: Thu, 11 Feb 2016 08:18:39 -0600
    Subject: [PATCH 165/902] Fix broken links to System Upgrade Page
    
    ---
     guides/v2.0/release-notes/tech_bull_201-upgrade.md | 8 ++++----
     1 file changed, 4 insertions(+), 4 deletions(-)
    
    diff --git a/guides/v2.0/release-notes/tech_bull_201-upgrade.md b/guides/v2.0/release-notes/tech_bull_201-upgrade.md
    index 7816e29a4b9..93838335420 100644
    --- a/guides/v2.0/release-notes/tech_bull_201-upgrade.md
    +++ b/guides/v2.0/release-notes/tech_bull_201-upgrade.md
    @@ -147,7 +147,7 @@ To apply the patch:
     	
     	
  • -3. We recommend you upgrade to version 2.0.2. +3. We recommend you upgrade to version 2.0.2. #### Resolution 1 (using version 2.0.0 or 2.0.1) {#resolution1} To resolve the missing `.gitignore` files issue using this method, all of the following must be true: @@ -179,7 +179,7 @@ To resolve the issue: php bin/magento setup:upgrade 6. Verify your server is running version 2.0.1 or 2.0.2 in any of the ways discussed earlier in this resolution. - + #### Resolution 2 (upgrade to 2.0.1 or 2.0.2 has failed) {#resolution2} @@ -219,7 +219,7 @@ To resolve the issue: * Using the `php /bin/magento --version` command * Log in to the Magento Admin. The version displays in the lower right corner of the page. -7. We recommend you upgrade to version 2.0.2. +7. We recommend you upgrade to version 2.0.2. #### Resolution 3 (does not require command line access) {#resolution3} To resolve the missing `.gitignore` files issue if you have no command-line access to your Magento server, install version 2.0.2 on a local machine and transfer the Magento codebase to your Magento server using FTP or a utility provided by your shared hosting service. @@ -229,4 +229,4 @@ If this message displays during your upgrade, it can mean any of the following: * You didn't authenticate with the System Upgrade utility * The updater application isn't initialized -* You cloned the Magento GitHub repository \ No newline at end of file +* You cloned the Magento GitHub repository From 58003cbebfa27f825ac1828589ef7908f574b57c Mon Sep 17 00:00:00 2001 From: Oleksandra Marchenko Date: Thu, 11 Feb 2016 17:21:57 +0200 Subject: [PATCH 166/902] Prepared for dev review the Modal component topic --- guides/v2.0/ui-components/ui-modal.md | 156 +++++++++++++++++++------- 1 file changed, 118 insertions(+), 38 deletions(-) diff --git a/guides/v2.0/ui-components/ui-modal.md b/guides/v2.0/ui-components/ui-modal.md index 55d34270fb0..0107d1f17d6 100644 --- a/guides/v2.0/ui-components/ui-modal.md +++ b/guides/v2.0/ui-components/ui-modal.md @@ -11,34 +11,32 @@ github_link: ui-components/ui-modal.md This topic describes the modal UI component. +**Contents:** + * TOC {:toc} -## Modal component: Overview +## Modal component: overview The modal UI component implements a secondary window that opens on top of the main window. It uses the [modal widget]([{site.gdeurl}}javascript-dev-guide/widgets/widget_modal.html) under the hood. -Similar to the widget implementation, the component allows to configure window type and action buttons. Additionally, the component allows to link modal buttons to methods of the other UI components (by using the button component). +Similar to the widget's configuration, the component's configuration allows to set the window type and action buttons behavior. Additionally, the component allows to link action buttons to methods of the other UI components (by using the button component). + +The modal component can be used for both Admin panel and storefront. -The modal component also introduces `toolbarSection`: a placeholder inside the window's header, where any content cab be added. -

    Where can it be used: backend/storefront?

    -

    Any related topic in http://devdocs.magento.com/guides/v2.0/pattern-library/bk-pattern.html?

    ## Structure -The modal ui component comprises the following files: +The modal UI component comprises the following files: - JS component: `/view/base/web/js/modal/modal-component.js` - Template: `/view/base/web/templates/modal/modal-component.html` ## Options -

    What about isTemplate and dataScope, are they hard-coded?

    -Modal options are set in the configuration xml as follows: - +Component's options are set in the configuration `.xml` file as follows: {%highlight xml%} @@ -48,35 +46,32 @@ Modal options are set in the configuration xml as follows: %value% %value% ... - - false - {%endhighlight%} -You can configure the following: +Except the general configuration options, similar for most of the UI components, the following modal-specific options are available: - - - - - + + + + + - + - + - + @@ -93,7 +88,21 @@ You can configure the following: - + + + + + + + + @@ -114,12 +123,11 @@ Set as follows: - - + - + @@ -164,8 +172,7 @@ Set as follows: - - + + + + + + + +
    OptionDescriptionTypeOptional/MandatoryDefault valueOptionDescriptionTypeOptional/MandatoryDefault value
    stateIs linked to the open/closed modal state as true/false. -

    Does it just display the state or set the state?

    Set the state of the modal window: true for open. + Boolean OptionalUndefinedfalse
    optionsOptions are passed to the modal widget initialization as isOptions are passed to the modal widget initialization as is. Object Optional {} String OptionalUndefined''
    subTitleThe subtitle of the modal window. Set as follows: +
    +<item name="options" xsi:type="array">
    +    <item name="title" xsi:type="string">%window_title%</item>
    +</item>
    +
    + +
    StringOptional''
    type
    buttonsModal buttons. -

    Are they the action buttons of the modal window?

    +
    The action buttons of the modal window. ObjectArray OptionalUndefined[]
    text
    actionsButton actions, -which will be performed synchronously and in order on button click. + Button actions. On button click, actions are performed in the same order as they are set in config. Set as follows:
    @@ -179,19 +186,92 @@ Set as follows:
     
    StringObject Optional Undefined
    onCancelAction (method name), that is performed on cancelling interactions: pressing Esc, clicking outside the modal window or clicking the 'X' (close) icon. +StringOptionalcloseModal
    +### Example of the modal component configuration + +The following sample is an example of the configuration for a simple modal window containing one text field and a standard set of action buttons (**Save**, **Delete**, **Cancel**): + +{%highlight xml%} + + + + actionCancel + + + + Cancel + action-secondary + + actionCancel + + + + Clear + action-secondary + + + ${ $.name }.testField + clear + + + + + Done + action-primary + + actionDone + + + + + + + + + + test field + input + true + + + + + + +{%endhighlight%} + + ## Public API (JS) -- `openModal()` - open the modal window -- `closeModal()` - close the modal window -- `toggleModal()` - toggle modal -- `setPrevValues(elem)` -- `elem` - component, all child of which will revert 'value' to the state, which was captured on modal open -- `actionCancel()` - cancels modal: return previous 'value' for every changed component in modal's content and closes modal -- `actionDone()` - approves changes in the modal: validates it contents and, if valid, closes modal \ No newline at end of file +- `openModal()`: opens the modal window +- `closeModal()`: closes the modal window +- `toggleModal()`: toggles the modal window state (open/close) +- `setPrevValues(elem)`: returns all `elem`'s child components to the state they had on modal open +- `actionCancel()`: returns all modal's child components to the state they had on modal open and closes the modal window. +- `actionDone()`: validates the changes in the modal's child components and, if valid, closes the modal. \ No newline at end of file From 6f311a8458626176e2174ed6ea3ac0094a773635 Mon Sep 17 00:00:00 2001 From: Rodion Savchuk Date: Thu, 11 Feb 2016 17:31:27 +0200 Subject: [PATCH 167/902] Changed order of upgrade section --- guides/v2.0/migration/migration-tool-configure.md | 2 +- guides/v2.0/migration/migration-tool-upgrade.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/guides/v2.0/migration/migration-tool-configure.md b/guides/v2.0/migration/migration-tool-configure.md index 98e414a0bd6..2f6b97d3486 100644 --- a/guides/v2.0/migration/migration-tool-configure.md +++ b/guides/v2.0/migration/migration-tool-configure.md @@ -5,7 +5,7 @@ subgroup: C_Data migration tool title: Configure migration menu_title: Configure migration menu_node: -menu_order: 3 +menu_order: 4 github_link: migration/migration-tool-configure.md redirect_from: /guides/v1.0/migration/migration-tool-configure.html --- diff --git a/guides/v2.0/migration/migration-tool-upgrade.md b/guides/v2.0/migration/migration-tool-upgrade.md index 65c13b39991..cb538f10a04 100644 --- a/guides/v2.0/migration/migration-tool-upgrade.md +++ b/guides/v2.0/migration/migration-tool-upgrade.md @@ -5,7 +5,7 @@ subgroup: C_Data migration tool title: Upgrade the Data Migration Tool menu_title: Upgrade the Data Migration Tool menu_node: -menu_order: 100 +menu_order: 3 github_link: migration/migration-tool-upgrade.md --- From f5ce150fd687570e3e5122717134ec8f45a17d07 Mon Sep 17 00:00:00 2001 From: Oleksandra Marchenko Date: Thu, 11 Feb 2016 17:51:43 +0200 Subject: [PATCH 168/902] Fixes during review in Modal component --- guides/v2.0/ui-components/ui-modal.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/guides/v2.0/ui-components/ui-modal.md b/guides/v2.0/ui-components/ui-modal.md index 0107d1f17d6..c5d958998b4 100644 --- a/guides/v2.0/ui-components/ui-modal.md +++ b/guides/v2.0/ui-components/ui-modal.md @@ -107,15 +107,14 @@ Except the general configuration options, similar for most of the UI components, type The type of the modal window. Can be one of the following: -slide, popup or custom +slide or popup Set as follows:
     <item name="options" xsi:type="array">
    -    <item name="type" xsi:type="string">%slide|popup|custom%</item>
    +    <item name="type" xsi:type="string">%slide|popup%</item>
     </item>
     
    -

    What is custom?

    String Optional From daef05ba21a84c18f87dfe67458d8662a97e22f6 Mon Sep 17 00:00:00 2001 From: Oleksandra Marchenko Date: Thu, 11 Feb 2016 17:57:18 +0200 Subject: [PATCH 169/902] Minor fix in UI components client side --- guides/v2.0/ui-components/ui_components_js.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/guides/v2.0/ui-components/ui_components_js.md b/guides/v2.0/ui-components/ui_components_js.md index 4cec21b21e9..0cac5e1bf46 100644 --- a/guides/v2.0/ui-components/ui_components_js.md +++ b/guides/v2.0/ui-components/ui_components_js.md @@ -61,7 +61,7 @@ The `.html` template of the bookmarks component is [Magento/Ui/view/base/web/tem - children: is a general name for the nested components of a certain component. Children can be specified in the `.xml` configuration of the parent component (all nodes except `` and `` are considered children) and in the Knockout JS templates: children are the keys of the `elems` property. - `name`: the name of the component specified in the `.xml` configuration file of the parent UI component. In the run-time in a browser this value is transformed to a complex string. This string represents hierarchy of components in the run-time. -For example, (`app/code/Magento/Cms/view/adminhtml/ui_component/cms_block_listing.xml:57`)[{{site.mage2000url}}app/code/Magento/Cms/view/adminhtml/ui_component/cms_block_listing.xml#L57]: +For example, [`app/code/Magento/Cms/view/adminhtml/ui_component/cms_block_listing.xml:57`]({{site.mage2000url}}app/code/Magento/Cms/view/adminhtml/ui_component/cms_block_listing.xml#L57): {%highlight xml%} @@ -71,9 +71,9 @@ In the run-time `columns_controls` is transformed to the following string: `cms_ This string is constructed from the following values: - - `cms_block_listing.cms_block_listing`: - the full name of the root component. + - `cms_block_listing.cms_block_listing`: the full name of the root component. - `listing_top`: the value of the `name` attribute of the parent `` component. - - `columns_controls` - the value of the `name` attribute of the component itself. + - `columns_controls`: the value of the `name` attribute of the component itself. ## UI Components' properties used for linking {#comp_link} From 7f840c7d4760c64352b7b5c1a73dea405578fe2b Mon Sep 17 00:00:00 2001 From: Oleksandra Marchenko Date: Thu, 11 Feb 2016 18:16:51 +0200 Subject: [PATCH 170/902] Updated the UI Modal topic --- guides/v2.0/ui-components/ui-modal.md | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/guides/v2.0/ui-components/ui-modal.md b/guides/v2.0/ui-components/ui-modal.md index c5d958998b4..8c15e041c72 100644 --- a/guides/v2.0/ui-components/ui-modal.md +++ b/guides/v2.0/ui-components/ui-modal.md @@ -268,9 +268,11 @@ The following sample is an example of the configuration for a simple modal windo ## Public API (JS) -- `openModal()`: opens the modal window +- `actionCancel()`: returns all modal's child components to the state they had on modal open and closes the modal window. +- `actionDone()`: validates the changes in the modal's child components and, if valid, closes the modal. - `closeModal()`: closes the modal window -- `toggleModal()`: toggles the modal window state (open/close) +- `openModal()`: opens the modal window - `setPrevValues(elem)`: returns all `elem`'s child components to the state they had on modal open -- `actionCancel()`: returns all modal's child components to the state they had on modal open and closes the modal window. -- `actionDone()`: validates the changes in the modal's child components and, if valid, closes the modal. \ No newline at end of file +- `setTitle()` - sets modal title +- `setSubTitle()` - sets modal sub title +- `toggleModal()`: toggles the modal window state (open/close) \ No newline at end of file From c7ad5109dd912de996aad887d8f5e709177148ca Mon Sep 17 00:00:00 2001 From: Dmitry Shevtsov Date: Thu, 11 Feb 2016 20:41:41 +0200 Subject: [PATCH 171/902] MAGEDOC-2409: [MTF] 'Testing Approach' Chapter - fixture creation added - test case creation started --- guides/v2.0/mtf/mtf_test-approach.md | 425 ++++++++++++++++++++++++--- 1 file changed, 389 insertions(+), 36 deletions(-) diff --git a/guides/v2.0/mtf/mtf_test-approach.md b/guides/v2.0/mtf/mtf_test-approach.md index 853769d1e5c..e81bb6b9254 100644 --- a/guides/v2.0/mtf/mtf_test-approach.md +++ b/guides/v2.0/mtf/mtf_test-approach.md @@ -3,7 +3,7 @@ layout: default group: mtf-guide subgroup: 40_Approach title: Test Approach in the Magento Testing Framework -menu_title: TEST APPROACH +menu_title: TESTING TUTORIAL menu_node: parent github_link: mtf/mtf_test-approach.md --- @@ -80,69 +80,415 @@ New tests must be stored in corresponding modules `/dev/tests/function Each test consists of four main components: test object, test data, test flow, test assertions. -#### Test object +#### Test object {#test-object} Test object is an object that you are going to test. All test actions will be performed under this object. Test object is represented as a [fixture][]. The fixture defines properties of an object. -For example, in [CreateSimpleProductEntityTest][] the `\Magento\Catalog\Test\Fixture\CatalogProductSimple` is a test object. - -#### Test data +#### Test data {#test-data} Test data are data for the test and data for preconditions - Data for a test are stored in [data set][] - Preconditions include sample data that are stored in a [fixture repository][] and sample test entity that can be created by a [handler][]. -#### Test flow +#### Test flow {#test-flow} -#### Test assertions +Test flow is a set of test steps that you want to perform under the test object to check required functionality. Test steps are declared in a [test case][]. Each test step contains actions on a [page][]. Each action is managed by a corresponding method declared in a [block][]. -These components are discussed in the rest of this topic. To demonstrate usage of these components in the test creation process we will create step-by-step a new test . Example test will create a new simple product. This test already exists in functional tests directory, so you can track processes of its creation. +#### Test assertions {#test-assertions} +Test assertions are represented in [constraints][]. -To create the test entity you must fill a product creation form with data from a data set. To do it correctly you need fixture for simple product entity. Learn more about Fixture. +To create the test entity you must fill a product creation form with data from a data set. To do it correctly you need a fixture for the simple product entity. Learn more about Fixture. Связать в рамках одного теста. Создаваемый продукт можно назначить существующей категории или создать новую категорию для этого продукта. Чтобы создать новую категорию нужен хендлер. Often you need to create some entity in precondition of your test case. To do this you need to create handler for Category creation in Handler directory of your module. Learn more about Handler. -#### Test flow - -Test flow is declared in a test case as test steps and preconditions. - -* [Create a test case file][] -* [Create a data set file][] with all variations for your test. A data set XML file should have the same name as your test case. +## Let's create a new test {#create-new-test} -UI manipulation methods are contained in blocks. A page is composed from blocks. +To demonstrate usage of test components from previous sections in the test creation process we will create a new test step-by-step. Before creating automated test, try to pass it manually. -тест степы - это действия на странице. Дальше про страницу -You need to create pages that you open. Learn about Page Creation. -All business logic (like click Save button or fill form) is stored in blocks. So you need to add blocks to your pages. Read about Block Creation. -After blocks creation you need to add them to pages and generate pages to be able to access blocks you added. -Once you have pages with blocks and fixture, you can start to develop preconditions and steps of your test case. Read about Test Case Creation. +### Test description {#description} -#### Test assertions +Create a synonym group with: -Verification assertions are managed by constraints. Проверка того что мы сделали в степах. Констрейнты используют страницы и блоки, либо те же либо другие, в зависимости от декларируемой логики проверок. +- Scope: All Store Views +- Synonyms: shoes, foot wear, men shoes, women shoes -Пример сценария для новой функциональности +### Manual testing scenario {#manual-test} -тест дизайн. понимание того что хочешь автоматизировать. +1. Log in to Admin +2. Browse to "Marketing" > "SEO & Search" > "Search Synonyms" +3. Click on the "New Synonyms Group" button +4. Enter data in the "Synonyms" field +5. Click the "Save Synonym Group" button +6. Check the newly created entity -создание фикстуры +### Automated testing scenario {#auto-test} -дата сет. прикидываю какие данные хочу проверить, +1. Log in to Admin +2. Open Search Synonym page +3. Click on the "New Synonym Group" button +4. Enter data according to a data set. +5. Click the "Save Synonym Group" button. +6. Perform assertions. -страницы и блоки для тест кейса +### Test creation {#test-creation} -тест кейс. переплетается с созданием страниц и блоков. +#### Step 1. Check the MTF configuration and environment {#check-mtf} + +[Adjust configuration][] +[Prepare environment for test run][] -страницы и блоки для ассерта +#### Step 2. Create testing object - a [fixture][] {#create-test-object} + +This step is applicable if a fixture doesn't exist in a module. + +Use a [`generateFixtureXml.php` tool][] to create a new [fixture][]. + +Enter in your terminal: + + cd /dev/tests/functional/utils + php -f generateFixtureXml.php -- --name synonym --entity search_synonyms --collection Magento\\Search\\Model\\ResourceModel\\Query\\Collection + +Probably you are curious about where we got that values from. See the following explanations. + +|Parameter|Value|Explanation +|-|-|- +|`--name`|`synonym`|It can have any name. `synonym` seems to be logical. +|`--entity`|`search_synonyms`|You can track database input when you perform a [manual test][]. A new record will be created in a table that you need. +|`--collection`|`Magento\\Search\\Model\\ResourceModel\\Query\\Collection`|Synonyms are the entities of a Magento_Search module. Collection can always be find somewhere in model resources. All slashes must be escaped, that's why we use double slash `\\`. + +A newly created fixture can be found in the `/dev/tests/functional/tests/app/Magento/Search/Test/Fixture` directory. + +![A new Synonym fixture]({{site.baseurl}}common/images/mtf_tut_fixt.png) + +The following is a code of the new Synonym fixture. + +{%highlight xml%} + + + + + + + + + + +{%endhighlight%} + +If we open a New Synonym Group page in a browser + +![New Synonym Group page]({{ site.baseurl }}common/images/mtf_tutorial_new_syn_ui.png) + +we see that `store_id` and `website_id` both are combined in the "Scope" fields. To set `store_id` and `website_id` we have to perform some more logic than just entering the data. That's why we should use a [data source][]. + +As you probably recall, the same field is present in Magento_Widget module. It means that data source has been already written and we can e-use it. + +Let's check the functional tests for the Magento_Widget module. + +![ScopeID data source alternative from Magento_Widget]({{ site.baseurl }}common/images/mtf_tutorial_storeIds-widget.png) + +It contains a `StoreIds.php` data source, that is exactly what we are looking for. It has the following code: + +{% highlight php %} + +params = $params; + if (isset($data['dataset'])) { + $dataset = explode(',', $data['dataset']); + foreach ($dataset as $store) { + /** @var Store $store */ + $store = $fixtureFactory->createByCode('store', ['dataset' => $store]); + if (!$store->hasData('store_id')) { + $store->persist(); + } + $this->stores[] = $store; + $this->data[] = $store->getName(); + } + } else { + $this->data[] = null; + } + } + + /** + * Return stores. + * + * @return Store + */ + public function getStores() + { + return $this->stores; + } +} + +{% endhighlight %} + +The difference is that it is designed for multiple stores, but we don't need that. Adding some changes we can get our data source. + +{% highlight php %} + +params = $params; + if (isset($data['dataset'])) { + $store = $fixtureFactory->createByCode('store', ['dataset' => $data['dataset']]); + if (!$store->hasData('store_id')) { + $store->persist(); + } + $this->store = $store; + $this->data = $store->getName(); + } else { + $this->data = null; + } + } + + /** + * Return store. + * + * @return Store + */ + public function getStore() + { + return $this->store; + } +} + +{% endhighlight %} + +This data source: + + 1. Creates a Store object `/dev/tests/functional/generated/Magento/Store/Test/Fixture/Store.php` with `scope_id` data from a data set that we will create later. This data from a data set is a name of repository `dataset` in `/dev/tests/functional/generated/Magento/Store/Test/Repository/Store.php`. A Store fixture to be generated is stored in a Store module `/dev/tests/functional/tests/app/Magento/Store/Test/Fixture/Store.xml` with a corresponding repository +`magento2/dev/tests/functional/tests/app/Magento/Store/Test/Repository/Store.xml`. + 2. Gets a `name` of the `store_id`. + +Now we should change the fixture. Instead of `store_id` and `website_id` we must use `scope_id` with the `Magento\Search\Test\Fixture\Synonym\ScopeId` data source class. + +{% highlight xml %} + +... ... ... + + + +... ... ... + +{% endhighlight %} + +Then, we can generate a PHP class for the fixture. Just run: + + php /dev/tests/functional/utils/generate.php + +And the new PHP class `Synonym.php` is generated in `/dev/tests/functional/generated/Magento/Search/Test/Fixture`. + +{%highlight php%} + '0', + ]; + + /** + * @var array + */ + protected $synonyms = [ + 'is_required' => '0', + ]; + + /** + * @var array + */ + protected $scope_id = [ + 'is_required' => '0', + 'source' => 'Magento\Search\Test\Fixture\Synonym\ScopeId', + ]; + + /** + * @return mixed + */ + public function getGroupId() + { + return $this->getData('group_id'); + } + + /** + * @return mixed + */ + public function getSynonyms() + { + return $this->getData('synonyms'); + } + + /** + * @return mixed + */ + public function getScopeId() + { + return $this->getData('scope_id'); + } +} + +{%endhighlight php%} + +#### Step 4. Create a [test case][] {#create-test-case} + +Now we can start creation of a test case. + +From the [test case topic][] we know about structure, location and name of the test case. +So, let it be `/dev/tests/functional/tests/app/Magento/Search/Test/TestCase/CreateSynonymEntityTest.xml`. And we know that we must open a Search Synonym Index page and a new New Synonym Group page during the test flow. It means that we should initialize these pages in the test using the `__inject()` method of the `Magento\Mtf\TestCase\Injectable` class. Also we will definitely use the fixture from the previous step. + +{% highlight php %} + +searchSynonymsIndex = $searchSynonymsIndex; + $this->searchSynonymsNew = $searchSynonymsNew; + } + + /** + * @param Synonym $synonym + * @return void + */ + public function test(Synonym $synonym) + { + // Steps + } + +} + +{% endhighlight %} -ассерты. -ран. дебаг. отладка. фикс -#### Example @@ -158,12 +504,19 @@ Verification assertions are managed by constraints. Проверка того ч [data set]: {{site.gdeurl}}mtf/mtf_entities/mtf_dataset.html [fixture repository]: {{site.gdeurl}}mtf/mtf_entities/mtf_fixture-repo.html [handler]: {{site.gdeurl}}mtf/mtf_entities/mtf_handler.html +[test case]: {{site.gdeurl}}mtf/mtf_entities/mtf_testcase.html +[test case topic]: {{site.gdeurl}}mtf/mtf_entities/mtf_testcase.html +[block]: {{site.gdeurl}}mtf/mtf_entities/mtf_block.html +[page]: {{site.gdeurl}}mtf/mtf_entities/mtf_page.html +[constraints]: {{site.gdeurl}}mtf/mtf_entities/mtf_constraint.html +[data source]: {{site.gdeurl}}mtf/mtf_entities/mtf_fixture.html#mtf_fixture_source -[CreateSimpleProductEntityTest]: {{mage2000url}}dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/Product +[Adjust configuration]: http://devdocs.magento.com/guides/v2.0/mtf/mtf_quickstart/mtf_quickstart_config.html +[Prepare environment for test run]: http://devdocs.magento.com/guides/v2.0/mtf/mtf_quickstart/mtf_quickstart_environmemt.html +[`generateFixtureXml.php` tool]: http://devdocs.magento.com/guides/v2.0/mtf/mtf_entities/mtf_fixture.html#mtf_fixture_create -[Create a test case file]: {{site.gdeurl}}mtf/mtf_entities/mtf_testcase.html#how-to-create -[Create a data set file]: {{site.gdeurl}}mtf/mtf_entities/mtf_dataset.html +[manual test]: #manual-test From dd20bd686f9915bc7d58313c95c85fb1676b6803 Mon Sep 17 00:00:00 2001 From: stevjohnson Date: Thu, 11 Feb 2016 12:58:18 -0600 Subject: [PATCH 172/902] Reorganize and redirect build directory --- .../{ => build}/XSD-XML-validation.md | 5 +++-- guides/v2.0/extension-dev-guide/{ => build}/build.md | 4 ++-- .../{ => build}/component-registration.md | 8 +++++--- .../{ => build}/composer-integration.md | 8 +++++--- .../extension-dev-guide/{ => build}/create_component.md | 9 +++++---- .../extension-dev-guide/{ => build}/enable-module.md | 5 +++-- .../{ => build}/module-file-structure.md | 3 ++- .../extension-dev-guide/{ => build}/module-load-order.md | 5 +++-- .../{ => build}/required-configuration-files.md | 3 ++- guides/v2.0/extension-dev-guide/dev-modtypes.md | 2 +- guides/v2.0/extension-dev-guide/dev-summary.md | 4 ++-- guides/v2.0/extension-dev-guide/developers_roadmap.md | 6 +++--- guides/v2.0/extension-dev-guide/intro-composer-gloss.md | 2 +- guides/v2.0/extension-dev-guide/prepare.md | 2 +- .../v2.0/extension-dev-guide/validate/validate-urls.txt | 3 +++ guides/v2.0/howdoi/php/php_clear-dirs.md | 2 +- 16 files changed, 42 insertions(+), 29 deletions(-) rename guides/v2.0/extension-dev-guide/{ => build}/XSD-XML-validation.md (94%) rename guides/v2.0/extension-dev-guide/{ => build}/build.md (91%) rename guides/v2.0/extension-dev-guide/{ => build}/component-registration.md (92%) rename guides/v2.0/extension-dev-guide/{ => build}/composer-integration.md (96%) rename guides/v2.0/extension-dev-guide/{ => build}/create_component.md (93%) rename guides/v2.0/extension-dev-guide/{ => build}/enable-module.md (92%) rename guides/v2.0/extension-dev-guide/{ => build}/module-file-structure.md (97%) rename guides/v2.0/extension-dev-guide/{ => build}/module-load-order.md (88%) rename guides/v2.0/extension-dev-guide/{ => build}/required-configuration-files.md (96%) create mode 100644 guides/v2.0/extension-dev-guide/validate/validate-urls.txt diff --git a/guides/v2.0/extension-dev-guide/XSD-XML-validation.md b/guides/v2.0/extension-dev-guide/build/XSD-XML-validation.md similarity index 94% rename from guides/v2.0/extension-dev-guide/XSD-XML-validation.md rename to guides/v2.0/extension-dev-guide/build/XSD-XML-validation.md index 25bfb8da478..ef6df603408 100644 --- a/guides/v2.0/extension-dev-guide/XSD-XML-validation.md +++ b/guides/v2.0/extension-dev-guide/build/XSD-XML-validation.md @@ -5,9 +5,10 @@ subgroup: 03_Build title: URN schema validation menu_title: URN schema validation menu_order: 6 -github_link: extension-dev-guide/XSD-XML-validation.md - +github_link: extension-dev-guide/build/XSD-XML-validation.md +redirect_from: /guides/v2.0/extension-dev-guide/XSD-XML-validation.html --- + ##{{page.menu_title}} diff --git a/guides/v2.0/extension-dev-guide/build.md b/guides/v2.0/extension-dev-guide/build/build.md similarity index 91% rename from guides/v2.0/extension-dev-guide/build.md rename to guides/v2.0/extension-dev-guide/build/build.md index 925564b7946..6ff89227369 100644 --- a/guides/v2.0/extension-dev-guide/build.md +++ b/guides/v2.0/extension-dev-guide/build/build.md @@ -6,8 +6,8 @@ title: Build menu_title: Build menu_order: 1 menu_node: parent -github_link: extension-dev-guide/build.md - +github_link: extension-dev-guide/build/build.md +redirect_from: /guides/v2.0/extension-dev-guide/build.html --- ##{{page.menu_title}} diff --git a/guides/v2.0/extension-dev-guide/component-registration.md b/guides/v2.0/extension-dev-guide/build/component-registration.md similarity index 92% rename from guides/v2.0/extension-dev-guide/component-registration.md rename to guides/v2.0/extension-dev-guide/build/component-registration.md index e3de15fe214..9566f46ca2d 100644 --- a/guides/v2.0/extension-dev-guide/component-registration.md +++ b/guides/v2.0/extension-dev-guide/build/component-registration.md @@ -5,10 +5,12 @@ subgroup: 03_Build title: Register your component menu_title: Register your component menu_order: 4 -github_link: extension-dev-guide/component-registration.md -redirect_from: /guides/v1.0/extension-dev-guide/component-registration.html - +github_link: extension-dev-guide/build/component-registration.md +redirect_from: + - /guides/v1.0/extension-dev-guide/build/component-registration.html + - /guides/v2.0/extension-dev-guide/component-registration.html --- + ##{{page.menu_title}} diff --git a/guides/v2.0/extension-dev-guide/composer-integration.md b/guides/v2.0/extension-dev-guide/build/composer-integration.md similarity index 96% rename from guides/v2.0/extension-dev-guide/composer-integration.md rename to guides/v2.0/extension-dev-guide/build/composer-integration.md index e8a1ad2ae4c..b6128d2bec0 100644 --- a/guides/v2.0/extension-dev-guide/composer-integration.md +++ b/guides/v2.0/extension-dev-guide/build/composer-integration.md @@ -5,10 +5,12 @@ subgroup: 03_Build title: Create composer.json menu_title: Create composer.json menu_order: 2 -github_link: extension-dev-guide/composer-integration.md -redirect_from: /guides/v1.0/extension-dev-guide/composer-integration.html - +github_link: extension-dev-guide/build/composer-integration.md +redirect_from: + - /guides/v1.0/extension-dev-guide/composer-integration.html + - /guides/v2.0/extension-dev-guide/composer-integration.html --- + ##{{page.menu_title}} #### Contents diff --git a/guides/v2.0/extension-dev-guide/create_component.md b/guides/v2.0/extension-dev-guide/build/create_component.md similarity index 93% rename from guides/v2.0/extension-dev-guide/create_component.md rename to guides/v2.0/extension-dev-guide/build/create_component.md index debe1c8765b..bc71668b113 100644 --- a/guides/v2.0/extension-dev-guide/create_component.md +++ b/guides/v2.0/extension-dev-guide/build/create_component.md @@ -5,10 +5,11 @@ subgroup: 03_Build title: Name your component menu_title: Name your component menu_order: 7 -github_link: extension-dev-guide/create_component.md +github_link: extension-dev-guide/build/create_component.md redirect_from: - /guides/v1.0/extension-dev-guide/create_module.html - /guides/v2.0/extension-dev-guide/create_module.html + - /guides/v2.0/extension-dev-guide/create_component.html --- ##{{page.menu_title}} @@ -24,9 +25,9 @@ You give a name to your component in its `composer.json` and `module.xml` files. ## Prerequisites {#prereq} Before you continue, make sure you have completed all of the following tasks: -* Created a [file structure]({{ site.gdeurl }}extension-dev-guide/module-file-structure.html) -* Created the the [configuration files]({{ site.gdeurl }}extension-dev-guide/required-configuration-files.html) you'll need -* [Registered]({{ site.gdeurl }}extension-dev-guide/component-registration.html) your component +* Created a [file structure]({{ site.gdeurl }}extension-dev-guide/build/module-file-structure.html) +* Created the the [configuration files]({{ site.gdeurl }}extension-dev-guide/build/required-configuration-files.html) you'll need +* [Registered]({{ site.gdeurl }}extension-dev-guide/build/component-registration.html) your component ## Add the component's `module.xml` file {#module-xml} Declare the component itself by adding a module.xml file in the `/etc` folder of your component. diff --git a/guides/v2.0/extension-dev-guide/enable-module.md b/guides/v2.0/extension-dev-guide/build/enable-module.md similarity index 92% rename from guides/v2.0/extension-dev-guide/enable-module.md rename to guides/v2.0/extension-dev-guide/build/enable-module.md index 8dee14f9649..d4b7a00ddad 100644 --- a/guides/v2.0/extension-dev-guide/enable-module.md +++ b/guides/v2.0/extension-dev-guide/build/enable-module.md @@ -5,9 +5,10 @@ subgroup: 03_Build title: Enable your component menu_title: Enable your component menu_order: 9 -github_link: extension-dev-guide/enable-module.md - +github_link: extension-dev-guide/build/enable-module.md +redirect_from: /guides/v2.0/extension-dev-guide/enable-module.html --- + ##{{page.menu_title}} After you have built the component and are ready to enable it in your Magento environment, do the following: diff --git a/guides/v2.0/extension-dev-guide/module-file-structure.md b/guides/v2.0/extension-dev-guide/build/module-file-structure.md similarity index 97% rename from guides/v2.0/extension-dev-guide/module-file-structure.md rename to guides/v2.0/extension-dev-guide/build/module-file-structure.md index 4567f7d2a4d..04209e95cb7 100644 --- a/guides/v2.0/extension-dev-guide/module-file-structure.md +++ b/guides/v2.0/extension-dev-guide/build/module-file-structure.md @@ -5,7 +5,8 @@ subgroup: 03_Build title: Create your component file structure menu_title: Create your component file structure menu_order: 3 -github_link: extension-dev-guide/module-file-structure.md +github_link: extension-dev-guide/build/module-file-structure.md +redirect_from: /guides/v2.0/extension-dev-guide/module-file-structure.html --- ##{{page.menu_title}} diff --git a/guides/v2.0/extension-dev-guide/module-load-order.md b/guides/v2.0/extension-dev-guide/build/module-load-order.md similarity index 88% rename from guides/v2.0/extension-dev-guide/module-load-order.md rename to guides/v2.0/extension-dev-guide/build/module-load-order.md index 93bb20a012b..941184f1917 100644 --- a/guides/v2.0/extension-dev-guide/module-load-order.md +++ b/guides/v2.0/extension-dev-guide/build/module-load-order.md @@ -5,13 +5,14 @@ subgroup: 03_Build title: Component load order menu_title: Component load order menu_order: 8 -github_link: extension-dev-guide/module-load-order.md +github_link: extension-dev-guide/build/module-load-order.md +redirect_from: /guides/v2.0/extension-dev-guide/module-load-order.html --- ##{{page.menu_title}} -You may need to specify your component's dependency on other components or files from other components using your component's composer.json. Further, you can specify a load order in your component's `module.xml` file using the `` tag to ensure that needed files from other components are already loaded when your component loads. +You may need to specify your component's dependency on other components or files from other components using your component's composer.json. Further, you can specify a load order in your component's `module.xml` file using the `` tag to ensure that needed files from other components are already loaded when your component loads. `` declares the list of components that must be loaded before the current component is loaded. It's used for loading different kind of files: configuration files, view files (including CSS, LESS, and template files), or setup classes. Note that `` does not affect the loading of regular classes (non-setup classes). *Setup* classes are classes in the component that create or update database schema or data. diff --git a/guides/v2.0/extension-dev-guide/required-configuration-files.md b/guides/v2.0/extension-dev-guide/build/required-configuration-files.md similarity index 96% rename from guides/v2.0/extension-dev-guide/required-configuration-files.md rename to guides/v2.0/extension-dev-guide/build/required-configuration-files.md index b04af5569b2..e0923955e2a 100644 --- a/guides/v2.0/extension-dev-guide/required-configuration-files.md +++ b/guides/v2.0/extension-dev-guide/build/required-configuration-files.md @@ -5,10 +5,11 @@ subgroup: 03_Build title: Define your configuration files menu_title: Define your configuration files menu_order: 3 -github_link: extension-dev-guide/required-configuration-files.md +github_link: extension-dev-guide/build/required-configuration-files.md redirect_from: - /guides/v1.0/extension-dev-guide/template_create_req_config_files.html - /guides/v2.0/extension-dev-guide/template_create_req_config_files.html + - /guides/v2.0/extension-dev-guide/required-configuration-files.html --- ##{{page.menu_title}} diff --git a/guides/v2.0/extension-dev-guide/dev-modtypes.md b/guides/v2.0/extension-dev-guide/dev-modtypes.md index e56e7fef845..9db70ed3aa1 100644 --- a/guides/v2.0/extension-dev-guide/dev-modtypes.md +++ b/guides/v2.0/extension-dev-guide/dev-modtypes.md @@ -19,7 +19,7 @@ redirect_from: /guides/v2.0/mktpl-quickstart/dev-modtypes.html {% include php-dev/composer-types.md %}
    -

    Each component type has a different directory structure and different contents for composer.json.

    +

    Each component type has a different directory structure and different contents for composer.json.

    ## Versioning {#component-version} diff --git a/guides/v2.0/extension-dev-guide/dev-summary.md b/guides/v2.0/extension-dev-guide/dev-summary.md index 34d15db9cc0..7b989e1db63 100644 --- a/guides/v2.0/extension-dev-guide/dev-summary.md +++ b/guides/v2.0/extension-dev-guide/dev-summary.md @@ -15,8 +15,8 @@ redirect_from: ##{{page.menu_title}} To develop your component, use the following steps: -1. Learn about using Composer with your component. -2. Build your component +1. Learn about using Composer with your component. +2. Build your component 3. Package a component 4. Validate your component 4. Upload the components to the Magento Marketplace. diff --git a/guides/v2.0/extension-dev-guide/developers_roadmap.md b/guides/v2.0/extension-dev-guide/developers_roadmap.md index 4095bd29131..bb0b01a6d69 100644 --- a/guides/v2.0/extension-dev-guide/developers_roadmap.md +++ b/guides/v2.0/extension-dev-guide/developers_roadmap.md @@ -20,11 +20,11 @@ Key points: * Minimum required elements: - * Declare component dependencies in `composer.json`. - * Register the component using `registration.php`. + * Declare component dependencies in `composer.json`. + * Register the component using `registration.php`. * Component-specific XML definition files: - * Modules: `module.xml` + * Modules: `module.xml` * Themes: `theme.xml` * Language packages: `language.xml` * Distribute your component: diff --git a/guides/v2.0/extension-dev-guide/intro-composer-gloss.md b/guides/v2.0/extension-dev-guide/intro-composer-gloss.md index b2f44be26a2..e0a07275e06 100644 --- a/guides/v2.0/extension-dev-guide/intro-composer-gloss.md +++ b/guides/v2.0/extension-dev-guide/intro-composer-gloss.md @@ -53,7 +53,7 @@ Merchants do not need to understand that, under the covers, some packages are sh #### For more information * metapackages -* component types in composer.json. +* component types in composer.json. ### Component Manager {#gloss-compman} Merchants use the Component Manager (part of the Magento Admin) to do any of the following: diff --git a/guides/v2.0/extension-dev-guide/prepare.md b/guides/v2.0/extension-dev-guide/prepare.md index c0f538b8377..339130cf165 100644 --- a/guides/v2.0/extension-dev-guide/prepare.md +++ b/guides/v2.0/extension-dev-guide/prepare.md @@ -16,5 +16,5 @@ Before you start building Magento modules, we suggest you use the following chec * [Install Magento and any required dependencies]({{ site.gdeurl }}/install-gde/bk-install-guide.html) * [Set Magento for developer mode]({{ site.gdeurl }}config-guide/cli/config-cli-subcommands-mode.html#config-mode) -* Decide which type of component you're creating and how to set it up in `composer.json`. +* Decide which type of component you're creating and how to set it up in `composer.json`. * [Understand the component file structure]({{ site.gdeurl }}extension-dev-guide/prepare_file-str.html) diff --git a/guides/v2.0/extension-dev-guide/validate/validate-urls.txt b/guides/v2.0/extension-dev-guide/validate/validate-urls.txt new file mode 100644 index 00000000000..e0553c81348 --- /dev/null +++ b/guides/v2.0/extension-dev-guide/validate/validate-urls.txt @@ -0,0 +1,3 @@ +extension-dev-guide/validate.html + howdoi\php\php_devs.md +extension-dev-guide/test-module.html (self) \ No newline at end of file diff --git a/guides/v2.0/howdoi/php/php_clear-dirs.md b/guides/v2.0/howdoi/php/php_clear-dirs.md index f7533662477..43a5f66159e 100644 --- a/guides/v2.0/howdoi/php/php_clear-dirs.md +++ b/guides/v2.0/howdoi/php/php_clear-dirs.md @@ -1,7 +1,7 @@ --- layout: default group: extension-dev-guide -subgroup: 6_Module Development +subgroup: 99_Module Development title: Clear directories during development menu_title: Clear directories during development menu_node: From 85dfde533c4fd8fdd9a7a5756ba5ff1fb00b9c26 Mon Sep 17 00:00:00 2001 From: stevjohnson Date: Thu, 11 Feb 2016 13:41:24 -0600 Subject: [PATCH 173/902] Reorganize and redirect CLI commands --- guides/v2.0/extension-dev-guide/{ => cli-cmds}/cli-add.md | 7 ++++--- .../v2.0/extension-dev-guide/{ => cli-cmds}/cli-howto.md | 5 +++-- .../{ => cli-cmds}/cli-naming-guidelines.md | 5 +++-- 3 files changed, 10 insertions(+), 7 deletions(-) rename guides/v2.0/extension-dev-guide/{ => cli-cmds}/cli-add.md (55%) rename guides/v2.0/extension-dev-guide/{ => cli-cmds}/cli-howto.md (91%) rename guides/v2.0/extension-dev-guide/{ => cli-cmds}/cli-naming-guidelines.md (96%) diff --git a/guides/v2.0/extension-dev-guide/cli-add.md b/guides/v2.0/extension-dev-guide/cli-cmds/cli-add.md similarity index 55% rename from guides/v2.0/extension-dev-guide/cli-add.md rename to guides/v2.0/extension-dev-guide/cli-cmds/cli-add.md index a0fece6700e..9764ee83ceb 100644 --- a/guides/v2.0/extension-dev-guide/cli-add.md +++ b/guides/v2.0/extension-dev-guide/cli-cmds/cli-add.md @@ -6,11 +6,12 @@ title: Add CLI commands menu_title: Add CLI commands menu_node: parent menu_order: 1 -github_link: extension-dev-guide/cli-add.md +github_link: extension-dev-guide/cli-cmds/cli-add.md +redirect_from: /guides/v2.0/extension-dev-guide/cli-add.html --- You module can optionally use Magento 2's Symfony-based command-line interface (CLI) to provide commands for users to interact with. To use the CLI, see the following topics: -* Command naming guidelines -* How to add CLI commands +* Command naming guidelines +* How to add CLI commands diff --git a/guides/v2.0/extension-dev-guide/cli-howto.md b/guides/v2.0/extension-dev-guide/cli-cmds/cli-howto.md similarity index 91% rename from guides/v2.0/extension-dev-guide/cli-howto.md rename to guides/v2.0/extension-dev-guide/cli-cmds/cli-howto.md index b7b69701394..dd055ea2ac9 100644 --- a/guides/v2.0/extension-dev-guide/cli-howto.md +++ b/guides/v2.0/extension-dev-guide/cli-cmds/cli-howto.md @@ -6,7 +6,8 @@ title: How to add CLI commands menu_title: How to add CLI commands menu_node: menu_order: 3 -github_link: extension-dev-guide/cli-howto.md +github_link: extension-dev-guide/cli-cmds/cli-howto.md +redirect_from: /guides/v2.0/extension-dev-guide/cli-howto.html --- #### Contents @@ -49,5 +50,5 @@ Following is a summary of the process: To be added at a later time. #### Related topic -Command naming guidelines +Command naming guidelines diff --git a/guides/v2.0/extension-dev-guide/cli-naming-guidelines.md b/guides/v2.0/extension-dev-guide/cli-cmds/cli-naming-guidelines.md similarity index 96% rename from guides/v2.0/extension-dev-guide/cli-naming-guidelines.md rename to guides/v2.0/extension-dev-guide/cli-cmds/cli-naming-guidelines.md index 4098e8e9eb7..65b1c500de8 100644 --- a/guides/v2.0/extension-dev-guide/cli-naming-guidelines.md +++ b/guides/v2.0/extension-dev-guide/cli-cmds/cli-naming-guidelines.md @@ -6,7 +6,8 @@ title: Command naming guidelines menu_title: Command naming guidelines menu_node: menu_order: 2 -github_link: extension-dev-guide/cli-naming-guidelines.md +github_link: extension-dev-guide/cli-cmds/cli-naming-guidelines.md +redirect_from: /guides/v2.0/extension-dev-guide/cli-naming-guidelines.html --- @@ -514,9 +575,16 @@ class CreateSynonymEntityTest extends Injectable [Adjust configuration]: http://devdocs.magento.com/guides/v2.0/mtf/mtf_quickstart/mtf_quickstart_config.html [Prepare environment for test run]: http://devdocs.magento.com/guides/v2.0/mtf/mtf_quickstart/mtf_quickstart_environmemt.html -[`generateFixtureXml.php` tool]: http://devdocs.magento.com/guides/v2.0/mtf/mtf_entities/mtf_fixture.html#mtf_fixture_create +[`generateFixtureXml.php` tool]: {{site.gdeurl}}mtf/mtf_entities/mtf_fixture.html#mtf_fixture_create +[set data to a fixture field]: {{site.gdeurl}}mtf/mtf_entities/mtf_dataset.html#fixture_field +[set data to a fixture field from a repository]: {{site.gdeurl}}mtf/mtf_entities/mtf_dataset.html#fixture_field_repository +[`%isolation%` placeholder]: {{site.gdeurl}}mtf/mtf_entities/mtf_fixture-repo.html#mtf_repo_isolation [manual test]: #manual-test +[test description]: #example-test-description + + + From d4437bce701182d8edd9dd64cb861852295c5113 Mon Sep 17 00:00:00 2001 From: stevjohnson Date: Sat, 13 Feb 2016 09:29:16 -0600 Subject: [PATCH 185/902] Fix errors in sample data topic --- .../install/sampledata/sample-data-after.md | 2 +- .../install/sampledata/sample-data-clone.md | 2 +- .../sampledata/sample-data-composer.md | 30 +++++-------------- .../varnish/config-varnish-final.md | 2 +- .../config-guide/varnish/config-varnish.md | 2 +- 5 files changed, 11 insertions(+), 27 deletions(-) diff --git a/_includes/install/sampledata/sample-data-after.md b/_includes/install/sampledata/sample-data-after.md index 584f2d263d2..c651b0959cb 100644 --- a/_includes/install/sampledata/sample-data-after.md +++ b/_includes/install/sampledata/sample-data-after.md @@ -1,6 +1,6 @@

    Complete the sample data installation

    -After you install the sample data, log in to your Magento server as, or switch to, the Magento file system owner and enter the following command: +After you download the sample data packages, log in to your Magento server as, or switch to, the Magento file system owner and enter the following command: php /bin/magento setup:upgrade diff --git a/_includes/install/sampledata/sample-data-clone.md b/_includes/install/sampledata/sample-data-clone.md index 54536a0f84b..92c003294e5 100644 --- a/_includes/install/sampledata/sample-data-clone.md +++ b/_includes/install/sampledata/sample-data-clone.md @@ -8,7 +8,7 @@ If you're not a contributing developer, choose one of the other options displaye Contributing developers can use this method of installing sample data *only* if all of the following are true: * You use Magento CE -* You cloned the Magento 2 `develop` branch. +* You cloned the Magento 2 repository.

    You can use sample data with either the develop branch (more current) or a released branch (such as 2.0 or 2.0.1 (more stable)). We recommend you use a released branch because it's more stable. If you're contributing code to the Magento 2 repository and you need the most recent code, use the develop branch.

    diff --git a/_includes/install/sampledata/sample-data-composer.md b/_includes/install/sampledata/sample-data-composer.md index a7330d76a16..68a69e95a42 100644 --- a/_includes/install/sampledata/sample-data-composer.md +++ b/_includes/install/sampledata/sample-data-composer.md @@ -10,29 +10,6 @@ You can use this method of getting sample data if you used Magento Community Edi If you're a contributing developer, see one of the other topics on the left side of this page. -See the following sections: - -* [Sample data prerequisites](#sample-data-rel-prereq) -* [Install released version sample data](#sample-data-rel-inst) - -### Sample data prerequisites {#sample-data-rel-prereq} -Before you install sample data, you must update Magento's `composer.json` to get components from `https://repo.magento.com`. - -1. Log in to the Magento server as, or switch to, the Magento file system owner. -4. Clone the Magento 2 GitHub repository. - -5. Update dependencies by running `composer install`. - -2. Change to your Magento installation directory. - - For example, `/var/www/html/magento2` -3. Require the `https://repo.magento.com` repository, which contains the sample data code: - - composer config repositories.magento composer https://repo.magento.com - -4. Continue with the next section. - -### Install released version sample data {#sample-data-rel-inst} To install sample data using the command line, enter the following command as the Magento file system owner: php /bin/magento sampledata:deploy @@ -51,6 +28,13 @@ The following error might display: If the error displays, change to your Magento installation directory and run `composer update`, which will prompt you for your authentication keys. +### Install the Magento software {#magento-install} +After downloading sample data packages, install the Magento software in any of the following ways: + +* Command line +* Setup Wizard + + @@ -563,14 +757,20 @@ OK, let's see the data set with data. [fixture]: {{site.gdeurl}}mtf/mtf_entities/mtf_fixture.html [data set]: {{site.gdeurl}}mtf/mtf_entities/mtf_dataset.html +[data source]: {{site.gdeurl}}mtf/mtf_entities/mtf_fixture.html#mtf_fixture_source [fixture repository]: {{site.gdeurl}}mtf/mtf_entities/mtf_fixture-repo.html [handler]: {{site.gdeurl}}mtf/mtf_entities/mtf_handler.html [test case]: {{site.gdeurl}}mtf/mtf_entities/mtf_testcase.html [test case topic]: {{site.gdeurl}}mtf/mtf_entities/mtf_testcase.html [block]: {{site.gdeurl}}mtf/mtf_entities/mtf_block.html +[block mapping]: {site.gdeurl}}mtf/mtf_entities/mtf_block.html#mtf_block_mapping +[nodes description table]: {site.gdeurl}}mtf/mtf_entities/mtf_block.html#mtf_block_form_xml_nodes [page]: {{site.gdeurl}}mtf/mtf_entities/mtf_page.html +[pages]: {{site.gdeurl}}mtf/mtf_entities/mtf_page.html +[Page topic]: {{site.gdeurl}}mtf/mtf_entities/mtf_page.html [constraints]: {{site.gdeurl}}mtf/mtf_entities/mtf_constraint.html -[data source]: {{site.gdeurl}}mtf/mtf_entities/mtf_fixture.html#mtf_fixture_source +[custom typified element]: {{site.gdeurl}}mtf/mtf_entities/mtf_typified-element.html#magento_class + [Adjust configuration]: http://devdocs.magento.com/guides/v2.0/mtf/mtf_quickstart/mtf_quickstart_config.html [Prepare environment for test run]: http://devdocs.magento.com/guides/v2.0/mtf/mtf_quickstart/mtf_quickstart_environmemt.html @@ -582,11 +782,14 @@ OK, let's see the data set with data. [manual test]: #manual-test [test description]: #example-test-description +[Step 4]: #create-init-test-case +[test description]: #auto-test - - - +[`Magento\Backend\Test\Block\FormPageActions`]: {{site.mage2000url}}dev/tests/functional/tests/app/Magento/Backend/Test/Block/GridPageActions.php +[`Magento\Mtf\Block\Form`]: https://github.com/magento/mtf/blob/develop/Magento/Mtf/Block/Form.php +[`\Magento\Mtf\Client\Element\SelectstoreElement`]: {{site.mage2000url}}dev/tests/functional/lib/Magento/Mtf/Client/Element/SelectstoreElement.php +[`Magento\Backend\Test\Block\FormPageActions`]: {{site.mage2000url}}dev/tests/functional/tests/app/Magento/Backend/Test/Block/FormPageActions.php *[MTF]: Magento Testing Framework From 3ee7dd8ee3e21aeeeeb12d8e198d26355cf8d708 Mon Sep 17 00:00:00 2001 From: stevjohnson Date: Mon, 15 Feb 2016 17:15:03 -0600 Subject: [PATCH 188/902] Fix broken links --- .../archi_perspectives/components/modules/mod_anatomy.md | 2 +- .../archi_perspectives/components/modules/mod_and_areas.md | 2 +- .../archi_perspectives/components/modules/mod_conventions.md | 2 +- .../archi_perspectives/components/modules/mod_depend.md | 2 +- .../archi_perspectives/components/modules/mod_depend_types.md | 2 +- .../archi_perspectives/components/modules/mod_intro.md | 2 +- .../archi_perspectives/components/modules/mod_relationships.md | 2 +- .../archi_perspectives/components/modules/modules.md | 2 +- guides/v2.0/migration/migration-tool-configure.md | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/guides/v2.0/architecture/archi_perspectives/components/modules/mod_anatomy.md b/guides/v2.0/architecture/archi_perspectives/components/modules/mod_anatomy.md index 7df2ddcd9e4..8c05be2ed64 100644 --- a/guides/v2.0/architecture/archi_perspectives/components/modules/mod_anatomy.md +++ b/guides/v2.0/architecture/archi_perspectives/components/modules/mod_anatomy.md @@ -6,7 +6,7 @@ title: menu_title: menu_order: -github_link: architecture/components/modules/mod_anatomy.md +github_link: architecture/archi_perspectives/components/modules/mod_anatomy.md redirect: /guides/v2.0/architecture/modules/mod_anatomy.html --- diff --git a/guides/v2.0/architecture/archi_perspectives/components/modules/mod_and_areas.md b/guides/v2.0/architecture/archi_perspectives/components/modules/mod_and_areas.md index a2fb5a20115..66de15873ce 100644 --- a/guides/v2.0/architecture/archi_perspectives/components/modules/mod_and_areas.md +++ b/guides/v2.0/architecture/archi_perspectives/components/modules/mod_and_areas.md @@ -7,7 +7,7 @@ menu_title: Modules and areas menu_order: 4 level3_menu_node: level3child level3_subgroup: modules -github_link: architecture/components/modules/mod_and_areas.md +github_link: architecture/archi_perspectives/components/modules/mod_and_areas.md redirect_from: /guides/v1.0/architecture/modules/mod_and_areas.html --- diff --git a/guides/v2.0/architecture/archi_perspectives/components/modules/mod_conventions.md b/guides/v2.0/architecture/archi_perspectives/components/modules/mod_conventions.md index da268217dd7..fcc6d974642 100644 --- a/guides/v2.0/architecture/archi_perspectives/components/modules/mod_conventions.md +++ b/guides/v2.0/architecture/archi_perspectives/components/modules/mod_conventions.md @@ -7,7 +7,7 @@ menu_title: Module conventions menu_order: 5 level3_menu_node: level3child level3_subgroup: modules -github_link: architecture/components/modules/mod_conventions.md +github_link: architecture/archi_perspectives/components/modules/mod_conventions.md redirect_from: /guides/v1.0/architecture/modules/mod_conventions.html --- diff --git a/guides/v2.0/architecture/archi_perspectives/components/modules/mod_depend.md b/guides/v2.0/architecture/archi_perspectives/components/modules/mod_depend.md index f3c55742444..6a62269babe 100644 --- a/guides/v2.0/architecture/archi_perspectives/components/modules/mod_depend.md +++ b/guides/v2.0/architecture/archi_perspectives/components/modules/mod_depend.md @@ -7,7 +7,7 @@ menu_title: Module dependencies menu_order: 6 level3_menu_node: level3child level3_subgroup: modules -github_link: architecture/components/modules/mod_depend.md +github_link: architecture/archi_perspectives/components/modules/mod_depend.md redirect_from: /guides/v1.0/architecture/modules/mod_depend.html --- diff --git a/guides/v2.0/architecture/archi_perspectives/components/modules/mod_depend_types.md b/guides/v2.0/architecture/archi_perspectives/components/modules/mod_depend_types.md index f35d70f3fe6..0042ad72650 100644 --- a/guides/v2.0/architecture/archi_perspectives/components/modules/mod_depend_types.md +++ b/guides/v2.0/architecture/archi_perspectives/components/modules/mod_depend_types.md @@ -7,7 +7,7 @@ menu_title: Module dependency types menu_order: 7 level3_menu_node: level3child level3_subgroup: modules -github_link: architecture/components/modules/mod_depend_types.md +github_link: architecture/archi_perspectives/components/modules/mod_depend_types.md redirect_from: /guides/v1.0/architecture/modules/mod_depend_types.html --- diff --git a/guides/v2.0/architecture/archi_perspectives/components/modules/mod_intro.md b/guides/v2.0/architecture/archi_perspectives/components/modules/mod_intro.md index bbd7444a8e8..46502017179 100644 --- a/guides/v2.0/architecture/archi_perspectives/components/modules/mod_intro.md +++ b/guides/v2.0/architecture/archi_perspectives/components/modules/mod_intro.md @@ -7,7 +7,7 @@ menu_title: Module overview menu_order: 3 level3_menu_node: level3child level3_subgroup: modules -github_link: architecture/components/modules/mod_intro.md +github_link: architecture/archi_perspectives/components/modules/mod_intro.md redirect_from: /guides/v1.0/architecture/modules/mod_intro.html --- diff --git a/guides/v2.0/architecture/archi_perspectives/components/modules/mod_relationships.md b/guides/v2.0/architecture/archi_perspectives/components/modules/mod_relationships.md index 7ba856115ae..0fef06e00ea 100644 --- a/guides/v2.0/architecture/archi_perspectives/components/modules/mod_relationships.md +++ b/guides/v2.0/architecture/archi_perspectives/components/modules/mod_relationships.md @@ -7,7 +7,7 @@ menu_title: Module relationships menu_order: 5 level3_menu_node: level3child level3_subgroup: modules -github_link: architecture/modules/mod_relationships.md +github_link: architecture/archi_perspectives/modules/mod_relationships.md redirect_from: /guides/v1.0/architecture/modules/mod_relationships.html --- diff --git a/guides/v2.0/architecture/archi_perspectives/components/modules/modules.md b/guides/v2.0/architecture/archi_perspectives/components/modules/modules.md index 99fdf8e42e9..18794765e59 100644 --- a/guides/v2.0/architecture/archi_perspectives/components/modules/modules.md +++ b/guides/v2.0/architecture/archi_perspectives/components/modules/modules.md @@ -8,6 +8,6 @@ menu_order: 1 level3_menu_node: level3parent level3_subgroup: modules -github_link: architecture/components/modules/modules.md +github_link: architecture/archi_perspectives/components/modules/modules.md --- diff --git a/guides/v2.0/migration/migration-tool-configure.md b/guides/v2.0/migration/migration-tool-configure.md index 2f6b97d3486..d79c9f373fc 100644 --- a/guides/v2.0/migration/migration-tool-configure.md +++ b/guides/v2.0/migration/migration-tool-configure.md @@ -34,7 +34,7 @@ Before you migrate any data, you must create a `config.xml` configuration file f To create a configuration file: -1. Log in to your Magento server as, or switch to, the Magento file system owner. +1. Log in to your Magento server as, or switch to, the Magento file system owner. 2. Change to the following directory: `/vendor/magento/data-migration-tool/etc// From 1fbf94d5b432ac868f322f57aee1f8eb12dbb208 Mon Sep 17 00:00:00 2001 From: stevjohnson Date: Mon, 15 Feb 2016 17:20:47 -0600 Subject: [PATCH 189/902] Fix broken links --- guides/v2.0/install-gde/install/cli/install-cli-uninstall.md | 2 +- guides/v2.0/install-gde/system-requirements_browsers.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/guides/v2.0/install-gde/install/cli/install-cli-uninstall.md b/guides/v2.0/install-gde/install/cli/install-cli-uninstall.md index bade6984e8c..8f0926fc37a 100644 --- a/guides/v2.0/install-gde/install/cli/install-cli-uninstall.md +++ b/guides/v2.0/install-gde/install/cli/install-cli-uninstall.md @@ -58,7 +58,7 @@ To reinstall the Magento software as a system integrator:
    -
    • If git pull origin develop fails, see troubleshooting.
    • +
      • If git pull origin develop fails, see troubleshooting.
      • To use your existing Magento software version , omit the git pull origin develop command.
    diff --git a/guides/v2.0/install-gde/system-requirements_browsers.md b/guides/v2.0/install-gde/system-requirements_browsers.md index dbbae9d1d93..3224d963541 100644 --- a/guides/v2.0/install-gde/system-requirements_browsers.md +++ b/guides/v2.0/install-gde/system-requirements_browsers.md @@ -6,7 +6,7 @@ title: Supported browsers menu_title: Supported browsers menu_node: menu_order: 3 -github_link: install-gde/system-requirements_admin-browser.md +github_link: install-gde/system-requirements_browsers.md --- ## Supported browsers From 800e03318187aa22b9c10fa5fefba461c8d7ba64 Mon Sep 17 00:00:00 2001 From: bh-ref Date: Tue, 16 Feb 2016 11:25:56 +0100 Subject: [PATCH 190/902] add link to index config guide you may also remove the link entirely, since the same link is already mentioned in step 4 --- guides/v2.0/migration/migration-plan.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guides/v2.0/migration/migration-plan.md b/guides/v2.0/migration/migration-plan.md index 4a30a2418a4..1aee3cad6d8 100644 --- a/guides/v2.0/migration/migration-plan.md +++ b/guides/v2.0/migration/migration-plan.md @@ -68,7 +68,7 @@ Now that your Magento 2 site is up-to-date with Magento 1 and is functioning nor 1. Put your Magento 1 system in maintenance mode (DOWNTIME STARTS). 2. Press Control+C in the migration tool command window to stop incremental updates. 3. Start your Magento 2 cron jobs. -4. In your Magento 2 system, reindex the stock indexer. For more information, see the ``. +4. In your Magento 2 system, reindex the stock indexer. For more information, see the Configuration Guide. 5. Using a tool of your choice, hit pages in your Magento 2 system to cache pages in advance of customers using your storefront. 6. Perform any final verification of your Magento 2 site. 7. Change DNS, load balancers, and so on to point to new production hardware (DOWNTIME ENDS) From 0eb42fc901903508b6abe76537eafc58c9e7d850 Mon Sep 17 00:00:00 2001 From: Oleksandra Marchenko Date: Tue, 16 Feb 2016 12:31:59 +0200 Subject: [PATCH 191/902] Added review comments --- guides/v2.0/ui-components/ui-modal.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/guides/v2.0/ui-components/ui-modal.md b/guides/v2.0/ui-components/ui-modal.md index 76eed122520..1d0eebc4cf3 100644 --- a/guides/v2.0/ui-components/ui-modal.md +++ b/guides/v2.0/ui-components/ui-modal.md @@ -201,7 +201,7 @@ Set as follows: ### Example of the modal component configuration -The following sample is an example of the configuration for a simple modal window containing one text field and a standard set of action buttons (**Save**, **Delete**, **Cancel**): +The following sample is an example of the configuration for a simple modal window containing one text field and a standard set of action buttons (**Cancel**, **Clear**, **Done**): {%highlight xml%} @@ -272,6 +272,6 @@ The following sample is an example of the configuration for a simple modal windo - `closeModal()`: closes the modal window. - `openModal()`: opens the modal window. - `setPrevValues(elem)`: returns all `elem`'s child components to the state they had on modal open. -- `setTitle()` - sets modal title. -- `setSubTitle()` - sets modal sub title. +- `setTitle()`: sets modal title. +- `setSubTitle()`: sets modal sub title. - `toggleModal()`: toggles the modal window state (open/close). \ No newline at end of file From fc861f634f297fde2040860ab58263bdf0f65241 Mon Sep 17 00:00:00 2001 From: stevjohnson Date: Tue, 16 Feb 2016 09:11:26 -0600 Subject: [PATCH 192/902] Fix bad links --- guides/v2.0/howdoi/config/configure.md | 2 +- guides/v2.0/install-gde/bk-install-guide.md | 4 +++- guides/v2.0/install-gde/install-roadmap_trouble.md | 2 +- guides/v2.0/install-gde/install-roadmap_web.md | 2 +- guides/v2.0/install-gde/install/cli/install-cli-adminurl.md | 4 +++- .../install-gde/install/cli/install-cli-subcommands-admin.md | 1 + guides/v2.0/install-gde/install/hosted/hosted_start.md | 2 +- guides/v2.0/install-gde/trouble/tshoot_admin.md | 2 +- guides/v2.0/install-gde/trouble/tshoot_var-gen-perms.md | 2 +- .../slideouts-modals-overlays/slideouts-modals-overalys.md | 4 ++-- 10 files changed, 15 insertions(+), 10 deletions(-) diff --git a/guides/v2.0/howdoi/config/configure.md b/guides/v2.0/howdoi/config/configure.md index 2ef597ab55d..d320df62a2e 100644 --- a/guides/v2.0/howdoi/config/configure.md +++ b/guides/v2.0/howdoi/config/configure.md @@ -6,7 +6,7 @@ title: Configure Magento menu_title: Configure Magento menu_node: parent menu_order: 1 -github_link: howdoi/deploy/configure.md +github_link: howdoi/config/configure.md --- After you finish your installation, Configure the Magento application. \ No newline at end of file diff --git a/guides/v2.0/install-gde/bk-install-guide.md b/guides/v2.0/install-gde/bk-install-guide.md index 50d96e640d0..f54ae1dbbd9 100644 --- a/guides/v2.0/install-gde/bk-install-guide.md +++ b/guides/v2.0/install-gde/bk-install-guide.md @@ -7,7 +7,9 @@ menu_title: Installation overview menu_node: menu_order: 1 github_link: install-gde/bk-install-guide.md -redirect_from: /guides/v1.0/install-gde/bk-install-guide.html +redirect_from: + - /guides/v1.0/install-gde/bk-install-guide.html + - /guides/v2.0/install-gde/install/install-merchbeta.html ---

    Magento software installation

    diff --git a/guides/v2.0/install-gde/install-roadmap_trouble.md b/guides/v2.0/install-gde/install-roadmap_trouble.md index 745c11fa19c..6c339eb3686 100644 --- a/guides/v2.0/install-gde/install-roadmap_trouble.md +++ b/guides/v2.0/install-gde/install-roadmap_trouble.md @@ -6,7 +6,7 @@ title: Installation roadmap (reference) menu_title: Installation roadmap (reference) menu_node: parent menu_order: 1 -github_link: install-roadmap_trouble.md +github_link: install-gde/install-roadmap_trouble.md --- {% include install/install-roadmap.md %} \ No newline at end of file diff --git a/guides/v2.0/install-gde/install-roadmap_web.md b/guides/v2.0/install-gde/install-roadmap_web.md index 37d19914fe4..8d0dd442c57 100644 --- a/guides/v2.0/install-gde/install-roadmap_web.md +++ b/guides/v2.0/install-gde/install-roadmap_web.md @@ -6,7 +6,7 @@ title: Installation roadmap (reference) menu_title: Installation roadmap (reference) menu_node: parent menu_order: 1 -github_link: install-roadmap_web.md +github_link: install-gde/install-roadmap_web.md --- {% include install/install-roadmap.md %} \ No newline at end of file diff --git a/guides/v2.0/install-gde/install/cli/install-cli-adminurl.md b/guides/v2.0/install-gde/install/cli/install-cli-adminurl.md index 201fdfdcec3..70cace9f97d 100644 --- a/guides/v2.0/install-gde/install/cli/install-cli-adminurl.md +++ b/guides/v2.0/install-gde/install/cli/install-cli-adminurl.md @@ -7,7 +7,9 @@ menu_title: Display or change the Admin URI menu_node: menu_order: 6 github_link: install-gde/install/cli/install-cli-adminurl.md -redirect_from: /guides/v1.0/install-gde/install/install-cli-adminurl.html +redirect_from: + - /guides/v1.0/install-gde/install/install-cli-adminurl.html + - /guides/v2.0/install-gde/install/install-cli-adminurl.html --- diff --git a/guides/v2.0/install-gde/install/cli/install-cli-subcommands-admin.md b/guides/v2.0/install-gde/install/cli/install-cli-subcommands-admin.md index c2a6da4982c..35e2e40a48f 100644 --- a/guides/v2.0/install-gde/install/cli/install-cli-subcommands-admin.md +++ b/guides/v2.0/install-gde/install/cli/install-cli-subcommands-admin.md @@ -7,6 +7,7 @@ menu_title: Create or unlock a Magento administrator account menu_node: menu_order: 50 github_link: install-gde/install/cli/install-cli-subcommands-admin.md +redirect_from: /guides/v2.0/install-gde/install/install-cli-subcommands-admin.html --- diff --git a/guides/v2.0/install-gde/install/hosted/hosted_start.md b/guides/v2.0/install-gde/install/hosted/hosted_start.md index 9f45a0eef98..56fbaf8807f 100644 --- a/guides/v2.0/install-gde/install/hosted/hosted_start.md +++ b/guides/v2.0/install-gde/install/hosted/hosted_start.md @@ -17,7 +17,7 @@ If your hosted system is already set up, go to Verify the software on your system -* Configure a database and a database user +* Configure a database and a database user * Configure PHP * Transfer the Magento software to your hosted system * Set up scheduled tasks (cron) diff --git a/guides/v2.0/install-gde/trouble/tshoot_admin.md b/guides/v2.0/install-gde/trouble/tshoot_admin.md index 75b30fb5185..f86502c800c 100644 --- a/guides/v2.0/install-gde/trouble/tshoot_admin.md +++ b/guides/v2.0/install-gde/trouble/tshoot_admin.md @@ -6,7 +6,7 @@ title: Error after logging in to the Magento Admin menu_title: Error after logging in to the Magento Admin menu_node: menu_order: 10 -github_link: install-gde/install/trouble/tshoot_admin.md +github_link: install-gde/trouble/tshoot_admin.md --- diff --git a/guides/v2.0/install-gde/trouble/tshoot_var-gen-perms.md b/guides/v2.0/install-gde/trouble/tshoot_var-gen-perms.md index 4447d5cb187..2928a4a03bd 100644 --- a/guides/v2.0/install-gde/trouble/tshoot_var-gen-perms.md +++ b/guides/v2.0/install-gde/trouble/tshoot_var-gen-perms.md @@ -13,7 +13,7 @@ github_link: install-gde/trouble/tshoot_var-gen-perms.md

    Cannot write to the var/generation directory

    ### Symptom -After you successfully install Magento, exceptions display when you try to access the storefront or Admin. (You might have to +After you successfully install Magento, exceptions display when you try to access the storefront or Admin. (You might have to enable developer mode to see the exceptions.) Sample exceptions follow: diff --git a/guides/v2.0/pattern-library/containers/slideouts-modals-overlays/slideouts-modals-overalys.md b/guides/v2.0/pattern-library/containers/slideouts-modals-overlays/slideouts-modals-overalys.md index d965aa71dee..3335e1cc0cf 100644 --- a/guides/v2.0/pattern-library/containers/slideouts-modals-overlays/slideouts-modals-overalys.md +++ b/guides/v2.0/pattern-library/containers/slideouts-modals-overlays/slideouts-modals-overalys.md @@ -6,9 +6,9 @@ title: Magento Admin Pattern Library menu_title: Slide-out, Modals, and Overlays menu_order: 2 menu_node: -github_link: pattern-library/containers/slideouts-modals-overlays/slideouts-modals-overlays.md - +github_link: pattern-library/containers/slideouts-modals-overlays/slideouts-modals-overalys.md --- +

    Slide-out Panels, Modal Windows, and Overlays

    Contents

    From 18f8cbefd0a343a0439e7b1a0081ae0b0ef8b7e7 Mon Sep 17 00:00:00 2001 From: Oleksandra Marchenko Date: Tue, 16 Feb 2016 18:07:28 +0200 Subject: [PATCH 193/902] Final update --- guides/v2.0/ui-components/ui-modal.md | 311 ++++++++++++++++---------- 1 file changed, 199 insertions(+), 112 deletions(-) diff --git a/guides/v2.0/ui-components/ui-modal.md b/guides/v2.0/ui-components/ui-modal.md index 1d0eebc4cf3..609a36d44c0 100644 --- a/guides/v2.0/ui-components/ui-modal.md +++ b/guides/v2.0/ui-components/ui-modal.md @@ -20,11 +20,11 @@ This topic describes the modal UI component. The modal UI component implements a secondary window that opens on top of the main window. It uses the [modal widget]([{site.gdeurl}}javascript-dev-guide/widgets/widget_modal.html). -Similar to the widget's configuration, the component's configuration allows you to set the window type and action buttons behavior. Additionally, the component allows to link action buttons to methods of the other UI components (by using the button component). +Similar to the widget's configuration, the component's configuration allows you to set the window type and action buttons behavior (including linking action buttons to methods of the other UI components). The modal component can be used for both Admin panel and storefront. -For recommendation about modal windows usage from the UX point of view, see the corresponding topic in the [Magento Admin pattern library](http://devdocs.magento.com/guides/v2.0/pattern-library/bk-pattern.html). +For recommendations about modal windows usage from the UX point of view, see the corresponding topic in the [Magento Admin pattern library](http://devdocs.magento.com/guides/v2.0/pattern-library/bk-pattern.html). ## Structure @@ -49,159 +49,246 @@ Component's options are set in the configuration `.xml` file as follows:
    {%endhighlight%} - +

    +

    +

    +

    The modal component uses general configuration options, similar to other UI components. However, it uses the following specific options as well: - - - - - - + - - - - - + - - - - - + - - - - - +

    + Type: String +

    +

    + Required?: Optional +

    +

    + Default value: '' +

    + - - - - - +

    + Type: String +

    +

    + Required?: Optional +

    +

    + Default value: '' +

    + - - - + - - - +

    + Type: String +

    +

    + Required?: Optional +

    +

    + Default value: slide +

    + - - - - - + - - - - - +

    + Type: String +

    +

    + Required?: Optional +

    +

    + Default value: Undefined +

    + - - - - - +

    + Type: String +

    +

    + Required?: Optional +

    +

    + Default value: Undefined +

    + - - - - - - +

    + Type: Object +

    +

    + Required?: Optional +

    +

    + Default value: Undefined +

    + - - - - - + -
    OptionDescriptionTypeOptional/MandatoryDefault value + Modal options +
    stateSet the state of the modal window: true for open. -BooleanOptionalfalse + state +

    + Set the state of the modal window: true for + open. +

    +

    + Type: Boolean +

    +

    + Required?: Optional +

    +

    + Default value: false +

    +
    optionsOptions are passed to the modal widget initialization as is.ObjectOptional{} + options +

    + Configuration for the modal widget. Passed to the widget + initialization as is. +

    +

    + Type: Object +

    +

    + Required?: Optional +

    +

    + Default value: {} +

    +
    titleThe title of the modal window. Set as follows: -
    -<item name="options" xsi:type="array">
    -    <item name="title" xsi:type="string">%window_title%</item>
    +    
    + title +

    + The title of the modal window. Set as follows: +

    +
    +<item name="options" xsi:type="array">
    +    <item name="title" xsi:type="string">%window_title%</item>
     </item>
     
    - -
    StringOptional''
    subTitleThe subtitle of the modal window. Set as follows: -
    -<item name="options" xsi:type="array">
    -    <item name="title" xsi:type="string">%window_title%</item>
    +    
    + subTitle +

    + The subtitle of the modal window. Set as follows: +

    +
    +<item name="options" xsi:type="array">
    +    <item name="title" xsi:type="string">%window_subtitle%</item>
     </item>
     
    - -
    StringOptional''
    typeThe type of the modal window. Can be one of the following: -slide or popup - -Set as follows: -
    -<item name="options" xsi:type="array">
    -    <item name="type" xsi:type="string">%slide|popup%</item>
    +  
    + type +

    + The type of the modal window. Can be one of the following: + slide or popup. Set as follows: +

    +
    +<item name="options" xsi:type="array">
    +    <item name="type" xsi:type="string">%slide|popup%</item>
     </item>
     
    -
    StringOptionalslide
    buttonsThe action buttons of the modal window. -ArrayOptional[] + buttons +

    + The action buttons of the modal window. +

    +

    + Type: Array Required?: + Optional Default value: [] +

    +
    textThe button label. - -Set as follows: -
    -<item name="options" xsi:type="array">
    -    <item name="buttons" xsi:type="array">
    -         <item name="%button_number%" xsi:type="array">
    -             <item name="text" xsi:type="string">%label%</item>
    +    
    + text +

    + The button label.
    + Set as follows: +

    +
    +<item name="options" xsi:type="array">
    +    <item name="buttons" xsi:type="array">
    +         <item name="%button_number%" xsi:type="array">
    +             <item name="text" xsi:type="string">%label%</item>
              </item>
         </item>
     </item>
     
    - -
    StringOptionalUndefined
    classThe CSS class for the button. - -Set as follows: -
    -<item name="options" xsi:type="array">
    -    <item name="buttons" xsi:type="array">
    -         <item name="%button_number%" xsi:type="array">
    -             <item name="class" xsi:type="string">%class%</item>
    +    
    + class +

    + The CSS class for the button.
    + Set as follows: +

    +
    +<item name="options" xsi:type="array">
    +    <item name="buttons" xsi:type="array">
    +         <item name="%button_number%" xsi:type="array">
    +             <item name="class" xsi:type="string">%class%</item>
              </item>
         </item>
     </item>
     
    - -
    StringOptionalUndefined
    actionsButton actions. On button click, actions are performed in the same order as they are set in config. - -Set as follows: -
    -<item name="options" xsi:type="array">
    -    <item name="buttons" xsi:type="array">
    -         <item name="%button_number%" xsi:type="array">
    -             <item name="actions" xsi:type="string">%label%</item>
    +    
    + actions +

    + Button actions. On button click, actions are performed in + the same order as they are specified in config.
    + Set as follows: +

    +
    +<item name="options" xsi:type="array">
    +    <item name="buttons" xsi:type="array">
    +         <item name="%button_number%" xsi:type="array">
    +             <item name="actions" xsi:type="string">
    +                <--! Action that calls the method of the other UI component -->
    +                <item name="%action_number%" xsi:type="array">
    +                    <item name="targetName" xsi:type="string">%component_which_performs_action%</item>
    +                    <item name="actionName" xsi:type="string">%method_of_target_component%</item>
    +                </item>
    +                <--! Action that calls the method of the modal component -->
    +                <item name="%next_action_number%" xsi:type="array">%method_of_modal_component%</item>
    +             </item>
              </item>
         </item>
     </item>
     
    - -
    ObjectOptionalUndefined
    onCancelAction (method name), that is performed on cancelling interactions: pressing Esc, clicking outside the modal window or clicking the 'X' (close) icon. -StringOptionalcloseModal + onCancel +

    + Action (method name), that is performed on canceling + interactions: pressing Esc, clicking outside the modal + window, or clicking the 'X' (close) icon. +

    +

    + Type: String +

    +

    + Required?: Optional +

    +

    + Default value: closeModal +

    +
    ### Example of the modal component configuration -The following sample is an example of the configuration for a simple modal window containing one text field and a standard set of action buttons (**Cancel**, **Clear**, **Done**): +The following sample is an example of the configuration for a simple modal window containing one text field and a standard set of action buttons (**Cancel**, **Clear**, **Done**): {%highlight xml%} @@ -267,11 +354,11 @@ The following sample is an example of the configuration for a simple modal windo ## Public API (JS) -- `actionCancel()`: returns all modal's child components to the state they had on modal open and closes the modal window. +- `actionCancel()`: returns all modal's child components to the state they had on modal open and closes the modal window. - `actionDone()`: validates the changes in the modal's child components and, if valid, closes the modal. - `closeModal()`: closes the modal window. - `openModal()`: opens the modal window. - `setPrevValues(elem)`: returns all `elem`'s child components to the state they had on modal open. - `setTitle()`: sets modal title. - `setSubTitle()`: sets modal sub title. -- `toggleModal()`: toggles the modal window state (open/close). \ No newline at end of file +- `toggleModal()`: toggles the modal window state (open/close). From ce400e5cb9918b162fd0a9b430545fd72ad77d12 Mon Sep 17 00:00:00 2001 From: Oleksandra Marchenko Date: Tue, 16 Feb 2016 19:02:55 +0200 Subject: [PATCH 194/902] fixed broken links --- .../frontend-dev-guide/css-guide/css_quick_guide_approach.md | 2 +- guides/v2.0/frontend-dev-guide/layouts/xml-manage.md | 2 +- guides/v2.0/frontend-dev-guide/templates/template-email.md | 2 +- guides/v2.0/frontend-dev-guide/templates/template-override.md | 2 +- guides/v2.0/javascript-dev-guide/widgets/widget_prompt.md | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/guides/v2.0/frontend-dev-guide/css-guide/css_quick_guide_approach.md b/guides/v2.0/frontend-dev-guide/css-guide/css_quick_guide_approach.md index 7e0a7de1526..c26ab2535de 100644 --- a/guides/v2.0/frontend-dev-guide/css-guide/css_quick_guide_approach.md +++ b/guides/v2.0/frontend-dev-guide/css-guide/css_quick_guide_approach.md @@ -15,7 +15,7 @@ Let's say you created a new theme inheriting from Magento Blank or Luma, and cho - Simplest way to override parent styles (that is, override default Magento UI library variables) - Adding structured changes - Extend component's styles - - Override component's styles + - Override component's styles

    Simplest way to extend parent styles

    diff --git a/guides/v2.0/frontend-dev-guide/layouts/xml-manage.md b/guides/v2.0/frontend-dev-guide/layouts/xml-manage.md index 9ca82b7afea..4ccafd44241 100644 --- a/guides/v2.0/frontend-dev-guide/layouts/xml-manage.md +++ b/guides/v2.0/frontend-dev-guide/layouts/xml-manage.md @@ -360,4 +360,4 @@ To replace an element, Layout instructions * Extend a layout -* Theme design best practices + diff --git a/guides/v2.0/frontend-dev-guide/templates/template-email.md b/guides/v2.0/frontend-dev-guide/templates/template-email.md index a377081c2b7..96fdd969f5e 100644 --- a/guides/v2.0/frontend-dev-guide/templates/template-email.md +++ b/guides/v2.0/frontend-dev-guide/templates/template-email.md @@ -33,7 +33,7 @@ This topic covers how to customize the content and design of email templates. * Newsletter templates

    Customize email templates

    -Email templates are stored in the `/view//email` directory of their respective modules. For example, the template for the new order transactional email for the Sales module is located in app/code/Magento/Sales/view/frontend/email/order_new.html. +Email templates are stored in the `/view//email` directory of their respective modules. For example, the template for the new order transactional email for the Sales module is located in [/view/frontend/email/order_new.html]({{ site.mage2000url }}app/code/Magento/Sales/view/frontend/email/order_new.html). We strongly recommend you not change the default Magento files. If you want to customize the default templates, you should create your custom templates and configure Magento to use them instead of the default templates. diff --git a/guides/v2.0/frontend-dev-guide/templates/template-override.md b/guides/v2.0/frontend-dev-guide/templates/template-override.md index af5b8f0cba4..2dcd699aec8 100644 --- a/guides/v2.0/frontend-dev-guide/templates/template-override.md +++ b/guides/v2.0/frontend-dev-guide/templates/template-override.md @@ -58,7 +58,7 @@ Overriding templates is described with more details in the Root template -In Magento there's a special template which serves as root template for all pages in the application: app/code/Magento/Theme/view/base/templates/root.phtml +In Magento there's a special template which serves as root template for all pages in the application: [/view/base/templates/root.phtml]({{site.mage2000url}}app/code/Magento/Theme/view/base/templates/root.phtml). Unlike other templates, `root.phtml` contains the `doctype` specification and contributes to <head> and <body> sections of all pages rendered by Magento application. diff --git a/guides/v2.0/javascript-dev-guide/widgets/widget_prompt.md b/guides/v2.0/javascript-dev-guide/widgets/widget_prompt.md index fd137c8c8b1..fbcbdd9b5dd 100644 --- a/guides/v2.0/javascript-dev-guide/widgets/widget_prompt.md +++ b/guides/v2.0/javascript-dev-guide/widgets/widget_prompt.md @@ -24,7 +24,7 @@ The widget can be used for implementing prompt windows for both, Admin and store - Initialize the prompt widget - Options - Events -- Keyboard navigation +- Keyboard navigation

    Initialize the prompt widget

    From 86d9a2fbd951ce46e9755492b90cd3dd47adf1c8 Mon Sep 17 00:00:00 2001 From: Oleksandra Marchenko Date: Tue, 16 Feb 2016 19:18:45 +0200 Subject: [PATCH 195/902] fixed more links --- guides/v2.0/javascript-dev-guide/javascript/js-resources.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/guides/v2.0/javascript-dev-guide/javascript/js-resources.md b/guides/v2.0/javascript-dev-guide/javascript/js-resources.md index 2b4b2527168..6262450fce5 100644 --- a/guides/v2.0/javascript-dev-guide/javascript/js-resources.md +++ b/guides/v2.0/javascript-dev-guide/javascript/js-resources.md @@ -48,13 +48,13 @@ The modular ID has `magento!` prefix and is used for loading the JavaScript modu

    Specify dependencies between JavaScript resources

    Specifying all dependencies between JavaScript resources might be time consuming. To facilitate this task we implemented ability to build the dependencies via plugin: thus, you will need to specify only dependency of your resource on a plugin, and the latter will pick up all necessary dependencies on other resources automatically. -When creating a new resource, you can select a plugin, on which your resources are to depend, from the ready-to-go plugin library or write a plugin by yourself. Observe the following rules when declaring a plugin: +When creating a new resource, you can select a plugin, on which your resources are to depend, from the [ready-to-go plugin library]({{site.mage2000url}}lib/web/mage) or write a plugin by yourself. Observe the following rules when declaring a plugin:
    1. To declare a plugin, use the define function:
    2. define(["jquery"], function($){
         // plugin code
         // where $ == "jquery"
      -})(jQuery); 
      +}); 
       
    3. If you need a plugin to be used in various environments, specify it as follows:
    4. From c2a3f62dd96b7335469c9f3d7cfe19025ee5558d Mon Sep 17 00:00:00 2001 From: Dmitry Shevtsov Date: Tue, 16 Feb 2016 19:59:28 +0200 Subject: [PATCH 196/902] MAGEDOC-2409: [MTF] 'Testing Approach' Chapter - base draft completed --- common/images/mtf_tutorial_block_mapping.png | Bin 0 -> 3574 bytes common/images/mtf_tutorial_block_struct.png | Bin 0 -> 4864 bytes .../images/mtf_tutorial_block_struct_test.png | Bin 0 -> 2169 bytes .../images/mtf_tutorial_page_new_synonym.png | Bin 0 -> 16718 bytes common/images/mtf_tutorial_pages_php.png | Bin 0 -> 3224 bytes .../mtf_quickstart/mtf_quickstart_runtest.md | 6 +- guides/v2.0/mtf/mtf_test-approach.md | 428 ++++++++++++++++-- 7 files changed, 393 insertions(+), 41 deletions(-) create mode 100644 common/images/mtf_tutorial_block_mapping.png create mode 100644 common/images/mtf_tutorial_block_struct.png create mode 100644 common/images/mtf_tutorial_block_struct_test.png create mode 100644 common/images/mtf_tutorial_page_new_synonym.png create mode 100644 common/images/mtf_tutorial_pages_php.png diff --git a/common/images/mtf_tutorial_block_mapping.png b/common/images/mtf_tutorial_block_mapping.png new file mode 100644 index 0000000000000000000000000000000000000000..8b8fd5eccf29a6f8c538b7269be833726e9f8f58 GIT binary patch literal 3574 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 OHGq?yi*2nn2LC@gRF%;H literal 0 HcmV?d00001 diff --git a/common/images/mtf_tutorial_block_struct.png b/common/images/mtf_tutorial_block_struct.png new file mode 100644 index 0000000000000000000000000000000000000000..cc519d74ebfbb4f592084b4b4b42e402388ff51b GIT binary patch literal 4864 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 literal 0 HcmV?d00001 diff --git a/common/images/mtf_tutorial_block_struct_test.png b/common/images/mtf_tutorial_block_struct_test.png new file mode 100644 index 0000000000000000000000000000000000000000..afb59bbe4c69d975db3ff00f0a7759c6e4af3343 GIT binary patch literal 2169 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 literal 0 HcmV?d00001 diff --git a/common/images/mtf_tutorial_pages_php.png b/common/images/mtf_tutorial_pages_php.png new file mode 100644 index 0000000000000000000000000000000000000000..6166d965f5a075bab7990e01434f3154b8e4efda GIT binary patch literal 3224 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/dev/tests/functional/vendor/phpunit This command will run all tests from `/dev/tests/functional/tests/app/Magento/`. @@ -33,7 +33,7 @@ This command will run all tests from `/dev/tests/functional/tests/app/ Enter in terminal - phpunit --filter + /dev/tests/functional/vendor/phpunit --filter Name of test is the name of PHP file with test. @@ -41,7 +41,7 @@ Example: Let's check creating of new category. For this we should run `/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/Category/CreateCategoryEntityTest.php`. To run this test enter the following script in your terminal: - phpunit --filter CreateCategoryEntityTest + /dev/tests/functional/vendor/phpunit --filter CreateCategoryEntityTest

      Next Steps

      << Prepare environment for test | See logs for failed tests >> diff --git a/guides/v2.0/mtf/mtf_test-approach.md b/guides/v2.0/mtf/mtf_test-approach.md index 1ebdf2545c5..4ead64daea4 100644 --- a/guides/v2.0/mtf/mtf_test-approach.md +++ b/guides/v2.0/mtf/mtf_test-approach.md @@ -53,7 +53,7 @@ Pass all the test steps defined in a test case you want to use. Step 2. [Run the test][] -## New test {#new-test} +## New functional test {#new-test} ### Extending an out-of-the-box test {#extending-oob-test} @@ -72,7 +72,7 @@ Example use cases: - [block overriding][] - [handler overriding][] -### Creating a test {#create-test} +### Creating a functional test {#create-test} When new functionality or/and new modules were added to Magento you would need to create an absolutely new test to check the functionality. @@ -104,7 +104,7 @@ To create the test entity you must fill a product creation form with data from a Связать в рамках одного теста. Создаваемый продукт можно назначить существующей категории или создать новую категорию для этого продукта. Чтобы создать новую категорию нужен хендлер. Often you need to create some entity in precondition of your test case. To do this you need to create handler for Category creation in Handler directory of your module. Learn more about Handler. -## Let's create a new test {#create-new-test} +## Let's create a new functional test {#create-new-test} To demonstrate usage of test components from previous sections in the test creation process we will create a new test step-by-step. Before creating automated test, try to pass it manually. @@ -131,7 +131,7 @@ Create a synonym group with: 3. Click on the "New Synonym Group" button 4. Enter data according to a data set 5. Click the "Save Synonym Group" button -6. Perform assertions +6. Check successful message ### Test creation {#test-creation} @@ -419,9 +419,9 @@ class Synonym extends \Magento\Mtf\Fixture\InjectableFixture {%endhighlight php%} -#### Step 4. Create an initial [test case][] {#create-init-test-case} +#### Step 3. Create an initial test case {#create-init-test-case} -Now we can start creation of a test case. +Now we can start creation of a [test case][]. From the [test case topic][] we know about structure, location and name of the test case. So, let it be `/dev/tests/functional/tests/app/Magento/Search/Test/TestCase/CreateSynonymEntityTest.xml`. And we know that we must open a Search Synonym Index page and a new New Synonym Group page during the test flow. It means that we should initialize these pages in the test using the `__inject()` method of the `Magento\Mtf\TestCase\Injectable` class. Also we will definitely use the [fixture][] from the previous step. @@ -487,9 +487,9 @@ class CreateSynonymEntityTest extends Injectable {% endhighlight %} -#### Step 5. Create a [data set][] {#create-data-set} +#### Step 4. Create a data set {#create-data-set} -Now we can add a data set with variations that cover cases in [test description][]: `/dev/tests/functional/tests/app/Magento/Search/Test/TestCase/CreateSynonymEntityTest.xml` +Now we can add a [data set][] with variations that cover cases in [test description][]: `/dev/tests/functional/tests/app/Magento/Search/Test/TestCase/CreateSynonymEntityTest.xml` ![Created data set]({{site.baseurl}}common/images/mtf_tutor_dataset.png) @@ -552,9 +552,9 @@ OK, let's see the data set with data. A bit later we will add assertions to complete our data set. -#### Step 6. Create [pages][] {#create-pages} +#### Step 5. Create pages {#create-pages} -In [Step 4][] we added two pages to the test case class. The both pages are in the Admin area, that's why we will create them in `/dev/tests/functional/tests/app/Magento/Search/Test/Page/Adminhtml`. This principle is a good practice, it is not obligatory. +In [Step 3][] we added two [pages][] to the test case class. The both pages are in the Admin area, that's why we will create them in `/dev/tests/functional/tests/app/Magento/Search/Test/Page/Adminhtml`. This principle is a good practice, it is not obligatory. **SynonymsIndex.xml** @@ -584,7 +584,7 @@ In [Step 4][] we added two pages to the test case class. The both pages are in t {% endhighlight %} -![Created pages]({{site.gdeurl}}commom/images/mtf_tutorial_pages.png) +![Created pages]({{site.baseurl}}common/images/mtf_tutorial_pages.png) More details about pages read in a [Page topic][]. @@ -592,20 +592,11 @@ To generate PHP classes for these pages enter and run in your terminal php /dev/tests/functional/utils/generate.php -![PHP classes of pages]({{site.gdeurl}}commom/images/mtf_tutorial_pages_php.png) +![PHP classes of pages]({{site.baseurl}}common/images/mtf_tutorial_pages_php.png) -[Run the test][] to check if you made any mistake. Selenium must perform three cycles of the following operations: - - - open a browser - - log in to Admin - - open a Search Synonym page - - open a New Synonym Group page - -Three cycles correspond to three variations in a data set. - In the following section we will create blocks that implements logic in these pages. -#### Step 7. Create blocks +#### Step 6. Create blocks {#create-blocks} Let's see in the [test description][] what actions must be performed: @@ -617,7 +608,7 @@ OK, let's start. **How to code 'Click on the "New Synonym Group" button'** -Fortunately you already have a block which contains method to add a new entity in a grid: [`Magento\Backend\Test\Block\GridPageActions`][]. +Fortunately you already have a block which contains method to add a new entity in a grid: [`\Magento\Backend\Test\Block\GridPageActions`][]. {% highlight php startinline=1 %} @@ -655,19 +646,19 @@ Now you can run `generate.php` as we did before to re-generate page classes. We need to enter data from a data set to the form fields. -![New Synonym Group page]({{site.gdeurl}}common/images/mtf_tutorial_page_new_synonym.png) +![New Synonym Group page]({{site.baseurl}}common/images/mtf_tutorial_page_new_synonym.png) It is time to use [block mapping][]. Corresponding to the structure of a Search module in a code base -![Block structure in a code base]({{site.gdeurl}}common/images/mtf_tutorial_block_struct.png) +![Block structure in a code base]({{site.baseurl}}common/images/mtf_tutorial_block_struct.png) we are going to create the similar structure: -![Block structure in a functional test]({{site.gdeurl}}common/images/mtf_tutorial_block_struct_test.png) +![Block structure in a functional test]({{site.baseurl}}common/images/mtf_tutorial_block_struct_test.png) -We need a `fill()` method from the [`Magento\Mtf\Block\Form`][] class and a mapping file. +We need a `fill()` method from the [`\Magento\Mtf\Block\Form`][] class and a mapping file. **Field mapping** @@ -722,7 +713,7 @@ Now we can add the `SynonymsForm.php` block class to the `SynonymsNews.xml` page **How to 'Click the "Save Synonym Group" button'** -To operate with forms we can use a `save()` method from [`Magento\Backend\Test\Block\FormPageActions`][] block class. +To operate with forms we can use a `save()` method from [`\Magento\Backend\Test\Block\FormPageActions`][] block class. To use this class, it must be added to the the `SynonymsNews.xml` page. The `.page-main-actions` css selector will help to identify a UI block with the button on the HTML page. @@ -732,18 +723,373 @@ To use this class, it must be added to the the `SynonymsNews.xml` page. The `.pa {% endhighlight %} -#### Step 8. Add blocks to pages +#### Step 7. Add blocks to pages {#add-blocks-to-pages} + +In previous step we created blocks with methods that enables us to perform required test flow. + +To associate methods with [pages][], blocks must be added to pages. + +**Search Synonym page** + +A corresponding page object in a functional test is `/dev/tests/functional/tests/app/Magento/Search/Test/Page/Adminhtml/SynonymsIndex.xml/Magento/Search/Test/Page/Adminhtml/SynonymsIndex.xml` + +The page with blocks needed for a test flow: + +{% highlight xml %} + + + + + + + + + +{% endhighlight %} + +**New Synonym Group** + +A corresponding page object in a functional test is `/dev/tests/functional/tests/app/Magento/Search/Test/Page/Adminhtml/SynonymsIndex.xml/Magento/Search/Test/Page/Adminhtml/SynonymsIndex.xml` + +The page with blocks needed for a test flow: + +{% highlight xml %} + + + + + + + + + + +{% endhighlight %} + +To generate PHP classes for these pages enter and run in your terminal: + + php /dev/tests/functional/utils/generate.php + +Well, now we can define a `test()` method that will contain a test flow. + +#### Step 8. Define a `test()` method {#define-test-method} + +An argument for the `test()` method is a test object (a fixture). + +{% highlight php startinline=1 %} + +/** + * @param Synonym $synonym + * @return void + */ +public function test(Synonym $synonym) +{ + // Steps +} + +{% endhighlight %} + +Here we should recall [Step 3][], where the initial test case was created. So, page classes must be used in a test case class: + +{% highlight php startinline=1 %} + +use Magento\Search\Test\Page\Adminhtml\SynonymsIndex; +use Magento\Search\Test\Page\Adminhtml\SynonymsNew; + +{% endhighlight %} + +All methods are defined in blocks ([Step 6][]) that are grouped in pages ([Step 5][], [Step 7][]). And we can code all required test flow: + +1. Log in to Admin +2. Open a Search Synonym page +3. Click on the "New Synonym Group" button +4. Enter data according to a data set +5. Click the "Save Synonym Group" button + +**Log in to Admin and open Search Synonym page** + +In the MTF the process of logging in doesn't require a special method and is performed automatically when any page from Admin is opened. A method we will use is an `open()` method of the `Magento/Mtf/Page/BackendPage` class. There is no need to add this class in `use`, because it is inherited from the `Magento/Search/Test/Page/Adminhtml/SynonymsIndex` class. + +{% highlight php startinline=1 %} + +$this->synonymsIndex->open(); + +{% endhighlight %} + +**Click on the "New Synonym Group" button** + +To click on the "New Synonym Group" button we will use the `addNew()` method from the `pageActionsBlock` block. A `getPageActionsBlock()` of the generated `Magento/Search/Test/Page/Adminhtml/SynonymsIndex` class receives parameters defined in the `pageActionsBlock` block (`class`, `locator`, `strategy`). + +{% highlight php startinline=1 %} + +$this->synonymsIndex->getPageActionsBlock()->addNew(); + +{% endhighlight %} + +Clicking on the button calls opening of the New Synonym Group page. + +**Enter data according to a data set** + +To enter data in the form we use the `fill()` method from the `synonymForm` block of the `synonymsNew` page. An argument for this method is a fixture `Synonym`. A `getSynonymForm()` method of the generated `Magento/Search/Test/Page/Adminhtml/SynonymsNew` class receives parameters defined in the `synonymForm` block. + +{% highlight php startinline=1 %} + +$this->synonymsNew->getSynonymForm()->fill($synonym); + +{% endhighlight %} + +**Click the "Save Synonym Group" button** + +A `save()` method with parameters defined in a `formPageActions` block. Parameters are injected using a `getFormPageActions()` method from the `synonymsNew` page (generated `Magento/Search/Test/Page/Adminhtml/SynonymsNew` page class). + +{% highlight php startinline=1 %} + +$this->synonymsNew->getFormPageActions()->save(); + +{% endhighlight %} + +**Full `test()` definition** + +{% highlight php startinline=1%} + +/** + * @param Synonym $synonym + * @return void + */ +public function test(Synonym $synonym) +{ + // Steps + $this->synonymsIndex->open(); // logs in to Admin, opens Search Synonyms page + $this->synonymsIndex->getPageActionsBlock()->addNew(); // receiving of the page action block with _rootElement containing locator which is indicated in the page class for PageActionBlock from the page, makes 'click' action on it + $this->synonymsNew->getSynonymForm()->fill($synonym); // enters data from variation in the New Synonym Group fields + $this->synonymsNew->getFormPageActions()->save(); // makes `click` action on the Save Synonym Group button +} + +{% endhighlight %} + +#### Step 9. Check the test run + +Now is everything ready to run the test (except assertion that we will create in the next step). + +Full test case code: + +{% highlight php %} + +synonymsIndex = $synonymsIndex; + $this->synonymsNew = $synonymsNew; + } + + /** + * @param Synonym $synonym + * @return void + */ + public function test(Synonym $synonym) + { + // Steps + $this->synonymsIndex->open(); // logs in to Admin, opens Search Synonyms page + $this->synonymsIndex->getPageActionsBlock()->addNew(); // receiving of the page action block with _rootElement containing locator which is indicated in the page class for PageActionBlock from the page, makes 'click' action on it + $this->synonymsNew->getSynonymForm()->fill($synonym); + $this->synonymsNew->getFormPageActions()->save(); + } +} + + +{% endhighlight %} + +You can run the test using your IDE or the CLI. To run the test using the CLI enter in your terminal: + + /dev/tests/functional/vendor/phpunit --filter CreateSynonymEntityTest + +Selenium must perform three cycles of the test flow in a browser. Three cycles correspond to three variations in a data set. + +#### Step 10. Create an assertion {#create-assertion} + +A last item in the test description says that the test must check appearance of a message about the successful save after a test flow. + +![Message about the successful save]({{site.baseurl}}common/images/mtf_tutorial_success_message.png) + +To cover this, we should create a test assertion ([constraint][]) and add the full class name to a variation of the data set. + +Fortunately, this assertion is popular among functional tests, and we can search by phrase "SuccessSaveMassage". Let's select from the list of results a [`\Magento\Customer\Test\Constraint\AssertCustomerSuccessSaveMessage`][] class. It has the following code: + +{% highlight php %} + +getMessagesBlock()->getSuccessMessage(); + \PHPUnit_Framework_Assert::assertEquals( + self::SUCCESS_MESSAGE, + $actualMessage, + 'Wrong success message is displayed.' + . "\nExpected: " . self::SUCCESS_MESSAGE + . "\nActual: " . $actualMessage + ); + } + + /** + * Text success save message is displayed + * + * @return string + */ + public function toString() + { + return 'Assert that success message is displayed.'; + } +} + +{% endhighlight %} + +Making a simple adoption we can create a constrain class that we need `\Magento\Search\Test\Constraint\AssertSynonymSuccessSaveMessage`: +{% highlight php %} +getMessagesBlock()->getSuccessMessage(); + \PHPUnit_Framework_Assert::assertEquals( + self::SUCCESS_MESSAGE, + $actualMessage, + 'Wrong success message is displayed.' + . "\nExpected: " . self::SUCCESS_MESSAGE + . "\nActual: " . $actualMessage + ); + } + /** + * Text success save message is displayed + * + * @return string + */ + public function toString() + { + return 'Assert that success message is displayed.'; + } +} + +{% endhighlight %} + +And now we can add `` to each variation of a data set `/dev/tests/functional/tests/app/Magento/Search/Test/TestCase/CreateSynonymEntityTest.xml`: +{% highlight xml %} + + + + + + + shoes %isolation%, foot wear %isolation%, men shoes %isolation%, women shoes %isolation% + + + + shoes %isolation%, foot wear %isolation%, men shoes %isolation%, women shoes %isolation% + all_store_views + + + + shoes %isolation%, foot wear %isolation%, men shoes %isolation%, women shoes %isolation% + default_store_view + + + + +{% endhighlight %} +The test is ready to run. +That's it! @@ -763,15 +1109,15 @@ To use this class, it must be added to the the `SynonymsNews.xml` page. The `.pa [test case]: {{site.gdeurl}}mtf/mtf_entities/mtf_testcase.html [test case topic]: {{site.gdeurl}}mtf/mtf_entities/mtf_testcase.html [block]: {{site.gdeurl}}mtf/mtf_entities/mtf_block.html -[block mapping]: {site.gdeurl}}mtf/mtf_entities/mtf_block.html#mtf_block_mapping -[nodes description table]: {site.gdeurl}}mtf/mtf_entities/mtf_block.html#mtf_block_form_xml_nodes +[block mapping]: {{site.gdeurl}}mtf/mtf_entities/mtf_block.html#mtf_block_mapping +[nodes description table]: {{site.gdeurl}}mtf/mtf_entities/mtf_block.html#mtf_block_form_xml_nodes [page]: {{site.gdeurl}}mtf/mtf_entities/mtf_page.html [pages]: {{site.gdeurl}}mtf/mtf_entities/mtf_page.html [Page topic]: {{site.gdeurl}}mtf/mtf_entities/mtf_page.html [constraints]: {{site.gdeurl}}mtf/mtf_entities/mtf_constraint.html +[constraint]: {{site.gdeurl}}mtf/mtf_entities/mtf_constraint.html [custom typified element]: {{site.gdeurl}}mtf/mtf_entities/mtf_typified-element.html#magento_class - [Adjust configuration]: http://devdocs.magento.com/guides/v2.0/mtf/mtf_quickstart/mtf_quickstart_config.html [Prepare environment for test run]: http://devdocs.magento.com/guides/v2.0/mtf/mtf_quickstart/mtf_quickstart_environmemt.html @@ -781,16 +1127,22 @@ To use this class, it must be added to the the `SynonymsNews.xml` page. The `.pa [`%isolation%` placeholder]: {{site.gdeurl}}mtf/mtf_entities/mtf_fixture-repo.html#mtf_repo_isolation [manual test]: #manual-test -[test description]: #example-test-description -[Step 4]: #create-init-test-case [test description]: #auto-test +[Step 3]: #create-init-test-case +[Step 5]: #create-pages +[Step 6]: #create-blocks +[Step 7]: #add-blocks-to-pages -[`Magento\Backend\Test\Block\FormPageActions`]: {{site.mage2000url}}dev/tests/functional/tests/app/Magento/Backend/Test/Block/GridPageActions.php -[`Magento\Mtf\Block\Form`]: https://github.com/magento/mtf/blob/develop/Magento/Mtf/Block/Form.php +[`\Magento\Backend\Test\Block\FormPageActions`]: {{site.mage2000url}}dev/tests/functional/tests/app/Magento/Backend/Test/Block/GridPageActions.php +[`\Magento\Mtf\Block\Form`]: https://github.com/magento/mtf/blob/develop/Magento/Mtf/Block/Form.php [`\Magento\Mtf\Client\Element\SelectstoreElement`]: {{site.mage2000url}}dev/tests/functional/lib/Magento/Mtf/Client/Element/SelectstoreElement.php -[`Magento\Backend\Test\Block\FormPageActions`]: {{site.mage2000url}}dev/tests/functional/tests/app/Magento/Backend/Test/Block/FormPageActions.php +[`\Magento\Backend\Test\Block\FormPageActions`]: {{site.mage2000url}}dev/tests/functional/tests/app/Magento/Backend/Test/Block/FormPageActions.php +[`\Magento\Customer\Test\Constraint\AssertCustomerSuccessSaveMessage`]: {{site.mage2000url}}dev/tests/functional/tests/app/Magento/Customer/Test/Constraint/AssertCustomerSuccessSaveMessage.php + *[MTF]: Magento Testing Framework -*[CRUD]: Create Read Update Delete \ No newline at end of file +*[CRUD]: Create Read Update Delete +*[IDE]: Integrated Development Environment +*[CLI]: Command Line Interface \ No newline at end of file From ad374c85c8fbc009ec6749d0bb511075557a6d89 Mon Sep 17 00:00:00 2001 From: Jeanne Frontain Date: Tue, 16 Feb 2016 12:12:22 -0600 Subject: [PATCH 197/902] added files for new patch releases --- guides/v2.0/release-notes/Patch 7504v1.1.md | 334 ++++++++++++++++++ .../v2.0/release-notes/ReleaseNotes1.14.2.4EE | 36 ++ .../release-notes/ReleaseNotes1.14.2.4EE.md | 48 +++ .../v2.0/release-notes/ReleaseNotes1.9.2.4CE | 25 ++ .../release-notes/ReleaseNotes1.9.2.4CE.md | 25 ++ 5 files changed, 468 insertions(+) create mode 100644 guides/v2.0/release-notes/Patch 7504v1.1.md create mode 100644 guides/v2.0/release-notes/ReleaseNotes1.14.2.4EE create mode 100644 guides/v2.0/release-notes/ReleaseNotes1.14.2.4EE.md create mode 100644 guides/v2.0/release-notes/ReleaseNotes1.9.2.4CE create mode 100644 guides/v2.0/release-notes/ReleaseNotes1.9.2.4CE.md diff --git a/guides/v2.0/release-notes/Patch 7504v1.1.md b/guides/v2.0/release-notes/Patch 7504v1.1.md new file mode 100644 index 00000000000..eda4d3e0ec9 --- /dev/null +++ b/guides/v2.0/release-notes/Patch 7504v1.1.md @@ -0,0 +1,334 @@ +--- +layout: default +group: +title: Release Notes +menu_title: +menu_node: +menu_order: 3 +github_link: release-notes/2.0.3.md +redirect_from: +--- + +

      Contents

      + +* Major changes in the Merchant Beta release +* Backward-incompatible changes +* Give us your feedback! + + + +

      Major changes in the Merchant Beta release

      +We made the following changes in this release: + +* Module version changes (requires reinstallation) +* Performance improvements +* Multiple administrators +* Magento Admin improvements +* Checkout improvements +* Payment improvements + +* Product attribute swatches +* Transactional emails +* Import and export +* Join directive +* Uninstall and backup +* Other changes + +For additional details not covered in these Release Notes, see the following: + +* Changelog +* Known issues +* Release highlights + +

      Module version changes (requires reinstallation)

      +{% include install/schema-change_merchbeta.html %} + +

      Performance improvements

      +A number of performance improvements, including: + +* Fewer requests for private content on cached catalog pages + + A request is sent only after login or adding product to cart +* User private blocks are rendered on the client only +* Checkout is based on two steps with complete rendering on the client and asynchronous blocks reloading + +* Fewer persistence operations +* Improved performance of payment blocks rendering + +

      Multiple administrators

      +Improved the ability for multiple administrators to access the Admin: + +* Up to 30 administrators simultaneously creating and processing orders +* Up to 25 administrators simultaneously editing and creating products with delayed catalog data update + + + + + +

      Magento Admin improvements

      +Among the improvements we made: + +* The Admin is touch-friendly (the Luma theme provided for storefront demonstration is also touch-friendly) +* Larger tap targets +* No hover states +* You can save custom views +* The following apply to the Content Management System (CMS), Products, and Sales: + + * Keyword search + * Configurable columns + * Expanding filters + * Custom views + * Drag and drop column reordering + * Thumbnails in the product catalog + +* Standard product templates: + + * Simple + * Configurable + * Virtual + * Downloadable + +* You can create products by attributes +* Bulk product editing by attribute: + + * Images + * Pricing + * Inventory + +

      Checkout improvements

      +Among the improvements we made: + +* Customers are identified as soon as they log in +* Shipping information populates automatically as soon as the customer enters the correct information + +

      Payment improvements

      +Among the improvements we made: + +* Third-party hosted payment page that redirects to a page on an entirely different domain for payment entry +* Easiest level of PCI compliance SAQ-A or SAQ A-EP depending on selected payment method +* Added the CyberSource and Worldpay payment processors +* CE and EE: Added the Braintree, PayPal, and Authorize.net payment processors + + + +

      Product attribute swatches

      +
      +Swatches provide an alternate way to display the selection of options for configurable products. Rather than choosing an option from a list, customers can make their selection by clicking a swatch. Product attribute swatches can be used on the product page, product list, and in layered navigation. + +To configure product attribute swatches, start the Magento Admin and click **Stores** > **Configuration**. All options are in the CATALOG group; for example, CATALOG > **Catalog** > **Storefront** has the option **Swatches per Product**. + +To set up attribute swatches for a product, go to **Products** > > BASIC SETTINGS > **Product Details ** > Configurations > **Create Configuration**. + +

      Transactional emails

      +Emails designed to display on all types of devices (desktop, tablet, mobile) to inform customers about store-related activities (for example, sales, promotions, new stock, and so on). + +Transactional emails provide the following benefits: + +* Email templates display consistently across all supported email clients +* Email templates can be distributed as a part of a theme +* Email templates work with Magento internationalization + +Transactional email templates are provided with the blank and Luma themes that ship with the Magento application. + +To use transactional emails, log in to the Magento Admin and click **Marketing** > Communications > **Email Templates**. For more information, see Customizing Email Templates. + +

      Import and export

      +Import and export enable you to do any of the following in one operation: + +* Add new products to your inventory +* Update your product data and advanced price data +* Replace a set of products + +Import and export includes product and advanced price entities. In comparison with the Magento 1.x import and export, Magento 2 has improved performance, a simplified file structure, and better error descriptions. + +For large catalogs especially, it's much easier to export the data, edit the data in a spreadsheet, and then import the data back into your store. + +To use import and export, log in to the Magento Admin and click **System** > Data Transfer > **Import** or **System** > Data Transfer > **Export**. + +

      Join directive

      +* Created a Join directive, join process for tables, and XML configuration support to define a performant join for search services. +* Changed the return type from `\Magento\Sales\Api\Data\OrderSearchResultInterface[]` to `\Magento\Sales\Api\Data\OrderInterface[]` in the API method `getList` in `Magento\Sales\Api\Data\OrderSearchResultInterface` +* Changed return type from `\Magento\Sales\Api\Data\InvoiceSearchResultInterface` to `\Magento\Sales\Api\Data\InvoiceCommentSearchResultInterface` in the API method `getList` in `Magento\Sales\Api\InvoiceCommentRepositoryInterface` + +

      Uninstall and backup

      +We've added the ability to back up and roll back to at any time: + +* The Magento 2 file system +* The `pub/media` directories +* The Magento 2 database + +You can also uninstall any of the following after optionally backing up: + +* Modules +* Themes +* Language packages + +You can roll back to an earlier backup at any time. + +

      Other changes

      +* Updated the "composer/composer" dependency to version "1.0.0-alpha10". +* The ext-xsl PHP extension is now a requirement to install the Magento software. + + This extension is typically provided with PHP on CentOS but you might need to install it on Ubuntu (`apt-get install php5-xsl`). +* We added the `pub/media/tmp` directory to the list of allowed media resources. + + For example, now when you upload an image using the product edit page, the image displays even if the product isn't saved. + +* The `pub/get.php` entry point now displays exceptions in developer mode. + +This change also enables you to get a table prefix without injecting `Magento\Framework\App\Resource` into ExtensionAttributesFactory. + +

      Backward-incompatible changes

      +This section discusses the backward-incompatible changes we made in this release. + +

      Unified connection resolving

      + +We simplified how you retrieve data from the database as follows: + +- All read/write differentiating constants, connection suffixes, and getter methods are now retrieve the resource connection instance by resource name with a fallback to the `default` connection. + +- The earlier `getAdapter`, `getDbAdapter`, `_getReadAdapter`, `getConnectionAdapter` that retrieved database connection instances have been unified to one method `getConnection()`. Old variables with the `adapter` keyword in their stored adapter instance pointer are renamed to `connection`. + +### Magento_Captcha changes + +`/Magento/Captcha/Model/Checkout/Plugin/Validation` validation moved to `Magento/Captcha/Model/Customer/Plugin/AjaxLogin` + +### Magento_Catalog changes + +#### Magento_Catalog API changes to product_sku attribute +The product link entity used as the payload for PUT, POST (`/V1/products/:sku/links`) and DELETE (`/V1/products/:sku/links/:type/:linkedProductSku`) has changed. The `product_sku` attribute is now `sku`. Examples follow: + +OLD + +{% highlight json %} +{ + "entity": { + "product_sku": "Simple_Product", + "linked_product_sku": "simple3", + "link_type": "upsell" + } +} +{% endhighlight %} + +NEW + +{% highlight json %} +{ + "entity": { + "sku": "Simple_Product", + "linked_product_sku": "simple3", + "link_type": "upsell" + } +} +{% endhighlight %} + +`link_type` is no longer specified in the REST URL. You must specify it in the payload for PUT and POST operations as follows: + +OLD + + POST: /V1/products/Simple_Product/links/related + +NEW + + POST: /V1/products/Simple_Product/links + +#### Magento_Catalog API change to stock item quantity +The new REST route URL to update stock item quantity is `/V1/products/:sku/stockItems/:itemId` + +#### Magento_Catalog argument change + +In `Magento\CatalogUrlRewrite\Model\ProductUrlPathGenerator`, we added a new argument `\Magento\Catalog\Api\ProductRepositoryInterface $productRepository` in `__construct;` + +### Magento_Checkout changes + +* We renamed `checkout_onepage_index.xml` to `checkout_index_index.xml` +* Updated the process method according to changes in checkout layout `Magento/Checkout/Block/Checkout/LayoutProcessor` +* In `Magento/Checkout/Model/DefaultConfigProvider` we added required parameters `Cart\ImageProvider`, `Magento\Directory\Model\Country\Postcode\ConfigInterface`, `Magento\Directory\Helper\Data`, `Magento\Quote\Api\Data\EstimateAddressInterfaceFactory`, +`Magento\Shipping\Model\Config`, `Magento\Store\Model\StoreManagerInterface`, `Magento\Quote\Api\PaymentMethodManagementInterface`, `Magento\Framework\App\Config\ScopeConfigInterface`, +`Magento\Store\Model\ScopeInterface`, `Magento\Quote\Api\CartTotalRepositoryInterface` + +### Magento_Config changes + +* `\Magento\Config\Model\Config\Structure\Reader` + + Add new argument `\Magento\Framework\View\TemplateEngine\Xhtml\CompilerInterface $compiler` into `__construct;` + +* `\Magento\Payment\Model\Method\AbstractMethod` + + Add new argument `\Magento\Payment\Model\Method\Logger $logger` into `__construct;` + +* `\Magento\Payment\Model\Method\Cc` + + Add new argument `\Magento\Payment\Model\Method\Logger $logger` into `__construct;` + +* `\Magento\Payment\Model\Method\Free` + + Add new argument `\Magento\Payment\Model\Method\Logger $Logger` into `__construct;` + +* `\Magento\Payment\Model\Method\Logger` + + Replace arguments for method `debug` from `($logData, ConfigInterface $config)` to `(array $debugData, array $debugReplaceKeys, $debugFlag);` + +### Magento_Email changes +Because of changes in the transactional email feature: + +* The `\Magento\Email` module was extensively refactored. +* The `\Magento\Newsletter` module was also affected. + +### Removed the Magento_GoogleShopping module +We removed the `Magento_GoogleShopping` module. + +### Magento_Quote changes +Removed: + +* `/Magento/Quote/Api/AddressDetailsManagementInterface` +* `/Magento/Quote/Api/Data/AddressDetailsInterface` +* `/Magento/Quote/Api/GuestAddressDetailsManagementInterface` +* `/Magento/Quote/Model/AddressDetails` +* `/Magento/Quote/Model/AddressDetailsManagement` +* `/Magento/Quote/Model/GuestCart/GuestAddressDetailsManagement` + +### Removed and replaced JavaScript +* `app/code/Magento/Captcha/view/frontend/web/js/view/checkout/guestCaptcha.js` replaced with `Magento/Captcha/view/frontend/web/js/view/checkout/loginCaptcha.js` +* `app/code/Magento/Captcha/view/frontend/web/js/view/checkout/registerCaptcha.js` replaced with `Magento/Captcha/view/frontend/web/js/view/checkout/loginCaptcha.js` +* `app/code/Magento/Checkout/view/frontend/web/js/view/payment/method-info.js` replaced with `Magento/Checkout/view/frontend/web/js/view/payment/default.js` +* `app/code/Magento/Checkout/view/frontend/web/js/view/progress.js` replaced with `Magento/Checkout/view/frontend/web/js/view/progress-bar` +* `app/code/Magento/Checkout/view/frontend/web/js/view/review/item/column.js` replaced with `Magento/Checkout/view/frontend/web/js/view/summary/cart-items.js` +* `app/code/Magento/Checkout/view/frontend/web/js/view/review/item/columns/price.js` replaced with `Magento/Checkout/view/frontend/web/js/view/summary/cart-items.js` +* `app/code/Magento/Checkout/view/frontend/web/js/view/review/item/columns/qty.js` replaced with `Magento/Checkout/view/frontend/web/js/view/summary/cart-items.js` +* `app/code/Magento/Checkout/view/frontend/web/js/view/shipping-address.js` replaced with `app/code/Magento/Checkout/view/frontend/web/js/view/shipping.js` +* `app/code/Magento/Checkout/view/frontend/web/js/view/shipping-method.js` replaced with `app/code/Magento/Checkout/view/frontend/web/js/view/shipping.js` +* `app/code/Magento/CheckoutAgreements/view/frontend/web/js/view/checkoutAgreements.js` replaced with `Magento/CheckoutAgreements/view/frontend/web/js/view/checkout-agreements-modal.js` +* `app/code/Magento/OfflinePayments/view/frontend/web/js/view/payment/checkmo-method.js` replaced with `OfflinePayments/view/frontend/web/js/view/payment/method-renderer/checkmo-method.js` +* `app/code/Magento/OfflinePayments/view/frontend/web/js/view/payment/purchaseorder-method.js` replaced with `OfflinePayments/view/frontend/web/js/view/payment/method-renderer/purchaseorder-method.js` + +* Removed: + + * `app/code/Magento/Checkout/view/frontend/web/js/model/addresslist.js` + * `app/code/Magento/Checkout/view/frontend/web/js/view/columns.js` + * `app/code/Magento/Checkout/view/frontend/web/js/view/discount.js` + * `app/code/Magento/Checkout/view/frontend/web/js/view/itemsAfter.js` + * `app/code/Magento/Checkout/view/frontend/web/js/view/itemsBefore.js` + * `app/code/Magento/Checkout/view/frontend/web/js/view/payment/generic.js` + * `app/code/Magento/Checkout/view/frontend/web/js/view/payment/virtual.js` + * `app/code/Magento/Checkout/view/frontend/web/js/view/subtotal.js` + * `app/code/Magento/Checkout/view/frontend/web/js/view/totals.js` + * `app/code/Magento/Checkout/view/frontend/web/js/view/review.js` + * `app/code/Magento/OfflinePayments/view/frontend/web/js/view/payment/instructions-method.js` + +### Framework changes +* We removed the method `getDefaultResult` from `\Magento\Framework\App\Action\AbstractAction` +* We removed `field_expr` support from `Magento\Framework\DB\Adapter\Pdo\Mysql::prepareSqlCondition()` +* We reduced `Zend_Db_*` libraries dependencies. All code base is cleaned up from hardcoded external library class references. + +

      Give us your feedback!

      +The Magento developer documentation team loves feedback! Please provide feedback in any of the following ways: + +* Create an issue +* Click **Edit this page on GitHub** on any topic to create a pull request +* Drop us a line on Twitter (`@MagentoDevDocs`) +* Send us e-mail + +Our contribution guidelines provide more detail about providing feedback on the code and documentation. diff --git a/guides/v2.0/release-notes/ReleaseNotes1.14.2.4EE b/guides/v2.0/release-notes/ReleaseNotes1.14.2.4EE new file mode 100644 index 00000000000..ba56289dc53 --- /dev/null +++ b/guides/v2.0/release-notes/ReleaseNotes1.14.2.4EE @@ -0,0 +1,36 @@ +--- +layout: default +group: +title: Magento Enterprise Edition Release Notes 1.14.2.4 +menu_title: +menu_node: +menu_order: +github_link: release-notes/ReleaseNotes1.14.2.4EE.md +redirect_from: +--- + +

      Release Notes

      +

      Magento Enterprise Edition 1.14.2.4

      + +We are pleased to bring to you Magento Enterprise Edition 1.14.2.4, which includes an update to , and a bundle of patches to improve the security of your Magento installation. While there are no confirmed attacks related to these issues to date, certain vulnerabilities can potentially be exploited to access customer information or take over administrator sessions. + +Important! Use Magento Enterprise 1.14.2.3 or later for all new installations and upgrades to ensure that you have the latest fixes, features, and security updates. + +

      Security Patch Bundle (SUPEE-7405 v.1.1)

      +We highly recommend all users of Magento Enterprise Edition 1.9.0.0 - 1.14.2.3 to either install the SUPEE-7405 1.1 patch bundle, or upgrade to Enterprise Edition 1.14.2.3. Visit the Magento Security Center for detailed information about the SUPEE-7405 1.1 patch bundle. + +* If you have not yet installed previous patches, please do so now to bring your system up to date. + +* Read or review Magento’s Security Best Practices and make sure that all safeguards are in place to protect your system from compromise. + +* Use this occasion to examine your system for indications of possible attack such as strange administrator accounts, unfamiliar files on the server, etc. + +* To receive direct notification from our security team regarding any emerging issues and solutions, sign up for the Security Alert Registry. + + +To download and install the patch: + +To upgrade Magento: + +See also: + diff --git a/guides/v2.0/release-notes/ReleaseNotes1.14.2.4EE.md b/guides/v2.0/release-notes/ReleaseNotes1.14.2.4EE.md new file mode 100644 index 00000000000..28326fe2f1e --- /dev/null +++ b/guides/v2.0/release-notes/ReleaseNotes1.14.2.4EE.md @@ -0,0 +1,48 @@ +--- +layout: default +group: +title: Magento Enterprise Edition Release Notes 1.14.2.4 +menu_title: +menu_node: +menu_order: +github_link: release-notes/ReleaseNotes1.14.2.4EE.md +redirect_from: +--- + +

      Release Notes

      +

      Magento Enterprise Edition 1.14.2.4

      + +We are pleased to bring to you Magento Enterprise Edition 1.14.2.4, which includes a bundle of patches to improve the security of your Magento installation. While there are no confirmed attacks related to these issues to date, certain vulnerabilities can potentially be exploited to access customer information or take over administrator sessions. + +Important! Use Magento Enterprise 1.14.2.4 or later for all new installations and upgrades to ensure that you have the latest fixes, features, and security updates. + + + +

      Security Patch Bundle (SUPEE-7405 v.1.1)

      +We highly recommend all users of Magento Enterprise Edition 1.9.0.0 - 1.14.2.3 to either install the SUPEE-7405 1.1 patch bundle, or upgrade to Enterprise Edition 1.14.2.4. You must install the preceding patch (SUPEE-7405 v1.0) *before* you install this patch. Visit the Magento Security Center for detailed information about the SUPEE-7405 1.1 patch bundle. + + + +

      Security Patch Bundle (SUPEE-7978) + + +

      Security Patch Bundle (SUPEE-7822) +The Magento SOAP API now works as expected. Previously, after installation of Patch SUPEE-7405v.0, an API request would cause a 500 error, and Magento would log an exception. + + + +* If you have not yet installed previous patches, please do so now to bring your system up to date. + +* Read or review Magento’s Security Best Practices and make sure that all safeguards are in place to protect your system from compromise. + +* Use this occasion to examine your system for indications of possible attack such as strange administrator accounts, unfamiliar files on the server, etc. + +* To receive direct notification from our security team regarding any emerging issues and solutions, sign up for the Security Alert Registry. + + +To download and install the patch: + +To upgrade Magento: + +See also: + diff --git a/guides/v2.0/release-notes/ReleaseNotes1.9.2.4CE b/guides/v2.0/release-notes/ReleaseNotes1.9.2.4CE new file mode 100644 index 00000000000..fef2d4bec68 --- /dev/null +++ b/guides/v2.0/release-notes/ReleaseNotes1.9.2.4CE @@ -0,0 +1,25 @@ +--- +layout: default +group: +title: Magento Community Edition Release Notes 1.9.2.4 +menu_title: +menu_node: +menu_order: +github_link: release-notes/1.9.2.4.md +redirect_from: +--- + +

      Release Notes

      +

      Magento Community Edition 1.9.2.4

      + +We are pleased to bring to you Magento Enterprise Edition 1.14.2.4, which includes an update to the USPS API, and a bundle of patches to improve the security of your Magento installation. While there are no confirmed attacks related to these issues to date, certain vulnerabilities can potentially be exploited to access customer information or take over administrator sessions. + +Important! Use Magento Enterprise 1.14.2.3 or later for all new installations and upgrades to ensure that you have the latest fixes, features, and security updates. + +

      Security Patch Bundle (SUPEE-7405 v.1)

      + +To download and install the patch: + +To upgrade Magento: + +See also: diff --git a/guides/v2.0/release-notes/ReleaseNotes1.9.2.4CE.md b/guides/v2.0/release-notes/ReleaseNotes1.9.2.4CE.md new file mode 100644 index 00000000000..fef2d4bec68 --- /dev/null +++ b/guides/v2.0/release-notes/ReleaseNotes1.9.2.4CE.md @@ -0,0 +1,25 @@ +--- +layout: default +group: +title: Magento Community Edition Release Notes 1.9.2.4 +menu_title: +menu_node: +menu_order: +github_link: release-notes/1.9.2.4.md +redirect_from: +--- + +

      Release Notes

      +

      Magento Community Edition 1.9.2.4

      + +We are pleased to bring to you Magento Enterprise Edition 1.14.2.4, which includes an update to the USPS API, and a bundle of patches to improve the security of your Magento installation. While there are no confirmed attacks related to these issues to date, certain vulnerabilities can potentially be exploited to access customer information or take over administrator sessions. + +Important! Use Magento Enterprise 1.14.2.3 or later for all new installations and upgrades to ensure that you have the latest fixes, features, and security updates. + +

      Security Patch Bundle (SUPEE-7405 v.1)

      + +To download and install the patch: + +To upgrade Magento: + +See also: From e3836f9089fcfe72572c280fc914838453b639fc Mon Sep 17 00:00:00 2001 From: Jeanne Frontain Date: Tue, 16 Feb 2016 13:00:47 -0600 Subject: [PATCH 198/902] added files for new patch releases --- .../release-notes/ReleaseNotes1.14.2.4EE.md | 23 +++++++++++++++---- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/guides/v2.0/release-notes/ReleaseNotes1.14.2.4EE.md b/guides/v2.0/release-notes/ReleaseNotes1.14.2.4EE.md index 28326fe2f1e..6bb56675ac2 100644 --- a/guides/v2.0/release-notes/ReleaseNotes1.14.2.4EE.md +++ b/guides/v2.0/release-notes/ReleaseNotes1.14.2.4EE.md @@ -12,23 +12,36 @@ redirect_from:

      Release Notes

      Magento Enterprise Edition 1.14.2.4

      -We are pleased to bring to you Magento Enterprise Edition 1.14.2.4, which includes a bundle of patches to improve the security of your Magento installation. While there are no confirmed attacks related to these issues to date, certain vulnerabilities can potentially be exploited to access customer information or take over administrator sessions. +We are pleased to bring to you Magento Enterprise Edition 1.14.2.4, which includes a bundle of patches to improve the security of your Magento installation. While there are no confirmed attacks related to these issues to date, certain vulnerabilities can potentially be exploited to access customer information or take over administrator sessions. + +This patch bundle also contains changes to Magento file permissions to support upload of all file types and directories. File permissions are now 0666 (previously 0640). Directory permissions are now 0777 (previously 0750). Important! Use Magento Enterprise 1.14.2.4 or later for all new installations and upgrades to ensure that you have the latest fixes, features, and security updates. +You *must* install Patch SUPEE-7405v1.0 before installing this patch unless you are running: + +* Magento EE 1.14.2.3 + +* Magento CE 1.9.2.3 + +If you running either of these versions of Magento, you do not need to install Patch SUPEE-7405v1.0 before installing this patch. +

      Security Patch Bundle (SUPEE-7405 v.1.1)

      -We highly recommend all users of Magento Enterprise Edition 1.9.0.0 - 1.14.2.3 to either install the SUPEE-7405 1.1 patch bundle, or upgrade to Enterprise Edition 1.14.2.4. You must install the preceding patch (SUPEE-7405 v1.0) *before* you install this patch. Visit the Magento Security Center for detailed information about the SUPEE-7405 1.1 patch bundle. +We highly recommend that all users of Magento Enterprise Edition 1.9.0.0 - 1.14.2.3 either install the SUPEE-7405 1.1 patch bundle, or upgrade to Enterprise Edition 1.14.2.4. + +Visit the Magento Security Center for detailed information about the SUPEE-7405 1.1 patch bundle. -

      Security Patch Bundle (SUPEE-7978) +

      Cart Merge Patch (SUPEE-7978) +Carts containing identical items now merge correctly. Previously, when you merged one cart containing an item with another cart that contained the same item, Magento did not merge cart totals appropriately. Now, your cart will display only one item. -

      Security Patch Bundle (SUPEE-7822) -The Magento SOAP API now works as expected. Previously, after installation of Patch SUPEE-7405v.0, an API request would cause a 500 error, and Magento would log an exception. +

      SOAP API Patch (SUPEE-7822) +The Magento SOAP API now works as expected. Previously, after installation of Patch SUPEE-7405v1.0, an API request would cause a 500 error, and Magento would log an exception. * If you have not yet installed previous patches, please do so now to bring your system up to date. From b60d54f0b20a9bffa5928ac36b21b5915722f6f6 Mon Sep 17 00:00:00 2001 From: Dmitry Shevtsov Date: Tue, 16 Feb 2016 21:05:29 +0200 Subject: [PATCH 199/902] broken links fixed --- common/images/mtf_tutorial_success_message.png | Bin 0 -> 37928 bytes .../v2.0/mtf/mtf_entities/mtf_fixture-repo.md | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) create mode 100644 common/images/mtf_tutorial_success_message.png diff --git a/common/images/mtf_tutorial_success_message.png b/common/images/mtf_tutorial_success_message.png new file mode 100644 index 0000000000000000000000000000000000000000..4ffb78c68246abd78dece8af4a85eae4540f6527 GIT binary patch literal 37928 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 -As you can see, the `ConfigData.xml` of the `Authorizenet` module and the `ConfigData.xml` of the `Magento_Backend` module have the same reference to the repository class; that is `Magento\Config\Test\Repository\ConfigData`. +As you can see, the `ConfigData.xml` of the [`Magento_Authorizenet` module]({{site.mage2000url}}app/code/Magento/Authorizenet) and the `ConfigData.xml` of the [`Magento_Backend` module]({{site.mage2000url}}app/code/Magento/Backend) have the same reference to the repository class; that is `Magento\Config\Test\Repository\ConfigData`. `ConfigData.php` will be generated in `/dev/tests/functional/generated/Magento/Config/Test/Repository`. This PHP repository will contain repository data sets from all Magento modules that have a `ConfigData.xml` repository. @@ -512,7 +512,7 @@ As you can see, a repository with the name `default` contains data from the `cus Credentials are stored in an `*.xml` file that is specified in `phpunit.xml`. -You can find a template for credentials in <magento2>/dev/tests/functional/credentials.xml.dist. +You can find a template for credentials in [`/dev/tests/functional/credentials.xml.dist`]({{site.mage2000url}}dev/tests/functional/credentials.xml.dist). Credentials always should stay invisible for security reasons. The MTF implicitly pastes credentials during the test run only. There are two ways to paste credentials: From b56010ee987ae7d385b3ef717442d8c7458a8ef8 Mon Sep 17 00:00:00 2001 From: stevjohnson Date: Tue, 16 Feb 2016 15:34:30 -0600 Subject: [PATCH 200/902] Add redirect for old topic --- _includes/install/composer-clone.md | 6 +++--- guides/v2.0/install-gde/prereq/dev_install.md | 1 + 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/_includes/install/composer-clone.md b/_includes/install/composer-clone.md index 6c808399ed6..a14b0d39a29 100644 --- a/_includes/install/composer-clone.md +++ b/_includes/install/composer-clone.md @@ -18,7 +18,7 @@ To install Composer: 2. Enter the following commands: -
      curl -sS https://getcomposer.org/installer | php
      -	mv composer.phar /usr/local/bin/composer
      - + curl -sS https://getcomposer.org/installer | php + mv composer.phar /usr/local/bin/composer + For additional installation options, see the Composer installation documentation. diff --git a/guides/v2.0/install-gde/prereq/dev_install.md b/guides/v2.0/install-gde/prereq/dev_install.md index 3a1a37c9fb7..2079f3e6644 100644 --- a/guides/v2.0/install-gde/prereq/dev_install.md +++ b/guides/v2.0/install-gde/prereq/dev_install.md @@ -10,6 +10,7 @@ github_link: install-gde/prereq/dev_install.md redirect_from: - /guides/v1.0/install-gde/install/composer-clone.html - /guides/v2.0/install-gde/install/composer-clone.html + - /guides/v2.0/install-gde/prereq/composer.html ---
      From b67aa1540436154275ef39c46f3c55185bce1518 Mon Sep 17 00:00:00 2001 From: Dmitry Shevtsov Date: Wed, 17 Feb 2016 12:30:02 +0200 Subject: [PATCH 201/902] - synonym group image deleted --- common/images/mtf_tutorial_success_message.png | Bin 37928 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 common/images/mtf_tutorial_success_message.png diff --git a/common/images/mtf_tutorial_success_message.png b/common/images/mtf_tutorial_success_message.png deleted file mode 100644 index 4ffb78c68246abd78dece8af4a85eae4540f6527..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 37928 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 Date: Wed, 17 Feb 2016 15:02:49 +0200 Subject: [PATCH 202/902] Added/corrected cross-links --- .../slideouts-modals-overlays/slideouts-modals-overalys.md | 5 ++++- guides/v2.0/ui-components/ui-modal.md | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/guides/v2.0/pattern-library/containers/slideouts-modals-overlays/slideouts-modals-overalys.md b/guides/v2.0/pattern-library/containers/slideouts-modals-overlays/slideouts-modals-overalys.md index 3335e1cc0cf..68f77a291c8 100644 --- a/guides/v2.0/pattern-library/containers/slideouts-modals-overlays/slideouts-modals-overalys.md +++ b/guides/v2.0/pattern-library/containers/slideouts-modals-overlays/slideouts-modals-overalys.md @@ -18,7 +18,7 @@ github_link: pattern-library/containers/slideouts-modals-overlays/slideouts-moda * Modals * Overlays * Assets - +* Technical Implementation

      Overview

      @@ -269,3 +269,6 @@ When field level validation is triggered resulting message should appear and per Download Slide-out Panels PSD source Download Modal PSD source + +

      Technical Implementation

      +Technically slideouts and modals are implemented using the [modal widget]({{site.gdeurl}}javascript-dev-guide/widgets/widget_modal.html) or the [modal UI component]({{site.gdeurl}}ui-components/ui-modal.html). \ No newline at end of file diff --git a/guides/v2.0/ui-components/ui-modal.md b/guides/v2.0/ui-components/ui-modal.md index 609a36d44c0..6a0d2006294 100644 --- a/guides/v2.0/ui-components/ui-modal.md +++ b/guides/v2.0/ui-components/ui-modal.md @@ -24,7 +24,7 @@ Similar to the widget's configuration, the component's configuration allows you The modal component can be used for both Admin panel and storefront. -For recommendations about modal windows usage from the UX point of view, see the corresponding topic in the [Magento Admin pattern library](http://devdocs.magento.com/guides/v2.0/pattern-library/bk-pattern.html). +For recommendations about modal windows usage from the UX point of view, see the corresponding topic in the [Magento Admin pattern library](http://devdocs.magento.com/guides/v2.0/pattern-library/containers/slideouts-modals-overlays/slideouts-modals-overalys.html). ## Structure From 37b9aed8bdd6d1cd58e178e0fd3331c7ab9e7718 Mon Sep 17 00:00:00 2001 From: Oleksandra Marchenko Date: Wed, 17 Feb 2016 16:14:00 +0200 Subject: [PATCH 203/902] One more minor correction --- guides/v2.0/frontend-dev-guide/themes/theme-apply.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guides/v2.0/frontend-dev-guide/themes/theme-apply.md b/guides/v2.0/frontend-dev-guide/themes/theme-apply.md index d3d3f4317e1..163d865f44a 100644 --- a/guides/v2.0/frontend-dev-guide/themes/theme-apply.md +++ b/guides/v2.0/frontend-dev-guide/themes/theme-apply.md @@ -99,5 +99,5 @@ A system message notifies you that invalidated cache types must be refreshed. ## Troubleshooting (if the changes do not get applied) -If the changes you configure in the Admin are not applied after you clear the cache and reload the page, delete all files in the `pub/static/frontend` and `var/view_preprocessing` directories, then reload the pages. You can delete the files manually or run the `grunt clean:` command in CLI. For details about using Grunt in Magento see [Installing and configuring Grunt]({{site.gdeurl}}frontend-dev-guide/css-topics/css_debug.html#grunt_prereq). +If the changes you configure in the Admin are not applied after you clear the cache and reload the page, delete all files in the `pub/static/frontend` and `var/view_preprocessed` directories, then reload the pages. You can delete the files manually or run the `grunt clean:` command in CLI. For details about using Grunt in Magento see [Installing and configuring Grunt]({{site.gdeurl}}frontend-dev-guide/css-topics/css_debug.html#grunt_prereq). From 6effc9e2839babcc3ebe9cf3b01ce75edc3a837c Mon Sep 17 00:00:00 2001 From: Dmitry Shevtsov Date: Wed, 17 Feb 2016 16:23:32 +0200 Subject: [PATCH 204/902] MAGEDOC-2409: [MTF] 'Testing Approach' Chapter - author review edits --- .../images/mtf_tutorial_success_message.png | Bin 0 -> 37928 bytes guides/v2.0/mtf/mtf_test-approach.md | 107 ++++++++++-------- 2 files changed, 57 insertions(+), 50 deletions(-) create mode 100644 common/images/mtf_tutorial_success_message.png diff --git a/common/images/mtf_tutorial_success_message.png b/common/images/mtf_tutorial_success_message.png new file mode 100644 index 0000000000000000000000000000000000000000..4ffb78c68246abd78dece8af4a85eae4540f6527 GIT binary patch literal 37928 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/dev/tests/functional/tests/app/Magento`. In this guide they are called `out-of-the-box` tests. You can use them to test default Magento functionality. +Tests usually cover functionality of a business entity. A goal is to find discrepancies between expected and real behaviour of the product. +Magento already contains functional tests in the `/dev/tests/functional/tests/app/Magento` directory. In this guide we call them `out-of-the-box` tests. You can use them to test default Magento functionality. -If you want to extend functionality you can modify existing tests or create your own functional tests using the MTF. +If you want to extend any functionality you can modify existing tests or create your own functional tests using the MTF. ## Out-of-the-box test {#out-of-the-box-test} @@ -26,7 +26,7 @@ The out-of-the-box tests are the ready to use functional tests developed by Mage ### Coverage {#coverage} -Test coverage of the out-of-the-box test depends on a module which it belongs to. The out-of-the-box tests cover basic functionality of Magento application. They test the CRUD functionality for all basic entities. The most important modules are covered better. +Test coverage of the out-of-the-box test depends on a module which it belongs to. The out-of-the-box tests cover basic functionality of Magento application. They test the CRUD functionality for all basic entities. The most important modules are covered better. ### Usage {#oob-usage} @@ -47,13 +47,15 @@ You can use out-of-the-box tests in: ### How to use {#how-to-use} -Step 1. Check the functionality manually +**Step 1.** Check the functionality manually -Pass all the test steps defined in a test case you want to use. +Pass all the test steps defined in a [test case][]. -Step 2. [Run the test][] +**Step 2.** [Run the test][] ## New functional test {#new-test} + +The MTF facilitates creation of a new test. You can create a new test extending your new test case from the out-of-the-box test, or create a completely new one. ### Extending an out-of-the-box test {#extending-oob-test} @@ -61,7 +63,7 @@ You can create a test extending from an out-of-the-box test. It is stored in the #### Usage {#ext-usage} -This approach is useful when the Magento functionality was extended, for example the minor changes were added to the existing functionality of a module. Also you can extend an out-of-the-box test to extend the current test coverage if functionality that you are interested in is not completely covered by the out-of-the-box test. +This approach is useful when the Magento functionality was extended. For example, the minor changes were made in the existing functionality of a module. Also you can extend an out-of-the-box test to extend the current test coverage if functionality that you are interested in is not completely covered by the out-of-the-box test. Example use cases: @@ -76,43 +78,44 @@ Example use cases: When new functionality or/and new modules were added to Magento you would need to create an absolutely new test to check the functionality. -New tests must be stored in corresponding modules `/dev/tests/functional/tests/app/Magento/`. +New test must be stored in the corresponding module `/dev/tests/functional/tests/app/Magento/`. Each test consists of four main components: test object, test data, test flow, test assertions. #### Test object {#test-object} -Test object is an object that you are going to test. All test actions will be performed under this object. -Test object is represented as a [fixture][]. The fixture defines properties of an object. +A test object is an object that you are going to test. All test actions will be performed under this object. +The test object is represented in a [fixture][]. The fixture defines properties of an object. #### Test data {#test-data} -Test data are data for the test and data for preconditions +Test data are data for a test and data for preconditions - - Data for a test are stored in [data set][] + - Data for the test are stored in a [data set][] - Preconditions include sample data that are stored in a [fixture repository][] and sample test entity that can be created by a [handler][]. #### Test flow {#test-flow} -Test flow is a set of test steps that you want to perform under the test object to check required functionality. Test steps are declared in a [test case][]. Each test step contains actions on a [page][]. Each action is managed by a corresponding method declared in a [block][]. +Test flow is a set of test steps that you want to perform under the test object to check required functionality. Test steps are defined in a [test case][]. Each test step contains actions related to a [page][]. Each action is managed by a corresponding method defined in a [block][]. #### Test assertions {#test-assertions} -Test assertions are represented in [constraints][]. - -To create the test entity you must fill a product creation form with data from a data set. To do it correctly you need a fixture for the simple product entity. Learn more about Fixture. -Связать в рамках одного теста. Создаваемый продукт можно назначить существующей категории или создать новую категорию для этого продукта. Чтобы создать новую категорию нужен хендлер. -Often you need to create some entity in precondition of your test case. To do this you need to create handler for Category creation in Handler directory of your module. Learn more about Handler. +A test assertion compares real test flow results with expected ones. Test assertions are represented in [constraints][]. ## Let's create a new functional test {#create-new-test} -To demonstrate usage of test components from previous sections in the test creation process we will create a new test step-by-step. Before creating automated test, try to pass it manually. +To demonstrate the usage of test components from previous sections in the test creation process we will create a new functional [injectable test][] step-by-step. Before creating automated test, try to pass it manually. + +To make documentation more consistent we created the completely new test specially for documentation needs. We used the fresh Magento functionality for the following test that is not available in 2.0.x versions, but is present in the current 2.0 version from [develop branch][]. You can [install a fresh one][] and try to follow this guide. ### Test description {#example-test-description} Create a synonym group with: -- Scope: All Websites; All Store Views; Default Store View +- Scope: + - All Websites; + - All Store Views; + - Default Store View - Synonyms: shoes, foot wear, men shoes, women shoes. For each variation the synonyms must have unique identifiers ### Manual testing scenario {#manual-test} @@ -122,7 +125,7 @@ Create a synonym group with: 3. Click on the "New Synonyms Group" button 4. Enter data in the "Synonyms" field 5. Click the "Save Synonym Group" button -6. Check the newly created entity +6. Check successful message ### Automated testing scenario {#auto-test} @@ -151,15 +154,15 @@ Enter in your terminal: cd /dev/tests/functional/utils php -f generateFixtureXml.php -- --name synonym --entity search_synonyms --collection Magento\\Search\\Model\\ResourceModel\\Query\\Collection -Probably you are curious about where we got that values from. See the following explanations. +See the following explanations. |Parameter|Value|Explanation |-|-|- |`--name`|`synonym`|It can have any name. `synonym` seems to be logical. |`--entity`|`search_synonyms`|You can track database input when you perform a [manual test][]. A new record will be created in a table that you need. -|`--collection`|`Magento\\Search\\Model\\ResourceModel\\Query\\Collection`|Synonyms are the entities of a Magento_Search module. Collection can always be find somewhere in model resources. All slashes must be escaped, that's why we use double slash `\\`. +|`--collection`|`Magento\\Search\\Model\\ResourceModel\\Query\\Collection`|Synonyms are the entities of a Magento_Search module. Collection can always be find in model resources. All slashes must be escaped `\\`. -A newly created fixture can be found in the `/dev/tests/functional/tests/app/Magento/Search/Test/Fixture` directory. +As a result of previous commands, a new brand fixture can be found in the `/dev/tests/functional/tests/app/Magento/Search/Test/Fixture` directory. ![A new Synonym fixture]({{site.baseurl}}common/images/mtf_tut_fixt.png) @@ -191,7 +194,7 @@ If we open a New Synonym Group page in a browser we see that `store_id` and `website_id` both are combined in the "Scope" fields. To set `store_id` and `website_id` we have to perform some more logic than just entering the data. That's why we should use a [data source][]. -As you probably recall, the same field is present in Magento_Widget module. It means that data source has been already written and we can e-use it. +As you probably recall, the same field is present in Magento_Widget module. It means that data source has been already written and we can reuse it. Let's check the functional tests for the Magento_Widget module. @@ -323,7 +326,7 @@ class ScopeId extends DataSource This data source: - 1. Creates a Store object `/dev/tests/functional/generated/Magento/Store/Test/Fixture/Store.php` with `scope_id` data from a data set that we will create later. This data from a data set is a name of repository `dataset` in `/dev/tests/functional/generated/Magento/Store/Test/Repository/Store.php`. A Store fixture to be generated is stored in a Store module `/dev/tests/functional/tests/app/Magento/Store/Test/Fixture/Store.xml` with a corresponding repository + 1. Creates a Store object `/dev/tests/functional/generated/Magento/Store/Test/Fixture/Store.php` with `scope_id` data from a data set that we will create later. This data from a data set is a name of a repository `dataset` in the `/dev/tests/functional/generated/Magento/Store/Test/Repository/Store.php` class. A Store fixture to be generated is stored in a Store module `/dev/tests/functional/tests/app/Magento/Store/Test/Fixture/Store.xml` with a corresponding repository `magento2/dev/tests/functional/tests/app/Magento/Store/Test/Repository/Store.xml`. 2. Gets a `name` of the `store_id`. @@ -424,7 +427,7 @@ class Synonym extends \Magento\Mtf\Fixture\InjectableFixture Now we can start creation of a [test case][]. From the [test case topic][] we know about structure, location and name of the test case. -So, let it be `/dev/tests/functional/tests/app/Magento/Search/Test/TestCase/CreateSynonymEntityTest.xml`. And we know that we must open a Search Synonym Index page and a new New Synonym Group page during the test flow. It means that we should initialize these pages in the test using the `__inject()` method of the `Magento\Mtf\TestCase\Injectable` class. Also we will definitely use the [fixture][] from the previous step. +So, let it be `/dev/tests/functional/tests/app/Magento/Search/Test/TestCase/CreateSynonymEntityTest.xml`. And we know that we must work with a Search Synonym Index page and a New Synonym Group page during the test flow. It means that we should initialize these pages in the test using an `__inject()` method of the `Magento\Mtf\TestCase\Injectable` class. Also we will definitely use the [fixture][] from the previous step. {% highlight php %} @@ -493,7 +496,7 @@ Now we can add a [data set][] with variations that cover cases in [test descript ![Created data set]({{site.baseurl}}common/images/mtf_tutor_dataset.png) -The following code contains data set, but don't have data yet +The following code contains data set, but doesn't have data yet: {% highlight xml %} @@ -515,10 +518,10 @@ The following code contains data set, but don't have data yet {% endhighlight %} -There is no need to enter a `group_id` field, because it is assigned automatically by application. We need to set `synonyms` and `scope_id` fields. +There is no need to enter data in a `group_id` field, because it is assigned automatically by application. We need to set a `synonyms` and a `scope_id` fields. - `synonyms` field. We need to [set data to a fixture field][]. So, name of the field should be `/data/`, or in our case it is `name = "synonym/data/synonyms"`. To make data unique in each variation we can use the [`%isolation%` placeholder][]. -- `scope_id` field. We need to [set data to a fixture field from a repository][]. So, name of the field should be `/data//dataset`, or in our case it is `name="synonym/data/scope_id/dataset"`. As you recall, we use data source to process this field. Data source creates Store fixture with Store repository to enter data to this field. It means that in this field we should insert name of the Store repository `dataset name` from `/dev/tests/functional/tests/app/Magento/Store/Test/Repository/Store.xml`. +- `scope_id` field. We need to [set data to a fixture field from a repository][]. So, name of the field should be `/data//dataset`, or in our case it is `name="synonym/data/scope_id/dataset"`. As you remember from [Step 2][], we use data source to process this field. Data source creates Store fixture with Store repository to enter data to this field. It means that in this field we should insert name of the Store repository `dataset name` from `/dev/tests/functional/tests/app/Magento/Store/Test/Repository/Store.xml`. | Variation # |`synonyms`|`scope_id` |--- @@ -554,7 +557,7 @@ OK, let's see the data set with data. #### Step 5. Create pages {#create-pages} -In [Step 3][] we added two [pages][] to the test case class. The both pages are in the Admin area, that's why we will create them in `/dev/tests/functional/tests/app/Magento/Search/Test/Page/Adminhtml`. This principle is a good practice, it is not obligatory. +In [Step 3][] we added two [pages][] to the test case class. The both pages are in the Admin area, that's why we will create them in the `/dev/tests/functional/tests/app/Magento/Search/Test/Page/Adminhtml` directory. This principle is a good practice, it is not obligatory. **SynonymsIndex.xml** @@ -662,7 +665,7 @@ We need a `fill()` method from the [`\Magento\Mtf\Block\Form`][] class and a map **Field mapping** -We don't need to assign parameters for the `synonyms` field, because they are the same as default values (see [nodes description table][]). The same is applicable to the `scope_id` field except type of input. The type of input here is a [custom typified element][] [`\Magento\Mtf\Client\Element\SelectstoreElement`][]. The mapping file `SynonymsForm.xml` has the following code: +We don't need to assign parameters for the `synonyms` field, because they are the same as default values (see [nodes description table][]). The same is applicable to the `scope_id` field except a type of input. The type of input here is a [custom typified element][] [`\Magento\Mtf\Client\Element\SelectstoreElement`][]. The mapping file `SynonymsForm.xml` has the following code: {% highlight xml %} @@ -677,7 +680,7 @@ We don't need to assign parameters for the `synonyms` field, because they are th {% endhighlight %} -A block class must simply extend `Magento\Mtf\Block\Form` class. Its name must contain a concatenation on the fixture name and a `Form`. Let's create a `Magento/Search/Test/Block/Adminhtml/Synonyms/Edit/SynonymsForm.php` class: +A block class must simply extend `Magento\Mtf\Block\Form` class. Its name must contain a concatenation of the fixture name and a `Form` ending. Let's create a `Magento/Search/Test/Block/Adminhtml/Synonyms/Edit/SynonymsForm.php` class: {% highlight php %} @@ -703,7 +706,7 @@ class SynonymsForm extends Form ![Form mapping block]({{site.baseurl}}common/images/mtf_tutorial_block_mapping.png) -Now we can add the `SynonymsForm.php` block class to the `SynonymsNews.xml` page object. To identify a form block on the HTML page we use a `id='page:main-container'` css selector. +Now we can add the `SynonymsForm.php` block class to the `SynonymsNews.xml` page object. To identify a form block on the HTML page we use an `id='page:main-container'` css selector. {% highlight xml %} @@ -713,7 +716,7 @@ Now we can add the `SynonymsForm.php` block class to the `SynonymsNews.xml` page **How to 'Click the "Save Synonym Group" button'** -To operate with forms we can use a `save()` method from [`\Magento\Backend\Test\Block\FormPageActions`][] block class. +To operate with forms we can use a `save()` method from the [`\Magento\Backend\Test\Block\FormPageActions`][] block class. To use this class, it must be added to the the `SynonymsNews.xml` page. The `.page-main-actions` css selector will help to identify a UI block with the button on the HTML page. @@ -808,7 +811,7 @@ All methods are defined in blocks ([Step 6][]) that are grouped in pages ([Step **Log in to Admin and open Search Synonym page** -In the MTF the process of logging in doesn't require a special method and is performed automatically when any page from Admin is opened. A method we will use is an `open()` method of the `Magento/Mtf/Page/BackendPage` class. There is no need to add this class in `use`, because it is inherited from the `Magento/Search/Test/Page/Adminhtml/SynonymsIndex` class. +In the MTF the process of logging in doesn't require a special method and is performed automatically when any page from the Admin is opened. A method which we will use is an `open()` method of the `Magento/Mtf/Page/BackendPage` class. There is no need to add this class in `use`, because it is inherited from the `Magento/Search/Test/Page/Adminhtml/SynonymsIndex` class. {% highlight php startinline=1 %} @@ -826,7 +829,7 @@ $this->synonymsIndex->getPageActionsBlock()->addNew(); {% endhighlight %} -Clicking on the button calls opening of the New Synonym Group page. + This action opens the New Synonym Group page. **Enter data according to a data set** @@ -860,18 +863,18 @@ public function test(Synonym $synonym) { // Steps $this->synonymsIndex->open(); // logs in to Admin, opens Search Synonyms page - $this->synonymsIndex->getPageActionsBlock()->addNew(); // receiving of the page action block with _rootElement containing locator which is indicated in the page class for PageActionBlock from the page, makes 'click' action on it + $this->synonymsIndex->getPageActionsBlock()->addNew(); // receiving of the page action block with '_rootElement' containing locator which is indicated in the page class for PageActionBlock from the page, makes 'click' action on it $this->synonymsNew->getSynonymForm()->fill($synonym); // enters data from variation in the New Synonym Group fields - $this->synonymsNew->getFormPageActions()->save(); // makes `click` action on the Save Synonym Group button + $this->synonymsNew->getFormPageActions()->save(); // `click` on the Save Synonym Group button } {% endhighlight %} #### Step 9. Check the test run -Now is everything ready to run the test (except assertion that we will create in the next step). +Now it is everything ready to run the test (except assertion that we will create in the next step). -Full test case code: +The full test case code: {% highlight php %} @@ -948,13 +951,13 @@ Selenium must perform three cycles of the test flow in a browser. Three cycles c #### Step 10. Create an assertion {#create-assertion} -A last item in the test description says that the test must check appearance of a message about the successful save after a test flow. +A last item in the test description says that the test must check appearance of a message about successful saving after a test flow. ![Message about the successful save]({{site.baseurl}}common/images/mtf_tutorial_success_message.png) -To cover this, we should create a test assertion ([constraint][]) and add the full class name to a variation of the data set. +To cover this, we should create the test assertion ([constraint][]) and add the full class name to a variation of the data set. -Fortunately, this assertion is popular among functional tests, and we can search by phrase "SuccessSaveMassage". Let's select from the list of results a [`\Magento\Customer\Test\Constraint\AssertCustomerSuccessSaveMessage`][] class. It has the following code: +Fortunately, this type of assertion is popular among functional tests, and we can search it by phrase "SuccessSaveMassage". Let's select from the list of results a [`\Magento\Customer\Test\Constraint\AssertCustomerSuccessSaveMessage`][] class. It has the following code: {% highlight php %} @@ -1008,7 +1011,7 @@ class AssertCustomerSuccessSaveMessage extends AbstractConstraint {% endhighlight %} -Making a simple adoption we can create a constrain class that we need `\Magento\Search\Test\Constraint\AssertSynonymSuccessSaveMessage`: +Making a simple adoption we can create a constraint class that we need `\Magento\Search\Test\Constraint\AssertSynonymSuccessSaveMessage`: {% highlight php %} @@ -1100,6 +1103,7 @@ That's it! [repository addition]: {{site.gdeurl}}mtf/mtf_entities/mtf_fixture.html#mtf_fixture_repositoy [block overriding]: {{site.gdeurl}}mtf/mtf_entities/mtf_block.html [handler overriding]: {{site.gdeurl}}mtf/mtf_entities/mtf_handler.html +[install a fresh one]: {{site.gdeurl}}install-gde/prereq/dev_install.html [fixture]: {{site.gdeurl}}mtf/mtf_entities/mtf_fixture.html [data set]: {{site.gdeurl}}mtf/mtf_entities/mtf_dataset.html @@ -1108,6 +1112,7 @@ That's it! [handler]: {{site.gdeurl}}mtf/mtf_entities/mtf_handler.html [test case]: {{site.gdeurl}}mtf/mtf_entities/mtf_testcase.html [test case topic]: {{site.gdeurl}}mtf/mtf_entities/mtf_testcase.html +[injectable test]: {{site.gdeurl}}mtf/mtf_entities/mtf_testcase.html [block]: {{site.gdeurl}}mtf/mtf_entities/mtf_block.html [block mapping]: {{site.gdeurl}}mtf/mtf_entities/mtf_block.html#mtf_block_mapping [nodes description table]: {{site.gdeurl}}mtf/mtf_entities/mtf_block.html#mtf_block_form_xml_nodes @@ -1128,18 +1133,20 @@ That's it! [manual test]: #manual-test [test description]: #auto-test +[Step 2]: #create-test-object [Step 3]: #create-init-test-case [Step 5]: #create-pages [Step 6]: #create-blocks [Step 7]: #add-blocks-to-pages - +[develop branch]: https://github.com/magento/magento2 [`\Magento\Backend\Test\Block\FormPageActions`]: {{site.mage2000url}}dev/tests/functional/tests/app/Magento/Backend/Test/Block/GridPageActions.php [`\Magento\Mtf\Block\Form`]: https://github.com/magento/mtf/blob/develop/Magento/Mtf/Block/Form.php [`\Magento\Mtf\Client\Element\SelectstoreElement`]: {{site.mage2000url}}dev/tests/functional/lib/Magento/Mtf/Client/Element/SelectstoreElement.php [`\Magento\Backend\Test\Block\FormPageActions`]: {{site.mage2000url}}dev/tests/functional/tests/app/Magento/Backend/Test/Block/FormPageActions.php [`\Magento\Customer\Test\Constraint\AssertCustomerSuccessSaveMessage`]: {{site.mage2000url}}dev/tests/functional/tests/app/Magento/Customer/Test/Constraint/AssertCustomerSuccessSaveMessage.php + *[MTF]: Magento Testing Framework From 30f49aa848dd65ad21dd701edf31832d963bad83 Mon Sep 17 00:00:00 2001 From: stevjohnson Date: Wed, 17 Feb 2016 08:46:51 -0600 Subject: [PATCH 205/902] Fix redirect --- guides/v2.0/ui-components/ui-component.md | 1 - 1 file changed, 1 deletion(-) diff --git a/guides/v2.0/ui-components/ui-component.md b/guides/v2.0/ui-components/ui-component.md index 658360847f6..24b370a9702 100644 --- a/guides/v2.0/ui-components/ui-component.md +++ b/guides/v2.0/ui-components/ui-component.md @@ -10,7 +10,6 @@ redirect_from: /guides/v2.0/ui-library/ui-component.html ---

      Overview of UI components

      - Magento UI components are designed for simple and flexible UI rendering. They allow you to configure the page manipulating the UI components. Magento UI components are implemented as a standard module and can be found under Magento\UI namespace. From a38d29f1c29f0f1cda7e48c618721347c0e1f36e Mon Sep 17 00:00:00 2001 From: stevjohnson Date: Wed, 17 Feb 2016 08:56:25 -0600 Subject: [PATCH 206/902] Fix redirect --- guides/v2.0/ui-components/ui-component.md | 1 - 1 file changed, 1 deletion(-) diff --git a/guides/v2.0/ui-components/ui-component.md b/guides/v2.0/ui-components/ui-component.md index 24b370a9702..c1bf1b75850 100644 --- a/guides/v2.0/ui-components/ui-component.md +++ b/guides/v2.0/ui-components/ui-component.md @@ -6,7 +6,6 @@ title: Overview menu_title: Overview menu_node: parent github_link: ui-components/ui-component.md -redirect_from: /guides/v2.0/ui-library/ui-component.html ---

      Overview of UI components

      From 7ff3c3d73141f5df942093b90f6c4849be673724 Mon Sep 17 00:00:00 2001 From: stevjohnson Date: Wed, 17 Feb 2016 08:58:56 -0600 Subject: [PATCH 207/902] Fix redirect --- guides/v2.0/ui-components/ui-component.md | 1 + 1 file changed, 1 insertion(+) diff --git a/guides/v2.0/ui-components/ui-component.md b/guides/v2.0/ui-components/ui-component.md index c1bf1b75850..45f3269cfbb 100644 --- a/guides/v2.0/ui-components/ui-component.md +++ b/guides/v2.0/ui-components/ui-component.md @@ -6,6 +6,7 @@ title: Overview menu_title: Overview menu_node: parent github_link: ui-components/ui-component.md +redirect_from: /guides/v2.0/ui-library/ui-component.html ---

      Overview of UI components

      From 7d26ef05e44c38d3a3fbdd6b3a305cab1db32f5e Mon Sep 17 00:00:00 2001 From: stevjohnson Date: Wed, 17 Feb 2016 09:44:28 -0600 Subject: [PATCH 208/902] Fix redirect --- guides/v2.0/ui-components/ui-component.md | 1 - 1 file changed, 1 deletion(-) diff --git a/guides/v2.0/ui-components/ui-component.md b/guides/v2.0/ui-components/ui-component.md index 45f3269cfbb..e258d83d5c0 100644 --- a/guides/v2.0/ui-components/ui-component.md +++ b/guides/v2.0/ui-components/ui-component.md @@ -34,7 +34,6 @@ All components can be configured both for Admin and storefront.

      Using UI component in layout file

      - Using UI component is as simple as adding the following code to the appropriate layout section: `` From 9e15055c9816c1845935acf1de8eb30a046798f1 Mon Sep 17 00:00:00 2001 From: stevjohnson Date: Wed, 17 Feb 2016 09:53:29 -0600 Subject: [PATCH 209/902] Fix redirect --- guides/v2.0/ui-components/ui-component.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guides/v2.0/ui-components/ui-component.md b/guides/v2.0/ui-components/ui-component.md index e258d83d5c0..c9245c37d43 100644 --- a/guides/v2.0/ui-components/ui-component.md +++ b/guides/v2.0/ui-components/ui-component.md @@ -6,7 +6,7 @@ title: Overview menu_title: Overview menu_node: parent github_link: ui-components/ui-component.md -redirect_from: /guides/v2.0/ui-library/ui-component.html +redirect_from: /guides/v2.0/ui-library/ui-library-component.html ---

      Overview of UI components

      From 1a0d1b8f813e5ea5617bb0577691bf5e019d6ec1 Mon Sep 17 00:00:00 2001 From: Jeanne Frontain Date: Wed, 17 Feb 2016 10:03:04 -0600 Subject: [PATCH 210/902] added content to CE 1.x file --- .../release-notes/ReleaseNotes1.14.2.4EE.md | 8 ++-- .../release-notes/ReleaseNotes1.9.2.4CE.md | 39 +++++++++++++++++-- 2 files changed, 40 insertions(+), 7 deletions(-) diff --git a/guides/v2.0/release-notes/ReleaseNotes1.14.2.4EE.md b/guides/v2.0/release-notes/ReleaseNotes1.14.2.4EE.md index 6bb56675ac2..5f6e8eab64a 100644 --- a/guides/v2.0/release-notes/ReleaseNotes1.14.2.4EE.md +++ b/guides/v2.0/release-notes/ReleaseNotes1.14.2.4EE.md @@ -14,17 +14,17 @@ redirect_from: We are pleased to bring to you Magento Enterprise Edition 1.14.2.4, which includes a bundle of patches to improve the security of your Magento installation. While there are no confirmed attacks related to these issues to date, certain vulnerabilities can potentially be exploited to access customer information or take over administrator sessions. -This patch bundle also contains changes to Magento file permissions to support upload of all file types and directories. File permissions are now 0666 (previously 0640). Directory permissions are now 0777 (previously 0750). +This patch bundle also contains changes to Magento file permissions that support the upload of all file types and directories. File permissions are now 0666 (previously 0640). Directory permissions are now 0777 (previously 0750). Important! Use Magento Enterprise 1.14.2.4 or later for all new installations and upgrades to ensure that you have the latest fixes, features, and security updates. -You *must* install Patch SUPEE-7405v1.0 before installing this patch unless you are running: +You must install Patch SUPEE-7405 v1.0 before installing this patch unless you are running: * Magento EE 1.14.2.3 * Magento CE 1.9.2.3 -If you running either of these versions of Magento, you do not need to install Patch SUPEE-7405v1.0 before installing this patch. +If you running either of these versions of Magento, you do not need to install Patch SUPEE-7405 v1.0 before installing this patch. @@ -41,7 +41,7 @@ Carts containing identical items now merge correctly. Previously, when you merge

      SOAP API Patch (SUPEE-7822) -The Magento SOAP API now works as expected. Previously, after installation of Patch SUPEE-7405v1.0, an API request would cause a 500 error, and Magento would log an exception. +The Magento SOAP API now works as expected. Previously, after installation of patch SUPEE-7405 v1.0, an API request would cause a 500 error, and Magento would log an exception. * If you have not yet installed previous patches, please do so now to bring your system up to date. diff --git a/guides/v2.0/release-notes/ReleaseNotes1.9.2.4CE.md b/guides/v2.0/release-notes/ReleaseNotes1.9.2.4CE.md index fef2d4bec68..ca73a990f6a 100644 --- a/guides/v2.0/release-notes/ReleaseNotes1.9.2.4CE.md +++ b/guides/v2.0/release-notes/ReleaseNotes1.9.2.4CE.md @@ -12,11 +12,44 @@ redirect_from:

      Release Notes

      Magento Community Edition 1.9.2.4

      -We are pleased to bring to you Magento Enterprise Edition 1.14.2.4, which includes an update to the USPS API, and a bundle of patches to improve the security of your Magento installation. While there are no confirmed attacks related to these issues to date, certain vulnerabilities can potentially be exploited to access customer information or take over administrator sessions. +We are pleased to bring to you Magento Community Edition 1.9.2.4, which includes a bundle of patches to improve the security of your Magento installation. While there are no confirmed attacks related to these issues to date, certain vulnerabilities can potentially be exploited to access customer information or take over administrator sessions. -Important! Use Magento Enterprise 1.14.2.3 or later for all new installations and upgrades to ensure that you have the latest fixes, features, and security updates. +This patch bundle also contains changes to Magento file permissions that support the upload of all file types and directories. File permissions are now 0666 (previously 0640). Directory permissions are now 0777 (previously 0750). + +Important! Use Magento Enterprise 1.14.2.4 or later for all new installations and upgrades to ensure that you have the latest fixes, features, and security updates. + +You must install Patch SUPEE-7405 v1.0 before installing this patch unless you are running: + +* Magento EE 1.14.2.3 + +* Magento CE 1.9.2.3 + +If you running either of these versions of Magento, you do not need to install Patch SUPEE-7405 v1.0 before installing this patch. + +

      Security Patch Bundle (SUPEE-7405 v.1.1)

      +We highly recommend that all users of Magento Enterprise Edition 1.9.0.0 - 1.14.2.3 either install the SUPEE-7405 1.1 patch bundle, or upgrade to Enterprise Edition 1.14.2.4. + +Visit the Magento Security Center for detailed information about the SUPEE-7405 1.1 patch bundle. + + + +

      Cart Merge Patch (SUPEE-7978) +Carts containing identical items now merge correctly. Previously, when you merged one cart containing an item with another cart that contained the same item, Magento did not merge cart totals appropriately. Now, your cart will display only one item. + + + +

      SOAP API Patch (SUPEE-7822) +The Magento SOAP API now works as expected. Previously, after installation of patch SUPEE-7405 v1.0, an API request would cause a 500 error, and Magento would log an exception. + + +* If you have not yet installed previous patches, please do so now to bring your system up to date. + +* Read or review Magento’s Security Best Practices and make sure that all safeguards are in place to protect your system from compromise. + +* Use this occasion to examine your system for indications of possible attack such as strange administrator accounts, unfamiliar files on the server, etc. + +* To receive direct notification from our security team regarding any emerging issues and solutions, sign up for the Security Alert Registry. -

      Security Patch Bundle (SUPEE-7405 v.1)

      To download and install the patch: From 4f6b32184d42358953b4f3e36f5985e723cd81bd Mon Sep 17 00:00:00 2001 From: Jeanne Frontain Date: Wed, 17 Feb 2016 10:15:07 -0600 Subject: [PATCH 211/902] fixed h2 issue --- guides/v2.0/release-notes/ReleaseNotes1.14.2.4EE.md | 4 ++-- guides/v2.0/release-notes/ReleaseNotes1.9.2.4CE.md | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/guides/v2.0/release-notes/ReleaseNotes1.14.2.4EE.md b/guides/v2.0/release-notes/ReleaseNotes1.14.2.4EE.md index 5f6e8eab64a..9334d04bd27 100644 --- a/guides/v2.0/release-notes/ReleaseNotes1.14.2.4EE.md +++ b/guides/v2.0/release-notes/ReleaseNotes1.14.2.4EE.md @@ -35,12 +35,12 @@ Visit the Magento Security Center for detailed information about the SUPEE-7405 -

      Cart Merge Patch (SUPEE-7978) +

      Cart Merge Patch (SUPEE-7978)

      Carts containing identical items now merge correctly. Previously, when you merged one cart containing an item with another cart that contained the same item, Magento did not merge cart totals appropriately. Now, your cart will display only one item. -

      SOAP API Patch (SUPEE-7822) +

      SOAP API Patch (SUPEE-7822)

      The Magento SOAP API now works as expected. Previously, after installation of patch SUPEE-7405 v1.0, an API request would cause a 500 error, and Magento would log an exception. diff --git a/guides/v2.0/release-notes/ReleaseNotes1.9.2.4CE.md b/guides/v2.0/release-notes/ReleaseNotes1.9.2.4CE.md index ca73a990f6a..6d1a6df4235 100644 --- a/guides/v2.0/release-notes/ReleaseNotes1.9.2.4CE.md +++ b/guides/v2.0/release-notes/ReleaseNotes1.9.2.4CE.md @@ -33,12 +33,12 @@ Visit the Magento Security Center for detailed information about the SUPEE-7405 -

      Cart Merge Patch (SUPEE-7978) +

      Cart Merge Patch (SUPEE-7978)

      Carts containing identical items now merge correctly. Previously, when you merged one cart containing an item with another cart that contained the same item, Magento did not merge cart totals appropriately. Now, your cart will display only one item. -

      SOAP API Patch (SUPEE-7822) +

      SOAP API Patch (SUPEE-7822)

      The Magento SOAP API now works as expected. Previously, after installation of patch SUPEE-7405 v1.0, an API request would cause a 500 error, and Magento would log an exception. From 6267fb61aded37c14693cdb167d036a1fc9340da Mon Sep 17 00:00:00 2001 From: Kevin Harper Date: Wed, 17 Feb 2016 14:49:20 -0600 Subject: [PATCH 212/902] first round of updates --- .../authentication/gs-authentication-oauth.md | 211 ++++++++++-------- 1 file changed, 117 insertions(+), 94 deletions(-) diff --git a/guides/v2.0/get-started/authentication/gs-authentication-oauth.md b/guides/v2.0/get-started/authentication/gs-authentication-oauth.md index a7d99bf2845..bd2fd59aa91 100644 --- a/guides/v2.0/get-started/authentication/gs-authentication-oauth.md +++ b/guides/v2.0/get-started/authentication/gs-authentication-oauth.md @@ -9,9 +9,11 @@ github_link: get-started/authentication/gs-authentication-oauth.md redirect_from: /guides/v1.0/get-started/authentication/gs-authentication-oauth.html --- -

      Third-party applications that integrate with Magento can use OAuth-based authentication as one of the ways to access Magento Web APIs. This authentication method uses an OAuth 1.0a handshake process.

      -

      For details about OAuth 1.0a, see The OAuth 1.0 Protocol.

      -

      To configure your third-party application (represented as an Integration in Magento) to use OAuth-based authentication to access Magento's Web APIs, read these sections:

      +Third-party applications that integrate with Magento can use OAuth-based authentication as one of the ways to access Magento Web APIs. This authentication method uses an OAuth 1.0a handshake process. + +For details about OAuth 1.0a, see [The OAuth 1.0 Protocol](https://tools.ietf.org/html/rfc5849) + +To configure your third-party application (represented as an Integration in Magento) to use OAuth-based authentication to access Magento's Web APIs, read these sections:

      +

      Integration registration

      -

      As a merchant, you must register your external application as an Integration with the Magento Instance. Integration can be registered in the Magento admin (System > Extensions > Integrations) OR

      -

      You can register Integration through Magento Connect. After successful registration, Magento Connect generates a configuration file. If you choose not to register the Integration through Magento Connect, you can manually create the configuration file and make it available to merchants.

      -

      An Integration contains details like the endpoint that receives Oauth credentials and list of APIs to which access is requested.

      + +As a merchant, you must register your external application as an Integration with the Magento Instance. Integration can be registered in the Magento admin (System > Extensions > Integrations). + +An Integration contains details like the endpoint that receives Oauth credentials and list of APIs to which access is requested.

      HTTP POST with OAuth credentials

      -

      This is the preceding step before the 2-legged Oauth handshake starts. Only an administrator with access to Integration grid in the backend can initiate this.

      -

      An admin may choose to select "Save and Activate" during integration creation or click on "Activate" against a previously saved integration from the Integration grid.

      -

      This action submits the credentials to the endpoint specified when creating the Integration

      -

      The use of an HTTPS for the endpoint to pass credentials eliminates this risk to a certain extent.

      -

      HTTP POST from Magento to the Integration endpoint will contain these attributes:

      -
        -
      • Magento store URL. For example, http://my-magento-store.com/.
      • -
      • oauth_verifier
      • -
      • OAuth consumer key
      • -
      • OAuth consumer key secret
      • -
      -

      Integrations use the passed credentials to get a request token, which is a pre-authorized token. Integrations then use credentials plus the request token to get a long-lived access token.

      + +This is the preceding step before the 2-legged Oauth handshake starts. Only an administrator with access to Integration grid in the backend can initiate this. + +An admin may choose to select **Save and Activate** during integration creation or click on **Activate** against a previously saved integration from the Integration grid. + +This action submits the credentials to the endpoint specified when creating the Integration. + +The use of an HTTPS for the endpoint to pass credentials eliminates this risk to a certain extent. + +HTTP POST from Magento to the Integration endpoint will contain these attributes: + +* Magento store URL. For example, `http://my-magento-store.com/`. +* oauth_verifier +* OAuth consumer key +* OAuth consumer key secret + +Integrations use the passed credentials to get a request token, which is a pre-authorized token. Integrations then use credentials plus the request token to get a long-lived access token.

      2-legged Oauth Handshake

      + +The process of completing the Oauth handshake requires that you + +* [Get a request token](#pre-auth-token) +* [Get an access token](#get-access-token) +

      Get a request token

      -

      This is the first step in the 2-legged Oauth handshake. However, you must use these credentials to get an access token in fewer than three minutes or the credentials are disabled for security reasons. The credentials expiry can be changed from backend by the administrator. As stated previously, its defaulted to three minutes

      -

      A request token is a temporary token that the user exchanges for an access token. To get a request token from Magento:

      -
      POST /oauth/token/request
      -

      You must include these request parameters in the Authorization request header in the call:

      -
        -
      • oauth_consumer_key. The consumer key value that you retrieve after you register the application.
      • -
      • oauth_nonce. A random value that is uniquely generated by the application.
      • -
      • oauth_signature_method. The name of the signature method used to sign the request. Must have this value: HMAC-SHA1.
      • -
      • oauth_signature. A generated value (signature).
      • -
      • oauth_timestamp. A positive integer, expressed in the number of seconds since January 1, 1970 00:00:00 GMT.
      • -
      • oauth_version. The OAuth version.
      • -
      -

      A valid response looks like this:

      -
      oauth_token=4cqw0r7vo0s5goyyqnjb72sqj3vxwr0h&oauth_token_secret=rig3x3j5a9z5j6d4ubjwyf9f1l21itrr
      + +This is the first step in the 2-legged Oauth handshake. However, you must use these credentials to get an access token in less than three minutes, or the credentials are disabled for security reasons. The credentials expiry can be changed from the admin panel. + +A request token is a temporary token that the user exchanges for an access token. To get a request token from Magento: + +`POST /oauth/token/request` + +You must include these request parameters in the `Authorization` request header in the call: + +* `oauth_consumer_key`. The consumer key value that you retrieve after you register the application. +* `oauth_signature_method`. The name of the signature method used to sign the request. Must have this value: `HMAC-SHA1`. +* `oauth_signature`. A generated value (signature). +* `oauth_nonce`. A random value that is uniquely generated by the application. +* `oauth_timestamp`. A positive integer, expressed in the number of seconds since January 1, 1970 00:00:00 GMT. +* `oauth_version`. The OAuth version. + +The response contains these fields: + +* `oauth_token`. The token to be used when requesting an access token. +* `oauth_token_secret`. A secret value that establishes ownership of the token. + +A valid response looks like this: + +`oauth_token=4cqw0r7vo0s5goyyqnjb72sqj3vxwr0h&oauth_token_secret=rig3x3j5a9z5j6d4ubjwyf9f1l21itrr`

      Get an access token

      -

      To get an access token from Magento:

      -
      POST /oauth/token/access
      -

      You must include these request parameters in the Authorization request header in the call:

      -
        -
      • oauth_consumer_key. The consumer key value provided after the registration of the application.
      • -
      • oauth_nonce. A random value, uniquely generated by the application.
      • -
      • oauth_signature_method. The name of the signature method used to sign the request. Can have one of the following values: HMAC-SHA1, RSA-SHA1, or PLAINTEXT.
      • -
      • oauth_signature. A generated value (signature).
      • -
      • oauth_timestamp. A positive integer, expressed in the number of seconds since January 1, 1970 00:00:00 GMT.
      • -
      • oauth_token. The oauth_token value, or request token, obtained in Get a request token.
      • -
      • oauth_verifier. The verification code that is tied to the consumer and request token.
      • -
      -

      A valid response looks like this:

      -
      oauth_token=0lnuajnuzeei2o8xcddii5us77xnb6v0&oauth_token_secret=1c6d2hycnir5ygf39fycs6zhtaagx8pd
      -

      The response contains these fields:

      -
        -
      • oauth_token. The access token that provides access to protected resources.
      • -
      • oauth_token_secret. The secret that is associated with the access token.
      • + +The customer cannot use the request token until it has been authorized. To get an access token from Magento: + +`POST /oauth/token/access` + +You must include these request parameters in the `Authorization` request header in the call: + +* `oauth_consumer_key`. The consumer key value provided after the registration of the application. +* `oauth_nonce`. A random value, uniquely generated by the application. +* `oauth_signature_method`. The name of the signature method used to sign the request. Can have one of the following values: `HMAC-SHA1`, `RSA-SHA1`, or `PLAINTEXT`. +* `oauth_signature`. A generated value (signature). +* `oauth_timestamp`. A positive integer, expressed in the number of seconds since January 1, 1970 00:00:00 GMT. +* `oauth_token`. The `oauth_token` value, or request token, obtained in Get a request token. +* `oauth_verifier`. The verification code that is tied to the consumer and request token. + +A valid response looks like this: +`oauth_token=0lnuajnuzeei2o8xcddii5us77xnb6v0&oauth_token_secret=1c6d2hycnir5ygf39fycs6zhtaagx8pd` + +The response contains these fields: +* `oauth_token`. The access token that provides access to protected resources. +* `oauth_token_secret`. The secret that is associated with the access token.

      Access the web APIs

      -

      After the Integration is authorized to make API calls, 3rd party applications (registered as Integrations in Magento) can invoke Magento web APIs by using the access token.

      -

      To use the access token to make web API calls:

      -
      GET /rest/V1/products/1234
      -

      You must include these request parameters in the Authorization request header in the call:

      -
        -
      • - oauth_consumer_key. The customer key value provided after the registration of the application. -
      • -
      • - oauth_nonce. A random value, uniquely generated by the application. -
      • -
      • - oauth_signature_method. The name of the signature method used to sign the request. Valid values are: HMAC-SHA1, RSA-SHA1, and PLAINTEXT. -
      • -
      • - oauth_signature. A generated value (signature). -
      • -
      • - oauth_timestamp. A positive integer, expressed in the number of seconds since January 1, 1970 00:00:00 GMT. -
      • -
      • oauth_token. The oauth_token, or access token, value obtained in Get an access token.
      • -
      + +After the Integration is authorized to make API calls, 3rd party applications (registered as Integrations in Magento) can invoke Magento web APIs by using the access token. + +To use the access token to make web API calls: + +`GET /rest/V1/products/1234` + +You must include these request parameters in the `Authorization` request header in the call: + +* `oauth_consumer_key`. The customer key value provided after the registration of the application. +* `oauth_nonce`. A random value, uniquely generated by the application. +* `oauth_signature_method`. The name of the signature method used to sign the request. Valid values are: `HMAC-SHA1`, `RSA-SHA1`, and `PLAINTEXT`. +* `oauth_signature`. A generated value (signature). +* `oauth_timestamp`. A positive integer, expressed in the number of seconds since January 1, 1970 00:00:00 GMT. +* `oauth_token`. The `oauth_token`, or access token, value obtained in Get an access token. +

      The OAuth signature

      -

      All Ouath handshake requests and Web Api requests include the signature as part of Authorization header. Its generated as follows:

      -

      You concatenate a set of URL-encoded attributes and parameters to construct the signature base string.

      -

      Use the ampersand (&) character to concatenate these attributes and parameters:

      -
        -
      1. HTTP method
      2. -
      3. URL
      4. -
      5. oauth_nonce
      6. -
      7. oauth_signature_method
      8. -
      9. oauth_timestamp
      10. -
      11. oauth_version
      12. -
      13. oauth_consumer_key
      14. -
      15. oauth_token
      16. -
      - -

      To generate the signature, you must use the HMAC-SHA1 signature method. - The signing key is the concatenated values of the consumer secret and token secret separated by the ampersand (&) character (ASCII code 38), even if empty. You must use parameter encoding to encode each value. -

      + +All OAuth handshake requests and Web Api requests include the signature as part of Authorization header. Its generated as follows: + +You concatenate a set of URL-encoded attributes and parameters to construct the signature base string. + +Use the ampersand (`&`) character to concatenate these attributes and parameters: + + +1. HTTP method +2. URL +3. `oauth_nonce` +4. `oauth_signature_method` +5. `oauth_timestamp` +6. `oauth_version` +7. `oauth_consumer_key` +8. `oauth_token` + +To generate the signature, you must use the HMAC-SHA1 signature method. + The signing key is the concatenated values of the consumer secret and token secret separated by the ampersand (`&`) character (ASCII code 38), even if empty. You must use parameter encoding to encode each value.

      OAuth error codes

      -

      When the third-party application makes an invalid request to Magento, the following OAuth-related errors can occur:

      +When the third-party application makes an invalid request to Magento, the following OAuth-related errors can occur: + @@ -216,11 +241,9 @@ redirect_from: /guides/v1.0/get-started/authentication/gs-authentication-oauth.h

      Next step

      Related topic

      From 006851e0799d6e1ddc7463c3cdda130bc0c9f4e3 Mon Sep 17 00:00:00 2001 From: stevjohnson Date: Wed, 17 Feb 2016 16:24:48 -0600 Subject: [PATCH 213/902] MAGETWO-45613. Add note about inability to change XSDs for Magento-provided XMLs --- .../v2.0/extension-dev-guide/build/XSD-XML-validation.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/guides/v2.0/extension-dev-guide/build/XSD-XML-validation.md b/guides/v2.0/extension-dev-guide/build/XSD-XML-validation.md index 6152b414f95..fe83232c48d 100644 --- a/guides/v2.0/extension-dev-guide/build/XSD-XML-validation.md +++ b/guides/v2.0/extension-dev-guide/build/XSD-XML-validation.md @@ -14,16 +14,19 @@ redirect_from: /guides/v2.0/extension-dev-guide/XSD-XML-validation.html Each Magento module can contain XSD files for XML validation. -Magento uses [Uniform Resource Names](https://en.wikipedia.org/wiki/Uniform_Resource_Name) (URNs) to reference XML Schema declarations. +Magento uses [Uniform Resource Names](https://en.wikipedia.org/wiki/Uniform_Resource_Name) (URNs) to reference XML schema declarations. Magento supported URNs begin with `urn:magento`. Magento supports two XSD reference types: * Module XSD * Framework XSD +
      + +

      You cannot change the XSD for any XML files provided with the Magento application.

      +
      ###Module XSD - The syntax for the module XSD is a colon separated declaration. An example follows: `urn:magento:module:Magento_Flow:flows/content.xsd` @@ -38,7 +41,6 @@ where ###Framework XSD - The syntax for the framework XSD is a colon separated declaration. An example follows: `urn:magento:framework:Api/etc/extension_attributes.xsd From bc5dc14b44e428433f706bba3545ac2c777d7e96 Mon Sep 17 00:00:00 2001 From: Dmitry Shevtsov Date: Thu, 18 Feb 2016 13:10:30 +0200 Subject: [PATCH 214/902] MAGETWO-48062: Publish backward incompatible changes on Price Rule and Reminder to devdocs - framework changes added --- guides/v2.0/release-notes/changes_2.0.md | 35 +++++++++++++++++++++--- 1 file changed, 31 insertions(+), 4 deletions(-) diff --git a/guides/v2.0/release-notes/changes_2.0.md b/guides/v2.0/release-notes/changes_2.0.md index dee4e88f5bf..38137746bc5 100644 --- a/guides/v2.0/release-notes/changes_2.0.md +++ b/guides/v2.0/release-notes/changes_2.0.md @@ -8,16 +8,39 @@ menu_node: github_link: release-notes/changes_2.0.md --- -This topic discusses backward-incompatible changes since the Magento 2.0 General Availability (GA) release in November 2015. +This topic discusses backward-incompatible changes for Magento 2.0.x releases. * TOC {:toc} -## Module Magento_Catalog +## Magento 2.0.2 -### Setup version 2.0.4 changes +### Framework -You can check the `setup_version` parameter in [`/app/code/Magento/Catalog/etc/module.xml`][]. +* a `convertConfigTimeToUtc()` method is added to the `lib/internal/Magento/Framework/Stdlib/DateTime/TimezoneInterface` interface. To implement this interface, please implement this method. +* a `convertConfigTimeToUtc` method is added to the `lib/internal/Magento/Framework/Stdlib/DateTime/Timezone ` + +### Magento_CatalogRule module + +#### DB schema changes + +* From the `catalogrule` table the following rows were deleted: `sub_is_enable`, `sub_simple_action`, `sub_discount_amount` +* From the `catalogrule_product` table the following rows were deleted: `sub_simple_action`, `sub_discount_amount` + +#### UI changes + +* The **Subproduct discounts** dropdown on a catalog price rule was deleted, including **Apply** and **Discount Amount** subfields. + +|--- +| Setup version 2.0.0 | Setup version 2.0.1 +|-|:- +| ![OLD - Adding a new catalog price rule]({{site.baseurl}}common/images/backw_chang_cat_pr_rul_200.png 'OLD - Adding a new catalog price rule') | ![NEW - Adding a new catalog price rule]({{site.baseurl}}common/images/backw_chang_cat_pr_rul_201.png 'NEW - Adding a new catalog price rule') + +#### Flow changes + +* The functionality of adding a price rule to the subproduct was deleted + +### Magento_Catalog module #### Code changes @@ -109,3 +132,7 @@ When **Products -> Categories** menu item in the Magento Admin is chosen, the fi [`/app/code/Magento/Catalog/etc/module.xml`]: https://github.com/magento/magento2/blob/bbc0e893539cad4ee415dd458dece7cd36d44cdc/app/code/Magento/Catalog/etc/module.xml [`/app/code/Magento/Catalog/view/adminhtml/ui_component/category_form.xml`]: https://github.com/magento/magento2/blob/bbc0e893539cad4ee415dd458dece7cd36d44cdc/app/code/Magento/Catalog/view/adminhtml/ui_component/category_form.xml + + + +*[UI]: User Interface \ No newline at end of file From 71c7bdec7bc7a824ae1d4ec4adbbe592f1567f78 Mon Sep 17 00:00:00 2001 From: Dmitry Shevtsov Date: Thu, 18 Feb 2016 13:21:02 +0200 Subject: [PATCH 215/902] MAGETWO-48062: Publish backward incompatible changes on Price Rule and Reminder to devdocs - author review edits --- guides/v2.0/release-notes/changes_2.0.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/guides/v2.0/release-notes/changes_2.0.md b/guides/v2.0/release-notes/changes_2.0.md index 38137746bc5..7e5c1935dbe 100644 --- a/guides/v2.0/release-notes/changes_2.0.md +++ b/guides/v2.0/release-notes/changes_2.0.md @@ -8,19 +8,19 @@ menu_node: github_link: release-notes/changes_2.0.md --- -This topic discusses backward-incompatible changes for Magento 2.0.x releases. +This topic discusses backward-incompatible changes for Magento 2.0. * TOC {:toc} ## Magento 2.0.2 -### Framework +### Framework changes -* a `convertConfigTimeToUtc()` method is added to the `lib/internal/Magento/Framework/Stdlib/DateTime/TimezoneInterface` interface. To implement this interface, please implement this method. +* a `convertConfigTimeToUtc()` method is added to the `lib/internal/Magento/Framework/Stdlib/DateTime/TimezoneInterface` interface. To implement this interface, please implement the method. * a `convertConfigTimeToUtc` method is added to the `lib/internal/Magento/Framework/Stdlib/DateTime/Timezone ` -### Magento_CatalogRule module +### Magento_CatalogRule module changes #### DB schema changes @@ -40,7 +40,7 @@ This topic discusses backward-incompatible changes for Magento 2.0.x releases. * The functionality of adding a price rule to the subproduct was deleted -### Magento_Catalog module +### Magento_Catalog module changes #### Code changes From 74610e38644f1a94aa2a3d84c09a8132f5425d2c Mon Sep 17 00:00:00 2001 From: stevjohnson Date: Thu, 18 Feb 2016 08:18:54 -0600 Subject: [PATCH 216/902] Remove incomplete topic --- .../install-gde/install/hosted/hosted_start.md | 1 - .../install/hosted/hosted_start_cron.md | 18 ------------------ 2 files changed, 19 deletions(-) delete mode 100644 guides/v2.0/install-gde/install/hosted/hosted_start_cron.md diff --git a/guides/v2.0/install-gde/install/hosted/hosted_start.md b/guides/v2.0/install-gde/install/hosted/hosted_start.md index 56fbaf8807f..63fc8c44f1d 100644 --- a/guides/v2.0/install-gde/install/hosted/hosted_start.md +++ b/guides/v2.0/install-gde/install/hosted/hosted_start.md @@ -20,7 +20,6 @@ If your hosted system is already set up, go to Configure a database and a database user * Configure PHP * Transfer the Magento software to your hosted system -* Set up scheduled tasks (cron) * Install the Magento software

      Verify the software on your system

      diff --git a/guides/v2.0/install-gde/install/hosted/hosted_start_cron.md b/guides/v2.0/install-gde/install/hosted/hosted_start_cron.md deleted file mode 100644 index 671acd98cc6..00000000000 --- a/guides/v2.0/install-gde/install/hosted/hosted_start_cron.md +++ /dev/null @@ -1,18 +0,0 @@ ---- -layout: default -group: -subgroup: 02_config-hosted -title: Set up scheduled tasks (cron) -menu_title: Set up scheduled tasks (cron) -menu_order: 10 -menu_node: -github_link: install-gde/install/hosted/hosted_start_cron.md ---- - -

      Set up scheduled tasks (cron)

      -*cron* is the UNIX task scheduler. Magento requires cron for quite a few things, including reindexing, automated e-mails, newsletters, sitemap, and so on. - -To set up cron on your managed server: - -1. If necessary, log in to the cPanel. -2. From 845b6e0687066e0c70f3d27218792efc69efde74 Mon Sep 17 00:00:00 2001 From: stevjohnson Date: Thu, 18 Feb 2016 09:35:36 -0600 Subject: [PATCH 217/902] Enhance description of MAGE_PROFILER --- common/images/config_depend-graphs.png | Bin 0 -> 58981 bytes .../config-guide/bootstrap/mage-profiler.md | 34 +++++++++++++----- .../bootstrap/magento-how-to-set.md | 9 ++--- 3 files changed, 31 insertions(+), 12 deletions(-) create mode 100644 common/images/config_depend-graphs.png diff --git a/common/images/config_depend-graphs.png b/common/images/config_depend-graphs.png new file mode 100644 index 0000000000000000000000000000000000000000..f6cb7a2f86e0c945b9ba1112172543979e388c19 GIT binary patch literal 58981 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 to Magento HTML profiling +* Introduction to Magento profiling * Set MAGE_PROFILER -

      Introduction to Magento HTML profiling

      -You can use an HTML profiler with Magento to perform tasks such as analyzing performance. (The nature of profiling depends on the analytical tools you use.) +

      Introduction to Magento profiling

      +Magento profiling enables you to: + +* Displays in the browser a list of objects created and marks unused objects (also referred to as *dependency graphs*). + + Unused dependency graphs occur when an object with many methods and many dependencies is instantiated and not all of its methods are called. These unused methods are created but are never used, so processor time and memory spent to creation of these dependencies are wasted. + +* Enable an HTML profiler + + You can use an HTML profiler with Magento to perform tasks such as analyzing performance. (The nature of profiling depends on the analytical tools you use.) Magento provides the base functionality in Magento\Framework\Profiler.

      Set MAGE_PROFILER

      `MAGE_PROFILER` supports the following values: -* `firebug` which uses Magento\Framework\Profiler\Driver\Standard\Output\Firebug -* `csv` which uses Magento\Framework\Profiler\Driver\Standard\Output\Csvfile -* Any other value, including an empty value, which uses Magento\Framework\Profiler\Driver\Standard\Output\Html +* `1` to enable an HTML profiler. + + You can also use one of the following values to enable a specific profiler: + + * `firebug` which uses Magento\Framework\Profiler\Driver\Standard\Output\Firebug + * `csv` which uses Magento\Framework\Profiler\Driver\Standard\Output\Csvfile + * Any other value (except `2`), including an empty value, which uses Magento\Framework\Profiler\Driver\Standard\Output\Html + +* `2` to enable dependency graphs. + + Dependency graphs typically display at the bottom of a page. The following figure shows portion of the output: + + You can set the value of `MAGE_PROFILER` in any of the ways discussed in Set the value of bootstrap parameters. \ No newline at end of file diff --git a/guides/v2.0/config-guide/bootstrap/magento-how-to-set.md b/guides/v2.0/config-guide/bootstrap/magento-how-to-set.md index a1fe80a54ec..df770128a5b 100644 --- a/guides/v2.0/config-guide/bootstrap/magento-how-to-set.md +++ b/guides/v2.0/config-guide/bootstrap/magento-how-to-set.md @@ -34,7 +34,7 @@ The following table discusses the bootstrap parameters you can set:
      - + @@ -44,7 +44,7 @@ The following table discusses the bootstrap parameters you can set:
      • Not all bootstrap parameters are documented at this time.
      • -
      • You now set the Magento mode (developer, default, production) using the magento application command.
      +
    5. You now set the Magento mode (developer, default, production) using the magento deploy:mode:set {mode} command.
    6. Specifying a parameter value using an environment variable

      @@ -140,7 +140,8 @@ To set a Magento bootstrap variable using your web server's environment: 5. Restart the web server: - service apache2 restart + * Ubuntu: `service apache2 restart` + * CentOS: `service httpd restart`

      Specify a bootstrap variable for Apache on CentOS

      This section assumes you've already set up your virtual host. If you have not, consult a resource such as this digitalocean tutorial. @@ -168,4 +169,4 @@ After setting the mode, restart the web server: * Customize base directory paths (MAGE_DIRS) * Set the Magento mode -* Enable an HTML profiler (MAGE_PROFILER) \ No newline at end of file +* Enable an dependency graphs and HTML profiler (MAGE_PROFILER) \ No newline at end of file From 321694dad45c62b0644f20cb229e6e0dfdedb5b0 Mon Sep 17 00:00:00 2001 From: Kevin Harper Date: Thu, 18 Feb 2016 09:54:46 -0600 Subject: [PATCH 218/902] added store code info --- guides/v2.0/rest/rest_endpoints.md | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/guides/v2.0/rest/rest_endpoints.md b/guides/v2.0/rest/rest_endpoints.md index 9f9dc846c20..c57b100adcc 100644 --- a/guides/v2.0/rest/rest_endpoints.md +++ b/guides/v2.0/rest/rest_endpoints.md @@ -12,11 +12,20 @@ github_link: rest/rest_endpoints.md ## REST Schema Endpoint Format To specify one or more services: -`http:///rest/default/schema&services=` +`http:///rest//schema&services=` To specify all services: -`http:///rest/default/schema` +`http:///rest//schema` + +
      +

      The value of `store_code` can be one of the following:

      +
        +
      • `default`
      • +
      • The assigned store code
      • +
      • `all`. This value only applies to the CMS and Product modules. If this value is specified, the API call affects or queries all the merchant's stores.
      • + +
      ## List of Service Names per Module @@ -208,4 +217,4 @@ taxTaxRateRepositoryV1: `http:///rest/default/schema&services=taxT taxTaxRuleRepositoryV1: `http:///rest/default/schema&services=taxTaxRuleRepositoryV1` -taxTaxClassRepositoryV1: `http:///rest/default/schema&services=taxTaxClassRepositoryV1` \ No newline at end of file +taxTaxClassRepositoryV1: `http:///rest/default/schema&services=taxTaxClassRepositoryV1` From b380af0032394a93200ec02930901a9346c114a7 Mon Sep 17 00:00:00 2001 From: Rudolph Gottesheim Date: Thu, 18 Feb 2016 18:47:43 +0100 Subject: [PATCH 219/902] Fix @magento-import -> @magento_import --- .../v2.0/frontend-dev-guide/css-topics/css-preprocess.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/guides/v2.0/frontend-dev-guide/css-topics/css-preprocess.md b/guides/v2.0/frontend-dev-guide/css-topics/css-preprocess.md index 7e8c1ec7e32..cfb31d047aa 100644 --- a/guides/v2.0/frontend-dev-guide/css-topics/css-preprocess.md +++ b/guides/v2.0/frontend-dev-guide/css-topics/css-preprocess.md @@ -101,9 +101,9 @@ For each CSS file included in the layouts, LESS preprocessor does the following: The client-side compilation flow is similar to server-side. The difference is in the set of files, published to pub/static on the last step. In the client-side mode, the following files are published to the pub/static/frontend/<Vendor>/<theme>/<locale> directory:
        -
      • root source (.less) files with resolved @magento-import directive
      • -
      • symlinks to the root source file that do not contain @magento-import
      • -
      • symlinks to the .less files included to the root source files using the imported by @magento-import and @import directives
      • +
      • root source (.less) files with resolved @magento_import directive
      • +
      • symlinks to the root source file that do not contain @magento_import
      • +
      • symlinks to the .less files included to the root source files using the imported by @magento_import and @import directives

      The @magento_import directive

      @@ -155,7 +155,7 @@ In the scope of static resources preprocessing, the built-in LESS preprocessor d
    7. Searches for all @magento_import directives.
    8. Replaces the original @magento_import directives with the standard @import directives. The latter specify the paths to the particular files that correspond to the pattern specified in @magento_import.
    9. -Example of how @magento-import is used and processed in <Magento_Blank_theme_dir>/web/css/styles-l.less: +Example of how @magento_import is used and processed in <Magento_Blank_theme_dir>/web/css/styles-l.less:
      HTTP code
      MAGE_PROFILEREnables an HTML profilerEnables dependency graphs and HTML profiling
      From fe0f8eaf1967c8a9846d03fed216537175ce5609 Mon Sep 17 00:00:00 2001 From: Kevin Harper Date: Thu, 18 Feb 2016 13:49:23 -0600 Subject: [PATCH 220/902] small updates --- .../authentication/gs-authentication-oauth.md | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/guides/v2.0/get-started/authentication/gs-authentication-oauth.md b/guides/v2.0/get-started/authentication/gs-authentication-oauth.md index bd2fd59aa91..651e2f53862 100644 --- a/guides/v2.0/get-started/authentication/gs-authentication-oauth.md +++ b/guides/v2.0/get-started/authentication/gs-authentication-oauth.md @@ -13,7 +13,7 @@ Third-party applications that integrate with Magento can use OAuth-based authent For details about OAuth 1.0a, see [The OAuth 1.0 Protocol](https://tools.ietf.org/html/rfc5849) -To configure your third-party application (represented as an Integration in Magento) to use OAuth-based authentication to access Magento's Web APIs, read these sections:

      +To configure your third-party application (represented as an Integration in Magento) to use OAuth-based authentication to access Magento's Web APIs, read these sections:
      • Integration registration
      • HTTP POST with OAuth credentials
      • @@ -32,7 +32,7 @@ To configure your third-party application (represented as an Integration in Mage As a merchant, you must register your external application as an Integration with the Magento Instance. Integration can be registered in the Magento admin (System > Extensions > Integrations). -An Integration contains details like the endpoint that receives Oauth credentials and list of APIs to which access is requested. +An integration contains details like the endpoint that receives Oauth credentials and list of APIs to which access is requested. See [Create an integration]({{ gdeurl }}/howdoi/webapi/integration.html) for information about configuring an integration

        HTTP POST with OAuth credentials

        @@ -62,7 +62,7 @@ The process of completing the Oauth handshake requires that you

        Get a request token

        -This is the first step in the 2-legged Oauth handshake. However, you must use these credentials to get an access token in less than three minutes, or the credentials are disabled for security reasons. The credentials expiry can be changed from the admin panel. +This is the first step in the 2-legged Oauth handshake. However, you must use these credentials to get an access token in less than three minutes, or the credentials are disabled for security reasons. The expiration time can be changed from the admin panel. A request token is a temporary token that the user exchanges for an access token. To get a request token from Magento: @@ -99,16 +99,16 @@ You must include these request parameters in the `Authorization` request header * `oauth_signature_method`. The name of the signature method used to sign the request. Can have one of the following values: `HMAC-SHA1`, `RSA-SHA1`, or `PLAINTEXT`. * `oauth_signature`. A generated value (signature). * `oauth_timestamp`. A positive integer, expressed in the number of seconds since January 1, 1970 00:00:00 GMT. -* `oauth_token`. The `oauth_token` value, or request token, obtained in Get a request token. +* `oauth_token`. The `oauth_token` value, or request token, obtained in [Get a request token](#pre-auth-token). * `oauth_verifier`. The verification code that is tied to the consumer and request token. A valid response looks like this: `oauth_token=0lnuajnuzeei2o8xcddii5us77xnb6v0&oauth_token_secret=1c6d2hycnir5ygf39fycs6zhtaagx8pd` The response contains these fields: + * `oauth_token`. The access token that provides access to protected resources. * `oauth_token_secret`. The secret that is associated with the access token. -

      Access the web APIs

      @@ -146,8 +146,7 @@ Use the ampersand (`&`) character to concatenate these attributes and parameters 7. `oauth_consumer_key` 8. `oauth_token` -To generate the signature, you must use the HMAC-SHA1 signature method. - The signing key is the concatenated values of the consumer secret and token secret separated by the ampersand (`&`) character (ASCII code 38), even if empty. You must use parameter encoding to encode each value. +To generate the signature, you must use the HMAC-SHA1 signature method. The signing key is the concatenated values of the consumer secret and token secret separated by the ampersand (`&`) character (ASCII code 38), even if empty. You must use parameter encoding to encode each value.

      OAuth error codes

      When the third-party application makes an invalid request to Magento, the following OAuth-related errors can occur: From d762a20facfd02728f056076f8f9c8b8cc600050 Mon Sep 17 00:00:00 2001 From: David Said Date: Fri, 19 Feb 2016 13:57:48 +1000 Subject: [PATCH 221/902] Fix the link to the dev-summary page --- guides/v2.0/extension-dev-guide/prepare/dev-summary.md | 2 +- guides/v2.0/extension-dev-guide/prepare/prepare_file-str.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/guides/v2.0/extension-dev-guide/prepare/dev-summary.md b/guides/v2.0/extension-dev-guide/prepare/dev-summary.md index 7152a788d55..0ab0b975cfc 100644 --- a/guides/v2.0/extension-dev-guide/prepare/dev-summary.md +++ b/guides/v2.0/extension-dev-guide/prepare/dev-summary.md @@ -6,7 +6,7 @@ title: Roadmap for developing and packaging components menu_title: Roadmap for developing and packaging components menu_order: 50 menu_node: -github_link: extension-dev-guide/prepare/prepare/dev-summary.md +github_link: extension-dev-guide/prepare/dev-summary.md redirect_from: - /guides/v2.0/mktpl-quickstart/dev-intro.html - /guides/v2.0/mktpl-quickstart/dev-summary.html diff --git a/guides/v2.0/extension-dev-guide/prepare/prepare_file-str.md b/guides/v2.0/extension-dev-guide/prepare/prepare_file-str.md index 39a1db4ddc1..03563c67aef 100644 --- a/guides/v2.0/extension-dev-guide/prepare/prepare_file-str.md +++ b/guides/v2.0/extension-dev-guide/prepare/prepare_file-str.md @@ -21,4 +21,4 @@ In addition, you can choose the component root directory to start development. T {% include php-dev/component-root.md %} #### Related topic -Roadmap for developing and packaging components \ No newline at end of file +Roadmap for developing and packaging components From e6872f7889554f7b93f61556af1456364f18fd39 Mon Sep 17 00:00:00 2001 From: Rudolph Gottesheim Date: Fri, 19 Feb 2016 10:25:08 +0100 Subject: [PATCH 222/902] Fix indentation in themes.js example --- guides/v2.0/frontend-dev-guide/css-topics/css_debug.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guides/v2.0/frontend-dev-guide/css-topics/css_debug.md b/guides/v2.0/frontend-dev-guide/css-topics/css_debug.md index 50c7a59f6bb..f1484d8b55b 100644 --- a/guides/v2.0/frontend-dev-guide/css-topics/css_debug.md +++ b/guides/v2.0/frontend-dev-guide/css-topics/css_debug.md @@ -91,7 +91,7 @@ module.exports = { '<path_to_file1>', //path to root source file '<path_to_file2>' ], - dsl: 'less' + dsl: 'less' }, From c4054be5ee2cf0f00ce12f0ae8151369a2546f96 Mon Sep 17 00:00:00 2001 From: Oleksandra Marchenko Date: Fri, 19 Feb 2016 12:57:00 +0200 Subject: [PATCH 223/902] Updated info about the remvoe directice --- .../layouts/xml-instructions.md | 37 +++++++++++++++---- .../themes/theme-inherit.md | 2 +- 2 files changed, 31 insertions(+), 8 deletions(-) diff --git a/guides/v2.0/frontend-dev-guide/layouts/xml-instructions.md b/guides/v2.0/frontend-dev-guide/layouts/xml-instructions.md index e8b92e48c4c..9a8c3110f7b 100644 --- a/guides/v2.0/frontend-dev-guide/layouts/xml-instructions.md +++ b/guides/v2.0/frontend-dev-guide/layouts/xml-instructions.md @@ -7,11 +7,6 @@ menu_title: Layout instructions menu_order: 2 github_link: frontend-dev-guide/layouts/xml-instructions.md --- - - -

      What's in this topic

      @@ -40,6 +35,7 @@ Use the following layout instructions to customize your layout: * <action> * <referenceBlock> and <referenceContainer> * <move> +* <remove> * <update> * <argument> @@ -185,7 +181,7 @@ Sample of usage in layout: This would add a new column to the page layout. -

      before and after attributes

      +

      before and after attributes

      To help you to position elements in a specific order suitable for design, SEO, usability, or other requirements, Magento software provides the before and after layout attributes.

      These optional attributes can be used in layout XML files to control the order of elements in their common parent. @@ -362,7 +358,12 @@ Sets the declared block or container element as a child of another element in th

      • <move> is skipped if the element to be moved is not defined.
      • If the as attribute is not defined, the current value of the element alias is used. If that is not possible, the value of the name attribute is used instead.
      • -
      • During layout generation, the <move> instruction is processed before the <remove> instruction. This means if any elements are moved to the element scheduled for removal, they will be removed as well.
      • +
      • During layout generation, the <move> + instruction is processed before the removal (set using the + remove attribute). This means if any elements are moved + to the element scheduled for removal, they will be removed as + well. +
      @@ -399,6 +400,28 @@ Sets the declared block or container element as a child of another element in th
      +

      <remove>

      + +Is used only to remove the static resources linked in a page <head> section. +For removing blocks or containers, use the <remove> attribute for <referenceBlock> and <referenceContainer>. + +Example of usage: + +{%highlight xml%} + + + + + + + + + + + + +{%endhighlight xml%} +

      <update>

      Includes a certain layout file. diff --git a/guides/v2.0/frontend-dev-guide/themes/theme-inherit.md b/guides/v2.0/frontend-dev-guide/themes/theme-inherit.md index 1c1a483602a..c6fe2b9bce0 100644 --- a/guides/v2.0/frontend-dev-guide/themes/theme-inherit.md +++ b/guides/v2.0/frontend-dev-guide/themes/theme-inherit.md @@ -137,7 +137,7 @@ To do this, they added an extending layout in `app/design/frontend/OrangeCo/oran {%highlight xml%} - + {%endhighlight xml%} From d1f58bbfb784a3c1a8bd3bcc1f81dde55a2f1813 Mon Sep 17 00:00:00 2001 From: Oleksandra Marchenko Date: Fri, 19 Feb 2016 18:28:53 +0200 Subject: [PATCH 224/902] Fixed broken links --- guides/v2.0/coding-standards/code-standard-jquery-widgets.md | 2 +- guides/v2.0/howdoi/checkout/checkout_overview.md | 2 +- guides/v2.0/howdoi/checkout/checkout_payment.md | 4 ++-- guides/v2.0/ui-components/ui-secondary-header.md | 4 ++-- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/guides/v2.0/coding-standards/code-standard-jquery-widgets.md b/guides/v2.0/coding-standards/code-standard-jquery-widgets.md index c6eab4f09d9..068498de27d 100644 --- a/guides/v2.0/coding-standards/code-standard-jquery-widgets.md +++ b/guides/v2.0/coding-standards/code-standard-jquery-widgets.md @@ -107,7 +107,7 @@ $.widget('mage.accordion', $.ui.accordion, {

    Instantiation and resources

    - +

    Additional JavaScript files used as resources by a widget

    diff --git a/guides/v2.0/howdoi/checkout/checkout_overview.md b/guides/v2.0/howdoi/checkout/checkout_overview.md index 47c8b21d8d6..9f421fa27b0 100644 --- a/guides/v2.0/howdoi/checkout/checkout_overview.md +++ b/guides/v2.0/howdoi/checkout/checkout_overview.md @@ -6,7 +6,7 @@ title: Customize Checkout menu_title: Customize Checkout menu_node: parent menu_order: 1 -github_link: frontend-dev-guide/howdoi/checkout/checkout_overview.md +github_link: howdoi/checkout/checkout_overview.md --- Magento checkout is implemented using the UI components. diff --git a/guides/v2.0/howdoi/checkout/checkout_payment.md b/guides/v2.0/howdoi/checkout/checkout_payment.md index 87511509981..45d9daa94ce 100644 --- a/guides/v2.0/howdoi/checkout/checkout_payment.md +++ b/guides/v2.0/howdoi/checkout/checkout_payment.md @@ -106,7 +106,7 @@ define( ); {%endhighlight%} -If your payment method requires credit cards information, you might use the Magento renderer implementing a credit card form: [`/view/frontend/web/js/view/payment/cc-form.js`]({{site.gdeurl}}app/code/Magento/Payment/view/frontend/web/js/view/payment/cc-form.js). It also extends the default payment renderer, but has the following own methods: +If your payment method requires credit cards information, you might use the Magento renderer implementing a credit card form: [`/view/frontend/web/js/view/payment/cc-form.js`]({{site.mage2000url}}app/code/Magento/Payment/view/frontend/web/js/view/payment/cc-form.js). It also extends the default payment renderer, but has the following own methods: @@ -306,4 +306,4 @@ In your custom module directory, create a new `/view/frontend/l {%endhighlight %} -For an illustration of `checkout_index_index.xml` where a new payment method is declared, view [`/view/frontend/layout/checkout_index_index.xml`]({{site.gdeurl}}app/code/Magento/Authorizenet/view/frontend/layout/checkout_index_index.xml) +For an illustration of `checkout_index_index.xml` where a new payment method is declared, view [app/code/Magento/Authorizenet/view/frontend/layout/checkout_index_index.xml]({{site.mage2000url}}app/code/Magento/Authorizenet/view/frontend/layout/checkout_index_index.xml) diff --git a/guides/v2.0/ui-components/ui-secondary-header.md b/guides/v2.0/ui-components/ui-secondary-header.md index d1b1e8206c4..4a97fe27d40 100644 --- a/guides/v2.0/ui-components/ui-secondary-header.md +++ b/guides/v2.0/ui-components/ui-secondary-header.md @@ -89,10 +89,10 @@ The sticky header component consists of the following elements: - Constructor: `/Magento/Ui/view/base/web/js/grid/sticky/sticky.js` - Main template: `/Magento/Ui/view/base/web/templates/grid/sticky/sticky.html` - Elements' templates: - - `/Magento/Ui/viewbase/web/templates/grid/sticky/toolbar.html` - `/Magento/Ui/view/base/web/templates/grid/sticky/listing.html` - `/Magento/Ui/view/base/web/templates/grid/sticky/filters.html` - - `/Magento/Ui/view/base/web/templates/grid/sticky/chips.html` + - `/Magento/Ui/view/base/web/templates/grid/sticky/sticky.html` +

    Dependencies

    The sticky header component depends on the following components: From ebfb904c23d0377d38207b131f55bfb71480aba4 Mon Sep 17 00:00:00 2001 From: Jeanne Frontain Date: Fri, 19 Feb 2016 10:38:08 -0600 Subject: [PATCH 225/902] added some of Piotr's comments --- guides/v2.0/release-notes/ReleaseNotes1.14.2.4EE.md | 11 ++++++++--- guides/v2.0/release-notes/ReleaseNotes1.9.2.4CE.md | 5 +++-- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/guides/v2.0/release-notes/ReleaseNotes1.14.2.4EE.md b/guides/v2.0/release-notes/ReleaseNotes1.14.2.4EE.md index 9334d04bd27..7b3e4363073 100644 --- a/guides/v2.0/release-notes/ReleaseNotes1.14.2.4EE.md +++ b/guides/v2.0/release-notes/ReleaseNotes1.14.2.4EE.md @@ -12,7 +12,7 @@ redirect_from:

    Release Notes

    Magento Enterprise Edition 1.14.2.4

    -We are pleased to bring to you Magento Enterprise Edition 1.14.2.4, which includes a bundle of patches to improve the security of your Magento installation. While there are no confirmed attacks related to these issues to date, certain vulnerabilities can potentially be exploited to access customer information or take over administrator sessions. +We are pleased to bring you Magento Enterprise Edition 1.14.2.4, which includes a bundle of patches that improve the security of your Magento installation. While there are no confirmed attacks related to these issues to date, certain vulnerabilities can potentially be exploited to access customer information or take over administrator sessions. This patch bundle also contains changes to Magento file permissions that support the upload of all file types and directories. File permissions are now 0666 (previously 0640). Directory permissions are now 0777 (previously 0750). @@ -24,12 +24,17 @@ You must install Patch SUPEE-7405 v1.0 before installing this patch unles * Magento CE 1.9.2.3 -If you running either of these versions of Magento, you do not need to install Patch SUPEE-7405 v1.0 before installing this patch. + +If you running either of these versions of Magento, or have previously installed Patch 7405 v 1.0 on an earlier version of Magento, you do not need to install Patch SUPEE-7405 v1.0 before installing this patch.

    Security Patch Bundle (SUPEE-7405 v.1.1)

    -We highly recommend that all users of Magento Enterprise Edition 1.9.0.0 - 1.14.2.3 either install the SUPEE-7405 1.1 patch bundle, or upgrade to Enterprise Edition 1.14.2.4. +We highly recommend that all users of Magento Enterprise Edition 1.9.0.0 - 1.14.2.3 either install the SUPEE-7405 1.1 Patch Bundle, or upgrade to Magento Enterprise Edition 1.14.2.4. Even if you are not having any of the issues addressed by this patch bundle, we recommend installing it. This will help prevent code conflicts with possibly future patches. + + +Security Patch Bundle (SUPEE-7405 v.1.1) includes several SUPEE patches, including SUPEE-7978 and SUPPEE-7822. So we should recommend (if one does not want to upgrade to 1.14.2.4/1.9.2.4) to (after installed v1.0) to install 1.1. + Visit the Magento Security Center for detailed information about the SUPEE-7405 1.1 patch bundle. diff --git a/guides/v2.0/release-notes/ReleaseNotes1.9.2.4CE.md b/guides/v2.0/release-notes/ReleaseNotes1.9.2.4CE.md index 6d1a6df4235..a754188dc0c 100644 --- a/guides/v2.0/release-notes/ReleaseNotes1.9.2.4CE.md +++ b/guides/v2.0/release-notes/ReleaseNotes1.9.2.4CE.md @@ -12,7 +12,7 @@ redirect_from:

    Release Notes

    Magento Community Edition 1.9.2.4

    -We are pleased to bring to you Magento Community Edition 1.9.2.4, which includes a bundle of patches to improve the security of your Magento installation. While there are no confirmed attacks related to these issues to date, certain vulnerabilities can potentially be exploited to access customer information or take over administrator sessions. +We are pleased to bring you Magento Community Edition 1.9.2.4, which includes a bundle of patches that improve the security of your Magento installation. While there are no confirmed attacks related to these issues to date, certain vulnerabilities can potentially be exploited to access customer information or take over administrator sessions. This patch bundle also contains changes to Magento file permissions that support the upload of all file types and directories. File permissions are now 0666 (previously 0640). Directory permissions are now 0777 (previously 0750). @@ -24,7 +24,8 @@ You must install Patch SUPEE-7405 v1.0 before installing this patch unles * Magento CE 1.9.2.3 -If you running either of these versions of Magento, you do not need to install Patch SUPEE-7405 v1.0 before installing this patch. + +If you running either of these versions of Magento, or have previously installed Patch 7405 v 1.0 on an earlier version of Magento, you do not need to install Patch SUPEE-7405 v1.0 before installing this patch.

    Security Patch Bundle (SUPEE-7405 v.1.1)

    We highly recommend that all users of Magento Enterprise Edition 1.9.0.0 - 1.14.2.3 either install the SUPEE-7405 1.1 patch bundle, or upgrade to Enterprise Edition 1.14.2.4. From eb653b3cab1a46b0216db4382a11b9f2df188242 Mon Sep 17 00:00:00 2001 From: Jeanne Frontain Date: Fri, 19 Feb 2016 10:48:11 -0600 Subject: [PATCH 226/902] added some of Piotr's comments --- guides/v2.0/release-notes/ReleaseNotes1.14.2.4EE.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guides/v2.0/release-notes/ReleaseNotes1.14.2.4EE.md b/guides/v2.0/release-notes/ReleaseNotes1.14.2.4EE.md index 7b3e4363073..e59bee2442d 100644 --- a/guides/v2.0/release-notes/ReleaseNotes1.14.2.4EE.md +++ b/guides/v2.0/release-notes/ReleaseNotes1.14.2.4EE.md @@ -12,7 +12,7 @@ redirect_from:

    Release Notes

    Magento Enterprise Edition 1.14.2.4

    -We are pleased to bring you Magento Enterprise Edition 1.14.2.4, which includes a bundle of patches that improve the security of your Magento installation. While there are no confirmed attacks related to these issues to date, certain vulnerabilities can potentially be exploited to access customer information or take over administrator sessions. +We are pleased to bring you Magento Enterprise Edition 1.14.2.4, which bundles improvements for issues reported to us by our merchants after installing latest Patch SUPEE-7405 or Magento Enterprise Edition Release 1.14.2.3. While there are no confirmed attacks related to these issues to date, certain vulnerabilities can potentially be exploited to access customer information or take over administrator sessions. This patch bundle also contains changes to Magento file permissions that support the upload of all file types and directories. File permissions are now 0666 (previously 0640). Directory permissions are now 0777 (previously 0750). From 5bfada8b61a79ef2b59837da733e378aee18f5e3 Mon Sep 17 00:00:00 2001 From: Jeanne Frontain Date: Fri, 19 Feb 2016 11:06:57 -0600 Subject: [PATCH 227/902] added some of Piotr's comments --- guides/v2.0/release-notes/ReleaseNotes1.14.2.4EE.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guides/v2.0/release-notes/ReleaseNotes1.14.2.4EE.md b/guides/v2.0/release-notes/ReleaseNotes1.14.2.4EE.md index e59bee2442d..dc1697bf7c4 100644 --- a/guides/v2.0/release-notes/ReleaseNotes1.14.2.4EE.md +++ b/guides/v2.0/release-notes/ReleaseNotes1.14.2.4EE.md @@ -33,7 +33,7 @@ If you running either of these versions of Magento, or have previously installed We highly recommend that all users of Magento Enterprise Edition 1.9.0.0 - 1.14.2.3 either install the SUPEE-7405 1.1 Patch Bundle, or upgrade to Magento Enterprise Edition 1.14.2.4. Even if you are not having any of the issues addressed by this patch bundle, we recommend installing it. This will help prevent code conflicts with possibly future patches. -Security Patch Bundle (SUPEE-7405 v.1.1) includes several SUPEE patches, including SUPEE-7978 and SUPPEE-7822. So we should recommend (if one does not want to upgrade to 1.14.2.4/1.9.2.4) to (after installed v1.0) to install 1.1. +Security Patch Bundle (SUPEE-7405 v.1.1) includes several SUPEE patches, including SUPEE-7978 and SUPPEE-7822. Visit the Magento Security Center for detailed information about the SUPEE-7405 1.1 patch bundle. From 6efa46a1d9552bf05e9337b25ee4cc33f419394b Mon Sep 17 00:00:00 2001 From: Jeanne Frontain Date: Fri, 19 Feb 2016 11:21:59 -0600 Subject: [PATCH 228/902] minor cleanup --- guides/v2.0/release-notes/ReleaseNotes1.14.2.4EE.md | 2 +- guides/v2.0/release-notes/ReleaseNotes1.9.2.4CE.md | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/guides/v2.0/release-notes/ReleaseNotes1.14.2.4EE.md b/guides/v2.0/release-notes/ReleaseNotes1.14.2.4EE.md index dc1697bf7c4..a812ac66e5e 100644 --- a/guides/v2.0/release-notes/ReleaseNotes1.14.2.4EE.md +++ b/guides/v2.0/release-notes/ReleaseNotes1.14.2.4EE.md @@ -16,7 +16,7 @@ We are pleased to bring you Magento Enterprise Edition 1.14.2.4, which bundles i This patch bundle also contains changes to Magento file permissions that support the upload of all file types and directories. File permissions are now 0666 (previously 0640). Directory permissions are now 0777 (previously 0750). -Important! Use Magento Enterprise 1.14.2.4 or later for all new installations and upgrades to ensure that you have the latest fixes, features, and security updates. +Important! Use Magento Enterprise Edition 1.14.2.4 or later for all new installations and upgrades to ensure that you have the latest fixes, features, and security updates. You must install Patch SUPEE-7405 v1.0 before installing this patch unless you are running: diff --git a/guides/v2.0/release-notes/ReleaseNotes1.9.2.4CE.md b/guides/v2.0/release-notes/ReleaseNotes1.9.2.4CE.md index a754188dc0c..ef8efc47292 100644 --- a/guides/v2.0/release-notes/ReleaseNotes1.9.2.4CE.md +++ b/guides/v2.0/release-notes/ReleaseNotes1.9.2.4CE.md @@ -12,11 +12,11 @@ redirect_from:

    Release Notes

    Magento Community Edition 1.9.2.4

    -We are pleased to bring you Magento Community Edition 1.9.2.4, which includes a bundle of patches that improve the security of your Magento installation. While there are no confirmed attacks related to these issues to date, certain vulnerabilities can potentially be exploited to access customer information or take over administrator sessions. +We are pleased to bring you Magento Community Edition 1.9.2.4, which bundles improvements for issues reported to us by our merchants after installing latest Patch SUPEE-7405 or Magento Community Edition Release 1.9.2.3. While there are no confirmed attacks related to these issues to date, certain vulnerabilities can potentially be exploited to access customer information or take over administrator sessions This patch bundle also contains changes to Magento file permissions that support the upload of all file types and directories. File permissions are now 0666 (previously 0640). Directory permissions are now 0777 (previously 0750). -Important! Use Magento Enterprise 1.14.2.4 or later for all new installations and upgrades to ensure that you have the latest fixes, features, and security updates. +Important! Use Magento Community Edition 1.9.2.4 or later for all new installations and upgrades to ensure that you have the latest fixes, features, and security updates. You must install Patch SUPEE-7405 v1.0 before installing this patch unless you are running: @@ -28,9 +28,9 @@ You must install Patch SUPEE-7405 v1.0 before installing this patch unles If you running either of these versions of Magento, or have previously installed Patch 7405 v 1.0 on an earlier version of Magento, you do not need to install Patch SUPEE-7405 v1.0 before installing this patch.

    Security Patch Bundle (SUPEE-7405 v.1.1)

    -We highly recommend that all users of Magento Enterprise Edition 1.9.0.0 - 1.14.2.3 either install the SUPEE-7405 1.1 patch bundle, or upgrade to Enterprise Edition 1.14.2.4. +We highly recommend that all users of Magento Community Edition 1.9.0.x either install the SUPEE-7405 1.1 Patch Bundle, or upgrade to Community Edition 1.9.2.4. -Visit the Magento Security Center for detailed information about the SUPEE-7405 1.1 patch bundle. +Visit the Magento Security Center for detailed information about the SUPEE-7405 1.1 Patch Bundle. From 5282c69df2ee0c12c0316670287f8c7e9be19233 Mon Sep 17 00:00:00 2001 From: cnanninga Date: Fri, 19 Feb 2016 12:42:47 -0600 Subject: [PATCH 229/902] Expanded info on factories and proxies --- guides/v2.0/extension-dev-guide/attributes.md | 2 +- .../backward-compatibility.md | 2 +- .../extension-dev-guide/code-generation.md | 12 +-- guides/v2.0/extension-dev-guide/depend-inj.md | 43 +--------- guides/v2.0/extension-dev-guide/factories.md | 64 ++++++++++++++ guides/v2.0/extension-dev-guide/indexing.md | 2 +- .../extension-dev-guide/message-queues.md | 2 +- guides/v2.0/extension-dev-guide/plugins.md | 2 +- guides/v2.0/extension-dev-guide/proxies.md | 86 +++++++++++++++++++ guides/v2.0/extension-dev-guide/routing.md | 2 +- .../service-to-web-service.md | 2 +- 11 files changed, 164 insertions(+), 55 deletions(-) create mode 100644 guides/v2.0/extension-dev-guide/factories.md create mode 100644 guides/v2.0/extension-dev-guide/proxies.md diff --git a/guides/v2.0/extension-dev-guide/attributes.md b/guides/v2.0/extension-dev-guide/attributes.md index f8ae2d36b76..cea61982b6f 100644 --- a/guides/v2.0/extension-dev-guide/attributes.md +++ b/guides/v2.0/extension-dev-guide/attributes.md @@ -4,7 +4,7 @@ group: extension-dev-guide subgroup: 99_Module Development title: EAV and extension attributes menu_title: EAV and extension attributes -menu_order: 7 +menu_order: 9 github_link: extension-dev-guide/attributes.md redirect_from: /guides/v1.0/extension-dev-guide/attributes.html diff --git a/guides/v2.0/extension-dev-guide/backward-compatibility.md b/guides/v2.0/extension-dev-guide/backward-compatibility.md index 7a900b0a64f..5a91c995a85 100644 --- a/guides/v2.0/extension-dev-guide/backward-compatibility.md +++ b/guides/v2.0/extension-dev-guide/backward-compatibility.md @@ -4,7 +4,7 @@ group: extension-dev-guide subgroup: 99_Module Development title: PHP developer guide menu_title: Backward compatibility -menu_order: 12 +menu_order: 14 github_link: extension-dev-guide/backward-compatibility.md redirect_from: - /guides/v1.0/architecture/index-cache/backward-compatibility.html diff --git a/guides/v2.0/extension-dev-guide/code-generation.md b/guides/v2.0/extension-dev-guide/code-generation.md index d82b325e09b..ed0028da91d 100644 --- a/guides/v2.0/extension-dev-guide/code-generation.md +++ b/guides/v2.0/extension-dev-guide/code-generation.md @@ -4,7 +4,7 @@ group: extension-dev-guide subgroup: 99_Module Development title: Code generation menu_title: Code generation -menu_order: 6 +menu_order: 8 github_link: extension-dev-guide/code-generation.md --- @@ -26,15 +26,11 @@ Provided the Magento application is not set for Factory class creates instances of a type. For example, a generated \Magento\Customer\Model\AddressFactory creates new instances of \Magento\Customer\Model\Address. The code in AddressFactory provides "typeSafety" (@return annotation) so IDEs understand the type of returned object for the Address type. +* A Factory class creates instances of a type. See Instantiating objects with factories for more information. Factories are directly referenced within application code. +* You can designate a Proxy to be generated for a type in order to ensure the type is not instantiated until it is needed. See Proxies for more information. Proxies are directly referenced within application code. -* You can designate a Proxy to be generated for a type. -A proxy is a wrapper for a base class, and the proxy must implement all functions of the base class to delegate those functions to the class. - - A proxy results in better performance because a proxy can be instantiated without instantiating its base class. The base class is instantiated only if one of its methods gets called. Therefore, if a class is used as a dependency, but takes a long time to instantiate and the class methods are used only during some paths of execution, using the proxy instead saves time. - - As a practical example, you can see the StoreManager class and then see the generated StoreManager Proxy class. +* Interceptor classes are automatically generated to facilitate Magento's plugin system. An interceptor class extends a type and is returned by the Object Manager to allow multiple plugin classes to inject logic into different methods. Interceptors work behind the scenes and are _not_ directly referenced in application code. You can also use the code compiler to generate code at any time. In Magento 2, "compiling" your application means performing code generation for any eligible class encountered by the configuration/code scanner, as well as performing a number of different dependency injection optimizations. diff --git a/guides/v2.0/extension-dev-guide/depend-inj.md b/guides/v2.0/extension-dev-guide/depend-inj.md index 9c2ecf26051..63e6e34b8a8 100644 --- a/guides/v2.0/extension-dev-guide/depend-inj.md +++ b/guides/v2.0/extension-dev-guide/depend-inj.md @@ -49,7 +49,7 @@ Factory Proxy -: Auto-generated object that implements the same interface as the original object, but unlike this original object has only one dependency—the object manager. A proxy is used for lazy loading of optional dependencies. A proxy can be used to break cyclical dependencies. For more information about proxies, see Preview of constructor injection. +: Auto-generated object that implements the same interface as the original object, but unlike this original object has only one dependency—the object manager. A proxy is used for lazy loading of optional dependencies. A proxy can be used to break cyclical dependencies. For more information, see Proxies. Lifecycle @@ -84,18 +84,6 @@ $test->execute(); ?> {% endhighlight %} - Use a proxy for expensive optional dependencies; proxies are auto-generated, no coding is required. - -A sample proxy (which you declare in `di.xml`) follows: - -{% highlight XML %} - - - Magento\Backend\Model\Config\Structure\Element\Group\Proxy - - -{% endhighlight %} -

    Configuration overview

    @@ -426,38 +414,13 @@ Non-injectable You must observe the following rules: * Injectables can request other injectables in the constructor, but non-injectables *cannot* request other objects in a constructor -* If a business function of an injectable object is to produce non-injectables, the injectable must ask for a factory in its constructor (due to the fact that factories are injectables) +* If a business function of an injectable object is to produce non-injectables, the injectable must ask for a factory in its constructor (due to the fact that factories are injectables) * If a business function of an injectable object is to perform some actions on a non-injectable, it must receive the non-injectable as a method argument -You can create non-injectables in services with object factories or you can pass them in as method parameters. +You can create non-injectables in services with object factories or you can pass them in as method parameters. Do not push injectables to non-injectables because it violates the Law of Demeter and requires additional lookup during object unserialization. -

    Factories

    -Factories are special objects that have only one purpose: to create an instance of one non-injectable class or interface. Unlike other objects, factories are allowed to depend on the object manager. Factories are used to isolate object manager from business code: - - - -{% highlight PHP %} -_objectManager = $objectManager; - } - - public function create($sourceData = null) - { - return $this->_objectManager->create('Magento\Core\Model\Config\Base', array('sourceData' => $sourceData)); - } -} ?> -{% endhighlight %} - -Most factories are simple, so developers do not have to bother with writing them. If a non-existent factory is encountered by object manager in runtime mode or compiler, the object manager generates the factory. -

    Compiler tool

    To compile all non-existent proxies and factories; and to pre-compile class definitions, inheritance information, and plugin definitions for multiple stores or websites, see one of the following topics: diff --git a/guides/v2.0/extension-dev-guide/factories.md b/guides/v2.0/extension-dev-guide/factories.md new file mode 100644 index 00000000000..5a090b2f9bf --- /dev/null +++ b/guides/v2.0/extension-dev-guide/factories.md @@ -0,0 +1,64 @@ +--- +layout: default +group: extension-dev-guide +subgroup: 99_Module Development +title: Instantiating objects with factories +menu_title: Instantiating objects with factories +menu_order: 6 +github_link: extension-dev-guide/factories.md +--- +##{{page.menu_title}} + +The most common way to request and work with objects in Magento is via constructor injection. Objects obtained this way (i.e., injectable classes) follow a singleton pattern, whereby the same instance is always returned by the Object Manager whenever a class is requested. + +Most development also requires working with objects that are individual instances of classes (e.g., a model representing a database entity). These are known as non-injectables and are not obtained directly via constructor injection. The prescribed way of instantiating such objects is via factories. + +Factories are special objects that have only one purpose: to create an instance of one non-injectable class or interface. Unlike other objects, factories are allowed to depend on the object manager. Factories are used to isolate object manager from business code: + +{% highlight PHP %} +_objectManager = $objectManager; + } + + public function create($sourceData = null) + { + return $this->_objectManager->create('Magento\Core\Model\Config\Base', array('sourceData' => $sourceData)); + } +} ?> +{% endhighlight %} + +Factories are always named identically to the classes they instantiate, suffixed with Factory. (e.g., Magento\Cms\Model\BlockFactory is responsible for objects of the class Magento\Cms\Model\Block.) + +Factories themselves are injectables, and therefore constructor injection is still key to the process of instantiating objects. Receive a factory class via a constructor: + +{% highlight PHP %} +blockFactory = $blockFactory; +} +?> +{% endhighlight %} + +When an instance of the class is needed, use the factory to instantiate it: + +{% highlight PHP %} +blockFactory->create(); +?> +{% endhighlight %} + +The _create_ method of factories accepts an array, which will be passed as the $data array to the instantiated object. + +An important thing to understand about factories is that they are an automatically generated class type. Factory classes do not need to be explicitly defined. Simply reference a class name with Factory appended in a constructor, and Magento will automatically generate the factory class if it does not already exist. (See Code Generation for more information.) Factory classes can be explicitly defined, however, if customization of the typical factory behavior is desired for a specific class. + +The code in factories provides “typeSafety” (@return annotation) so IDEs understand the type of returned object for the type. + +Just as interfaces can be specified in constructor injection in order to obtain the best object implementing that interface (as defined in DI preferences), factories can be used for such interfaces as well. For example, requesting an object of the class Magento\Customer\Api\Data\CustomerInterfaceFactory in a constructor will result in a factory responsible for creating instances of the appropriate DI preference implementing Magento\Customer\Api\Data\CustomerInterface. \ No newline at end of file diff --git a/guides/v2.0/extension-dev-guide/indexing.md b/guides/v2.0/extension-dev-guide/indexing.md index bd7dd43be01..d55d9a63e33 100644 --- a/guides/v2.0/extension-dev-guide/indexing.md +++ b/guides/v2.0/extension-dev-guide/indexing.md @@ -4,7 +4,7 @@ group: extension-dev-guide subgroup: 99_Module Development title: Indexing menu_title: Indexing -menu_order: 10 +menu_order: 12 github_link: extension-dev-guide/indexing.md redirect_from: - /guides/v1.0/architecture/index-cache/indexing.html diff --git a/guides/v2.0/extension-dev-guide/message-queues.md b/guides/v2.0/extension-dev-guide/message-queues.md index 76ace05ca4d..b3721946a2c 100644 --- a/guides/v2.0/extension-dev-guide/message-queues.md +++ b/guides/v2.0/extension-dev-guide/message-queues.md @@ -4,7 +4,7 @@ group: extension-dev-guide subgroup: 99_Module Development title: Message Queues menu_title: Message Queues (Enterprise Edition Only) -menu_order: 15 +menu_order: 17 github_link: extension-dev-guide/message-queues.md --- diff --git a/guides/v2.0/extension-dev-guide/plugins.md b/guides/v2.0/extension-dev-guide/plugins.md index ce7a4e6e31b..c9067534bea 100644 --- a/guides/v2.0/extension-dev-guide/plugins.md +++ b/guides/v2.0/extension-dev-guide/plugins.md @@ -4,7 +4,7 @@ group: extension-dev-guide subgroup: 99_Module Development title: Magento plug-ins menu_title: Magento plug-ins -menu_order: 8 +menu_order: 10 github_link: extension-dev-guide/plugins.md redirect_from: - /guides/v1.0/extension-dev-guide/plugins.html diff --git a/guides/v2.0/extension-dev-guide/proxies.md b/guides/v2.0/extension-dev-guide/proxies.md new file mode 100644 index 00000000000..7740db35799 --- /dev/null +++ b/guides/v2.0/extension-dev-guide/proxies.md @@ -0,0 +1,86 @@ +--- +layout: default +group: extension-dev-guide +subgroup: 99_Module Development +title: Proxies +menu_title: Proxies +menu_order: 7 +github_link: extension-dev-guide/proxies.md +--- +##{{page.menu_title}} + +Magento's constructor injection pattern allows for clear and flexible management of class dependencies. However, this pattern also means that a chain reaction of object instantiation is often the result when any object is created. If a class's constructor is particularly resource intensive, this can lead to unnecessary performance impact when another class depends on it, if the expensive object does not end up being needed during a particular request. + +As an example, consider the following two classes: + +{% highlight PHP %} +slowLoading = slowLoading; + } + + public function getFastValue() + { + return 'FastLoading value'; + } + + public function getSlowValue() + { + return $this->slowLoading->getValue(); + } +} +?> +{% endhighlight %} + +The class SlowLoading has a non-trivial performance impact when instantiated (perhaps due to a complex database query or a call to a third-party web API). Because of the dependency injection in the constructor of FastLoading, this impact will also be incurred if FastLoading is instantiated. Note, however, that the SlowLoading instance is only used in the method getSlowValue, meaning that the resource cost is unnecessary if this method is never called on the FastLoading object. + +Magento has a solution for this situation: proxies. Proxies extend other classes to become lazy-loaded versions of them. That is, a real instance of the class a proxy extends is not created until one of the class's methods is actually called. A proxy implements the same interface as the original class and so can be used as a dependency anywhere the original class can. Unlike its parent, a proxy has only once dependency: the object manager. + +Proxies are generated code and therefore do not need to be manually written. (See Code Generation for more information.) Simply reference a class in the form \Original\Class\Name\Proxy, and the class will be generated if it does not exist. + +Using the above example, the constructor signature of FastLoading could be changed as follows: + +{% highlight PHP %} +slowLoading = slowLoading; + } +?> +{% endhighlight %} + +Now the SlowLoading class will not be instantiated - and therefore the resource intensive constructor operations not performed - until the SlowLoading object is used (i.e., if the getSlowValue method is called). + +The above example of directly referencing a proxy in a constructor parameter would function correctly. However, a better practice would be to leave the original interface or class reference in your constructor signature and specify the proxy via DI configuration instead: + +{% highlight XML %} + + + SlowLoading\Proxy + + +{% endhighlight %} + +In this way, proxies can be dropped in to replace their corresponding classes - or proxy replacements _removed_ - without touching application code. + +As a practical example of a proxy, you can see the StoreManager class and then see the generated StoreManager Proxy class. \ No newline at end of file diff --git a/guides/v2.0/extension-dev-guide/routing.md b/guides/v2.0/extension-dev-guide/routing.md index 8801fc0d725..030aaad5939 100644 --- a/guides/v2.0/extension-dev-guide/routing.md +++ b/guides/v2.0/extension-dev-guide/routing.md @@ -4,7 +4,7 @@ group: extension-dev-guide subgroup: 99_Module Development title: Routing menu_title: Routing -menu_order: 9 +menu_order: 11 github_link: extension-dev-guide/routing.md redirect_from: /guides/v1.0/extension-dev-guide/routing.html --- diff --git a/guides/v2.0/extension-dev-guide/service-contracts/service-to-web-service.md b/guides/v2.0/extension-dev-guide/service-contracts/service-to-web-service.md index b4ed68c7bad..e8e6b0a959d 100644 --- a/guides/v2.0/extension-dev-guide/service-contracts/service-to-web-service.md +++ b/guides/v2.0/extension-dev-guide/service-contracts/service-to-web-service.md @@ -4,7 +4,7 @@ group: extension-dev-guide subgroup: 99_Module Development title: Configure services as web APIs menu_title: Configure services as web APIs -menu_order: 11 +menu_order: 13 contributor_name: Classy Llama contributor_link: http://www.classyllama.com/ github_link: extension-dev-guide/service-contracts/service-to-web-service.md From afddcbea88dc67a579d938ec18eb2adb46e93423 Mon Sep 17 00:00:00 2001 From: Oleksandra Marchenko Date: Fri, 19 Feb 2016 20:47:22 +0200 Subject: [PATCH 230/902] Added content to Adding custom ship address renderer --- .../v2.0/howdoi/checkout/checkout_address.md | 39 ++++++++++++++++++- .../v2.0/howdoi/checkout/checkout_new_step.md | 5 +++ .../v2.0/howdoi/checkout/checkout_payment.md | 3 +- 3 files changed, 43 insertions(+), 4 deletions(-) diff --git a/guides/v2.0/howdoi/checkout/checkout_address.md b/guides/v2.0/howdoi/checkout/checkout_address.md index ddbcae7a0d2..3cbe228240b 100644 --- a/guides/v2.0/howdoi/checkout/checkout_address.md +++ b/guides/v2.0/howdoi/checkout/checkout_address.md @@ -8,6 +8,41 @@ menu_order: 8 github_link: howdoi/checkout/checkout_address.md --- ## What's in this topic -Magento uses address renderers to display shipping address details on the Shipping Information step of the checkout flow. Default address renderers cover the majority of use cases, but Magento provides way to register custom address renderer for a new address type. -

    This is a part of the bigger task of adding a custom shipping method to your Magento store.

    \ No newline at end of file +Out of the box, Magento checkout consists of two steps: + +- Shipping Information +- Review and Payment Information + +On the Shipping Information step Magento renders the shipping address form. Default address renderers cover the majority of use cases, but Magento provides way to register custom address renderer for a new address type. +

    Is it really the form?

    +

    What is meant by most use cases?

    + +This topic describes how to implement a custom shipping address renderer. + +To implement a payment method rendering in checkout, you need to take the following steps: + +1. [Create the JS renderer component (shipping address renderer).](#create) +2. Create the JS model for the shipping rate processor +3. Create the JS model for the shipping address saving processor +4. Create the JS component registering the processors +5. Create template? +

    do we need a template?

    +3. [Create a template for the payment method renderer.](#template) +4. [Declare the new components in the checkout page layout.](#layout) +5. [Add the shipping address renderer to the "Ship-To" block (optional)](#ship_to) + +All the steps are described further. + + +## Create the JS renderer component (shipping address renderer) {#create} + +Your shipping address renderer must be implemented as a UI component. That is, it must be a RequireJS module, and must return a factory function, that takes a configurable object. + + +For the sake of compatibility, upgradability and easy maintenance, do not edit the default Magento code, add your customizations in a separate module. For your checkout customization to be applied correctly, your custom module should depend on the Magento_Checkout module. Module dependencies are specified in the [module's `composer.json`]({{site.gdeurl}}extension-dev-guide/build/composer-integration.html). + +In you custom module directory create the component's `.js` file (payment method renderer). It must be located under the `/view/frontend/web/js/view/` directory. For example in the Magento modules, the payment methods renderers are stored in the `/view/frontend/web/js/view/payment/method-renderer/` directory. + +Usually, your component will extend the default payment method component (default payment method renderer) implemented in the `/view/frontend/web/js/view/payment/default.js` file. The following table contains the list of the `default` component's methods. + \ No newline at end of file diff --git a/guides/v2.0/howdoi/checkout/checkout_new_step.md b/guides/v2.0/howdoi/checkout/checkout_new_step.md index a451414c525..a38aad3682a 100644 --- a/guides/v2.0/howdoi/checkout/checkout_new_step.md +++ b/guides/v2.0/howdoi/checkout/checkout_new_step.md @@ -18,6 +18,11 @@ You can add a custom checkout step, it should be implemented as a UI component. This topic describes how to create the frontend part of the component, implementing a checkout step, and how to add it to the checkout flow. +**Contents** + +* TOC +{:toc} + ## Create the view part of the checkout step component To create the view part of the new checkout step: diff --git a/guides/v2.0/howdoi/checkout/checkout_payment.md b/guides/v2.0/howdoi/checkout/checkout_payment.md index 87511509981..509fe848f61 100644 --- a/guides/v2.0/howdoi/checkout/checkout_payment.md +++ b/guides/v2.0/howdoi/checkout/checkout_payment.md @@ -12,7 +12,6 @@ github_link: howdoi/checkout/checkout_payment.md Out of the box, Magento checkout consists of two steps: - - Shipping Information - Review and Payment Information @@ -30,7 +29,7 @@ All the steps are described further. ## Create the .js component file {#create} -Your payment method must be implemented as a UI component. For the sake of compatibility, upgradability and easy maintenance, do not edit the default Magento code, add your customizations in a separate module. For your checkout customization to be applied correctly, your custom module should depend on the Magento_Checkout module. Module dependencies are specified in the [module's `composer.json`]({{site.gdeurl}}extension-dev-guide/build/composer-integration.html). +Your payment method renderer must be implemented as a UI component. For the sake of compatibility, upgradability and easy maintenance, do not edit the default Magento code, add your customizations in a separate module. For your checkout customization to be applied correctly, your custom module should depend on the Magento_Checkout module. Module dependencies are specified in the [module's `composer.json`]({{site.gdeurl}}extension-dev-guide/build/composer-integration.html). In you custom module directory create the component's `.js` file (payment method renderer). It must be located under the `/view/frontend/web/js/view/` directory. For example in the Magento modules, the payment methods renderers are stored in the `/view/frontend/web/js/view/payment/method-renderer/` directory. From 68a5ff6f08a32ea9c82a13b50c93a403db5ad9b4 Mon Sep 17 00:00:00 2001 From: stevjohnson Date: Fri, 19 Feb 2016 12:53:06 -0600 Subject: [PATCH 231/902] Add language about keys from a shared account --- guides/v2.0/comp-mgr/bk-compman-upgrade-guide.md | 5 +++++ guides/v2.0/comp-mgr/upgrader/upgrade-start.md | 3 ++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/guides/v2.0/comp-mgr/bk-compman-upgrade-guide.md b/guides/v2.0/comp-mgr/bk-compman-upgrade-guide.md index f1f181a7ff5..d15aeebd020 100644 --- a/guides/v2.0/comp-mgr/bk-compman-upgrade-guide.md +++ b/guides/v2.0/comp-mgr/bk-compman-upgrade-guide.md @@ -31,6 +31,11 @@ The way you upgrade (that is, patch) the Magento software depends on how you ins

    System upgrade refers to updating the Magento 2.x core components and other installed components. To migrate from Magento 1.x to Magento 2, see the Migration Guide.

    +
    +

    Authorization keys from a shared account cannot be used to update or upgrade the Magento software. You must get your authorization keys from magento.com account owner.

    + +
    +

    Update components

    To update Magento components, use the Component Manager. diff --git a/guides/v2.0/comp-mgr/upgrader/upgrade-start.md b/guides/v2.0/comp-mgr/upgrader/upgrade-start.md index f52b42f9e65..79173ab1174 100644 --- a/guides/v2.0/comp-mgr/upgrader/upgrade-start.md +++ b/guides/v2.0/comp-mgr/upgrader/upgrade-start.md @@ -17,7 +17,8 @@ This section discusses how to start System Upgrade, which upgrades the version o
    -

    If you installed the Magento application by cloning the GitHub repository, you cannot use the System Upgrade utility to upgrade the software. Instead, you must update it manually.

    +
    • Authorization keys from a shared account cannot be used for upgrade. You must get your authorization keys from magento.com account owner.
    • +
    • If you installed the Magento application by cloning the GitHub repository, you cannot use the System Upgrade utility to upgrade the software. Instead, you must update it manually.

    Prerequisites

    From 4b5fc571bd3a3c176f02a983b42b7c31a3832226 Mon Sep 17 00:00:00 2001 From: Kevin Harper Date: Fri, 19 Feb 2016 14:39:37 -0600 Subject: [PATCH 232/902] added the all keyword --- guides/v2.0/rest/rest_endpoints.md | 6 +++--- guides/v2.0/soap/bk-soap.md | 11 ++++++++++- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/guides/v2.0/rest/rest_endpoints.md b/guides/v2.0/rest/rest_endpoints.md index c57b100adcc..2179be5809c 100644 --- a/guides/v2.0/rest/rest_endpoints.md +++ b/guides/v2.0/rest/rest_endpoints.md @@ -21,10 +21,10 @@ To specify all services:

    The value of `store_code` can be one of the following:

      -
    • `default`
    • +
    • default
    • The assigned store code
    • -
    • `all`. This value only applies to the CMS and Product modules. If this value is specified, the API call affects or queries all the merchant's stores.
    • - +
    • all. This value only applies to the CMS and Product modules. If this value is specified, the API call affects or queries all the merchant's stores.
    • +
    ## List of Service Names per Module diff --git a/guides/v2.0/soap/bk-soap.md b/guides/v2.0/soap/bk-soap.md index 835e6a951cc..c6e0b8fef58 100644 --- a/guides/v2.0/soap/bk-soap.md +++ b/guides/v2.0/soap/bk-soap.md @@ -16,6 +16,15 @@ Additional information about SOAP APIs will be published in a future sprint. `http:///soap/?wsdl&services=` +
    +

    The value of store_code can be one of the following:

    +
      +
    • default
    • +
    • The assigned store code
    • +
    • all. This value only applies to the CMS and Product modules. If this value is specified, the API call affects or queries all the merchant's stores.
    • +
    +
    + ## List of Service Names per Module ###Backend @@ -205,4 +214,4 @@ taxTaxRateRepositoryV1: `http:///soap/default?wsdl&services=taxTax taxTaxRuleRepositoryV1: `http:///soap/default?wsdl&services=taxTaxRuleRepositoryV1` -taxTaxClassRepositoryV1: `http:///soap/default?wsdl&services=taxTaxClassRepositoryV1` \ No newline at end of file +taxTaxClassRepositoryV1: `http:///soap/default?wsdl&services=taxTaxClassRepositoryV1` From 08b4e51debdbb01588cc1d3ad81808ff96e542a4 Mon Sep 17 00:00:00 2001 From: Kevin Harper Date: Fri, 19 Feb 2016 15:28:56 -0600 Subject: [PATCH 233/902] get operations --- guides/v2.0/rest/rest_endpoints.md | 2 +- guides/v2.0/soap/bk-soap.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/guides/v2.0/rest/rest_endpoints.md b/guides/v2.0/rest/rest_endpoints.md index 2179be5809c..6898b788391 100644 --- a/guides/v2.0/rest/rest_endpoints.md +++ b/guides/v2.0/rest/rest_endpoints.md @@ -23,7 +23,7 @@ To specify all services:
    • default
    • The assigned store code
    • -
    • all. This value only applies to the CMS and Product modules. If this value is specified, the API call affects or queries all the merchant's stores.
    • +
    • all. This value only applies to the CMS and Product modules. If this value is specified, the API call affects all the merchant's stores. GEToperations cannot be performed when you specify all.
    diff --git a/guides/v2.0/soap/bk-soap.md b/guides/v2.0/soap/bk-soap.md index c6e0b8fef58..a64d44ef857 100644 --- a/guides/v2.0/soap/bk-soap.md +++ b/guides/v2.0/soap/bk-soap.md @@ -21,7 +21,7 @@ Additional information about SOAP APIs will be published in a future sprint.
    • default
    • The assigned store code
    • -
    • all. This value only applies to the CMS and Product modules. If this value is specified, the API call affects or queries all the merchant's stores.
    • +
    • all. This value only applies to the CMS and Product modules. If this value is specified, the API call affects all the merchant's stores. getoperations cannot be performed when you specify all.
    From 570626752b0a9798a5789d51fbbb6147f960b858 Mon Sep 17 00:00:00 2001 From: stevjohnson Date: Sun, 21 Feb 2016 08:23:59 -0600 Subject: [PATCH 234/902] Review comments, proofreading --- guides/v2.0/config-guide/bootstrap/mage-profiler.md | 10 +++++----- .../v2.0/config-guide/bootstrap/magento-how-to-set.md | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/guides/v2.0/config-guide/bootstrap/mage-profiler.md b/guides/v2.0/config-guide/bootstrap/mage-profiler.md index c8d9e814f83..99365daa7e6 100644 --- a/guides/v2.0/config-guide/bootstrap/mage-profiler.md +++ b/guides/v2.0/config-guide/bootstrap/mage-profiler.md @@ -18,20 +18,20 @@ redirect_from: /guides/v1.0/config-guide/bootstrap/mage-profiler.html

    Introduction to Magento profiling

    Magento profiling enables you to: -* Displays in the browser a list of objects created and marks unused objects (also referred to as *dependency graphs*). +* Enable a built-in profiler - Unused dependency graphs occur when an object with many methods and many dependencies is instantiated and not all of its methods are called. These unused methods are created but are never used, so processor time and memory spent to creation of these dependencies are wasted. + You can use a built-in built-in profiler with Magento to perform tasks such as analyzing performance. (The nature of profiling depends on the analytical tools you use. We support multiple formats, including HTML.) -* Enable an HTML profiler +* Displays dependency graphs on a Magento page. A *dependency graph* is a list of object dependencies and all of their all their dependencies, and all the dependencies for those dependencies, and so on. - You can use an HTML profiler with Magento to perform tasks such as analyzing performance. (The nature of profiling depends on the analytical tools you use.) + You should be particularly interested in the list of *unused dependencies*, which are objects that were created because they were requested in some constructor, but were never used (that is, none of their methods were called). As a result, processor time and memory spent to create these dependencies is wasted. Magento provides the base functionality in Magento\Framework\Profiler.

    Set MAGE_PROFILER

    `MAGE_PROFILER` supports the following values: -* `1` to enable an HTML profiler. +* `1` to enable a specific profiler's output. You can also use one of the following values to enable a specific profiler: diff --git a/guides/v2.0/config-guide/bootstrap/magento-how-to-set.md b/guides/v2.0/config-guide/bootstrap/magento-how-to-set.md index df770128a5b..da75b4e9330 100644 --- a/guides/v2.0/config-guide/bootstrap/magento-how-to-set.md +++ b/guides/v2.0/config-guide/bootstrap/magento-how-to-set.md @@ -169,4 +169,4 @@ After setting the mode, restart the web server: * Customize base directory paths (MAGE_DIRS) * Set the Magento mode -* Enable an dependency graphs and HTML profiler (MAGE_PROFILER) \ No newline at end of file +* Enable an dependency graphs and built-in profiler (MAGE_PROFILER) \ No newline at end of file From 8e4993dc83cd8fe406f797d4b0d292a510b94f83 Mon Sep 17 00:00:00 2001 From: stevjohnson Date: Sun, 21 Feb 2016 08:26:59 -0600 Subject: [PATCH 235/902] Update --- guides/v2.0/config-guide/bootstrap/mage-profiler.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guides/v2.0/config-guide/bootstrap/mage-profiler.md b/guides/v2.0/config-guide/bootstrap/mage-profiler.md index 99365daa7e6..11d51ed8322 100644 --- a/guides/v2.0/config-guide/bootstrap/mage-profiler.md +++ b/guides/v2.0/config-guide/bootstrap/mage-profiler.md @@ -24,7 +24,7 @@ Magento profiling enables you to: * Displays dependency graphs on a Magento page. A *dependency graph* is a list of object dependencies and all of their all their dependencies, and all the dependencies for those dependencies, and so on. - You should be particularly interested in the list of *unused dependencies*, which are objects that were created because they were requested in some constructor, but were never used (that is, none of their methods were called). As a result, processor time and memory spent to create these dependencies is wasted. + You should be particularly interested in the list of *unused dependencies*, which are objects that were created because they were requested in some constructor, but were never used (that is, none of their methods were called). As a result, processor time and memory spent to create these dependencies are wasted. Magento provides the base functionality in Magento\Framework\Profiler. From c0d61a2133d13b63c193a33b1558a6848356ec2c Mon Sep 17 00:00:00 2001 From: stevjohnson Date: Sun, 21 Feb 2016 09:20:12 -0600 Subject: [PATCH 236/902] Proofreading part 1, factories --- guides/v2.0/extension-dev-guide/factories.md | 23 +++++++++++--------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/guides/v2.0/extension-dev-guide/factories.md b/guides/v2.0/extension-dev-guide/factories.md index 5a090b2f9bf..2a9ee0e3e22 100644 --- a/guides/v2.0/extension-dev-guide/factories.md +++ b/guides/v2.0/extension-dev-guide/factories.md @@ -9,11 +9,12 @@ github_link: extension-dev-guide/factories.md --- ##{{page.menu_title}} -The most common way to request and work with objects in Magento is via constructor injection. Objects obtained this way (i.e., injectable classes) follow a singleton pattern, whereby the same instance is always returned by the Object Manager whenever a class is requested. +The most common way to request and work with objects in Magento is using constructor injection. Objects obtained this way (that is, using injectable classes) follow a singleton pattern, whereby the same instance is always returned by the Object Manager whenever a class is requested. -Most development also requires working with objects that are individual instances of classes (e.g., a model representing a database entity). These are known as non-injectables and are not obtained directly via constructor injection. The prescribed way of instantiating such objects is via factories. +Most development also requires working with objects that are individual instances of classes (for example, a model representing a database entity). These are referred to as *non-injectables*. Non-injectiables are not obtained directly using constructor injection; instead, instantiate them using *factories*. -Factories are special objects that have only one purpose: to create an instance of one non-injectable class or interface. Unlike other objects, factories are allowed to depend on the object manager. Factories are used to isolate object manager from business code: +### Purpose of factories +Factories are special objects that have only one purpose: to create an instance of one non-injectable class or interface. Unlike other objects, factories are allowed to depend on the object manager. Factories are used to isolate the object manager from business code as the following example shows: {% highlight PHP %} {% endhighlight %} -Factories are always named identically to the classes they instantiate, suffixed with Factory. (e.g., Magento\Cms\Model\BlockFactory is responsible for objects of the class Magento\Cms\Model\Block.) +### Factories are generated classes +Factories are always named identically to the classes they instantiate, suffixed with `Factory`. (For example, `Magento\Cms\Model\BlockFactory` is responsible for objects of the class Magento\Cms\Model\Block.) +An important thing to understand about factories is that they are an automatically generated class type. Factory classes do not need to be explicitly defined. Simply reference a class name with `Factory` appended in a constructor, and Magento automatically generates the factory class if it does not already exist. (See Code generation for more information.) + +Factory classes can be explicitly defined, however, if customization of the typical factory behavior is desired for a specific class. The code in factories provides `typeSafety` (`@return` annotation) so IDEs understand the type of returned object for the type. + +### Factories are injectable Factories themselves are injectables, and therefore constructor injection is still key to the process of instantiating objects. Receive a factory class via a constructor: {% highlight PHP %} @@ -55,10 +62,6 @@ $block = $this->blockFactory->create(); ?> {% endhighlight %} -The _create_ method of factories accepts an array, which will be passed as the $data array to the instantiated object. - -An important thing to understand about factories is that they are an automatically generated class type. Factory classes do not need to be explicitly defined. Simply reference a class name with Factory appended in a constructor, and Magento will automatically generate the factory class if it does not already exist. (See Code Generation for more information.) Factory classes can be explicitly defined, however, if customization of the typical factory behavior is desired for a specific class. - -The code in factories provides “typeSafety” (@return annotation) so IDEs understand the type of returned object for the type. +The `_create_` method of factories accepts an array, which is passed as the `$data` array to the instantiated object. -Just as interfaces can be specified in constructor injection in order to obtain the best object implementing that interface (as defined in DI preferences), factories can be used for such interfaces as well. For example, requesting an object of the class Magento\Customer\Api\Data\CustomerInterfaceFactory in a constructor will result in a factory responsible for creating instances of the appropriate DI preference implementing Magento\Customer\Api\Data\CustomerInterface. \ No newline at end of file +Just as interfaces can be specified in constructor injection to obtain the best object implementing that interface (as defined in dependency injection preferences), factories can be used for such interfaces as well. For example, requesting an object of the class `Magento\Customer\Api\Data\CustomerInterfaceFactory` in a constructor results in a factory responsible for creating instances of the appropriate dependency injection preference implementing `Magento\Customer\Api\Data\CustomerInterface`. \ No newline at end of file From a1f703edc57c5da9377bf6219612f8c0b00a378f Mon Sep 17 00:00:00 2001 From: stevjohnson Date: Sun, 21 Feb 2016 09:37:59 -0600 Subject: [PATCH 237/902] Ready for spell check --- guides/v2.0/extension-dev-guide/factories.md | 2 ++ guides/v2.0/extension-dev-guide/proxies.md | 24 ++++++++++++-------- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/guides/v2.0/extension-dev-guide/factories.md b/guides/v2.0/extension-dev-guide/factories.md index 2a9ee0e3e22..efc58521847 100644 --- a/guides/v2.0/extension-dev-guide/factories.md +++ b/guides/v2.0/extension-dev-guide/factories.md @@ -5,6 +5,8 @@ subgroup: 99_Module Development title: Instantiating objects with factories menu_title: Instantiating objects with factories menu_order: 6 +contributor_name: Classy Llama +contributor_link: http://www.classyllama.com/ github_link: extension-dev-guide/factories.md --- ##{{page.menu_title}} diff --git a/guides/v2.0/extension-dev-guide/proxies.md b/guides/v2.0/extension-dev-guide/proxies.md index 7740db35799..cc64a151df1 100644 --- a/guides/v2.0/extension-dev-guide/proxies.md +++ b/guides/v2.0/extension-dev-guide/proxies.md @@ -5,11 +5,15 @@ subgroup: 99_Module Development title: Proxies menu_title: Proxies menu_order: 7 +contributor_name: Classy Llama +contributor_link: http://www.classyllama.com/ github_link: extension-dev-guide/proxies.md --- ##{{page.menu_title}} -Magento's constructor injection pattern allows for clear and flexible management of class dependencies. However, this pattern also means that a chain reaction of object instantiation is often the result when any object is created. If a class's constructor is particularly resource intensive, this can lead to unnecessary performance impact when another class depends on it, if the expensive object does not end up being needed during a particular request. +Magento's constructor injection pattern enables you to flexibly manage your class dependencies. However, constructor injection also means that a chain reaction of object instantiation is often the result when you create an object. (The original object has dependencies that have dependencies, and those objects have dependencies, and so on.) + +If a class's constructor is particularly resource-intensive, this can lead to unnecessary performance impact when another class depends on it, if the expensive object does not end up being needed during a particular request. (You can display a *dependency graph* of such objects by enabling profiling.) As an example, consider the following two classes: @@ -51,13 +55,15 @@ class FastLoading ?> {% endhighlight %} -The class SlowLoading has a non-trivial performance impact when instantiated (perhaps due to a complex database query or a call to a third-party web API). Because of the dependency injection in the constructor of FastLoading, this impact will also be incurred if FastLoading is instantiated. Note, however, that the SlowLoading instance is only used in the method getSlowValue, meaning that the resource cost is unnecessary if this method is never called on the FastLoading object. +Assume that class `SlowLoading` has a non-trivial performance impact when instantiated (perhaps due to a complex database query or a call to a third-party web API). Because of the dependency injection in the constructor of `FastLoading`, this impact is incurred if `FastLoading` is instantiated. Note, however, that the `SlowLoading` instance is used only in the method `getSlowValue`, meaning that the resource cost is unnecessary if this method is never called on the `FastLoading` object. -Magento has a solution for this situation: proxies. Proxies extend other classes to become lazy-loaded versions of them. That is, a real instance of the class a proxy extends is not created until one of the class's methods is actually called. A proxy implements the same interface as the original class and so can be used as a dependency anywhere the original class can. Unlike its parent, a proxy has only once dependency: the object manager. +### Proxies are generated code +Magento has a solution for this situation: proxies. Proxies extend other classes to become lazy-loaded versions of them. That is, a real instance of the class a proxy extends created only after one of the class's methods is actually called. A proxy implements the same interface as the original class and so can be used as a dependency anywhere the original class can. Unlike its parent, a proxy has only once dependency: the object manager. -Proxies are generated code and therefore do not need to be manually written. (See Code Generation for more information.) Simply reference a class in the form \Original\Class\Name\Proxy, and the class will be generated if it does not exist. +Proxies are generated code and therefore do not need to be manually written. (See Code generation for more information.) Simply reference a class in the form `\Original\Class\Name\Proxy`, and the class is generated if it does not exist. -Using the above example, the constructor signature of FastLoading could be changed as follows: +### Solve the issue using a proxy +Using the preceding example, the constructor signature of FastLoading could be changed as follows: {% highlight PHP %} {% endhighlight %} -Now the SlowLoading class will not be instantiated - and therefore the resource intensive constructor operations not performed - until the SlowLoading object is used (i.e., if the getSlowValue method is called). +Now, the `SlowLoading` class is instantiated—and therefore the resource intensive constructor operations not performed—until the SlowLoading object is used (that is, if the `getSlowValue` method is called). -The above example of directly referencing a proxy in a constructor parameter would function correctly. However, a better practice would be to leave the original interface or class reference in your constructor signature and specify the proxy via DI configuration instead: +The preceding example of directly referencing a proxy in a constructor parameter would function correctly. However, a better practice would be to leave the original interface or class reference in your constructor signature and specify the proxy using the dependency injection configuration instead: {% highlight XML %} @@ -81,6 +87,6 @@ The above example of directly referencing a proxy in a constructor parameter wou {% endhighlight %} -In this way, proxies can be dropped in to replace their corresponding classes - or proxy replacements _removed_ - without touching application code. +In this way, proxies can be dropped in to replace their corresponding classes—or proxy replacements _removed_—without touching application code. -As a practical example of a proxy, you can see the StoreManager class and then see the generated StoreManager Proxy class. \ No newline at end of file +As a practical example of a proxy, you can see the StoreManager class and then see the generated `StoreManager` proxy class. \ No newline at end of file From 0ed1b5a460e012b1ca37efe5322467b5c0879cc8 Mon Sep 17 00:00:00 2001 From: stevjohnson Date: Sun, 21 Feb 2016 17:45:56 -0600 Subject: [PATCH 238/902] [Twitter] Provide more detail about Redis --- .../v2.0/config-guide/redis/config-redis.md | 23 +++++-------------- 1 file changed, 6 insertions(+), 17 deletions(-) diff --git a/guides/v2.0/config-guide/redis/config-redis.md b/guides/v2.0/config-guide/redis/config-redis.md index 54d4bd49dec..b96ca1a0736 100644 --- a/guides/v2.0/config-guide/redis/config-redis.md +++ b/guides/v2.0/config-guide/redis/config-redis.md @@ -18,8 +18,13 @@ github_link: config-guide/redis/config-redis.md

    Overview of the Redis solution

    Redis is an optional backend cache solution to replace Zend_Cache_Backend_File, which is used in Magento 2 by default. -### Issues with `Zend_Cache_Backend_File` +This topic discusses how to configure Redis to serve as the following Magento caches: + +* The page cache (that is, full page cache). +* The default cache, which stores: configuration, layout configuration, block HTML output, collections data, reflection data, database DDL operations, EAV types and attributes, translations, web services configuration, and integration API. + +### Issues with `Zend_Cache_Backend_File` * The `core_cache_tag` table constantly grows. If a Magento instance has multiple web sites and web stores with large catalogs, the table can grow to 15 million records in less than a day. Insertion into `core_cache_tag` leads to issues with MySQL server, including performance degradation. (A *tag* is an identifier that classifies different types of Magento cache objects.) @@ -67,11 +72,8 @@ Following is a sample configuration to add to `app/etc 'backend_options' => [ 'server' => '127.0.0.1', 'port' => '6379', - 'persistent' => '', - 'database' => 0, 'password' => '', 'force_standalone' => 0, - 'connect_retries' => 1, ], where @@ -95,15 +97,6 @@ where
    - - - - - - - - @@ -112,10 +105,6 @@ where - - - -
    port Redis server listen port
    persistent

    Specify a unique string to enable persistent connections. For example, sess-db0.

    -

    Note that there are known issues phpredis and php-fpm.

    databaseUnique Redis database number, which is recommended to protect against data loss.
    password Specifies a password if your Redis server requires authentication.force_standalone Use 0 for phpredis or 1 for standalone PHP.
    connect_retriesReduces errors due to random connection failures. Specify 1 to not retry after the first failure.
    From 1b056af6ddae3b95f8656d396e13cd4370030fe6 Mon Sep 17 00:00:00 2001 From: stevjohnson Date: Sun, 21 Feb 2016 17:58:23 -0600 Subject: [PATCH 239/902] Update the Redis topic --- guides/v2.0/config-guide/redis/config-redis.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/guides/v2.0/config-guide/redis/config-redis.md b/guides/v2.0/config-guide/redis/config-redis.md index b96ca1a0736..cfe988d1ec4 100644 --- a/guides/v2.0/config-guide/redis/config-redis.md +++ b/guides/v2.0/config-guide/redis/config-redis.md @@ -74,6 +74,7 @@ Following is a sample configuration to add to `app/etc 'port' => '6379', 'password' => '', 'force_standalone' => 0, + 'compression_lib' => 'gzip', ], where @@ -105,6 +106,10 @@ where force_standalone Use 0 for phpredis or 1 for standalone PHP. + + compression_lib + We support the following: snappy, l4z, lzf, gzip. + From d090d022cedd4a75d38ec8cbf29f8da44cd70ffe Mon Sep 17 00:00:00 2001 From: stevjohnson Date: Sun, 21 Feb 2016 18:08:12 -0600 Subject: [PATCH 240/902] Final proofread of Redis --- .../v2.0/config-guide/redis/config-redis.md | 30 ++++++++++++------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/guides/v2.0/config-guide/redis/config-redis.md b/guides/v2.0/config-guide/redis/config-redis.md index cfe988d1ec4..b324523144f 100644 --- a/guides/v2.0/config-guide/redis/config-redis.md +++ b/guides/v2.0/config-guide/redis/config-redis.md @@ -66,16 +66,30 @@ Installing and configuring the Redis software is beyond the scope of this guide. Following is a sample configuration to add to `app/etc/env.php`: 'cache' => [ - 'frontend' => [ - 'page_cache' => [ - 'backend' => 'Cm_Cache_Backend_Redis', - 'backend_options' => [ + 'frontend' => + array ( + 'default' => + array ( + 'backend' => 'Cm_Cache_Backend_Redis', + 'backend_options' => + array ( + 'server' => '127.0.0.1', + 'port' => '6379', + 'password' => '', + 'force_standalone' => '0', + ), + ), + 'page_cache' => + array ( + 'backend' => 'Cm_Cache_Backend_Redis', + 'backend_options' => + array ( 'server' => '127.0.0.1', 'port' => '6379', 'password' => '', 'force_standalone' => 0, - 'compression_lib' => 'gzip', - ], + ), + where @@ -106,10 +120,6 @@ where force_standalone Use 0 for phpredis or 1 for standalone PHP. - - compression_lib - We support the following: snappy, l4z, lzf, gzip. - From 00d78e4cf9074fe86e379ae33df02caed5b39283 Mon Sep 17 00:00:00 2001 From: Rodion Savchuk Date: Mon, 22 Feb 2016 11:34:09 +0200 Subject: [PATCH 241/902] updated options in UI select --- .../ui-components/ui-secondary-uiselect.md | 74 ++++++++++++++++++- 1 file changed, 71 insertions(+), 3 deletions(-) diff --git a/guides/v2.0/ui-components/ui-secondary-uiselect.md b/guides/v2.0/ui-components/ui-secondary-uiselect.md index a6097329db7..67e375c7609 100644 --- a/guides/v2.0/ui-components/ui-secondary-uiselect.md +++ b/guides/v2.0/ui-components/ui-secondary-uiselect.md @@ -75,8 +75,6 @@ Navigation keys: Abstract - uiLayout - * imports option The option defines from where the component receives its data. @@ -109,4 +107,74 @@ Navigation keys: value: 'deselectPage', label: $t('Deselect all on this page') }], - {% endhighlight %} \ No newline at end of file + {% endhighlight %} + +

    Component options

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TitleDescriptionRequired For Correct WorkTypeDefault Value

    options.< option name >.label
    +
    options.< option name >.value
    +
    options.< option name >.optgroup
    Options label, value, nested level of optionsNo
    String
    +
    String
    +
    Object
    +
    undefined
    mode
    Mode overrides default values for some options.
    +
    In 'simple' mode showCheckbox = chipsEnabled = closeBtn = false
    +
    In 'optgroup' mode showCheckbox = openLevelsAction = false, and lastSelectable = optgroupLabels = labelsDecoration = true
    NoBooleanfalse
    isMultipleFilesFlag which indicates whether multiple files can be uploaded or notNoBooleanfalse
    allowedExtensionsList of allowed file extensionsNoString/Array*
    dropZoneCSS selector of a drop zone element relative to a file input elementNoString[data-role=drop-zone]
    uploaderConfigConfiguration which will be passed to jquery-file-upload pluginYesObject
    uploaderConfig.urlRoute to server controller which will handle file uploading processYesStringnull
    \ No newline at end of file From 56ce8d4f9e507f8c524f56f1de46eb30884ce729 Mon Sep 17 00:00:00 2001 From: Rodion Savchuk Date: Mon, 22 Feb 2016 13:00:33 +0200 Subject: [PATCH 242/902] Added jpg to ui select component section --- common/images/ui-select.jpg | Bin 0 -> 31248 bytes .../ui-components/ui-secondary-uiselect.md | 113 ++++++++++++------ 2 files changed, 77 insertions(+), 36 deletions(-) create mode 100644 common/images/ui-select.jpg diff --git a/common/images/ui-select.jpg b/common/images/ui-select.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e411480c8e871116cd91856be950aa726b26e9ed GIT binary patch literal 31248 zcmeFZ2Ut_>wk{e3MO4H>6O>p$nut=RB{o1rj7YB$kzOJqO#)FAkS-vgAfOa!2BZX# zl1Nvo)IcbqODCa(K-!t^y`HuH{k!(Q|33Ggd(XMg3e4w8=FI%&7~ePQJH{8*AZr|S z=%$vA7Kn|F4de^_fmp+!YoJ|hY`^~h_F~`7{_C}egM)oH=N?YZU&mgq{akzZ?%T`B zxsQ9_zWoP)7bn+29_|ANf4%=T$gkUf-39y~*vq;1*EjxqFVN=nAQ0PbfZAUK|Lw)Li=AWl9)P5M`++ZD4gut|v+n|k-Oa%Pd^-TR4&pex z`^c$_SN0s$x8XeP!7KMH_QT#YSBvZT?sk(zO+%zyWGBzoCCAE?^BfIDhfQw#x@N*bj5;K6P==kt_O~HXcV$%RSr6 zdo}h$aUItg`MV^(`;WT!@rx=?G>_HUg1HO7Mer#SmNWB=fb06M_V1}q-?VGtC= zpl5`mKRFNV?1}XX@DWdNvD@DzzbsSC%WwNE?jhTp{LQ=imOb64vW82}bz2haSfB{3 z2z86prb&)@vB|RxKj<4WgixS$oi>GZAO6N&Vq{_+8geI~AS>S~$Ki|Q$HMY`5*e@R z!#l}75eh^$Uz59d#gyRy$jioHPf^7uri%)EZwn&O zqbJ8c-(FQcZFAbJp*Z|9%`o9)WHdYFIwPeFML1fYUZ&j;6S|Y|8Y_rb7s&8Usb8BH z(n4p>Lx(TI9(RwLH|1Gb-bVGv^oYN;GNP9YYmK2`(1~*90aUjY)rJKM){9|*P86z5 z5nFIUL=h(MLK-iEu)ksKke;CyI-ly$qQozhT4~1jE&P5*#X~Ff+S;dv$l2NhT6%B# z@}#;m6(zkR6S13BZv1^oMiOI;ngtcC)xL+B%M*^6nv9LxA_0cx{#G|T9Ff8ZG_{M8 z!3c-QF}veUsd3FH@Io?Y=&H;{_sKpPb@`8N2>$$2Yb=m2-;7JogbE>Q)sh8z=~}kG zXb4Vun?7!p{;~+?AR{$ZpPUvd)D$3-KV~u3pj03hH^SV=I4!L^C>P&@(+b>6f6Pc_ zfgDgT2s}YZNiuXIBz=MfI%qDF`i`?H@phfI*xSf24)$ViV?>KJ7V}x4kYVaY7D&@) zB9zIe1f_eIF`HYi7HLSy_jLHjjaqmO$P@-z$taDsPo>PPNZu|(GN{V|=XP!mJWs3$ zzxj>6$jGSin^+yLFlBtkr0=dP@Qt`qMb*uKWm-15c)2h>QF^W0X6rxYt~Hkwh+qBm zqjLMRX22H~h@&iG!Vp^Q6Rcg=4I+JrdCY_nyi?X*y5pv%es;ZmH#O6Fxp0apj2LfW z@DW46RKr0Qh)no>3G+V0+2%=VDTo(s!Ph&j%D0vgD^0}r3qJ*qeb>Q<#B3+6X=!Y2 zAyBJ|ZthP4_-4VRVbmVzTp|4e3snEHg$0W4W`VdXNVd%I)dn8Alq-t5Y(jxRnMfE5 z#Fn(pL$hULfuO)VKGUXm!7^$Z{sL8*G%%P2f{3#~Puu9v|24wD=HY*-JX8`xab>Uu zzzrq$RUv}ay~bCME?oHP{s7bCRp2s|`BE5@X#KB?{`F~>@5 zhZ$4cPH3Y*J1z2c(&H5z;5?+y-1)CONYMpGA#VEhJd~nJ1ytm&j8ZM6rh!t$0>v3* zu|R{16HvyDGQ!3q)YcAoDu($wMopOodRWBd3cOVsFvY{Sh*cnSr^Ne*>`2GPyi_Z2AG6m9!-MMQ_bLfffrgxom01p%YS%v@wp_oBvX>LVkkCV z=k#~W-!h+dv@z5p2bo{ii3M@Il1}YKxe)g)if|7oR^RXn8}Iq_2{HB5B7bDz;uyWW zp4WlXzg>j8#Pzi4;PC?&pIlVx9%lT{xA$UZRr#dJ3jQIf6Hs+vj`D&vGxW_A^=z!Tm z#m?9l5VNz)z9L#@NF-(-YcGd1y@{w5#aIX%O6ENd;qlvS-G7eH`PKC&8u91cXMP|Qg<(sml97g-HV#P& zZC>UeHFBk+w2jypQGIFZ7#jZPX)B1KhO$6sP%lv{cUYj_nWiUpV!2}>;NO<}&mw4T zLOwIqSyi)wi+RD3{i81BFtrKpIOSvg;?&Ue~ zwHMalP8e*sSUqvpO~8R0ycT>=&SVyd!AS?)){B`g7D!y5QUtvJfvRJHsJDT5WXcKg? zfep!h<}eEMrOd|S;$p3|9^NjRNK-Sa#h97|87SHN5Nc?AGxe=|DMsI$_({=PwZFZXz(T8l{9iMV=lL z(1Yw~_`~k+B$NgZ+qnDqne1N2WTqfiC^Ipgdkv01)0G}PzwBw=(kvqVqsD1sQNxVMbnY2;x7)-mU- z-=OT&eP}aoV`Nu&o==hK{7!aus#WPI59rZ2(=h3O1n5lg6ed zx9asg8@!VvRrSUS5Hodtig{JhqYZnE9iKN_J<60ip#yG|e%Z$YId+BeGtUipaSKcl z>mn{GR==)E79Q0aSnkoR2;oWS**R7AN#dc2icHsKAXVdrPVnqpfI0o33i z<cx?9Rgl!a^1qx+yM1sRn#UD#)mj|5$P=|`JM|>L^15YH6J0WtBYW}GrYA(Sq zZ^aE+Iv*+3t>TrIf*rHGSFo$D3QT>VD@NvQSgdx561e`E6kK&BcW&o=c)6-Odiry6 zpZ1|xZ2K$AS;Jf3w_bLs<)xE)nTJ@Q%wXz%76=6}Ka&dn{nVuyK`KTpG_@C3zqLwb zX0<7Q)p^u*c)vOE$WZmxiY;A(@mw8B>YCDA4ck~2p74uaSflCd4yp49&_zjI-aYCs zoC_|AUAsBXzGwB^i}N0pJKzwk;3ANfVA-ht^?^e8jg$a*LzUgf6#kq%rz6%Dw@yXb z+Pgfc48z{bdU{q^=Xm)AKN!^sP)}5MJ$*L|g!>Fwqt2M$PraO`Zi;AL_3mB5CRNNf zuOr!$qn%_OM)H|RMv9R{%`aEGU7c7d#0U>(3PvoOn3x=~9Jz7mXz{I*FGk-9mB%i9 zA4g5(&`+^I+WScYOeP@VZK}}U&Y*@=g3(Lj0Bzyl;Dn*Stv0T!Yo*t=pRPBNA}cuO zIbRj2HQ7A3JMHk9lW(tZWV)SveW^im+f2uJx6U37&N>1jc(v$f@3L_>Mup$yb<~^d zYrBVQv{Swf9-rI-S+#Fe?J2s5@av{btUmbmyvtM#=z7gfN5fZz7Z$EwAav$ zZ4c|W)+eCN>A_XC<;6;ww9sI1_wa$?}@VZ%!m@LhioG*X3VF`!KmmCpxrf4JLXyNICL}&e-?!Sa3~J zvo%L3-0wq)v0>a$Bw4Yvs(KH{xAb!lB&3FEvcJp7KM|XEk0O!YA0X*=8@1TQS`I*L zSfDpAQRBL8UEhUE0=sPJ&`*QhrV{;h3zx~K^}P&OyqAl|v@J@7rZh^o4fK9@j|}HQ z-Rt6^%Tv4kCj->9sMfYsHQ2tp6c~FG3&f=^KUx-ZN+`dR>rPK4sII#0)c$wwYX3yt z{>dpAMMO$i3tw&j$>#a0W|On_cU&Ymeu@S9`R}rPc|DTz-%T~HePc(u z{dY_v^EZT`XbFj;Q`4F3vTNdhL<8EP!$+A~vd@VWRbY}oa@%JV?xz$m&{#g-2y3e0 z4yutDivOPDTV;__UP0!2moacA!?~CX>>BF49jBENy=R`+%SN9CYA{Diu|OGbNi-H{ zpEQ)IVjUtc*`lg&Boq3Kkwjl#Q>XL0Ju@n(Fb50KbeRDS?NlPAmjwz^q+2l1ICl-s zDYww&E1u&KMD|_Q;tn4H5iF81iu$jH+ks9pO*`B z^9+2IG17rxzjB}?Sa|4+!=v!qH|{Q7KI!iIfCQ-hK>9x1+(#q?NGHO(0GtJ&liP_@ zzzlb2SfxvR0^-UUKfnT0S)gq)l)eW({RBKL`0uN@4?62*4Ve1)PEtA}%=#n?)U$jL z8(NgW+>JCR6*b8Yt2N+Ak<^q1=4l#F5N5TE1+rVXFv>^|poEp85?kDt(UF@3j~;9; zT3%IA@@lYZv4=B{)+eUQTf2n3{ygh!Nl9_Vd>?qjQ+-Xo8IjNWn!KPt9{8*6xQkXf zq6d&8ho94_8#(%#Al| zV63&qq{_R(4Lj~2!)MRu`=@Z_>GYR@M_8cZ^?KqCvbgA)WTahm<}vAqp zX9l4qsuj7M%lt1|P)zZur7Y0?ib?!A0dgHv#m_)PjRx;IZ$*UB8YABx=mW>v11%UU$iON?!dR}9s_qAVzyERd-0DqXG|P!vsoJ_h*%;E>B>sCI7t%m_qN5pC)kVC>!e`FK&z#>+f(0T>W& z@+?(BJD~Jq1^`Z=?(-Wp+P{rg8y*hDNPCAe_X7|77W&_2uSpY3NT>!V*$oK#^flV~ zn00`TJ%+%Cm=l1C8{=_v<#clv2&({P8UrBUpJuG+en!ml%~622pm~75Q;a0-ZGe*J zQm8fUXh7wpU5FbNfiftf5RfNHJN`BzzF7ayvquLgsY`%vpJ_q;X)()Ce;UtaFgKHS zx55!MUWKB+MA>ySfe2{4HJu(ig(I~Rwix`x2>4cWC=1jIprXG?hCUW7n$lVqM{fgu)+#niRVqa3(2Hz`V-1i$ z48SK%Un3|e7>v8fCV`Xet}y;k}8<#=UlqK1JTVKDjK?TSAB`dsK-&o zw&e$NGs1zax`m{HA676+r-{>qg@P9X((Q@zZhZwmr<_@!!j{x`p0ht?Qd{nqBBkB( z2u^W@Xb4usI*fDv*4jGBlH z8JmB(moAw#vJiiOLFRRx;H*Bx>mLhG!I5BH1X`m2^Z-`g*T9TgE87S@vWPkWV5bk} z@jrYcoeg{+tyq{PZrzT)9vk(gJn5VCp_3o!<6cESx(GQGr*5cASJ0EBr$`+X+SF0C zy?ix*k)-gj!}GX-=$Nj2W{gZL=qu>v^e%a8|EU=2S)O|MQQx08$$P>wa-PbTEuS&` zF$?D+n9UbEmnR3~Vx=r|pVf3c=Q;L`Ku>Kr{l&%LU8cS)Mu6{EVFCW`9RfeHw6r7H zdHCU)6D~eFttMZ$qIS!#f2#?6RGfaui*Bv1Sr`K>LwyFbhdC?&6x$pb1vE7j0n%OF zzV3q@-g56!=?D;`U3A_8T*A^2iL$dZJ4xBuYEX6E5;*$pL870?fRcl^%DKik9dXfQ z5-|iy(&;)#SEQ;<#(^L*jAR>nQt72M*Ova-Ynu4f3X?wVu#4LveZ3+?kqXhRCRUfM^@pe4!d|b4MhPQP7uuZDCHUT*(B;v z!{ll>ge|4zjtnmRQ;papn~lw+mnr?d`?znG3B*j|=JGdj718)UK*~85s6Kv^wYGO_ zt!(ux@PXiAx>9woyF=8{u|TZ4Ub05x!nwn}EqQRYyOj96$00!Mh%8<5}eol6U z;9vPZZ}f(!RWp0Y2Qi#O2_qi)N?wCqXJ>+=mG7Y1O$%aGJka~Sc;ZIas3&wkl8n;1R)$25=e#qHT z4PuBxU-D^%d4MGJ{p;cENX<#^CqJ9gj|85i7BvdVQ~fqs zAi+f(AvrkuU1KrkSxwn>J)mwnB3dDuyvpPbY_AgkN*s#0Nj1n=5F-D09B`t{!hgs; z!HX{}A*p@c_WCaU%2%zK9PHus3h!*h{ISN>$h-MlYX&hL-Zuyav&lWJi(PhlZnIOe z@#_#EiVT7+ZV^nHxE<<&L|EO4JQJu)n5$oG6gf&B%dL2F{cC&vPGW5FE&Jj2c9)s& z!3VU)*iFWa#&M;}^rJr;(n}GIZCygTQ?g;{hv^m`IVjt@0_w0ev;Rx)r^q1Vil;As zNXZA^zj5xyA|A47B{O!>$_-sUy1Z7=N$F`;D$5$cZ!h62=;#1`!|ZXaz8t zb+X^nnlyP$-aR?X(-7e%*W0kQKWjwK%h^j$b96>f`XRm)Qyr68!JRaC4w`_b`fDUyW;`>{Kh#a@m)$=9{1tq+&@c=Er3a{oKm zihwYCJQ~Wc02O9-4J4mW^?1CK6k1j-xcVWvd6L+6RxaNtOVf<^4e>zm>*Y&|6tO_} zzz%3xT5t}kPC?Oh!zRl&|EE^(2KtP7d1{VQ^4-qw9C22H7f;@J>isZMn5)ko8!B0+ zD-fKzSF=Lub)3tCnNCb^XPfC_AIbBa;X`VxmxE|rj#2eW&$K&X)h;0Y!;ZFQppCVz zNGMG;ut!N~Pj*H{Xk1%^YT{e*5QRmwxX${6>R7wV(rBj{^)jgg#aO&!2}l}l? z<9TMDy58kMB3?=JyYL_pb}`N1sj@tO+rPEkizMgb-7cAPNyIBrb7nqW^Wvxa75`%A{6S6e0x(oo{w+T_C z$i!h75cqSU2Dc{=42UT{As&ED0SkE?wUPD24@V0|k#yG_ihF0 zc0A7+XM<8LlKNf&8;85~S{(12uRTCmI77ry2S#+2V&8xKT*9_H-+8UJENpGMta(r_ z4gTzCK>yEKHGA2s$$ej3yz+1ns~-}___}*KN0%Kqx8f}2JI`KKer#mAcUzn24%6%@ z)BwXnTjmvHGe-joU?qC6TLI>p%x{hHiD`U?DpF<K-R`ZplI0Uj2A;HFswFNX4i%#1=E6CuFFvd2#n6_#UPT)q?Vr)IVE1al(LR zal3a@8Z9!3DAnUk@^U*B?nr43Z*d7yW-Hs|h;~62b;wf1eU>rfI3DCFYAVV98rkq7 z(!H<7V(M5K_tB-KJv#0O@bZ_hW6fR!w68I6`PGDPflcPD{t|?CqxX7 z=~R^H>5NkPWneu7X|gVp%YbwR3qk7P)xmkxg1T~i;8~JZ-bbV+X|oI>W);Ys^tw*F zokIao71xl7XWaYG`g||DK&w>_T7{eo?16&I6RRcu*eb<-$oHTQ}bn}qfp5x+GVjhPevSPSIRG=Vv_ z5||U%Lj-T2hHS^R!?34(gN6-ix{;Fh2=|HJOr7&tm+L%)sx#sfPnZU{2v7Z7P9d#Q zEUEfgRD8=$e@keM23m(#35Yc9t*mixMfKzg#L6C(&|fyjDMi|4M=kN2JdAmboZ zU|$c_r74|9RvoZfd#&F2U`0sptWV!Krzl&7YH5FN%;~yz((9F`xapJ_r@;<+YIR#K zz=hcu1{Cj~6&yEm($6u^z{g#P+otI<7WQ?O)>iTG2=*7;OzD05J)kueyW-&DMVxZg}ce6mP_A?%!}H=e9o&R z7be$knk3z+B5VxtT+T7M7N1z1x^&(~Nm&AtF~LLUBo``Eu25ysR0j%{YCzI9rs<7h zQu`}f+>Elt@XL1{yNAm?o1tX{la~8WOe`uesfrZ4w%LulZnC8HHdJw&_t+arsGU&E zvi93RDg3I>ZqzFABd(CwWD2*GM6qLJ2Oi}X4Hidve8K&auk%xoa~%rbIN zJF-JHxRPz*OPw7xleqhm+UCwVsOkqR=|p)8x4p?*!U~Tdp`V{mv z{aP~ken-CU|C8+Ki3*g);32oLKsU8hQ&^x%6JQ+NSpY=(I^E)CDRRV5(lZt%^)_0nkM$V_SFk})FK4Wp(fXVhPKs;Wvk>2}PauNK~wvF~A3 zHJ{EZs(TrNDb@>U=`|#4#@sC$#CJ1JHFMV1E%Lv_=AK#vW>#O>bM3?KXr?oGoU7 z0Jl$_LIs0K@un5lK3$+lp{*pqCe@He5#s02cQj5+XfIq>66QlZ!%dONZ?M zsMxrA;+Qs@!P|h!K%;}l3}28pwyhXICO2=`mFox~6g+pNe~&j~0V93_5V`>r$-@Vb zJn8Q!S6ME?eBeRSi|)2O`Jxzg*=I_b9&(mIQcUOZqIB>(FuyaKn?F2BcNnT@ANG>k zrV?~~ysa8LZqM*FtH_fuX)?TK6&2-&it z%wFJRd@$ARqj=-8wPWE~H@l5$-m0fDqb=?wV}h0^YRw4a;5Uq>aWA(8M?s?i6Xq2k z=;n7^YyltKhy{9O)x~&(n0Ed^KBJn>eyK_#qjqXKC|vr@56BsmJJOge9s+5ZLDfU; zZ2Tzc%02{0pZlKC6s=L5!(x0YV~@(^#~UVWoXgPhf^-qxiN?NFVf|>QW#cQ^)&b#@ zlN=7o1Yw-?(z@m8tl$sPTCe;b*#&Af%|oD6RT<7J{leB|R?3Z4kE@!~AGb~(bDeq$ z6KjB6JnkYaDRb(Mvc$q==`{5kd@p^K30tvS(@jYvq(<>g3vDgCWx7E2U~#0Zq$3OF z?jN#-N6Z#gHC9sOhR2AS?&60=MCBA*(XvTW&xI8nc9(xHq)jTJCj-Q_Us4UO^(c?A>1@x z)tZ>OIY`-+B`Z6A3=WUWj=TO?^az)=#9f#X5jG8(7pvOq&V4RPvK?;Uzv2VZWgy}`dRd2a>+UzVK2jfgWZ1sW)~;fPaA zEes`AI;y{1K2j(SU>>KN)sI7fKQj|2^b^qVmW{xV?mlIMyzLi?Q9~!k1 zZp+brc~7R=^2QJGQETI)LTRdbGgYZlbyN?xkLJFC6OU8E3emUoa;s}Hce@Kwyek2> zc&=IV_+$MxFSWkJuUjgnbf{YZIdOqewtRDc!HM%f#CG78+HOyTbnB)SPQJ{#_-N=} zW55Sk+tb?#MbDOiDjvpL?-O`AmFP$;u!1I~4z2mzK*nG_rk9!p1PPVN1H%S@|J0Ld zl*z13tup`0xq7D3GxXJ z>L!Z&j8z^9vqZMcIGhQdnh}h*CZRE7*^Ey;3s)Bgh9uE(U*;0esE-ZTQ4(qG~2T;gNe2arg2Z=?{-_S>9`_O;{Ahtf$sbo zd9rjp6pUFtL^Ww(?!lMA4?7XOvT}^c8UqPlj+8D>oU6zDmh{QfUUhPkt+COYOT2fT zmoJ`8oZHTs@L4kQBW+DG&>f=@E>HN=3$0xS%p-}1H)mXQauWSsbMuCNJ{RJxH>r7m zE8tm}c?k*#=Yif%YS??{s@g2ovjtgWjv`0=jbC?VnvHgd^^M&Vz8GdMm|%?Y#%zMqM;E+_ z&`oWW2lQxq&5-P;F58QQc+BU{--BtLunVtSeE3t2j9Tt0KySNdxjq_{Rg zlM+AKHcUzhX6S|GAXQHT{Kd3TV~lwaH_X<>g=a*LBK=zg@q4&&bZ3?f$-e z4U=(bgHGUKx^(Yj-GVm=*(s-$)tnIMc}e#|@wiEEO_fvXLvTmY)XMK?t9GO^;&fyZ z$Ka$@(HfqPv0!-Z}j{^*FIlY!7a!fA>O}3P*L!V7#D+To`N2x(H8F?FZ^**in_Hid848I^C&6We?D88gua!Ae@)i^ zoymeL0eI(MfLf8_lJ}%Mp%px>9~z_{hCtG#D!%+3ZM9k0{r@7``U%B88c?eF7AO^= zii>ltbA~8x>q?_Hv4KiOJ4=2;EfDudLnGdjG9g#>QC9}*zEERw z2)_12W0wG5!sw0r*Yyr=t{6rUpRgTH;A{=FzpP>%Xp@ozkt#1ED`MliowXJgX-D$lqE}q(kwRZAIx3tS=YieA(CW3EKGD#;?pBmt#D6N(udfemNo0qoLGDT1$ zm)3lKN=L3(&O711=R1)so6nlAoH4tjx4+@!0XgL}Ph0(FOn0ds;?~pLwQn81Yq0{4 z!YDWDK`h$xT+fwR9klRwNQhKgJ+lC@J?*g1;=cPy&tlIXCfOz_R2GP$PYP{}d5M@z znOAqPMRy=}XZ6fsg2h2{dT4qDI1(a; zd{9x+`&eze2Ab#l{0?bn7*$_G-i3OQT|II&`9)QOMDJ`=_A{TW&y>PQXYC_Hx(9IX z3|mdA$(~w9u!Co=uS5NlkJVEe5RT+)4*vGb_UArGC&J|@(ys)wLfbG%Nl_t+#!-p~ zsVD?{T4ypqNyGm(F4^h49R@?@&peoLuE(K0p=|S=Sy{AcsmhDei|2IQotqPAP+w)O zz8YJfgU=rHQ0dPncfTtmJ73na9qj%hk!zGL@m|tN^!|Reqg*=I5>^q-190hzvs>LV zm;uxTd=Y!N+#$ey zNUZdt^V7H18o86E!~-RVY_GmWWI`Rg4xs9FNwY9&0(IS5DPFYUCMonK^z)|hRBELF z)TOMxaCutz1;<&4J8#3p>X2u>i13dhg+};M;`~+xe}ya}pPFOXeK8GR( z+-{C&<{mzn>f^mQ+iDY)X%eRl@vfuI$42OEc6jWdzQVZX(+`{_JytbVhd%BQYvlHl zZ}U3yeYU2g)3QUfNW8sAE$P0F=xp`Ak1MP5Tf^4C#w-Zj<=2( zfWqDQ{NE~vB>g!O*$Ke{V+X-d-}9+1%sPJfj+je#4s*hQ{*az8;sxK@LH&wFZtaAG zOB7w&xca|i#&L1!eHk3Q@JK9p+NUdra1Q?|XKCwj*!f70Q=R*pZ$*9uT~1bykBthi z>n$v6p{5oz@YS?^`j~Wo%OIZiMTTHew~wtlziQ;@S`4-(EuvPBJDAr9d=#jOU~*CT zvh*FU_nHgR4Rh~#9%j@)!a-a6{+E9!`fZ_>T!2#6UtT9z8;lyZ-T>XWu}P$hXtF@f z`Irj2fbMk$1|mgQpn5ux){TC+D|Vgm4M?Q88LRYw#SP2f&2Zd%_wwc981CdE9>@{X zP;0Mvf}j+&dH9ae2}E39e7l6~>Mwj%OQqw|Cu}uy8n=;%x(%ST_grnMB8$t(=eij2 zjHsxqn~<(j#M|-(qjfR{g}3eOR9W{-?3^k#!}68)Eh~ICF|G_*m>aWFRlmmOMwrxk z23c79{HBlG50mMezf-=)o-pc+n550wRRlkNTw398R>zo5Ih)YC4B6@H-SoD?rj|WqIKThB5C?*G{=lSO7ciU7F^XBi=d3f<8Hnc|D zo_x7-#%Xj$=c{N`&D0rHqsb>pjf>D1H~{01c+kHQBh==Go)^0A?PCsqfw3|tXhp4F z5AQX%XcOXFKYD8L_yrA#MH{sZjgoNc)Pzr++YxbhL?tH*`Te z+)gOu@Gf=9nEyl=9Immjc`RZUt+>|z!}wGBes$C&n4KEmkjPI!CuWl>8q7mO>5>5t zBcB^qR*ofZ9cpb)nT~G0bViO7q~m$v{JwWr;~&;yFw7a^z<00Ol{k~f{WA22>x;ecmdhc9T|2$2^u6a%PDOh) zC%B=OAyXE8pS;AAFU8*?F+b#5ovCM9w#k$oQvdO0#MR^U`Q~j4&hSP0#mN9@bK3FZ z{*8i4#74(WjxU%m!4;z9%GS@27ed=z4dA2nYoyTenZz*u=aX|7p2N;n@5+;hNQIfX zx^9kmptFh~@c9aFbkd{k?14R|b*?j~G$pX}BwL-H$KYUd?&x6tyo0fJ_KB2&Jo7FW zZzG6h+wr-$P|+hkx#B7<3IlmKSQ{d#%}VC+vhu(f?s+$zUPQDn>h0F#{kP7qznt!_ z3sZpZ;ULBwv{bvn5qZXwG;GqJ{Ubw9rSN|LRG9sRm~)>Ej(t`0jNB^fO=doDgHAi) zQA?*hfW1WK)hh2E?IbdNQS*uiAx7uwQ-Nk*)Q*un1;#v$By};4XaJZnXDo`G51kb6 z0=VuzgGZ741c2nKs3l+e8>K`e#!jTAzp8?M6mLaMm3?tL*lrxkF()9x4&-Hob<5g; zqBKE;*|ZxyZknTlGT#ZgcL!w8rCp8o2KrA*y68tUo6~{vlPfqRP`qXUd8)uM4NQgy zD=K{HS+!49v^a5-B!(F+b~IG5e&8NelUcx1b%kRF33QkT)hwj%#h|!^VO%39dq+6W z2NM4WzQP)ck53!#s=Ci-%Pci?mN9bo@X6+J&)DdQaWI{iN1qC$n!68DpTrJP6J_L^ z%+o_3bA7<8-`eSKN4TLa#?WwsqZ3)FY7x)F2t?0aEU@sTh585^0!VCwBR21vsDniKX;7ZP;B=a+I?E5rGzF@|`gzFD}V@2WOU z-SK{iiJYC4scZdf*LU~Q=Z62Iz`1Pyqym+x-5lM3hve{Wo7jp%vgcCqb%f-3O2#1d zqpn(kS}H`xyN!43ddg|k#nAYQeV4fV((+K>u-Uk@^pE|rRJWfla~}Rgf&#iibaktj znVztWj?V^0Riz%AC>m;^U{Oz_Js0cB}c7?-SX54PLgkwjyu&hN^VE$}!<1ZjW9*yzU2zmXCb* zVB5+!6<$E!fQ018WFlt51M?+y@fM5thedF}_yEn1t(PHtf&DP6*{FF#F91$DSjYH) znv3z>0%&_=f})*b))NH-_c4dkIn}i%yFx`|NX%f{si@KXgrA-*EQ!HF7c`30E)dWS1+U8OA_1d!T9hbckJ4= zmzsSUe1vZ=mS1XB7l$;DckcE4%K;zI00-hVNe}E#yU>RPGdr+K17-g6WgP~$dd{Dh zai0j66fKXvGtqBn5*gdaX>7U4;bD1)@!qSE41c;IJRjF)jUkIQM@*)ej$2g}e~b_C zIzZm@-PHaw%6TUON!z@Gf$9QL8&3bG6$ii?&JZ=Jc zWonUXpWdK1wI9I=^m|2dSorOkkr910oIfgLu#4JKI=i%l`F;p3ZWVwC{5ROmpQT zCc8{EpIgl;Ld~27^1>4r5!n)j?34H?Md*H{HWi*TWF?43UMm_gU68QVqTQ0rCf+WH zlf%`9D7B8$E9Y(iJ5L*lho~`=;FdY8$Q(qxPyMKq&3oCGiYE;8FlCi};&LMjhpq?^ zGLm_(Ot<&&2fvxUkR5p6rdmhSeH9V+2o>aNbv&(=7%>BnxUsn-J=+1FT8+dWCoVEU zZsx<5WW{n^#vB3q(o2|^V|d|4$4{#!P_%g3somX;x<{ZZY=&(@u*1lJ3Pw^P^Q1N! zd4>9Rs>7!q%Znq+ISBy?^S$0r=kJ$AONzSaE(RzOxIWtl3!dxcUDwhw>^>$5PqMH= z_8BIZ@0_i{5IyS8Ke`j%KTLL)q>Mr$lSMHIF9dJN$)3l6 z_XqNsy`PefobLuz$H3xrZ7S{fCu#mZ=l1di)6OIB_XUa}@ATd8SN9~luQ7Y!csEpu zJ?TOPsU_Aez>DKzVU|Lc*07Lvq;;Z$<&l<0Knd+R)g1?3FII0IX=@|bVreMzbiHo4 zBo)z;eu&OVllQfloFO)9Ae!KAF}EuF>Cgfv!UJ#F-5rhkdK3o?Cd7C4%6VHkozo{$ z%x*6)E)xaRUGk{5ldy*U`-Rg__clUKR+jXgS?k7j@0<7O&7Tf3Inp3(cLRD}KIjU6 zmDlkyTr5!^E?!47@WnL{ONoursTM}!mNcH1n=mft4yRo~=L!oyxM*DtQi|h|QnqS) zd)gy)nYShD_L97-A8z4hFhN@BDEu+JE)lWbK+0@M9CVtATz0 z`(qeF{S1W3IvZ)7vWwbJmUGiJ`2i86HkkCv7G`~^sKWG)P9-Zp`nI5b=L$!F3wm^B z6WYSVIQ!unZrTP$2eRg#yfiCKe;i$nlM)Q{0BB4R>3rX{|Kmq%#kb2=;GT}ZhKVx& z(1E(X{ioi;=cLKuTV*6h{k-x~EAvzXeIGxqeItrX%Ma7Ne9a=mFU@5pF8CCHziz=@ zyX{d+=}WH80(q2x6l6!m-JQnJN1w=e#LIp7BmyV+s{*eS{kPkPuw)5_vMdiLLyNr~vsp zZ!yQ0t2yn5!)6`7o&1n^>$n;_QC}OV(OTh7nYqmRV(?44S))##R1_1~&?lVJP@Pc^ z=lDcH4e=aR@u^tnt{B$*A{ry+{=%Opkym@oE}X76J_>74 z4eML-lHopQ?G=ljEw{6)DX$EB)dB?VZR$Tc4u`k&qwG~MF5E&h*i+OMu;AQhn0=Z| zutMdgT7i?@5%r^2&tV%*+ub?u=5xM1??7kA!sELYn^a^Ou@doRraSPv$gwX}6xuNv zJy4AvqlPn2Slq?C7jZm6H*JWR46P*IFjfejT)RK`IYX=Z(rpXH4W1!YF!ff78QCGK z#)iy?D=vDxcUk?)p2Wmrb8B_(M=7pL=(bgw!pZGm67Q677^GB_AD)vqFzi;g@x#Mi zwFT9JrKPF7XMO_@RwadICQWKLS{XD1@>hqf-y$*S$*z=FZ?sMtS1O_0Uuh41f7DKF z?63eIz&Yp^1zVp^^asDRR{GL?whw`ke{XdyTk&b!ieFCbHFVslo0+{mocJ@C#C!zI9OaQde~1?B?T5tD#oHOtiF}D^=E$IM ziT6O$*vB&|hRfcO!%yw%c|EsC~*P2Nl) zD8?Q4a}q_PI`5NQYx!K8MT=*F{{HxGMu8WwGXgNS#D+Wi+UNW^%hDgAe!tmeUvKk{ z-B#2pU4^f6+2K}6MW4GHy+XuNfJglycF9dGnPBr&M_2`PIMrF@%%HpH?GD@`yzTBk z8OnK|#7vBh|9{SJMzkq~#|bhG1V#UBzVzEf>XyYv(*H3-F@L8wC|t#MP~(4&#ebvg z9wmMS_J=vqrl9e3I*^~DxUXm)FJ2Pq3HT1Qnfz@^9sjUmxe}R)8qW!^FVKJ7^7jQ- z+|B!_<@5g`JX-@|_ovMtCHSa6ZxS(mow&=J=^JRE_*JI{iJ${g)$=~!8nBh4EB%gL zKq=s$-UlWD0TCCJ+TjOYj`Gac8SmP=KSgaXkm73^_lYwef!hai zg55D{wQ|P&=m|`fK+=t{!{1!IDr4`VYDUUVE2(eV)^8jOlmpu4GEn$a^p3~lScQkP z@VdZ{dO-W%m-U?Fz(Lj9d4+);W0K`PZV1_*aeF(OvXe_Kt|Ld3LiY7*TQ!Q@;tAovO! zlW$iP`o>Ru{8A{0(KBB(kazYjacVp8LsK&0Bx2)BOajMMB{9xK@7yA^1p2t@|7h>Z z!21O)*FnS~&; zVF)uK%1k04gana6Ac;T-Wbkczudmi>U+;VOeeZtn>mT{pAtxvMth3MBYpwnJ{q~&h zY=$`RFr&{hsc=W5uCEUjb{#_aLHbkt>y;Qot}?w^>joXAKrGuuTa9(FlxPi6!}#~w zw#}?Da4f-U!A}Nxj2v0FYGih=m*P;3Z(`x_4GmNIc%v#sJna!Bk%zC(ck#;>I?#NU z`L2(DHm67a>J<|5d{lZZr$%v^%5v)WHZ#%k(Wq5kLpO^^R1DQO&Y_5ASxE5xo9pu~ zVa3oC#oLa_f->@FX_~BB=L*Q zW#?fO-EMW0L+5YrTVCqPDF%!Y9d3U$sxEKIUIKaUix;*XLt4p1i9)!gthaDxIkkW$&{j-I^9Px*xdNN zGqFn1JJ_2ke{0;{sCFu9?X6XwHl3HGBwl8w=u7+GrKKp|B%wF72salyGp>l|5de1n zpUvaC@@+Ge>uNmTH2_y|Rqw5U12HUw+dpcnrzR1zJ7vbl)OLal&4WG*WdACN3n=nm z-#A*C!O-cj?#{!m;?=!mcGY_cJdBh4Q9CD=U|MXA$WOobrH;tq&)w`jM1S8-%hJDob>9m=lTo%Ree*-bUrig{G**1WJ zM|{*CO;3L7yI5d&1C&Fnm3&2f1Uq>FHUFV0-(h1x8Li}$RJ;xM( zN373j@z`-^`8`GpK;ATM*!8W;=sVx5zw$@a^8PLPBcO=Bdjr&fAT$h+FG0*r9tMT# zM|D>yq3fK=lHGA8oz@4v1J*iRefI(K#N678&v-RI_t ziW<~*`+A9u6<#*At$3W<=Oo)3Ip}FFP4XUr6ik(Sgc!af3%Q&jTa=*Ep}DKu>G1ls zXM1!ic`6t8j05MCBd)H{;QEb^4wSF3qx(2;W5=fY{h!UPOzpKV=)@o=&_|D^in5h5 z>z-H$gX-c-SnzE<<)wj5X73`NB(xkMd&FT?XW1i#kU_9|DmzG7Aq;`@Fgiff8stty zw1kDcNWvOEr|}Gri?c<9;)`sJdLC=3)8;TeTjNoZT~RJ_{K+`^Qx9-jgj*CSuC?(ydYT-| zx^$K9xVEMdk&#tH#n(37IzOmw9=Qbz=Zw9V(4I22^}hYLIh7G|`CNJLbYV;xyP`U^ zAT+Lj7N6aeP3dP_O&g_%9-b@P`AE1Il0{0U5}78LCacFmmQFe6$yRmIkD3(g)&;2D zO}Uq;dhkhDt6YNRuqfA9TH%_8uRq)OZC$5p0u653RD+7|&xxuc8l3826}y*&2i=D5 z%1%tFH0$RCcd-1%wbK3bcXyr0?>rc!_04D?@8*U;@q^^1i$#Gypn~?93?=m5yfAQR z|1Dg@(?iA2qvgrt@j3q9%#%G>%p%TP|C`n{wNCbVEmKW?SWxe`sHOMOarl#H11-w} z&m`mB=5a?>=Bg?b>y!GSRa8V!PK5esI{b)MDQXT#rvhbvtXtr0txS(!HDZNNxsKr2 z?OKPxkc@N1q1@n|8819smQ_t@4n_7wz1VHwa>1o%@!I;1aHimZlfMg!A12-!yTSxk zjVdSIJxL?wAM3*uerlKsYq`lUHxWlcOsz9vJmOeSNG zcXCcdraLNbOn=1qbOt~7)xn{<<R<8tJ*w$569?HmQE&|j0=o2oE{HJ- zrkaJ7<^|Yw*m7HdhU7KIk#|3#1F^@1zS*j`Z`RXtV^*62I%za)WTAW zZ|()yW^IlTtuq`Lc60K|SJsX@d&WKjqt|Cly9m)|iekF5y4{pUiaWR$LB=>zP}(ZcB=B2m zoePn5NCmzk+Qe|e2XEd~*RPmQtVI!POuTDofhmPE^EF#3PHt-~H2DOgc9g4Qr2XQi zGtYR5N|1Y>9}`iV4YSIp72sA|U^B2N&GH{z2jFg}&~X_91ardzokrIa&tjJCsPfFI z^{{;}QMOW3Jr4I~NVrAJ4$yM!wb6IQsf*zudbrm4lZ3fA2d*%Nsu-;07qB70@w#}E zJ8ewXDb0@nUp~Z_H5w2$ERD0iXmk4>q8mUtC%K7r4wiy!sdrW?XihofC-@y9fI#qu!F_5VSP#JPU4GQ zi7fi4_gj?uRZ)D|J{DUMXuW}|je;d}=m~v%qEIPFd0YEg`VR+xwD_*9{SYAKo~RXb zES5GX86`{>XGkym-qOd+kll!8UortL!eY~Ch#4xXIO0JEWMy1Kopt0q<=oap|+XX#nhsL zW%EpCVhv>?cRx zUux_%5WkaUaaC7Y8dW4Xb31D{t=Kbw2#Zr%sWZ8E9e$5gUND-oue!pBPWFX6n-^D< zb{3FY*()Ojn&ZzCP7wA>yG&eo9$uNJfKTx&^83S|OP&{WB{I|QL(bk5K|)2^N@`xr zm4}>F513hGzNM~}x@}45Xmc8C0wW&lKdXEy%rfZiBqr#hh1u!vD61#6ORm#=-pz$ooFI7^V6^0w(LKD^(aF-}1VeeEFb!qCRzt)$HFZQmay=yEeS~YSv2CHO#LBg1Z zxB`-PY5%VVt;LO3Fh%*D*{2@kwaY9rEK|^x?zwlPPQ{VRnXU(+_LS4%WKgjU{OZtVQ{j zT`b~G!iVY!@{X!eo)YU-W1sx-ea*aZA-MgO%^`J?kwSVVf^&P6I=vcg5)Ftw|6U?O0+W;u^1zS3)Arlr zcmEeZ(JDE%gZP_s!hX}CMSt~R*Y9nBETW$yZ~LYuz+EGvP1gQo(6rPgIK6?vv4qX( z!N6Smaz_Uckc8u}I0HQ;4e0gDV6cXDA`2;!D;xozcxC`%rM-+HSs+6EQmjeE@BBry z=6~w1fab|hpI=f905hN5+gzb_+~Hh0&L_(VuSt7tfs@Q3(+bRL;TfI=$$UCw*pjC9yEa(Y^9})*!;c>E~#vvz^@KAZQu^^m;DGl zY$tS{pDex(#{tQ24aA({C6fvQS7w4C2el4m1AxZX>tHF@MpVio&TlBB3YUNw=Czvy zZ(h9?Q5*~$AC`eD_%` zdh$j-kXhZDBM?`TVDqND^02ZX79=Ey5zqUYgIR;Sr|7&cZO7iUo8xrmn$vv=Tjxd8EWyh2&rZn~a-nF)7yAYp|I zg}d?^)Z3!iciG|d8iWU2(>L4YlGW9-@^o@HN1PjFtQW!_`J2O5qx{J=j;ODnvwD;d zDIb zzk)x?_gYpGToC`mk0f2K%Oyv+7UNVF<3_uG+EEH86sw2P=F-DvEI3_teGiF}(c!n? zeb2?{0?F5As!2vs>B*$;mmGW89_TJV8e&OB2BMq~A4j8Zq^J1IBWmK1Rqpu}u_JhG zW=nX&YOtpoTUVq~hf(U<1vf6Cbe@~}-nF1;yT0k1JwdZ|kAaHBlw+Cv;KT}+Luf4d zx^A|bbBF4g{be0E70Tsq|4qiHGE}I#Q_>B{Znb)hDOaZ6C8>L#iwjE~C=$EHq8`%H zDNk~1j@1>?_B$HMJGO+^KUeTnk1{dhnem;{`HF*e^UY-JAR2C0r;uxPAz@3Lh0dY2 zy(+Q~1COrWc4S9X$i;V6Cf`;~Vdf!AA*1ijnqx&pRJu?vEg#@-8-JmoQ#mza%i~1R zWi3$L!be+Y0l`_s>%y174+01QAli0YOXq^4f1^VD!A&{-8@o+M;sTa5iVmXD6P7X} zSP-V>XvG%37n8jXlii$sf21d+dee>5rFjIuBTIgMaQ9&S!S82xEgIV82&V1o2#%v@ znRqQA>HPo`nt@t!u>5<8z0fr($4(lE>h0d>Wfq7KZf8hBt%*#WP!3d_Yk?2ik}r@W}ME4jU? z**^2tv%+-_X*=xY2URKfWTB=^4_fRWtPO_MnT1D+1VY6DQ3`eVdJRmt z4NSUoF3x6O7G)lG<{yI<6bm_gFmGIav2X?rkZ)Y85?DelGGPe*4?w}^U3~@N%ev6b zR89#3i<@I|8bF8%B2w|uHX!1Cg+~JHVAx8CbC(K~u_N&Ef1phr4>3J~_SRGllPF%J z54K)2Ik*SFWchxw$Yuo|B^hnDM)lby=vm`ZR0+Y`6Z?3;J2T-YS`~= zLvK6sC86p$`e!a0@u_9VNncXQ{%bh=Lks?|;jkc@{?~B$FdU4u>exL_cS44lKLKF* z)xSGRUAnjdT9U&5nv;lZJsq%BAo)nI>eY|;wn#Q^Default Value -
    options.< option name >.label
    -
    options.< option name >.value
    -
    options.< option name >.optgroup
    - Options label, value, nested level of options - No -
    String
    -
    String
    -
    Object
    - + options.< option name >.label + Options label + - + String + undefined + + + options.< option name >.value + Options value + - + String + undefined + + + options.< option name >.optgroup + Nested level of options + - + Object undefined mode -
    Mode overrides default values for some options.
    -
    In 'simple' mode showCheckbox = chipsEnabled = closeBtn = false
    -
    In 'optgroup' mode showCheckbox = openLevelsAction = false, and lastSelectable = optgroupLabels = labelsDecoration = true
    - No + Mode overrides default values for some options. In 'simple' mode showCheckbox = chipsEnabled = closeBtn = false. In 'optgroup' mode showCheckbox = openLevelsAction = false, and lastSelectable = optgroupLabels = labelsDecoration = true. + - Boolean false - isMultipleFiles - Flag which indicates whether multiple files can be uploaded or not - No + showCheckbox + Show checkbox just before option label, select options by checking + - Boolean - false + true - allowedExtensions - List of allowed file extensions - No - String/Array - * + chipsEnabled + Selected options are shown in ui select's header as deletable chips + - + Boolean + true - dropZone - CSS selector of a drop zone element relative to a file input element - No - String - [data-role=drop-zone] + closeBtn + Show button that closes dropdown + - + Boolean + true - uploaderConfig - Configuration which will be passed to jquery-file-upload plugin - Yes - Object + closeBtnLabel + Label of the close button + - + string + $t('Done') + + + levelsVisibility + If true, all levels are visible. If is a number, this number of levels are visible. + - + Boolean/number + true + + + openLevelsAction + + - + Boolean + true + + + showOpenLevelsActionIcon + + - + Boolean + true + + + showTree + - + Boolean + false - uploaderConfig.url - Route to server controller which will handle file uploading process - Yes + separator + + - String - null + optgroup - \ No newline at end of file + + +####Integration + +Here is an example of configuration of select component. It is used as column filter and has 3 levels of options, with not selectable label for every level, without checkboxes: + +view the configuration \ No newline at end of file From 02b8ddebeb8eda815b5d30f91d2f7a7b81169149 Mon Sep 17 00:00:00 2001 From: Oleksandra Marchenko Date: Mon, 22 Feb 2016 16:28:22 +0200 Subject: [PATCH 243/902] Added content about custom shipping address renderer --- .../v2.0/howdoi/checkout/checkout_address.md | 299 +++++++++++++++++- 1 file changed, 289 insertions(+), 10 deletions(-) diff --git a/guides/v2.0/howdoi/checkout/checkout_address.md b/guides/v2.0/howdoi/checkout/checkout_address.md index 3cbe228240b..f25612f0890 100644 --- a/guides/v2.0/howdoi/checkout/checkout_address.md +++ b/guides/v2.0/howdoi/checkout/checkout_address.md @@ -22,15 +22,14 @@ This topic describes how to implement a custom shipping address renderer. To implement a payment method rendering in checkout, you need to take the following steps: -1. [Create the JS renderer component (shipping address renderer).](#create) -2. Create the JS model for the shipping rate processor -3. Create the JS model for the shipping address saving processor -4. Create the JS component registering the processors +1. [Create the JS renderer component (shipping address renderer)](#create). +2. [Create the JS model for the shipping rate processor](#rate_processor). +3. [Create the JS model for the shipping address saving processor](#save). +4. [Create the JS component registering the processors](#register). 5. Create template?

    do we need a template?

    -3. [Create a template for the payment method renderer.](#template) -4. [Declare the new components in the checkout page layout.](#layout) -5. [Add the shipping address renderer to the "Ship-To" block (optional)](#ship_to) +4. [Declare the new components in the checkout page layout.](#layout). +5. [Add the shipping address renderer to the "Ship-To" block (optional)](#ship_to). All the steps are described further. @@ -39,10 +38,290 @@ All the steps are described further. Your shipping address renderer must be implemented as a UI component. That is, it must be a RequireJS module, and must return a factory function, that takes a configurable object. - For the sake of compatibility, upgradability and easy maintenance, do not edit the default Magento code, add your customizations in a separate module. For your checkout customization to be applied correctly, your custom module should depend on the Magento_Checkout module. Module dependencies are specified in the [module's `composer.json`]({{site.gdeurl}}extension-dev-guide/build/composer-integration.html). -In you custom module directory create the component's `.js` file (payment method renderer). It must be located under the `/view/frontend/web/js/view/` directory. For example in the Magento modules, the payment methods renderers are stored in the `/view/frontend/web/js/view/payment/method-renderer/` directory. +In you custom module directory create the component's `.js` file (shipping address renderer). It must be located under the `/view/frontend/web/js/view/` directory. For example in the Magento modules, the payment methods renderers are stored in the ... directory. + +

    any conventions on this?

    Usually, your component will extend the default payment method component (default payment method renderer) implemented in the `/view/frontend/web/js/view/payment/default.js` file. The following table contains the list of the `default` component's methods. - \ No newline at end of file + +

    Is there smth similar for shipping address?

    + +The general view of the shipping address renderer is the following: + +

    what template do we need to specify?

    +

    what template do we need to specify?

    ?

    + +{%highlight js%} +define([ + 'ko', + 'uiComponent', + 'Magento_Checkout/js/action/select-shipping-address', + 'Magento_Checkout/js/model/quote' +], function(ko, Component, selectShippingAddressAction, quote) { + 'use strict'; + return Component.extend({ + defaults: { + template: '%path to your template%' + }, + + initProperties: function () { + this._super(); + this.isSelected = ko.computed(function() { + var isSelected = false; + var shippingAddress = quote.shippingAddress(); + if (shippingAddress) { + isSelected = shippingAddress.getKey() == this.address().getKey(); + } + return isSelected; + }, this); + + return this; + }, + + /** Set selected customer shipping address */ + selectAddress: function() { + selectShippingAddressAction(this.address()); + }, + + /** additional logic required for this renderer **/ + + }); +}); +{%endhighlight%} + +## Create the JS model for the shipping rate processor {#rate_processor} + +A shipping rate processor is responsible for retrieving the shipping rates available for the given shipping address. + +In you custom module directory create the component's `.js` file for the processor. It must be located under the `/view/frontend/web/js/view/` directory. + +

    any additional conventions?

    + +

    What is %URL for shipping rate estimation%, %address parameters%

    + +Following is a sample of the shipping rate processor code: + +{%highlight js%} +define( + [ + 'Magento_Checkout/js/model/quote', + 'Magento_Checkout/js/model/shipping-service', + 'Magento_Checkout/js/model/shipping-rate-registry', + 'magento/storage', + 'Magento_Checkout/js/model/error-processor', + // additional dependencies + ], + function (quote, shippingService, rateRegistry, storage, errorProcessor, ...) { + 'use strict'; + return { + getRates: function(address) { + var cache = rateRegistry.get(address.getKey()); + if (cache) { + shippingService.setShippingRates(cache); + } else { + shippingService.isLoading(true); + storage.post( + %URL for shipping rate estimation%, + JSON.stringify({ + %address parameters% + }), + false + ).done( + function (result) { + rateRegistry.set(address.getKey(), result); + shippingService.setShippingRates(result); + } + ).fail( + function (response) { + shippingService.setShippingRates([]); + errorProcessor.process(response); + } + ).always( + function () { + shippingService.isLoading(false); + } + ); + } + } + }; + } +); + +{%endhighlight%} + +## Create the JS model for the shipping address saving processor {#save} + +This processor is responsible for saving the shipping address. + +In you custom module directory create the component's `.js` file for the processor. It must be located under the `/view/frontend/web/js/view/` directory. + +

    any additional conventions?

    + +Following is a sample of the shipping rate processor code: + +{%highlight js%} +define( + [ + 'Magento_Checkout/js/model/quote', + 'Magento_Checkout/js/model/resource-url-manager', + 'mage/storage', + 'Magento_Checkout/js/model/payment-service', + 'Magento_Checkout/js/model/error-processor', + 'Magento_Checkout/js/model/payment/method-converter' + ], + function (quote, resourceUrlManager, storage, paymentService, errorProcessor, methodConverter) { + 'use strict'; + return { + saveShippingInformation: function() { + var shippingAddress = {}, + payload; + + shippingAddress.extension_attributes = { + %address extension attributes% + }; + + payload = { + addressInformation: { + shipping_address: shippingAddress, + shipping_method_code: quote.shippingMethod().method_code, + shipping_carrier_code: quote.shippingMethod().carrier_code + } + }; + + return storage.post( + resourceUrlManager.getUrlForSetShippingInformation(quote), + JSON.stringify(payload) + ).done( + function (response) { + paymentService.setPaymentMethods(methodConverter(response.payment_methods)); + quote.setTotals(response.totals) + } + ).fail( + function (response) { + errorProcessor.process(response); + } + ); + } + } + } +); +{%endhighlight%} + +## Create the JS component registering the processors {#register} + +In you custom module directory create the `.js` UI component that registers the rate and saving processors. It must be located under the `/view/frontend/web/js/view/` directory. +

    true?

    +

    Are the processors added to some list of processors?

    + +The file content must be similar to the following: + +

    what is address type

    + +{%highlight js%} +define( + [ + 'uiComponent', + 'Magento_Checkout/js/model/shipping-rate-service', + %custom shipping rate processor%, + 'Magento_Checkout/js/model/shipping-save-processor', + %custom shipping save processor% + ], + function ( + Component, + shippingRateService, + customShippingRateProcessor, + shippingSaveProcessor, + customShippingSaveProcessor + ) { + 'use strict'; + + //Register rate processor + shippingRateService.registerProcessor(%address type%, customShippingRateProcessor); + + //Register save shipping address processor + shippingSaveProcessor.registerProcessor(%address type%, custormShippingSaveProcessor); + + /** Add view logic here if needed */ + return Component.extend({}); + } +); +{%endhighlight%} + +## Declare the new components in the checkout page layout {#layout} + +In your custom module directory, create a new `/view/frontend/layout/checkout_index_index.xml` file. In this file, add the following: + +{%highlight xml%} + + + + + + + + + + + + + + + %component that registers address/rate processors% + + + + + + + %address renderer JS component% + + + + + + + + + + + + + + + + +{%endhighlight%} + +### Add the shipping address renderer to the "Ship-To" block (optional) {#ship_to} + +If you need the ... +

    why do you need to

    +In your `/view/frontend/layout/checkout_index_index.xml` file add the following: + +

    indents of the first two nodes?

    +

    where exactly in layout shoul it go?

    + +{%highlight xml%} +.... + + + + + + + + uiComponent + + %custom template% + + + + + + + + +... +{%endhighlight%} \ No newline at end of file From 28f03d19d2b7dac6cac5f114cc1a5cb05a4978d0 Mon Sep 17 00:00:00 2001 From: Oleksandra Marchenko Date: Mon, 22 Feb 2016 16:48:41 +0200 Subject: [PATCH 244/902] Minor corrections --- guides/v2.0/howdoi/checkout/checkout_address.md | 9 +++++---- guides/v2.0/howdoi/checkout/checkout_overview.md | 3 +-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/guides/v2.0/howdoi/checkout/checkout_address.md b/guides/v2.0/howdoi/checkout/checkout_address.md index f25612f0890..add3f5e151b 100644 --- a/guides/v2.0/howdoi/checkout/checkout_address.md +++ b/guides/v2.0/howdoi/checkout/checkout_address.md @@ -2,9 +2,9 @@ layout: default group: howdoi subgroup: checkout -title: Add custom shipping address renderers -menu_title: Add custom shipping address renderers -menu_order: 8 +title: Add custom shipping address renderer +menu_title: Add custom shipping address renderer +menu_order: 9 github_link: howdoi/checkout/checkout_address.md --- ## What's in this topic @@ -51,7 +51,6 @@ Usually, your component will extend the default payment method component (defaul The general view of the shipping address renderer is the following:

    what template do we need to specify?

    -

    what template do we need to specify?

    ?

    {%highlight js%} define([ @@ -297,7 +296,9 @@ In your custom module directory, create a new `/view/frontend/l ### Add the shipping address renderer to the "Ship-To" block (optional) {#ship_to} If you need the ... +

    why do you need to

    + In your `/view/frontend/layout/checkout_index_index.xml` file add the following:

    indents of the first two nodes?

    diff --git a/guides/v2.0/howdoi/checkout/checkout_overview.md b/guides/v2.0/howdoi/checkout/checkout_overview.md index 47c8b21d8d6..df06cb3f48f 100644 --- a/guides/v2.0/howdoi/checkout/checkout_overview.md +++ b/guides/v2.0/howdoi/checkout/checkout_overview.md @@ -25,8 +25,7 @@ You can customize the default checkout in many ways. Here the following customiz - [Add custom shipping carrier validations]({{site.gdeurl}}howdoi/checkout/checkout_carrier.html) - [Add custom input mask for ZIP code]({{site.gdeurl}}howdoi/checkout/checkout_zip.html) - [Add a custom template for a form field on Checkout page]({{site.gdeurl}}howdoi/checkout/checkout_edit_form.html) - - + - [Add custom shipping address renderer]({{site.gdeurl}}howdoi/checkout/checkout_address.html) For the sake of compatibility, upgradability, and easy maintenance, do not edit the default Magento code, add your customizations in a custom module. From 17861f81f7437d8fd7455c27f190510a6effd879 Mon Sep 17 00:00:00 2001 From: cnanninga Date: Mon, 22 Feb 2016 09:01:43 -0600 Subject: [PATCH 245/902] Fixed terminology regarding proxies being referenced in code --- guides/v2.0/extension-dev-guide/code-generation.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guides/v2.0/extension-dev-guide/code-generation.md b/guides/v2.0/extension-dev-guide/code-generation.md index ed0028da91d..a807d430ac7 100644 --- a/guides/v2.0/extension-dev-guide/code-generation.md +++ b/guides/v2.0/extension-dev-guide/code-generation.md @@ -28,7 +28,7 @@ In particular, * A Factory class creates instances of a type. See Instantiating objects with factories for more information. Factories are directly referenced within application code. -* You can designate a Proxy to be generated for a type in order to ensure the type is not instantiated until it is needed. See Proxies for more information. Proxies are directly referenced within application code. +* You can designate a Proxy to be generated for a type in order to ensure the type is not instantiated until it is needed. See Proxies for more information. Proxies are directly referenced within DI configuration. * Interceptor classes are automatically generated to facilitate Magento's plugin system. An interceptor class extends a type and is returned by the Object Manager to allow multiple plugin classes to inject logic into different methods. Interceptors work behind the scenes and are _not_ directly referenced in application code. From b02743b090f94892745488219472e0a9c3ca0724 Mon Sep 17 00:00:00 2001 From: stevjohnson Date: Mon, 22 Feb 2016 09:01:50 -0600 Subject: [PATCH 246/902] Add info about the package validation tool to PHP Dev Guide --- guides/v2.0/extension-dev-guide/intro/developers_roadmap.md | 2 ++ guides/v2.0/extension-dev-guide/package/package.md | 4 +++- guides/v2.0/extension-dev-guide/package/package_module.md | 3 +++ guides/v2.0/extension-dev-guide/prepare/dev-summary.md | 3 +++ 4 files changed, 11 insertions(+), 1 deletion(-) diff --git a/guides/v2.0/extension-dev-guide/intro/developers_roadmap.md b/guides/v2.0/extension-dev-guide/intro/developers_roadmap.md index 364adf044ec..69c26e61e20 100644 --- a/guides/v2.0/extension-dev-guide/intro/developers_roadmap.md +++ b/guides/v2.0/extension-dev-guide/intro/developers_roadmap.md @@ -31,6 +31,8 @@ Key points: * Distribute your component: * Package your component in `.zip` format. + + Use our [validation tool](http://alankent.me/2016/02/01/magento-2-marketplace-upload-validation-tool-quick-note){:target="_blank"} to check your package before you distribute it. * If you upload the component to Magento Marketplace, it should be less than 30MB in size. #### Related topics diff --git a/guides/v2.0/extension-dev-guide/package/package.md b/guides/v2.0/extension-dev-guide/package/package.md index 14abf5be0e4..29da4c46e6f 100644 --- a/guides/v2.0/extension-dev-guide/package/package.md +++ b/guides/v2.0/extension-dev-guide/package/package.md @@ -14,4 +14,6 @@ redirect_from: /guides/v2.0/extension-dev-guide/package.html Use [Composer](https://getcomposer.org/) to package your module. -* [Using Composer to package a Magento 2 module](package_module.html) \ No newline at end of file +* [Using Composer to package a Magento 2 module](package_module.html) +* Use our [validation tool](http://alankent.me/2016/02/01/magento-2-marketplace-upload-validation-tool-quick-note){:target="_blank"} to check your package before you distribute it. +* *Distribution on Magento Marketplace only*. [Upload your package to the Magento Marketplace](http://docs.magento.com/marketplace/user_guide/getting-started.html){:target="_blank"} diff --git a/guides/v2.0/extension-dev-guide/package/package_module.md b/guides/v2.0/extension-dev-guide/package/package_module.md index deaf5f1988d..a7daa0852de 100644 --- a/guides/v2.0/extension-dev-guide/package/package_module.md +++ b/guides/v2.0/extension-dev-guide/package/package_module.md @@ -27,6 +27,9 @@ To package a component, you must: * Register the component using `registration.php` * Package and publish your component. + Use our [validation tool](http://alankent.me/2016/02/01/magento-2-marketplace-upload-validation-tool-quick-note){:target="_blank"} to check your package before you distribute it. + +

    Create a Magento Composer file

    The Magento `composer.json` file defines the name, requirements, version, and other basic information about the component. This file must be placed in the root directory of the module. diff --git a/guides/v2.0/extension-dev-guide/prepare/dev-summary.md b/guides/v2.0/extension-dev-guide/prepare/dev-summary.md index 0ab0b975cfc..f52e9566d38 100644 --- a/guides/v2.0/extension-dev-guide/prepare/dev-summary.md +++ b/guides/v2.0/extension-dev-guide/prepare/dev-summary.md @@ -19,6 +19,9 @@ To develop your component, use the following steps: 1. Learn about using Composer with your component. 2. Build your component 3. Package a component + + Use our [validation tool](http://alankent.me/2016/02/01/magento-2-marketplace-upload-validation-tool-quick-note){:target="_blank"} to check your package before you distribute it. + 4. Validate your component 4. Upload the components to the Magento Marketplace. From 74f4b542dd037a649d0799a16998776e78ae92b7 Mon Sep 17 00:00:00 2001 From: Oleksandra Marchenko Date: Mon, 22 Feb 2016 17:39:38 +0200 Subject: [PATCH 247/902] added first review comments --- .../v2.0/howdoi/checkout/checkout_address.md | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/guides/v2.0/howdoi/checkout/checkout_address.md b/guides/v2.0/howdoi/checkout/checkout_address.md index add3f5e151b..055cf9198bd 100644 --- a/guides/v2.0/howdoi/checkout/checkout_address.md +++ b/guides/v2.0/howdoi/checkout/checkout_address.md @@ -42,11 +42,6 @@ For the sake of compatibility, upgradability and easy maintenance, do not edit t In you custom module directory create the component's `.js` file (shipping address renderer). It must be located under the `/view/frontend/web/js/view/` directory. For example in the Magento modules, the payment methods renderers are stored in the ... directory. -

    any conventions on this?

    - -Usually, your component will extend the default payment method component (default payment method renderer) implemented in the `/view/frontend/web/js/view/payment/default.js` file. The following table contains the list of the `default` component's methods. - -

    Is there smth similar for shipping address?

    The general view of the shipping address renderer is the following: @@ -94,11 +89,13 @@ define([ A shipping rate processor is responsible for retrieving the shipping rates available for the given shipping address. -In you custom module directory create the component's `.js` file for the processor. It must be located under the `/view/frontend/web/js/view/` directory. +In you custom module directory create the component's `.js` file for the processor. It must be located under the `/view/frontend/web/js/model/` directory. + + +

    What is %URL for shipping rate estimation%, %address parameters% -

    any additional conventions?

    -

    What is %URL for shipping rate estimation%, %address parameters%

    +

    Following is a sample of the shipping rate processor code: @@ -152,7 +149,7 @@ define( ## Create the JS model for the shipping address saving processor {#save} -This processor is responsible for saving the shipping address. +This processor is responsible for sending the address to be used for shipping + selected rate to the server. In you custom module directory create the component's `.js` file for the processor. It must be located under the `/view/frontend/web/js/view/` directory. @@ -301,8 +298,8 @@ If you need the ... In your `/view/frontend/layout/checkout_index_index.xml` file add the following: -

    indents of the first two nodes?

    -

    where exactly in layout shoul it go?

    +

    indents of the first two nodes?

    need to correct indents +

    where exactly in layout shoul it go?

    search "ship-to" {%highlight xml%} .... From 7982deb7c0aea3fed22742fddeb7b2535c6b8319 Mon Sep 17 00:00:00 2001 From: Alexander Menk Date: Mon, 22 Feb 2016 19:27:48 +0100 Subject: [PATCH 248/902] Clarify before plugin --- guides/v2.0/extension-dev-guide/plugins.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/guides/v2.0/extension-dev-guide/plugins.md b/guides/v2.0/extension-dev-guide/plugins.md index ce7a4e6e31b..00e3e0b45c8 100644 --- a/guides/v2.0/extension-dev-guide/plugins.md +++ b/guides/v2.0/extension-dev-guide/plugins.md @@ -66,7 +66,6 @@ Several conditions influence how plug-ins apply to the same class or interface: Use one or more of the following methods to extend/modify an original method's behavior with the interception functionality: * Change the arguments of an original method through the before-listener. - * Change the values returned by an original method through the after-listener. * Change both the arguments and returned values of an original method through the around-listener. @@ -93,7 +92,7 @@ Several conditions influence how plug-ins apply to the same class or interface:

    Example plug-ins

    -To change the arguments of an original method or add some behavior before an original method is called, use the before-listener method. +To change the arguments of an original method or add some behavior before an original method is called, use the before-listener method. The method should return the changed argument, or an array of arguments, if the original method had multiple arguments. If the method returns `null`, no arguments are changed. Prefix the name of the original method with `before` as the following sample shows: From 1d0c39d45aefa5ce968a5dd6792c3e0c633e2726 Mon Sep 17 00:00:00 2001 From: fahadonline Date: Tue, 23 Feb 2016 18:54:56 +0500 Subject: [PATCH 249/902] "information about" repeated twice "information about" repeated twice --- guides/v2.0/extension-dev-guide/attributes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guides/v2.0/extension-dev-guide/attributes.md b/guides/v2.0/extension-dev-guide/attributes.md index f8ae2d36b76..25d14c9a3ca 100644 --- a/guides/v2.0/extension-dev-guide/attributes.md +++ b/guides/v2.0/extension-dev-guide/attributes.md @@ -13,7 +13,7 @@ redirect_from: /guides/v1.0/extension-dev-guide/attributes.html Magento provides two types of attributes that integrators can use to extend the functionality provided out-of-the-box: -* Custom and EAV (Entity-Attribute-Value) attributes. Custom attributes are those added on behalf of a merchant. For example, a merchant might need to add attributes to describe products, such as shape or volume. A merchant can add these attributes on the admin panel, and these attributes can be displayed. See the merchant documentation for information about information about managing custom attributes. +* Custom and EAV (Entity-Attribute-Value) attributes. Custom attributes are those added on behalf of a merchant. For example, a merchant might need to add attributes to describe products, such as shape or volume. A merchant can add these attributes on the admin panel, and these attributes can be displayed. See the merchant documentation for information about managing custom attributes. Custom attributes are a subset of EAV attributes. Objects that use EAV attributes typically store values in several MySQL tables. The `Customer` and `Catalog` modules have the primary models that use EAV attributes. Other modules, such as `ConfigurableProduct`, `GiftMessage`, and `Tax`, use the EAV functionality for `Catalog`. From e45cbb0aa621306eba987f857c47577cf1e44339 Mon Sep 17 00:00:00 2001 From: stevjohnson Date: Tue, 23 Feb 2016 08:35:56 -0600 Subject: [PATCH 250/902] Update to Redis configuration --- .../v2.0/config-guide/redis/config-redis.md | 61 ++++++++++--------- 1 file changed, 33 insertions(+), 28 deletions(-) diff --git a/guides/v2.0/config-guide/redis/config-redis.md b/guides/v2.0/config-guide/redis/config-redis.md index b324523144f..88b43c8bca6 100644 --- a/guides/v2.0/config-guide/redis/config-redis.md +++ b/guides/v2.0/config-guide/redis/config-redis.md @@ -65,31 +65,32 @@ Installing and configuring the Redis software is beyond the scope of this guide.

    Configure Magento to use Redis

    Following is a sample configuration to add to `app/etc/env.php`: - 'cache' => [ - 'frontend' => - array ( - 'default' => - array ( - 'backend' => 'Cm_Cache_Backend_Redis', - 'backend_options' => - array ( - 'server' => '127.0.0.1', - 'port' => '6379', - 'password' => '', - 'force_standalone' => '0', - ), - ), - 'page_cache' => - array ( - 'backend' => 'Cm_Cache_Backend_Redis', - 'backend_options' => - array ( - 'server' => '127.0.0.1', - 'port' => '6379', - 'password' => '', - 'force_standalone' => 0, - ), - + 'cache' => + array( + 'frontend' => + array( + 'default' => + array( + 'backend' => 'Cm_Cache_Backend_Redis', + 'backend_options' => + array( + 'server' => '127.0.0.1', + 'port' => '6379' + ), + ), + 'page_cache' => + array( + 'backend' => 'Cm_Cache_Backend_Redis', + 'backend_options' => + array( + 'server' => '127.0.0.1', + 'port' => '6379', + 'database' => '1', + 'compress_data' => '0' + ) + ) + ) + ) where @@ -102,7 +103,7 @@ where page_cache

    Specify the segment name to use a particular segment or a default shortcut for all other caches.

    -

    The default cache segment enables you to configure all cache segments except for page_cache.

    +

    The default cache segment enables you to configure all cache segments except for page_cache (the full page cache).

    server @@ -112,13 +113,17 @@ where port Redis server listen port + + database + Required if you use Redis for both the default and full page cache. You must specify the database number of one of the caches; the other cache uses 0 by default. + password Specifies a password if your Redis server requires authentication. - force_standalone - Use 0 for phpredis or 1 for standalone PHP. + compress_data + Required only for the full page cache. Set to 1 to compress the full page cache. Redis chooses a compression algorithm in the following order, based on availability: snappy, l4z, or lzf. If none of them available, Redis uses gzip. From 2713c2764eed6e5964e156dae261f979c7ef580a Mon Sep 17 00:00:00 2001 From: stevjohnson Date: Tue, 23 Feb 2016 08:45:12 -0600 Subject: [PATCH 251/902] Clarify cache segments for Redis --- guides/v2.0/config-guide/redis/config-redis.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guides/v2.0/config-guide/redis/config-redis.md b/guides/v2.0/config-guide/redis/config-redis.md index 88b43c8bca6..5a487b71c4e 100644 --- a/guides/v2.0/config-guide/redis/config-redis.md +++ b/guides/v2.0/config-guide/redis/config-redis.md @@ -101,7 +101,7 @@ where Meaning - page_cache + default, page_cache

    Specify the segment name to use a particular segment or a default shortcut for all other caches.

    The default cache segment enables you to configure all cache segments except for page_cache (the full page cache).

    From 55c92507304f3311bedfac93d2fa5df8baec775f Mon Sep 17 00:00:00 2001 From: fahadonline Date: Tue, 23 Feb 2016 20:12:32 +0500 Subject: [PATCH 252/902] "must" not "much" "must" not "much" --- guides/v2.0/extension-dev-guide/attributes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guides/v2.0/extension-dev-guide/attributes.md b/guides/v2.0/extension-dev-guide/attributes.md index f8ae2d36b76..7c8bc764368 100644 --- a/guides/v2.0/extension-dev-guide/attributes.md +++ b/guides/v2.0/extension-dev-guide/attributes.md @@ -82,7 +82,7 @@ where:

    for

    -

    The fully-qualified type name with the namespace that processes the extensions. The value much be a type that implements `ExtensibleDataInterface`. The interface can be in a different module.

    +

    The fully-qualified type name with the namespace that processes the extensions. The value must be a type that implements `ExtensibleDataInterface`. The interface can be in a different module.

    Magento\Quote\Api\Data\TotalsInterface From 033ffb304b49f25cc5576de4a205ecba88ccbfd5 Mon Sep 17 00:00:00 2001 From: Oleksandra Marchenko Date: Tue, 23 Feb 2016 17:53:27 +0200 Subject: [PATCH 253/902] added corrections --- .../v2.0/howdoi/checkout/checkout_address.md | 99 +++++++++++-------- 1 file changed, 58 insertions(+), 41 deletions(-) diff --git a/guides/v2.0/howdoi/checkout/checkout_address.md b/guides/v2.0/howdoi/checkout/checkout_address.md index 055cf9198bd..d54fc439f7d 100644 --- a/guides/v2.0/howdoi/checkout/checkout_address.md +++ b/guides/v2.0/howdoi/checkout/checkout_address.md @@ -14,20 +14,17 @@ Out of the box, Magento checkout consists of two steps: - Shipping Information - Review and Payment Information -On the Shipping Information step Magento renders the shipping address form. Default address renderers cover the majority of use cases, but Magento provides way to register custom address renderer for a new address type. -

    Is it really the form?

    -

    What is meant by most use cases?

    +When a logged in shopper proceeds to checkout,oOn the Shipping Information step Magento renders the saved addresses. The shopper can then click on the address they want to use as a shipping address. Default address renderers cover the majority of use cases, but Magento provides way to register custom address renderer for a new address type. This topic describes how to implement a custom shipping address renderer. To implement a payment method rendering in checkout, you need to take the following steps: 1. [Create the JS renderer component (shipping address renderer)](#create). +3. [Create a template for the shipping address renderer.](#template) 2. [Create the JS model for the shipping rate processor](#rate_processor). 3. [Create the JS model for the shipping address saving processor](#save). 4. [Create the JS component registering the processors](#register). -5. Create template? -

    do we need a template?

    4. [Declare the new components in the checkout page layout.](#layout). 5. [Add the shipping address renderer to the "Ship-To" block (optional)](#ship_to). @@ -40,13 +37,11 @@ Your shipping address renderer must be implemented as a UI component. That is, i For the sake of compatibility, upgradability and easy maintenance, do not edit the default Magento code, add your customizations in a separate module. For your checkout customization to be applied correctly, your custom module should depend on the Magento_Checkout module. Module dependencies are specified in the [module's `composer.json`]({{site.gdeurl}}extension-dev-guide/build/composer-integration.html). -In you custom module directory create the component's `.js` file (shipping address renderer). It must be located under the `/view/frontend/web/js/view/` directory. For example in the Magento modules, the payment methods renderers are stored in the ... directory. +In you custom module directory create the component's `.js` file (shipping address renderer). It must be located under the `/view/frontend/web/js/view/` directory. The general view of the shipping address renderer is the following: -

    what template do we need to specify?

    - {%highlight js%} define([ 'ko', @@ -85,17 +80,24 @@ define([ }); {%endhighlight%} +## Create a template for the shipping address renderer {#template} + +In your custom module directory create a new `/view/frontend/web/template/.html` file. The template can use [Knockout JS](http://knockoutjs.com/) syntax. + +The template should contain a button for setting the address to be used for shipping. + +You can use the code from the default template: [app/code/Magento/Checkout/view/frontend/web/template/shipping-address/address-renderer/default.html]({{site.gdeurl}}app/code/Magento/Checkout/view/frontend/web/template/shipping-address/address-renderer/default.html). + + ## Create the JS model for the shipping rate processor {#rate_processor} A shipping rate processor is responsible for retrieving the shipping rates available for the given shipping address. In you custom module directory create the component's `.js` file for the processor. It must be located under the `/view/frontend/web/js/model/` directory. +Here you need to specify the URL used for calculating the shipping rate for your custom address type. -

    What is %URL for shipping rate estimation%, %address parameters% - - -

    +

    isn't rate different for different shipping address?

    Following is a sample of the shipping rate processor code: @@ -153,7 +155,6 @@ This processor is responsible for sending the address to be used for shipping + In you custom module directory create the component's `.js` file for the processor. It must be located under the `/view/frontend/web/js/view/` directory. -

    any additional conventions?

    Following is a sample of the shipping rate processor code: @@ -208,13 +209,9 @@ define( ## Create the JS component registering the processors {#register} In you custom module directory create the `.js` UI component that registers the rate and saving processors. It must be located under the `/view/frontend/web/js/view/` directory. -

    true?

    -

    Are the processors added to some list of processors?

    The file content must be similar to the following: -

    what is address type

    - {%highlight js%} define( [ @@ -290,36 +287,56 @@ In your custom module directory, create a new `/view/frontend/l {%endhighlight%} +The address_type you need to specify in the layout, is the value you set in the JS model of your custom address type. + ### Add the shipping address renderer to the "Ship-To" block (optional) {#ship_to} -If you need the ... +On the Review and Payment Information step of checkout, the address selected by the shopper to be used for shipping is displayed in the **Ship-To** section for customer to make sure everything is set correctly. -

    why do you need to

    +If you want your custom address type to be displayed here as well, you need to create a an `.html` template for rendering it, and declare in the corresponding location in layout. -In your `/view/frontend/layout/checkout_index_index.xml` file add the following: +### Add template for displaying the address in the Ship-To section -

    indents of the first two nodes?

    need to correct indents -

    where exactly in layout shoul it go?

    search "ship-to" +In your custom module directory create a new `/view/frontend/web/template/.html` file. The template can use [Knockout JS](http://knockoutjs.com/) syntax. + +You can use the code from the default template: [app/code/Magento/Checkout/view/frontend/web/template/shipping-information/address-renderer/default.html]({{site.gdeurl}}app/code/Magento/Checkout/view/frontend/web/template/shipping-information/address-renderer/default.html). + +### Declare the address to be used in the Ship-To section in layout + +In your `/view/frontend/layout/checkout_index_index.xml` file add the following: {%highlight xml%} -.... - - - - - - - - uiComponent - - %custom template% + + + + + + + + + + + + + + + uiComponent + + %custom template% + + + + + + + + + - - - - - - - -... + + + + + + {%endhighlight%} \ No newline at end of file From 34e3ed0031a640c7192b93ddf1d5b4beca0d0656 Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 23 Feb 2016 18:05:05 +0200 Subject: [PATCH 254/902] Implemented EEITWE-1497: Global Footer - redesign --- _includes/footer.html | 137 ++++++++++++++++++------------------- scss/_overrides.scss | 46 ++++++++++++- scss/partials/_footer.scss | 97 ++++++++++++++++---------- 3 files changed, 173 insertions(+), 107 deletions(-) diff --git a/_includes/footer.html b/_includes/footer.html index 0d959852709..1331a3456b0 100644 --- a/_includes/footer.html +++ b/_includes/footer.html @@ -8,89 +8,84 @@ -3. If prompted, enter your [authentication keys]({{ site.gdeurl }}). +3. If prompted, enter your [authentication keys]({{ site.gdeurl }}comp-mgr/prereq/prereq_auth-token.html). 4. Update the database schema and data: php bin/magento setup:upgrade @@ -80,4 +80,4 @@ To upgrade using the command line: /var/cache /var/page_cache - /var/generation \ No newline at end of file + /var/generation From 429786e228425c0efd42461d45851a1d0bd93e49 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anna=20V=C3=B6lkl?= Date: Wed, 20 Apr 2016 14:23:09 +0200 Subject: [PATCH 735/902] Add Knockout.js to technology list --- guides/v2.0/architecture/tech-stack.md | 1 + 1 file changed, 1 insertion(+) diff --git a/guides/v2.0/architecture/tech-stack.md b/guides/v2.0/architecture/tech-stack.md index 36397b48c3d..979c48a8cce 100644 --- a/guides/v2.0/architecture/tech-stack.md +++ b/guides/v2.0/architecture/tech-stack.md @@ -58,6 +58,7 @@ Magento’s highly modular structure includes the following open-source technolo * JQuery (primary JavaScript library) * RequireJS (library that helps load JavaScript resources on demand) +* Knockout.js (simplifies JavaScript UIs with the Model-View-View model pattern) * Third-party libraries (Zend Framework 1, Zend Framework 2, Symfony) * Coding standards PSR-0 (autoloading standard), PSR-1 (basic coding standards), and PSR-2 (coding style guide), PSR-3, PSR-4 From 435b7cfbea2cf5e007f01bbfa602ef6e2151c926 Mon Sep 17 00:00:00 2001 From: Dmitry Shevtsov Date: Wed, 20 Apr 2016 17:01:53 +0300 Subject: [PATCH 736/902] MAGETWO-52026: [MTF] Review MTF guide after Vinai's contibution - Navigation panel changed - QA added --- _includes/navigation.html | 9 +++++++++ guides/v2.0/{howdoi/mtf/mtf.md => test/qa.md} | 17 ++++++++++------- 2 files changed, 19 insertions(+), 7 deletions(-) rename guides/v2.0/{howdoi/mtf/mtf.md => test/qa.md} (94%) diff --git a/_includes/navigation.html b/_includes/navigation.html index c587573a434..7926710089e 100644 --- a/_includes/navigation.html +++ b/_includes/navigation.html @@ -38,6 +38,15 @@
  • Coding Standards
  • +
  • + QA + > +
  • +
  • Designers
  • -
  • - QA - > -
  • -
  • Designers
  • +
  • + Testing + +
  • How Do I...?
  • diff --git a/guides/v2.0/test/qa.md b/guides/v2.0/test/testing.md similarity index 100% rename from guides/v2.0/test/qa.md rename to guides/v2.0/test/testing.md From eedcf182a6efabbc9d4849127ca6cd81e5a58d30 Mon Sep 17 00:00:00 2001 From: Dmitry Shevtsov Date: Wed, 20 Apr 2016 18:20:08 +0300 Subject: [PATCH 738/902] MAGETWO-52026: [MTF] Review MTF guide after Vinai's contibution - unit and integration tests each now have own group --- guides/v2.0/test/integration/integration_test_execution.md | 4 ++-- .../v2.0/test/integration/integration_test_execution_cli.md | 4 ++-- .../test/integration/integration_test_execution_phpstorm.md | 4 ++-- guides/v2.0/test/integration/integration_test_setup.md | 4 ++-- guides/v2.0/test/unit/unit_test_execution.md | 4 ++-- guides/v2.0/test/unit/unit_test_execution_cli.md | 4 ++-- guides/v2.0/test/unit/unit_test_execution_phpstorm.md | 4 ++-- guides/v2.0/test/unit/writing_testable_code.md | 4 ++-- 8 files changed, 16 insertions(+), 16 deletions(-) diff --git a/guides/v2.0/test/integration/integration_test_execution.md b/guides/v2.0/test/integration/integration_test_execution.md index b20e7cb66d8..c6b1debcbc0 100644 --- a/guides/v2.0/test/integration/integration_test_execution.md +++ b/guides/v2.0/test/integration/integration_test_execution.md @@ -1,7 +1,7 @@ --- layout: default -group: test-guide -subgroup: B1_Running_Integration_Tests +group: integration-testing +subgroup: 10_Running_Integration_Tests title: Running Integration Tests menu_title: Running Integration Tests menu_node: parent diff --git a/guides/v2.0/test/integration/integration_test_execution_cli.md b/guides/v2.0/test/integration/integration_test_execution_cli.md index b78e389afd9..4852ef64dba 100644 --- a/guides/v2.0/test/integration/integration_test_execution_cli.md +++ b/guides/v2.0/test/integration/integration_test_execution_cli.md @@ -1,7 +1,7 @@ --- layout: default -group: test-guide -subgroup: B3_Running_Integration_Tests +group: integration-testing +subgroup: 20_Running_Integration_Tests title: Running Integration Tests in the CLI menu_title: Running Integration Tests in the CLI menu_node: parent diff --git a/guides/v2.0/test/integration/integration_test_execution_phpstorm.md b/guides/v2.0/test/integration/integration_test_execution_phpstorm.md index 13b68841a12..34e0f7d3078 100644 --- a/guides/v2.0/test/integration/integration_test_execution_phpstorm.md +++ b/guides/v2.0/test/integration/integration_test_execution_phpstorm.md @@ -1,7 +1,7 @@ --- layout: default -group: test-guide -subgroup: B4_Running_Integration_Tests +group: integration-testing +subgroup: 40_Running_Integration_Tests title: Running Integration Tests in PHPStorm menu_title: Running Integration Tests in PHPStorm menu_node: parent diff --git a/guides/v2.0/test/integration/integration_test_setup.md b/guides/v2.0/test/integration/integration_test_setup.md index bf407220053..5d5b91d7b6b 100644 --- a/guides/v2.0/test/integration/integration_test_setup.md +++ b/guides/v2.0/test/integration/integration_test_setup.md @@ -1,7 +1,7 @@ --- layout: default -group: test-guide -subgroup: B2_Integration_Test_Setup +group: integration-testing +subgroup: 40_Integration_Test_Setup title: Preparing Integration Test Execution menu_title: Integration Test Setup menu_node: parent diff --git a/guides/v2.0/test/unit/unit_test_execution.md b/guides/v2.0/test/unit/unit_test_execution.md index 45085be1dd0..c07896658f0 100644 --- a/guides/v2.0/test/unit/unit_test_execution.md +++ b/guides/v2.0/test/unit/unit_test_execution.md @@ -1,7 +1,7 @@ --- layout: default -group: test-guide -subgroup: A1_Running_Unit_Tests +group: unit-testing +subgroup: 10_Running_Unit_Tests title: Running Unit Tests menu_title: Running Unit Tests menu_node: parent diff --git a/guides/v2.0/test/unit/unit_test_execution_cli.md b/guides/v2.0/test/unit/unit_test_execution_cli.md index 14918dd676e..1d51334b715 100644 --- a/guides/v2.0/test/unit/unit_test_execution_cli.md +++ b/guides/v2.0/test/unit/unit_test_execution_cli.md @@ -1,7 +1,7 @@ --- layout: default -group: test-guide -subgroup: A2_Running_Unit_Tests +group: unit-testing +subgroup: 20_Running_Unit_Tests title: Running Unit Tests in the CLI menu_title: Running Unit Tests in the CLI menu_node: parent diff --git a/guides/v2.0/test/unit/unit_test_execution_phpstorm.md b/guides/v2.0/test/unit/unit_test_execution_phpstorm.md index 5b7b15f0a5c..c3176727b82 100644 --- a/guides/v2.0/test/unit/unit_test_execution_phpstorm.md +++ b/guides/v2.0/test/unit/unit_test_execution_phpstorm.md @@ -1,7 +1,7 @@ --- layout: default -group: test-guide -subgroup: A3_Running_Unit_Tests +group: unit-testing +subgroup: 30_Running_Unit_Tests title: Running Unit Tests in PHPStorm menu_title: Running Unit Tests in PHPStorm menu_node: parent diff --git a/guides/v2.0/test/unit/writing_testable_code.md b/guides/v2.0/test/unit/writing_testable_code.md index e4f85febcfc..c1bff1c3f46 100644 --- a/guides/v2.0/test/unit/writing_testable_code.md +++ b/guides/v2.0/test/unit/writing_testable_code.md @@ -1,7 +1,7 @@ --- layout: default -group: test-guide -subgroup: A5_Running_Unit_Tests +group: unit-testing +subgroup: 40_Running_Unit_Tests title: Writing Testable Code menu_title: Writing Testable Code menu_node: parent From 896360aba55dbbfce20f5fc24b948b22625f0a70 Mon Sep 17 00:00:00 2001 From: James Calcaben Date: Wed, 20 Apr 2016 10:48:01 -0500 Subject: [PATCH 739/902] Fix minor grammar errors --- .../extension-dev-guide/prepare/lifecycle.md | 26 +++++++++---------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/guides/v2.0/extension-dev-guide/prepare/lifecycle.md b/guides/v2.0/extension-dev-guide/prepare/lifecycle.md index 9f083455c92..60050d6e379 100644 --- a/guides/v2.0/extension-dev-guide/prepare/lifecycle.md +++ b/guides/v2.0/extension-dev-guide/prepare/lifecycle.md @@ -27,7 +27,7 @@ Your extension's lifecycle is the series of phases it goes through while it is a ### Schema and Data Initialization -When your module is installed, re-installed, or upgraded, it goes through an initialization process for both schema and data. +When your module is installed, re-installed, or upgraded, it goes through an initialization process for its schema and then its data. For schema initialization, your module goes through the following phases: @@ -47,17 +47,15 @@ After the schema initialization completes, your module goes through the data ini In order for Magento to detect the classes you are using to hook into the different lifecycle phases, you must follow these standards: -* The class should be in the `Setup` folder in your module's root directory. -* The class must use the specific name for the phase it will be executed in; e.g. `InstallSchema`, `InstallData`, etc. -* The class must implement the specific class interface for the phase it will be executed in. - -See each provided example below to get the correct name and class interface to use for your lifecycle classes. +* The class should be in the `Setup` folder in your module's root directory with the appropriate file name. For the correct file name, please see the specific examples below. +* The class must use the specific name for the phase it will be executed in. To determine the correct class name to use, please see the specific examples below. +* The class must implement the specific class interface for the phase it will be executed in. To determine the correct interface to use, please see the specific examples below. ### Installation Phases The installation phase of your module lifecycle occurs when it is initially installed or reinstalled. This happens after your extension has been automatically installed from the [Magento Marketplace](https://www.magentocommerce.com/magento-connect){:target="_blank"} or manually installed with the command: `bin/magento setup:upgrade`. -If the `schema_version` of the module is present in the database, then the following two phases are skipped because it is assumed that the module schema and data has already been initialized in a previous installation. When a phase is skipped, your module will move on to the [Upgrade phase](#upgrade-phase). +If the `schema_version` of the module is present in the database, then the following two phases are skipped because it is assumed that the module schema and data has already been initialized in a previous installation. When a phase is skipped, your module will move on to the [upgrade phase](#upgrade-phase). #### Schema Installation Phase The schema installation phase is the first phase your module goes through when it is initially installed. During this phase, the `install` function will be executed in the `InstallSchema` class implementing the `\Magento\Framework\Setup\InstallSchemaInterface`: @@ -82,7 +80,7 @@ When the schema installation phase completes, your module will continue to the [ #### Data Installation Phase -The data installation phase occurs only after your module has completed the Schema Installation, Schema Upgrade, and Schema Recurring phases. The purpose of this phase is to add initial data to the database for your module. +The data installation phase occurs only after your module has completed the schema installation, schema upgrade, and schema recurring phases. The purpose of this phase is to add initial data to the database for your module. During this phase, the `install` function will be executed in the `InstallData` class implementing the `Magento\Framework\Setup\InstallDataInterface`: @@ -102,17 +100,17 @@ class \\\Setup\InstallData implements \Magento\Framework\Setup\I ~~~ -When the data installation phase completes, your module will continue to the [Data Upgrade phase](#data-upgrade-phase). +When the data installation phase completes, your module will continue to the [data upgrade phase](#data-upgrade-phase). --- ### Upgrade Phases -The Upgrade phases always occurs after the [Installation phases](#installation-phases) successfully runs. If the Schema or Data Installation phase was skipped because it detected a previous installation, Magento will check the current module's version to see if it should run the Upgrade phase or skip to the [Recurring Phases](#recurring-phases). +The upgrade phases always occurs after the [installation phases](#installation-phases) successfully runs. If the schema or data Installation phase was skipped because it detected a previous installation, Magento will check the current module's version to see if it should run the upgrade phase or skip to the [recurring phases](#recurring-phases). #### Schema Upgrade Phase -The Schema Upgrade phase runs after the [Schema Installation phase](#schema-installation-phase)(whether the installation phase occurred or not) and when current version is out of date. The purpose of the Schema Upgrade phase is usually to update the database structure. +The schema upgrade phase runs after the [schema installation phase](#schema-installation-phase)(whether the installation phase occurred or not) and when current version is out of date. The purpose of the schema upgrade phase is usually to update the database structure. During this phase, the `upgrade` function will be executed in the `UpgradeSchema` class implementing the `Magento\Framework\Setup\UpgradeSchemaInterface`: @@ -131,7 +129,7 @@ class \\\Setup\UpgradeSchema implements \Magento\Framework\Setup } ~~~ -When the schema upgrade phase completes, your module will continue to the [Schema Recurring Phase](#schema-recurring-phase). +When the schema upgrade phase completes, your module will continue to the [schema recurring phase](#schema-recurring-phase). #### Data Upgrade Phase @@ -221,7 +219,7 @@ During the install, re-install, and upgrade process, the recurring phases are al Your module goes through the schema recurring phase following the schema [installation](#schema-installation-phase) and [upgrade](#schema-upgrade-phase) phases. The purpose of this phase is usually to do final modifications to the database schema after the schema has been installed or updated. -During this phase, the `install` function will be executed in the Recurring class implementing the `Magento\Framework\Setup\InstallSchemaInterface`: +During this phase, the `install` function will be executed in the `Recurring` class implementing the `Magento\Framework\Setup\InstallSchemaInterface`: ~~~ // Location: /Setup/Recurring.php @@ -267,7 +265,7 @@ When the data recurring phase has completed, your module's data store is fully i ### Working Phase -The working phase occurs after your module has been [installed](#installation-phases) or [upgraded](#upgrade-phases). In this phase, your module's core code is executed by the Magento application to perform its business function. For most of its lifetime, your module will be in this phase until it is disabled or [uninstalled](#uninstall-phases). +The working phase occurs after your module has been [installed](#installation-phases) or [upgraded](#upgrade-phases). In this phase, your module's core code is executed by the Magento application to perform its business function. For most of its lifetime, your module will be in this phase until it is [disabled](#disable-and-enable-phases) or [uninstalled](#uninstall-phases). --- From 5e130859e0b0ebfd7878704f132e0f3769249930 Mon Sep 17 00:00:00 2001 From: Akexandr Date: Wed, 20 Apr 2016 18:03:03 +0200 Subject: [PATCH 740/902] Update module-load-order.md correct misspelling in info block. --- guides/v2.0/extension-dev-guide/build/module-load-order.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guides/v2.0/extension-dev-guide/build/module-load-order.md b/guides/v2.0/extension-dev-guide/build/module-load-order.md index 5825ebfd4f2..c2610cf68c2 100644 --- a/guides/v2.0/extension-dev-guide/build/module-load-order.md +++ b/guides/v2.0/extension-dev-guide/build/module-load-order.md @@ -22,7 +22,7 @@ If you know that your component's logic depends on something in another componen

    If you change the component load order using <sequence>, you must regenerate the component list in config.php; otherwise, the load order does not take effect.

    -

    Currently, the only way to do this is to enable the component using magento module:enable <module-list>, where <,pdi;e-list> is the component or components to which you added <sequence>.

    +

    Currently, the only way to do this is to enable the component using magento module:enable <module-list>, where <module-list> is the component or components to which you added <sequence>.

    From 80423933d5a741d66a7c908b590faecdbe7fde1d Mon Sep 17 00:00:00 2001 From: stevjohnson Date: Wed, 20 Apr 2016 11:11:45 -0500 Subject: [PATCH 741/902] Correct admin-password special character documentation --- guides/v2.0/install-gde/install/cli/install-cli-install.md | 2 +- .../install-gde/install/cli/install-cli-subcommands-admin.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/guides/v2.0/install-gde/install/cli/install-cli-install.md b/guides/v2.0/install-gde/install/cli/install-cli-install.md index ab1c68b58c8..25a54dea4c3 100644 --- a/guides/v2.0/install-gde/install/cli/install-cli-install.md +++ b/guides/v2.0/install-gde/install/cli/install-cli-install.md @@ -130,7 +130,7 @@ The following table discusses the meanings of installation option names and valu

    --admin-password

    Magento administrator user password.

    The password must be at least 7 characters in length and must include at least one alphabetic and at least one numeric character.

    -

    We recommend a longer, more complex password. Enclose the entire password string in single quotes and escape special characters with /. For example, --admin-password='A0b9\%t_3\`g'

    +

    We recommend a longer, more complex password. Enclose the entire password string in single quotes. For example, --admin-password='A0b9%t_3`g'

    Yes

    diff --git a/guides/v2.0/install-gde/install/cli/install-cli-subcommands-admin.md b/guides/v2.0/install-gde/install/cli/install-cli-subcommands-admin.md index 35e2e40a48f..816e666f737 100644 --- a/guides/v2.0/install-gde/install/cli/install-cli-subcommands-admin.md +++ b/guides/v2.0/install-gde/install/cli/install-cli-subcommands-admin.md @@ -77,7 +77,7 @@ where the following table defines parameters and values.

    --admin-password

    Magento administrator user password.

    The password must be at least 7 characters in length and must include at least one alphabetic and at least one numeric character.

    -

    We recommend a longer, more complex password. Enclose the entire password string in single quotes and escape special characters with /. For example, --admin-password=''A0b9\%t_3\`g'

    +

    We recommend a longer, more complex password. Enclose the entire password string in single quotes. For example, --admin-password=''A0b9%t_3`g'

    Yes

    From 7b83408d296a50c6d024d653ac60e071411e9250 Mon Sep 17 00:00:00 2001 From: stevjohnson Date: Wed, 20 Apr 2016 12:48:03 -0500 Subject: [PATCH 742/902] Add optional upgrade maintenance page to 2.0 branch --- .../v2.0/comp-mgr/trouble/cman/maint-mode.md | 147 ++++++++++++++++++ .../comp-mgr/upgrader/upgrade-checklist.md | 3 - .../v2.0/comp-mgr/upgrader/upgrade-start.md | 26 +--- 3 files changed, 152 insertions(+), 24 deletions(-) create mode 100644 guides/v2.0/comp-mgr/trouble/cman/maint-mode.md diff --git a/guides/v2.0/comp-mgr/trouble/cman/maint-mode.md b/guides/v2.0/comp-mgr/trouble/cman/maint-mode.md new file mode 100644 index 00000000000..d7f8fe6427b --- /dev/null +++ b/guides/v2.0/comp-mgr/trouble/cman/maint-mode.md @@ -0,0 +1,147 @@ +--- +layout: default +group: compman +subgroup: 50_trouble +title: Maintenance mode options for upgrade +menu_title: Maintenance mode options for upgrade +menu_node: +menu_order: 200 +github_link: comp-mgr/trouble/cman/maint-mode.md +--- + +## Maintenance mode options for upgrade +This topic discusses how you can create a custom maintenance page to display to users while your Magento application is being upgraded. Creating a custom page is optional but recommended because your site is accessible during part of the upgrade. + +Creating a custom page to which to redirect users prevents any access to the site and also informs your users that the site is undergoing maintenance. + +
    +

    You must perform the tasks in this section as a user with root privileges.

    +
    + +See one of the following sections for more information: + +* [Create the custom maintenance page](#compman-trouble-maint-create) +* [Custom maintenance page for Apache](#compman-trouble-maint-apache) +* [Custom maintenance page for nginx](#compman-trouble-maint-nginx) + +## Create the custom maintenance page {#compman-trouble-maint-create} +To create a maintenance page and redirect to it, first create a maintenance page named: + +* Apache: `/maintenance.html` +* nginx: `/maintenance.html` + +Add to it the following contents: + +{% highlight html %} + + + +Temporarily Offline + + + + +

    Temporarily offline

    +

    We're down for a short time to perform maintenance on our site to give you the best possible experience. Check back soon!

    + + +{% endhighlight %} + +## Custom maintenance page for Apache {#compman-trouble-maint-apache} +This section discusses how to create a custom maintenance page and how to redirect traffic to it. + +The example in this section shows how to modify the following files, which is one way to set up your maintenance page: + +* Apache 2.4: `/etc/apache2/sites-available/000-default.conf` +* Apache 2.2: `/etc/apache2/sites-available/default` (Ubuntu), `/etc/httpd/conf/httpd.conf` (CentOS) + +To redirect traffic to a custom maintenance page: + +2. Update your Apache configuration to do the following: + + * Redirect all traffic to the maintenance page + * Whitelist certain IPs so an administrator can run the System Upgrade utility to upgrade the Magento software. + + The following example whitelists 192.0.2.110. + + Add the following at the end of your Apache configuration file: + + RewriteEngine On + RewriteCond %{REMOTE_ADDR} !^192\.0\.2\.110 + RewriteCond %{DOCUMENT_ROOT}/maintenance.html -f + RewriteCond %{DOCUMENT_ROOT}/maintenance.enable -f + RewriteCond %{SCRIPT_FILENAME} !maintenance.html + RewriteRule ^.*$ /maintenance.html [R=503,L] + ErrorDocument 503 /maintenance.html + Header Set Cache-Control "max-age=0, no-store" + +3. Restart Apache: + + * CentOS: `service httpd restart` + * Ubuntu: `service apache2 restart` + +4. Enter the following command: + + touch /maintenance.enable +5. [Upgrade your system]({{ site.gdeurl }}comp-mgr/upgrader/upgrade-start.html). +7. Test your site to make sure it functions correctly. +6. After the upgrade is done, delete `maintenance.enable`. + +## Custom maintenance page for nginx {#compman-trouble-maint-nginx} +This section discusses how to create a custom maintenance page and how to redirect traffic to it. + +To redirect traffic to a custom maintenance page: + +1. Use a text editor to open the nginx configuration file that contains your server block. +2. Add the following to the server block (`server` is shown for clarity only; don't add a second server block). + + The following whitelists IP address 192.0.2.110 and 192.0.2.115 on a system where Magento is installed in `/var/www/html/magento2`: + + server { + listen 80; + set $MAGE_ROOT /var/www/html/magento2; + + set $maintenance off; + + if (-f $MAGE_ROOT/maintenance.enable) { + set $maintenance on; + } + + if ($remote_addr ~ (192.0.2.110|192.0.2.115)) { + set $maintenance off; + } + + if ($maintenance = on) { + return 503; + } + + location /maintenance { + } + + error_page 503 @maintenance; + + location @maintenance { + root $MAGE_ROOT; + rewrite ^(.*)$ /maintenance.html break; + + include /var/www/html/magento2/nginx.conf; + } +4. Enter the following command: + + touch /maintenance.enable +3. Reload the nginx configuration: + + service nginx reload +5. [Upgrade your system]({{ site.gdeurl }}comp-mgr/upgrader/upgrade-start.html). +7. Test your site to make sure it functions correctly. +6. After the upgrade is done, delete or rename `maintenance.enable` +5. Reload the nginx configuration: + + service nginx reload diff --git a/guides/v2.0/comp-mgr/upgrader/upgrade-checklist.md b/guides/v2.0/comp-mgr/upgrader/upgrade-checklist.md index e52e084f2ff..9917429ba38 100644 --- a/guides/v2.0/comp-mgr/upgrader/upgrade-checklist.md +++ b/guides/v2.0/comp-mgr/upgrader/upgrade-checklist.md @@ -30,9 +30,6 @@ You can upgrade in any of the following ways:
  • If you installed the Magento application by cloning the GitHub repository, you cannot use the System Upgrade utility to upgrade the software. Instead, you must update it manually.
  • -

    Prerequisites

    -Before continuing, complete all tasks discussed in Prerequisites. - ## System Upgrade checklist {% include install/update/checklist.md %} diff --git a/guides/v2.0/comp-mgr/upgrader/upgrade-start.md b/guides/v2.0/comp-mgr/upgrader/upgrade-start.md index 173ac37aae3..4a1779015a4 100644 --- a/guides/v2.0/comp-mgr/upgrader/upgrade-start.md +++ b/guides/v2.0/comp-mgr/upgrader/upgrade-start.md @@ -9,30 +9,14 @@ menu_order: 2 github_link: comp-mgr/upgrader/upgrade-start.md --- -

    Overview of System Upgrade

    -This section discusses how to start System Upgrade, which upgrades the version of Magento core components as well as any other installed components. - -You can upgrade in any of the following ways: - -* Using the System Upgrade utility, a wizard that walks you through the upgrade step by step; continue with this topic. - - Use this method if you don't have access to the Magento server's file system or if you're a non-technical user. -* Using the [command line]({{ site.gdeurl }}comp-mgr/cli/cli-upgrade.html). - - This upgrade method is more advanced and it requires access to the Magento server's file system. - -
    -

    System upgrade refers to updating the Magento 2.x core components and other installed components. To migrate from Magento 1.x to Magento 2, see the Migration Guide.

    -
    - -
    -
    • Authorization keys from a shared account cannot be used for upgrade. You must get your authorization keys from magento.com account owner.
    • -
    • If you installed the Magento application by cloning the GitHub repository, you cannot use the System Upgrade utility to upgrade the software. Instead, you must update it manually.
    -
    -

    Prerequisites

    Before continuing, complete all tasks discussed in Prerequisites. +## Optional custom maintenance page +During the time you're upgrading, your storefront is partially available. Users can see a list of files and so on but cannot shop or check out. + +To avoid the appearance of a disabled site and to set up a custom maintenance page that displays during the upgrade, see [Maintenance mode options for upgrade]({{ site.gdeurl }}comp-mgr/trouble/cman/maint-mode.html). +

    Start System Upgrade from the Magento Admin

    To run System Upgrade: From cc1ed9cb07046f8baf3882538a846024ad903ed4 Mon Sep 17 00:00:00 2001 From: James Calcaben Date: Wed, 20 Apr 2016 14:50:20 -0500 Subject: [PATCH 743/902] Fix headings to use sentence-case --- .../extension-dev-guide/prepare/lifecycle.md | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/guides/v2.0/extension-dev-guide/prepare/lifecycle.md b/guides/v2.0/extension-dev-guide/prepare/lifecycle.md index 60050d6e379..16023dff62f 100644 --- a/guides/v2.0/extension-dev-guide/prepare/lifecycle.md +++ b/guides/v2.0/extension-dev-guide/prepare/lifecycle.md @@ -25,7 +25,7 @@ Your extension's lifecycle is the series of phases it goes through while it is a --- -### Schema and Data Initialization +### Schema and data initialization When your module is installed, re-installed, or upgraded, it goes through an initialization process for its schema and then its data. @@ -43,7 +43,7 @@ After the schema initialization completes, your module goes through the data ini --- -### Lifecycle Class Rules +### Lifecycle class rules In order for Magento to detect the classes you are using to hook into the different lifecycle phases, you must follow these standards: @@ -51,13 +51,13 @@ In order for Magento to detect the classes you are using to hook into the differ * The class must use the specific name for the phase it will be executed in. To determine the correct class name to use, please see the specific examples below. * The class must implement the specific class interface for the phase it will be executed in. To determine the correct interface to use, please see the specific examples below. -### Installation Phases +### Installation phases The installation phase of your module lifecycle occurs when it is initially installed or reinstalled. This happens after your extension has been automatically installed from the [Magento Marketplace](https://www.magentocommerce.com/magento-connect){:target="_blank"} or manually installed with the command: `bin/magento setup:upgrade`. If the `schema_version` of the module is present in the database, then the following two phases are skipped because it is assumed that the module schema and data has already been initialized in a previous installation. When a phase is skipped, your module will move on to the [upgrade phase](#upgrade-phase). -#### Schema Installation Phase +#### Schema installation phase The schema installation phase is the first phase your module goes through when it is initially installed. During this phase, the `install` function will be executed in the `InstallSchema` class implementing the `\Magento\Framework\Setup\InstallSchemaInterface`: ~~~ @@ -78,7 +78,7 @@ class \\\Setup\InstallSchema implements \Magento\Framework\Setup When the schema installation phase completes, your module will continue to the [Schema Upgrade phase](#schema-upgrade-phase). -#### Data Installation Phase +#### Data installation phase The data installation phase occurs only after your module has completed the schema installation, schema upgrade, and schema recurring phases. The purpose of this phase is to add initial data to the database for your module. @@ -104,11 +104,11 @@ When the data installation phase completes, your module will continue to the [da --- -### Upgrade Phases +### Upgrade phases The upgrade phases always occurs after the [installation phases](#installation-phases) successfully runs. If the schema or data Installation phase was skipped because it detected a previous installation, Magento will check the current module's version to see if it should run the upgrade phase or skip to the [recurring phases](#recurring-phases). -#### Schema Upgrade Phase +#### Schema upgrade phase The schema upgrade phase runs after the [schema installation phase](#schema-installation-phase)(whether the installation phase occurred or not) and when current version is out of date. The purpose of the schema upgrade phase is usually to update the database structure. @@ -131,7 +131,7 @@ class \\\Setup\UpgradeSchema implements \Magento\Framework\Setup When the schema upgrade phase completes, your module will continue to the [schema recurring phase](#schema-recurring-phase). -#### Data Upgrade Phase +#### Data upgrade phase The data upgrade phase runs after the [data installation phase](#data-installation-phase) and when version is more current than the installed version. The purpose of the data upgrade phase is usually to fix data that has been corrupted or populate a new data field from a schema change. @@ -156,7 +156,7 @@ When the data upgrade phase completes, your module will continue to the [data re --- -### Setup Resource Models +### Setup resource models Magento provides `ModuleDataSetupInterface` and `ModuleContextInterface` to assist with database manipulations. However, if the installation/upgrade is too complex, more classes may be created to handle all the logic. In these cases, you can pass the `ModuleDataSetupInterface` resource to other classes that may require DB manipulations. @@ -211,11 +211,11 @@ class \Magento\Cms\Setup\InstallData implements \Magento\Framework\Setup\Upgrade --- -### Recurring Phase +### Recurring phase During the install, re-install, and upgrade process, the recurring phases are always the last phases your module will go through for schema and data. This phase is run regardless of whether any of the previous phases have executed. -#### Schema Recurring Phase +#### Schema recurring phase Your module goes through the schema recurring phase following the schema [installation](#schema-installation-phase) and [upgrade](#schema-upgrade-phase) phases. The purpose of this phase is usually to do final modifications to the database schema after the schema has been installed or updated. @@ -238,7 +238,7 @@ class \\\Setup\Recurring implements \Magento\Framework\Setup\Ins When the schema recurring phase has completed, your module's schema is fully initialized and updated. The next phase it goes through is the [data intallation phase](#data-installation-phase) which begins the data initialization process. -#### Data Recurring Phase +#### Data recurring phase Your module goes through the data recurring phase after the data [installation](#data-installation-phase) and [upgrade](#data-upgrade-phase) phases. The purpose of this phase is usually to do final modifications to the database store after data has been installed or updated. @@ -263,13 +263,13 @@ When the data recurring phase has completed, your module's data store is fully i --- -### Working Phase +### Working phase The working phase occurs after your module has been [installed](#installation-phases) or [upgraded](#upgrade-phases). In this phase, your module's core code is executed by the Magento application to perform its business function. For most of its lifetime, your module will be in this phase until it is [disabled](#disable-and-enable-phases) or [uninstalled](#uninstall-phases). --- -### Uninstall Phase +### Uninstall phase The uninstall phase begins when you uninstall your module using the [Component Manager](#{{site.gdeurl}}comp-mgr/compman-uninst.html) or by running the command `bin/magento module:uninstall --remove-data `. From 7d575fccafa4bd270ab15314f7121e5be3cee2c6 Mon Sep 17 00:00:00 2001 From: James Calcaben Date: Wed, 20 Apr 2016 14:51:16 -0500 Subject: [PATCH 744/902] Remove Working Phase section --- guides/v2.0/extension-dev-guide/prepare/lifecycle.md | 6 ------ 1 file changed, 6 deletions(-) diff --git a/guides/v2.0/extension-dev-guide/prepare/lifecycle.md b/guides/v2.0/extension-dev-guide/prepare/lifecycle.md index 16023dff62f..69dd0f9881e 100644 --- a/guides/v2.0/extension-dev-guide/prepare/lifecycle.md +++ b/guides/v2.0/extension-dev-guide/prepare/lifecycle.md @@ -263,12 +263,6 @@ When the data recurring phase has completed, your module's data store is fully i --- -### Working phase - -The working phase occurs after your module has been [installed](#installation-phases) or [upgraded](#upgrade-phases). In this phase, your module's core code is executed by the Magento application to perform its business function. For most of its lifetime, your module will be in this phase until it is [disabled](#disable-and-enable-phases) or [uninstalled](#uninstall-phases). - ---- - ### Uninstall phase The uninstall phase begins when you uninstall your module using the [Component Manager](#{{site.gdeurl}}comp-mgr/compman-uninst.html) or by running the command `bin/magento module:uninstall --remove-data `. From 1a69fa1d767f1b6c9f8b9cc72a2b517ced7f7b37 Mon Sep 17 00:00:00 2001 From: James Calcaben Date: Wed, 20 Apr 2016 14:55:08 -0500 Subject: [PATCH 745/902] Remove horizontal rules --- .../v2.0/extension-dev-guide/prepare/lifecycle.md | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/guides/v2.0/extension-dev-guide/prepare/lifecycle.md b/guides/v2.0/extension-dev-guide/prepare/lifecycle.md index 69dd0f9881e..90ef929a11a 100644 --- a/guides/v2.0/extension-dev-guide/prepare/lifecycle.md +++ b/guides/v2.0/extension-dev-guide/prepare/lifecycle.md @@ -23,8 +23,6 @@ Your extension's lifecycle is the series of phases it goes through while it is a

    Since theme extensions and language packages generally do not need to install a database schema or update data in the database, they do not need to worry about their lifecycle phases.

    ---- - ### Schema and data initialization When your module is installed, re-installed, or upgraded, it goes through an initialization process for its schema and then its data. @@ -41,8 +39,6 @@ After the schema initialization completes, your module goes through the data ini 2. [Data upgrade](#data-upgrade-phase) 3. [Data recurring](#data-recurring-phase) ---- - ### Lifecycle class rules In order for Magento to detect the classes you are using to hook into the different lifecycle phases, you must follow these standards: @@ -102,8 +98,6 @@ class \\\Setup\InstallData implements \Magento\Framework\Setup\I When the data installation phase completes, your module will continue to the [data upgrade phase](#data-upgrade-phase). ---- - ### Upgrade phases The upgrade phases always occurs after the [installation phases](#installation-phases) successfully runs. If the schema or data Installation phase was skipped because it detected a previous installation, Magento will check the current module's version to see if it should run the upgrade phase or skip to the [recurring phases](#recurring-phases). @@ -154,8 +148,6 @@ class \\\Setup\UpgradeData implements \Magento\Framework\Setup\U When the data upgrade phase completes, your module will continue to the [data recurring phase](#data-recurring-phase). ---- - ### Setup resource models Magento provides `ModuleDataSetupInterface` and `ModuleContextInterface` to assist with database manipulations. However, if the installation/upgrade is too complex, more classes may be created to handle all the logic. In these cases, you can pass the `ModuleDataSetupInterface` resource to other classes that may require DB manipulations. @@ -191,8 +183,6 @@ class InstallData implements InstallDataInterface } ~~~ ---- - ### Module context In order to add more logic to your install/upgrade classes, you can use `ModuleContextInterface` provided by Magento. The context provides module information, such as current module version, to help add logic to your class. @@ -209,8 +199,6 @@ class \Magento\Cms\Setup\InstallData implements \Magento\Framework\Setup\Upgrade } ~~~ ---- - ### Recurring phase During the install, re-install, and upgrade process, the recurring phases are always the last phases your module will go through for schema and data. This phase is run regardless of whether any of the previous phases have executed. @@ -261,7 +249,6 @@ class \\\Setup\RecurringData implements \Magento\Framework\Setup When the data recurring phase has completed, your module's data store is fully initialized and updated. The next phase for your module is the [working phase](#working-phase). ---- ### Uninstall phase @@ -291,6 +278,4 @@ class \\\Setup\Uninstall implements \Magento\Framework\Setup\Uni

    A disabled module's uninstall routine can still be invoked when it is uninstalled. This means that module specific configurations such as dependency injection configurations and event/observer configurations will not be available and can cause problems. To avoid this, uninstall classes should not have dependencies on them.

    ---- - **Related Topics** From 850d9e958a503a98afa0b8c252256c18d5648000 Mon Sep 17 00:00:00 2001 From: James Calcaben Date: Wed, 20 Apr 2016 15:26:50 -0500 Subject: [PATCH 746/902] Fix grammar errors --- guides/v2.0/extension-dev-guide/prepare/lifecycle.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/guides/v2.0/extension-dev-guide/prepare/lifecycle.md b/guides/v2.0/extension-dev-guide/prepare/lifecycle.md index 90ef929a11a..17f8dfb7cb3 100644 --- a/guides/v2.0/extension-dev-guide/prepare/lifecycle.md +++ b/guides/v2.0/extension-dev-guide/prepare/lifecycle.md @@ -16,7 +16,7 @@ github_link: extension-dev-guide/prepare/lifecycle.md ### Overview -Your extension's lifecycle is the series of phases it goes through while it is associated with the Magento application. The module extension type is the only type that need to worry about lifecycle phases. During each of these phases, your extension's modules can perform database initialization tasks, upgrade tasks, clean up tasks, etc. +Your extension's lifecycle is the series of phases it goes through while it is associated with the Magento application. The module extension type is the only type that need to worry about lifecycle phases. During each of these phases, your extension's modules can perform database initialization tasks, upgrade tasks, clean up tasks, and so on.
    Other Extension Types @@ -41,11 +41,11 @@ After the schema initialization completes, your module goes through the data ini ### Lifecycle class rules -In order for Magento to detect the classes you are using to hook into the different lifecycle phases, you must follow these standards: +Magento will detect the classes you are using to hook into the different lifecycle phases when you follow these rules: -* The class should be in the `Setup` folder in your module's root directory with the appropriate file name. For the correct file name, please see the specific examples below. -* The class must use the specific name for the phase it will be executed in. To determine the correct class name to use, please see the specific examples below. -* The class must implement the specific class interface for the phase it will be executed in. To determine the correct interface to use, please see the specific examples below. +* The class should be in the `Setup` directory in your module's root directory with the appropriate file name. For the correct file name, please see the specific examples below. +* The class must use the specific name for the phase in which it will be executed in. To determine the correct class name to use, please see the specific examples below. +* The class must implement the specific class interface for the phase in which it will be executed in. To determine the correct interface to use, please see the specific examples below. ### Installation phases @@ -185,7 +185,7 @@ class InstallData implements InstallDataInterface ### Module context -In order to add more logic to your install/upgrade classes, you can use `ModuleContextInterface` provided by Magento. The context provides module information, such as current module version, to help add logic to your class. +To add more logic to your install/upgrade classes, you can use `ModuleContextInterface` provided by Magento. The context provides module information, such as current module version, to help add logic to your class. ~~~ class \Magento\Cms\Setup\InstallData implements \Magento\Framework\Setup\UpgradeDataInterface From ecd6d1c43b1c06eafea353267f8c1b4756d50bc2 Mon Sep 17 00:00:00 2001 From: James Calcaben Date: Wed, 20 Apr 2016 15:39:32 -0500 Subject: [PATCH 747/902] Replaces references to 'extensions' with 'components' --- guides/v2.0/extension-dev-guide/prepare/lifecycle.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/guides/v2.0/extension-dev-guide/prepare/lifecycle.md b/guides/v2.0/extension-dev-guide/prepare/lifecycle.md index 17f8dfb7cb3..52219618405 100644 --- a/guides/v2.0/extension-dev-guide/prepare/lifecycle.md +++ b/guides/v2.0/extension-dev-guide/prepare/lifecycle.md @@ -16,11 +16,11 @@ github_link: extension-dev-guide/prepare/lifecycle.md ### Overview -Your extension's lifecycle is the series of phases it goes through while it is associated with the Magento application. The module extension type is the only type that need to worry about lifecycle phases. During each of these phases, your extension's modules can perform database initialization tasks, upgrade tasks, clean up tasks, and so on. +Your component's lifecycle is the series of phases it goes through while it is associated with the Magento application. The [module component type]({{site.gdeurl}}architecture/archi_perspectives/components/modules/mod_intro.html) is the only type that need to worry about lifecycle phases. During each of these phases, your module can perform database initialization tasks, upgrade tasks, clean up tasks, and so on. -
    - Other Extension Types -

    Since theme extensions and language packages generally do not need to install a database schema or update data in the database, they do not need to worry about their lifecycle phases.

    +
    + Other Module Types +

    Since theme components and language packages generally do not need to install a database schema or update data in the database, they do not need to worry about their lifecycle phases.

    ### Schema and data initialization @@ -49,7 +49,7 @@ Magento will detect the classes you are using to hook into the different lifecyc ### Installation phases -The installation phase of your module lifecycle occurs when it is initially installed or reinstalled. This happens after your extension has been automatically installed from the [Magento Marketplace](https://www.magentocommerce.com/magento-connect){:target="_blank"} or manually installed with the command: `bin/magento setup:upgrade`. +The installation phase of your module lifecycle occurs when it is initially installed or reinstalled. This happens after your component has been automatically installed from the [Magento Marketplace](https://www.magentocommerce.com/magento-connect){:target="_blank"} or manually installed with the command: `bin/magento setup:upgrade`. If the `schema_version` of the module is present in the database, then the following two phases are skipped because it is assumed that the module schema and data has already been initialized in a previous installation. When a phase is skipped, your module will move on to the [upgrade phase](#upgrade-phase). From e271a539322b6ad230fdaba31aa3d873bb008d3a Mon Sep 17 00:00:00 2001 From: James Calcaben Date: Wed, 20 Apr 2016 15:40:45 -0500 Subject: [PATCH 748/902] Remove bolded titles in callouts --- guides/v2.0/extension-dev-guide/prepare/lifecycle.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/guides/v2.0/extension-dev-guide/prepare/lifecycle.md b/guides/v2.0/extension-dev-guide/prepare/lifecycle.md index 52219618405..6a3da449b1b 100644 --- a/guides/v2.0/extension-dev-guide/prepare/lifecycle.md +++ b/guides/v2.0/extension-dev-guide/prepare/lifecycle.md @@ -19,7 +19,6 @@ github_link: extension-dev-guide/prepare/lifecycle.md Your component's lifecycle is the series of phases it goes through while it is associated with the Magento application. The [module component type]({{site.gdeurl}}architecture/archi_perspectives/components/modules/mod_intro.html) is the only type that need to worry about lifecycle phases. During each of these phases, your module can perform database initialization tasks, upgrade tasks, clean up tasks, and so on.
    - Other Module Types

    Since theme components and language packages generally do not need to install a database schema or update data in the database, they do not need to worry about their lifecycle phases.

    @@ -274,7 +273,6 @@ class \\\Setup\Uninstall implements \Magento\Framework\Setup\Uni ~~~
    - Uninstalling disabled modules

    A disabled module's uninstall routine can still be invoked when it is uninstalled. This means that module specific configurations such as dependency injection configurations and event/observer configurations will not be available and can cause problems. To avoid this, uninstall classes should not have dependencies on them.

    From a0a004c44486a4147c565734a2532da357cb721c Mon Sep 17 00:00:00 2001 From: stevjohnson Date: Wed, 20 Apr 2016 16:54:24 -0500 Subject: [PATCH 749/902] MAGETWO-51683. Add instrux to update the updater --- guides/v2.0/comp-mgr/compman-update.md | 2 +- .../v2.0/comp-mgr/updater/update-updater.md | 27 +++++++++++++++++++ 2 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 guides/v2.0/comp-mgr/updater/update-updater.md diff --git a/guides/v2.0/comp-mgr/compman-update.md b/guides/v2.0/comp-mgr/compman-update.md index 0894a15cf97..1f32fab09f7 100644 --- a/guides/v2.0/comp-mgr/compman-update.md +++ b/guides/v2.0/comp-mgr/compman-update.md @@ -1,7 +1,7 @@ --- layout: default group: compman -subgroup: 17_Update +subgroup: 08_Update title: Step 3. Component Update menu_title: Component Update menu_node: parent diff --git a/guides/v2.0/comp-mgr/updater/update-updater.md b/guides/v2.0/comp-mgr/updater/update-updater.md new file mode 100644 index 00000000000..66c07292957 --- /dev/null +++ b/guides/v2.0/comp-mgr/updater/update-updater.md @@ -0,0 +1,27 @@ +--- +layout: default +group: compman +subgroup: 20_update-updater +title: Update the updater application +menu_title: Update the updater application +menu_node: parent +menu_order: 1 +github_link: comp-mgr/updater/update-updater.md +--- + +## Update the updater application +In some cases, you might need to update the updater application, which is responsible for updating components and the Magento application. You should do this only if instructed to do so. + +To update the updater application: + +1. Log in to your Magento server as, or switch to, the [Magento file system owner]({{ site.gdeurl }}install-gde/prereq/apache-user.html). +2. Delete, move, or rename the directory containing the updater application. + + For example, + + mv /update /old_update +3. Change to your Magento 2 installation directory and enter the following command: + + composer create-project magento/updater update --repository https://repo.magento.com +4. If prompted, enter your Magento [authentication keys]({{ site.gdeurl }}install-gde/prereq/connect-auth.html). +5. Wait while Composer installs the updater and its dependencies. \ No newline at end of file From 52b7754dc83bfcc7fdb21c8ef2009ae50396593f Mon Sep 17 00:00:00 2001 From: stevjohnson Date: Wed, 20 Apr 2016 18:22:49 -0500 Subject: [PATCH 750/902] Add info about using the same auth keys --- guides/v2.0/comp-mgr/bk-compman-upgrade-guide.md | 9 +++++---- guides/v2.0/comp-mgr/compman-start.md | 6 ++++++ guides/v2.0/comp-mgr/upgrader/upgrade-start.md | 13 +++++++++++++ 3 files changed, 24 insertions(+), 4 deletions(-) diff --git a/guides/v2.0/comp-mgr/bk-compman-upgrade-guide.md b/guides/v2.0/comp-mgr/bk-compman-upgrade-guide.md index c74150dc1fa..053f600a67f 100644 --- a/guides/v2.0/comp-mgr/bk-compman-upgrade-guide.md +++ b/guides/v2.0/comp-mgr/bk-compman-upgrade-guide.md @@ -20,8 +20,8 @@ This topic discusses the ways you can: * Language packages (localize the storefront and Admin) * Libraries (common code) -

    Upgrade the Magento software

    -The way you upgrade (that is, patch) the Magento software depends on how you installed it: +

    Upgrade the Magento application

    +The way you upgrade (that is, patch) the Magento application depends on how you installed it: * Magento CE or EE: If you used Composer to install or if you downloaded an archive, use the System Upgrade utility or the [command line]({{ site.gdeurl }}comp-mgr/cli/cli-upgrade.html). * Magento CE only: If you cloned the Magento 2 GitHub repository because you are contributing code to the Magento CE codebase, upgrade the software manually. @@ -38,8 +38,9 @@ The way you upgrade (that is, patch) the Magento software depends on how you ins
    -

    Authorization keys from a shared account cannot be used to update or upgrade the Magento software. You must get your authorization keys from magento.com account owner.

    - +

    For upgrade or update, you must use the same authentication keys you used to install the Magento software. For example, you cannot use Magento CE authentication keys to update or upgrade Magento EE or vice versa. You also cannot use:

    +
    • Another user's authentication keys
    • +
    • Shared account authentication keys

    Update components

    diff --git a/guides/v2.0/comp-mgr/compman-start.md b/guides/v2.0/comp-mgr/compman-start.md index 37178cb0039..6f43f2066dd 100644 --- a/guides/v2.0/comp-mgr/compman-start.md +++ b/guides/v2.0/comp-mgr/compman-start.md @@ -22,6 +22,12 @@ To run the Component Manager: The following figure shows an example if you *have* already entered your keys. ![Authentication keys entered in the Setup Wizard]({{ site.baseurl }}common/images/compman_auth-keys.png) + +
    +

    For upgrade or update, you must use the same authentication keys you used to install the Magento software. For example, you cannot use Magento CE authentication keys to update or upgrade Magento EE or vice versa. You also cannot use:

    +
    • Another user's authentication keys
    • +
    • Shared account authentication keys
    +
    5. Click **Save Config**. 3. Click **Component Manager** and continue with Manage your components. diff --git a/guides/v2.0/comp-mgr/upgrader/upgrade-start.md b/guides/v2.0/comp-mgr/upgrader/upgrade-start.md index 4a1779015a4..2176b35c728 100644 --- a/guides/v2.0/comp-mgr/upgrader/upgrade-start.md +++ b/guides/v2.0/comp-mgr/upgrader/upgrade-start.md @@ -24,6 +24,19 @@ To run System Upgrade: 2. Click **System** > Tools > **Web Setup Wizard**. The following page displays.

    Specify whether to manage components or upgrade Magento +3. Click **System Configuration**. +4. If you haven't already done so, enter your [authentication keys]({{ site.gdeurl }}install-gde/prereq/connect-auth.html) in the provided fields. + + The following figure shows an example if you *have* already entered your keys. + + ![Authentication keys entered in the Setup Wizard]({{ site.baseurl }}common/images/compman_auth-keys.png) + +
    +

    For upgrade or update, you must use the same authentication keys you used to install the Magento software. For example, you cannot use Magento CE authentication keys to update or upgrade Magento EE or vice versa. You also cannot use:

    +
    • Another user's authentication keys
    • +
    • Shared account authentication keys
    +
    +5. Click **Save Config**. 3. Click **System Upgrade**. Magento begins searching for core module updates immediately. To also search for component updates, click **Yes**. A sample follows: From 3ba39d25495ba3e482f3b6b4b75739a5bcd011ef Mon Sep 17 00:00:00 2001 From: Dmitry Shevtsov Date: Thu, 21 Apr 2016 11:28:59 +0300 Subject: [PATCH 751/902] MAGETWO-52026: [MTF] Review MTF guide after Vinai's contibution - atom feed added --- _config.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/_config.yml b/_config.yml index 4f4df853380..e760b778868 100644 --- a/_config.yml +++ b/_config.yml @@ -52,5 +52,6 @@ incremental: true gems: - jekyll-redirect-from + - jekyll-feed exclude: ['scss','bin','node_modules','vendor'] From 9798e650f54dbecffadafd37bc4b5b450e2cb955 Mon Sep 17 00:00:00 2001 From: Dmitry Shevtsov Date: Thu, 21 Apr 2016 12:09:06 +0300 Subject: [PATCH 752/902] MAGETWO-52026: [MTF] Review MTF guide after Vinai's contibution - feed gem deleted - atom feed added manually (http://jekyll.tips/tutorials/atom-feed/) --- _config.yml | 1 - _includes/header.html | 1 + atom.xml | 25 +++++++++++++++++++++++++ 3 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 atom.xml diff --git a/_config.yml b/_config.yml index e760b778868..4f4df853380 100644 --- a/_config.yml +++ b/_config.yml @@ -52,6 +52,5 @@ incremental: true gems: - jekyll-redirect-from - - jekyll-feed exclude: ['scss','bin','node_modules','vendor'] diff --git a/_includes/header.html b/_includes/header.html index 2d0143876c3..be974213008 100644 --- a/_includes/header.html +++ b/_includes/header.html @@ -13,6 +13,7 @@ + diff --git a/atom.xml b/atom.xml new file mode 100644 index 00000000000..6a47ec01866 --- /dev/null +++ b/atom.xml @@ -0,0 +1,25 @@ +--- +layout: null +--- + + + +{{ site.name }} + + +{{ site.time | date_to_xmlschema }} +{{ site.url }} + +{{ site.author.name }} +{{ site.author.email }} + +{% for post in site.posts limit:10 %} + +{{ post.title }} + +{{ post.date | date_to_xmlschema }} +{{ site.url }}{{ post.id }} +{{ post.content | xml_escape }} + +{% endfor %} + \ No newline at end of file From b16eb9f9586d9a2de9cd1b20adef9191707a3356 Mon Sep 17 00:00:00 2001 From: stevjohnson Date: Thu, 21 Apr 2016 09:13:37 -0500 Subject: [PATCH 753/902] PR#617. Fix one more instance --- guides/v2.0/comp-mgr/trouble/tshoot.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guides/v2.0/comp-mgr/trouble/tshoot.md b/guides/v2.0/comp-mgr/trouble/tshoot.md index 5fbedd77179..5dcb2341a06 100644 --- a/guides/v2.0/comp-mgr/trouble/tshoot.md +++ b/guides/v2.0/comp-mgr/trouble/tshoot.md @@ -18,7 +18,7 @@ The following topics discuss Component Manager and System Upgrade errors and sug * Troubleshoot backup ### System Upgrade only -* "We're sorry, we can't take that action right now" +* "Sorry, we can't take that action right now" * Missing .gitignore files * Roll back after upgrade failure * CE to EE upgrade failure From 6108a47d61b7e620b68eae349f8ed83c34961c23 Mon Sep 17 00:00:00 2001 From: Oleksandra Marchenko Date: Thu, 21 Apr 2016 18:45:31 +0300 Subject: [PATCH 754/902] Added info about jquery ui styles --- _config.yml | 4 ++-- .../v2.0/javascript-dev-guide/widgets/jquery-widgets-about.md | 4 ++++ guides/v2.0/javascript-dev-guide/widgets/widget_tabs.md | 2 +- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/_config.yml b/_config.yml index 4f4df853380..2d19a26917c 100644 --- a/_config.yml +++ b/_config.yml @@ -52,5 +52,5 @@ incremental: true gems: - jekyll-redirect-from - -exclude: ['scss','bin','node_modules','vendor'] + +exclude: ['scss','bin','node_modules','vendor', ] diff --git a/guides/v2.0/javascript-dev-guide/widgets/jquery-widgets-about.md b/guides/v2.0/javascript-dev-guide/widgets/jquery-widgets-about.md index 78e56e432f1..2ba59fec3db 100644 --- a/guides/v2.0/javascript-dev-guide/widgets/jquery-widgets-about.md +++ b/guides/v2.0/javascript-dev-guide/widgets/jquery-widgets-about.md @@ -36,4 +36,8 @@ This guide discusses the following widgets:

    Magento 2 supports jQuery UI 1.9.2, widget options added in later versions might be unavailable.

    +
    + +
    +

    Magento out of the box does not contain jQuery UI styles. To be able to use them, you need to download them from https://jqueryui.com/download/ to the %your_theme_dir%/web/css or %your_module_dir%/view/%area/web/css directory.

    \ No newline at end of file diff --git a/guides/v2.0/javascript-dev-guide/widgets/widget_tabs.md b/guides/v2.0/javascript-dev-guide/widgets/widget_tabs.md index 37119962454..ab9e945993c 100644 --- a/guides/v2.0/javascript-dev-guide/widgets/widget_tabs.md +++ b/guides/v2.0/javascript-dev-guide/widgets/widget_tabs.md @@ -152,7 +152,7 @@ The option of the +**Default value**: { header: null, activeHeader: null }

    loadingClass

    From b036399f73a3067eb1dfa866efaaa3881ab6c510 Mon Sep 17 00:00:00 2001 From: James Calcaben Date: Thu, 21 Apr 2016 11:04:13 -0500 Subject: [PATCH 755/902] Reorder and revise content Content has been re-ordered to better reflect the actual sequence the module goes through. The notion of phases has been removed and replaced with the idea of the stages and events that module goes through. --- .../extension-dev-guide/prepare/lifecycle.md | 174 ++++++++---------- 1 file changed, 73 insertions(+), 101 deletions(-) diff --git a/guides/v2.0/extension-dev-guide/prepare/lifecycle.md b/guides/v2.0/extension-dev-guide/prepare/lifecycle.md index 6a3da449b1b..4f6707183c3 100644 --- a/guides/v2.0/extension-dev-guide/prepare/lifecycle.md +++ b/guides/v2.0/extension-dev-guide/prepare/lifecycle.md @@ -16,44 +16,31 @@ github_link: extension-dev-guide/prepare/lifecycle.md ### Overview -Your component's lifecycle is the series of phases it goes through while it is associated with the Magento application. The [module component type]({{site.gdeurl}}architecture/archi_perspectives/components/modules/mod_intro.html) is the only type that need to worry about lifecycle phases. During each of these phases, your module can perform database initialization tasks, upgrade tasks, clean up tasks, and so on. +This article describes your module's lifecycle and how you can create executable classes that will run when it is initialized or uninstalled. During initialization or uninstallation, these classes can perform database setup tasks, upgrade tasks, clean up tasks, and so on.
    -

    Since theme components and language packages generally do not need to install a database schema or update data in the database, they do not need to worry about their lifecycle phases.

    +

    Since theme components and language packages generally do not need to install a database schema or update data in the database, they do not need to worry about initialization or uninstallation tasks.

    -### Schema and data initialization - -When your module is installed, re-installed, or upgraded, it goes through an initialization process for its schema and then its data. - -For schema initialization, your module goes through the following phases: - -1. [Schema installation](#schema-installation-phase) -2. [Schema upgrade](#schema-upgrade-phase) -3. [Schema recurring](#schema-recurring-phase) - -After the schema initialization completes, your module goes through the data initialization phases: - -1. [Data installation](#data-installation-phase) -2. [Data upgrade](#data-upgrade-phase) -3. [Data recurring](#data-recurring-phase) - ### Lifecycle class rules -Magento will detect the classes you are using to hook into the different lifecycle phases when you follow these rules: +Magento will detect the classes you are using to hook into the different lifecycle stages when you follow these rules: * The class should be in the `Setup` directory in your module's root directory with the appropriate file name. For the correct file name, please see the specific examples below. * The class must use the specific name for the phase in which it will be executed in. To determine the correct class name to use, please see the specific examples below. * The class must implement the specific class interface for the phase in which it will be executed in. To determine the correct interface to use, please see the specific examples below. -### Installation phases +### Schema initialization + +Schema initialization is the first process your module goes through when it is installed, re-installed, or upgraded. -The installation phase of your module lifecycle occurs when it is initially installed or reinstalled. This happens after your component has been automatically installed from the [Magento Marketplace](https://www.magentocommerce.com/magento-connect){:target="_blank"} or manually installed with the command: `bin/magento setup:upgrade`. +#### Schema installation -If the `schema_version` of the module is present in the database, then the following two phases are skipped because it is assumed that the module schema and data has already been initialized in a previous installation. When a phase is skipped, your module will move on to the [upgrade phase](#upgrade-phase). +When your module is initially installed, the first thing your modules does is perform a schema installation by executing its installation class. -#### Schema installation phase -The schema installation phase is the first phase your module goes through when it is initially installed. During this phase, the `install` function will be executed in the `InstallSchema` class implementing the `\Magento\Framework\Setup\InstallSchemaInterface`: +If the `schema_version` of the module is found in the `setup_modules` table, then this stage will be skipped because it is assumed that the module schema has already been initialized in a previous installation. + +During this stage, the `install` function will be executed in the `InstallSchema` class implementing the `\Magento\Framework\Setup\InstallSchemaInterface`: ~~~ // File Location: /Setup/InstallSchema.php @@ -71,64 +58,81 @@ class \\\Setup\InstallSchema implements \Magento\Framework\Setup ~~~ -When the schema installation phase completes, your module will continue to the [Schema Upgrade phase](#schema-upgrade-phase). +#### Schema upgrade -#### Data installation phase +If your module already has an earlier version installed in Magento, then it will perform a schema upgrade instead of an installation. The purpose of a schema upgrade is usually to update the database structure or apply patches. -The data installation phase occurs only after your module has completed the schema installation, schema upgrade, and schema recurring phases. The purpose of this phase is to add initial data to the database for your module. +For example, when a new 2.0.1 version of your module is installed over a previous 2.0.0 version, your module's upgrade class will be executed instead of the installation class. -During this phase, the `install` function will be executed in the `InstallData` class implementing the `Magento\Framework\Setup\InstallDataInterface`: +During this phase, the `upgrade` function will be executed in the `UpgradeSchema` class implementing the `Magento\Framework\Setup\UpgradeSchemaInterface`: ~~~ -// Location: /Setup/InstallData.php +// Location: /Setup/UpgradeSchema.php -class \\\Setup\InstallData implements \Magento\Framework\Setup\InstallDataInterface +class \\\Setup\UpgradeSchema implements \Magento\Framework\Setup\UpgradeSchemaInterface { /** * {@inheritdoc} */ - public function install(ModuleDataSetupInterface $setup, ModuleContextInterface $context) + public function upgrade(SchemaSetupInterface $setup, ModuleContextInterface $context) { ... } } +~~~ + +#### Recurring schema event + +You can create a class in your module that will be run every time after schema installation or upgrade. The purpose of running code in this final stage of schema initialization is usually to do final modifications to the database schema after it has been installed or updated. + +During this stage, the `install` function will be executed in the `Recurring` class implementing the `Magento\Framework\Setup\InstallSchemaInterface`: ~~~ +// Location: /Setup/Recurring.php -When the data installation phase completes, your module will continue to the [data upgrade phase](#data-upgrade-phase). +class \\\Setup\Recurring implements \Magento\Framework\Setup\InstallSchemaInterface +{ + /** + * {@inheritdoc} + */ + public function install(SchemaSetupInterface $setup, ModuleContextInterface $context) + { + ... + } +} +~~~ -### Upgrade phases +### Data initialization -The upgrade phases always occurs after the [installation phases](#installation-phases) successfully runs. If the schema or data Installation phase was skipped because it detected a previous installation, Magento will check the current module's version to see if it should run the upgrade phase or skip to the [recurring phases](#recurring-phases). +After your module's schema has been initialized, your module will go through the same process for data initialization. -#### Schema upgrade phase +#### Data installation -The schema upgrade phase runs after the [schema installation phase](#schema-installation-phase)(whether the installation phase occurred or not) and when current version is out of date. The purpose of the schema upgrade phase is usually to update the database structure. +Just like with [schema installation](#schema-installation), this stage will run only during the initial installation of your module. The purpose of data installation is usually to populate the database with initial data for your module. -During this phase, the `upgrade` function will be executed in the `UpgradeSchema` class implementing the `Magento\Framework\Setup\UpgradeSchemaInterface`: +During this stage, the `install` function will be executed in the `InstallData` class implementing the `Magento\Framework\Setup\InstallDataInterface`: ~~~ -// Location: /Setup/UpgradeSchema.php +// Location: /Setup/InstallData.php -class \\\Setup\UpgradeSchema implements \Magento\Framework\Setup\UpgradeSchemaInterface +class \\\Setup\InstallData implements \Magento\Framework\Setup\InstallDataInterface { /** * {@inheritdoc} */ - public function upgrade(SchemaSetupInterface $setup, ModuleContextInterface $context) + public function install(ModuleDataSetupInterface $setup, ModuleContextInterface $context) { ... } } -~~~ -When the schema upgrade phase completes, your module will continue to the [schema recurring phase](#schema-recurring-phase). +~~~ -#### Data upgrade phase +#### Data upgrade -The data upgrade phase runs after the [data installation phase](#data-installation-phase) and when version is more current than the installed version. The purpose of the data upgrade phase is usually to fix data that has been corrupted or populate a new data field from a schema change. +Just like the [schema-upgrade](#schema-upgrade) stage, data upgrade only occurs when Magento detects a previous installation. The purpose of this stage is usually to fix data that has been corrupted or populate a new data field from a schema change. -During this phase, the `upgrade` function will be executed in the `UpgradeData` class implementing the `Magento\Framework\Setup\UpgradeDataInterface`: +During this stage, the `upgrade` function will be executed in the `UpgradeData` class implementing the `Magento\Framework\Setup\UpgradeDataInterface`: ~~~ ///Setup/UpgradeData.php @@ -145,7 +149,26 @@ class \\\Setup\UpgradeData implements \Magento\Framework\Setup\U } ~~~ -When the data upgrade phase completes, your module will continue to the [data recurring phase](#data-recurring-phase). +#### Recurring data event + +You can create a class that will run after every data installation or upgrade. The purpose of the class is usually to do final modifications to the database store after data has been installed or updated. + +During this stage, the `install` function will be executed in the `RecurringData` class implementing the `Magento\Framework\Setup\InstallDataInterface`: + +~~~ +// Location: /Setup/RecurringData.php + +class \\\Setup\RecurringData implements \Magento\Framework\Setup\InstallDataInterface +{ + /** + * {@inheritdoc} + */ + public function install(ModuleDataSetupInterface $setup, ModuleContextInterface $context) + { + ... + } +} +~~~ ### Setup resource models @@ -198,64 +221,13 @@ class \Magento\Cms\Setup\InstallData implements \Magento\Framework\Setup\Upgrade } ~~~ -### Recurring phase - -During the install, re-install, and upgrade process, the recurring phases are always the last phases your module will go through for schema and data. This phase is run regardless of whether any of the previous phases have executed. - -#### Schema recurring phase - -Your module goes through the schema recurring phase following the schema [installation](#schema-installation-phase) and [upgrade](#schema-upgrade-phase) phases. The purpose of this phase is usually to do final modifications to the database schema after the schema has been installed or updated. - -During this phase, the `install` function will be executed in the `Recurring` class implementing the `Magento\Framework\Setup\InstallSchemaInterface`: - -~~~ -// Location: /Setup/Recurring.php - -class \\\Setup\Recurring implements \Magento\Framework\Setup\InstallSchemaInterface -{ - /** - * {@inheritdoc} - */ - public function install(SchemaSetupInterface $setup, ModuleContextInterface $context) - { - ... - } -} -~~~ - -When the schema recurring phase has completed, your module's schema is fully initialized and updated. The next phase it goes through is the [data intallation phase](#data-installation-phase) which begins the data initialization process. - -#### Data recurring phase - -Your module goes through the data recurring phase after the data [installation](#data-installation-phase) and [upgrade](#data-upgrade-phase) phases. The purpose of this phase is usually to do final modifications to the database store after data has been installed or updated. - -During this phase, the `install` function will be executed in the `RecurringData` class implementing the `Magento\Framework\Setup\InstallDataInterface`: - -~~~ -// Location: /Setup/RecurringData.php - -class \\\Setup\RecurringData implements \Magento\Framework\Setup\InstallDataInterface -{ - /** - * {@inheritdoc} - */ - public function install(ModuleDataSetupInterface $setup, ModuleContextInterface $context) - { - ... - } -} -~~~ - -When the data recurring phase has completed, your module's data store is fully initialized and updated. The next phase for your module is the [working phase](#working-phase). - - -### Uninstall phase +### Uninstall event -The uninstall phase begins when you uninstall your module using the [Component Manager](#{{site.gdeurl}}comp-mgr/compman-uninst.html) or by running the command `bin/magento module:uninstall --remove-data `. +The uninstall event begins when you uninstall your module using the [Component Manager](#{{site.gdeurl}}comp-mgr/compman-uninst.html) or by running the command `bin/magento module:uninstall --remove-data `. -In this phase, your module should remove all traces of its existence in the database; e.g. dropping tables, deleting data, or restoring data. +In this stage, your module should remove all traces of its existence in the database; e.g. dropping tables, deleting data, or restoring data. -During this phase, the `uninstall` function will be executed in the `Uninstall` class implementing the `Magento\Framework\Setup\UninstallInterface`: +During this stage, the `uninstall` function will be executed in the `Uninstall` class implementing the `Magento\Framework\Setup\UninstallInterface`: ~~~ // Location: /Setup/Uninstall.php From 32dacd5936c617187af92171eda5b2e75c27ccd9 Mon Sep 17 00:00:00 2001 From: James Calcaben Date: Thu, 21 Apr 2016 11:51:38 -0500 Subject: [PATCH 756/902] Add version policy to lifecycle class rules section --- guides/v2.0/extension-dev-guide/prepare/lifecycle.md | 1 + 1 file changed, 1 insertion(+) diff --git a/guides/v2.0/extension-dev-guide/prepare/lifecycle.md b/guides/v2.0/extension-dev-guide/prepare/lifecycle.md index 4f6707183c3..b52d813a844 100644 --- a/guides/v2.0/extension-dev-guide/prepare/lifecycle.md +++ b/guides/v2.0/extension-dev-guide/prepare/lifecycle.md @@ -29,6 +29,7 @@ Magento will detect the classes you are using to hook into the different lifecyc * The class should be in the `Setup` directory in your module's root directory with the appropriate file name. For the correct file name, please see the specific examples below. * The class must use the specific name for the phase in which it will be executed in. To determine the correct class name to use, please see the specific examples below. * The class must implement the specific class interface for the phase in which it will be executed in. To determine the correct interface to use, please see the specific examples below. +* The version you use in your module should follow our [versioning policy]({{site.gdeurl}}architecture/versioning.html). ### Schema initialization From a5709f059d297d824008b21206b767747a15ea79 Mon Sep 17 00:00:00 2001 From: stevjohnson Date: Thu, 21 Apr 2016 12:10:59 -0500 Subject: [PATCH 757/902] Stopping point --- _includes/cloud/cli-get-started.md | 23 +++++++++++ .../env/environment-tutorial-env-merge.md | 18 ++------- .../env/environment-tutorial-set-mage-vars.md | 21 ++-------- .../cloud/project/project-integrate-github.md | 40 ++++++++++++++++++- 4 files changed, 69 insertions(+), 33 deletions(-) create mode 100644 _includes/cloud/cli-get-started.md diff --git a/_includes/cloud/cli-get-started.md b/_includes/cloud/cli-get-started.md new file mode 100644 index 00000000000..5d4ea3cb9c5 --- /dev/null +++ b/_includes/cloud/cli-get-started.md @@ -0,0 +1,23 @@ +
    + +1. Log in to the server on which your SSH keys are located. +2. Log in to your project: + + magento-cloud login +3. List your projects: + + magento-cloud project:list +4. Change to a project directory. + + For example if your project is named Magento 2, `cd magento-2` +4. List environments in the project: + + magento-cloud environment:list +6. Check out an environment: + + magento-cloud environment:checkout + + To create a new environment, use `magento-cloud environment:branch` +7. Create a [snapshot]({{ site.gdeurl }}cloud/admin/admin-snap.html) of the environment. + + magento-cloud snapshot:create -e \ No newline at end of file diff --git a/guides/v2.0/cloud/env/environment-tutorial-env-merge.md b/guides/v2.0/cloud/env/environment-tutorial-env-merge.md index 6f5faf4f8b1..9a89bd23d28 100644 --- a/guides/v2.0/cloud/env/environment-tutorial-env-merge.md +++ b/guides/v2.0/cloud/env/environment-tutorial-env-merge.md @@ -16,23 +16,13 @@ This tutorial shows how to merge changes from an environment to its parent, whic This tutorial shows how to create a sample file and merge it. This tutorial assumes you're already working in an environment; if not, see [ Get started with an environment]({{ site.gdeurl }}cloud/env/environments-start.html#env-start-comm) to create one. -To merge an environment: - -1. Log in to the machine on which your Magento Enterprise Cloud Edition SSH key is stored. -2. Log in to the project: +To get started: - magento-cloud login -3. List projects: +{% include cloud/cli-get-started.md %} - magento-cloud project:list -4. Change to a project directory. -4. List environments in the project: - - magento-cloud environment:list -5. Check out an environment: +To merge an environment: - magento-cloud environment:checkout -6. Add a file named `test.txt` to the environment root directory. +1. Add a file named `test.txt` to the environment root directory. You can put whatever contents you want; for example, the number `1` 7. Save your changes and exit the text editor. diff --git a/guides/v2.0/cloud/env/environment-tutorial-set-mage-vars.md b/guides/v2.0/cloud/env/environment-tutorial-set-mage-vars.md index 3e15a20bb6a..e685cc3f7e4 100644 --- a/guides/v2.0/cloud/env/environment-tutorial-set-mage-vars.md +++ b/guides/v2.0/cloud/env/environment-tutorial-set-mage-vars.md @@ -18,26 +18,13 @@ Remember that environment variables are inherited from the parent environment to You can use the same tasks to change any variable discussed in the preceding section. -To change the Admin URI and administrator password: - -1. Log in to your project. - - magento-cloud login -2. List project IDs. +To get started: - magento-cloud project:list -3. Get (that is, clone) the project if you haven't already done so. +{% include cloud/cli-get-started.md %} - magento-cloud project:get -4. When prompted, enter the name of a project directory. -5. Wait for the project to clone. -4. Change to the project directory. - - For example, if your project is named `Magento 2`, enter `cd magento-2` -7. Create a [snapshot]({{ site.gdeurl }}cloud/admin/admin-snap.html) of the environment. +To change the Admin URI and administrator password: - magento-cloud snapshot:create -e master -8. Set the variable values. +1. Set the variable values. magento-cloud variable:set diff --git a/guides/v2.0/cloud/project/project-integrate-github.md b/guides/v2.0/cloud/project/project-integrate-github.md index ce7238b0838..55cd6b1f1ae 100644 --- a/guides/v2.0/cloud/project/project-integrate-github.md +++ b/guides/v2.0/cloud/project/project-integrate-github.md @@ -42,7 +42,7 @@ To generate a token: 5. Select check boxes corresponding to how you intend to use the token: * To integrate with public repositories, select **public_repo** - * To integrate with your own private repositories, select **repo** + * To integrate with your personal, private repositories, select **repo** * To integrate with your organization's private repositories, select **repo** and **read:org** The following figure shows an example of creating a token that can be used to integrate with a private repository to which you have write access: @@ -54,7 +54,43 @@ To generate a token: ![Create a GitHub token for a private repository]({{ site.baseurl }}common/images/cloud_github-token-copy.png){:width="600px"} ## Enable the GitHub integration {#cloud-int-gh-enable} -TBD +To get started: + +{% include cloud/cli-get-started.md %} + +To enable the GitHub integration for your project: + + +4. Enable the integration: + + platform integration:add --type=github --project= --token= {--repository=USER/REPOSITORY | --repository=ORGANIZATION/REPOSITORY} [--build-pull-requests={true|false} --fetch-branches={true|false} + + where + + `` is your Magento Enterprise Cloud Edition project ID + + `` is the token you got in the preceding section + + `--repository=USER/REPOSITORY` is how you specify your personal, private GitHub repository + + `--repository=ORGANIZATION/REPOSITORY` is how you specify an organization repository + + `--build-pull-requests` is an optional parameter that instructs Magento Cloud to deploy after you merge a pull request (`true` by default) + + `--fetch-branches` is an optional parameter that causes Magento Cloud to track branches and deploy after you update a branch (`true` by default) + + Example 1: Enable the GitHub integration for a personal, private repository: + + TBD + + Example 2: Enable the GitHub integration for an organization repository: + + TBD + + Sample output: + + TBD +5. Copy the Payload URL displayed by the command and continue with the next section. ## Add the webhook {#cloud-int-gh-hook} TBD From 4747214e35256d8712d160eedeabe96c41fee749 Mon Sep 17 00:00:00 2001 From: James Calcaben Date: Thu, 21 Apr 2016 13:24:28 -0500 Subject: [PATCH 758/902] Turn class references into links to code in GitHub --- .../extension-dev-guide/prepare/lifecycle.md | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/guides/v2.0/extension-dev-guide/prepare/lifecycle.md b/guides/v2.0/extension-dev-guide/prepare/lifecycle.md index b52d813a844..d597babdcb4 100644 --- a/guides/v2.0/extension-dev-guide/prepare/lifecycle.md +++ b/guides/v2.0/extension-dev-guide/prepare/lifecycle.md @@ -41,7 +41,7 @@ When your module is initially installed, the first thing your modules does is pe If the `schema_version` of the module is found in the `setup_modules` table, then this stage will be skipped because it is assumed that the module schema has already been initialized in a previous installation. -During this stage, the `install` function will be executed in the `InstallSchema` class implementing the `\Magento\Framework\Setup\InstallSchemaInterface`: +During this stage, the `install` function will be executed in the `InstallSchema` class implementing the [`\Magento\Framework\Setup\InstallSchemaInterface`]({{site.mage2000url}}lib/internal/Magento/Framework/Setup/InstallSchemaInterface.php){:target="_blank"}: ~~~ // File Location: /Setup/InstallSchema.php @@ -65,7 +65,7 @@ If your module already has an earlier version installed in Magento, then it will For example, when a new 2.0.1 version of your module is installed over a previous 2.0.0 version, your module's upgrade class will be executed instead of the installation class. -During this phase, the `upgrade` function will be executed in the `UpgradeSchema` class implementing the `Magento\Framework\Setup\UpgradeSchemaInterface`: +During this phase, the `upgrade` function will be executed in the `UpgradeSchema` class implementing the [`Magento\Framework\Setup\UpgradeSchemaInterface`]({{site.mage2000url}}lib/internal/Magento/Framework/Setup/UpgradeSchemaInterface.php){:target="_blank"}: ~~~ // Location: /Setup/UpgradeSchema.php @@ -86,7 +86,7 @@ class \\\Setup\UpgradeSchema implements \Magento\Framework\Setup You can create a class in your module that will be run every time after schema installation or upgrade. The purpose of running code in this final stage of schema initialization is usually to do final modifications to the database schema after it has been installed or updated. -During this stage, the `install` function will be executed in the `Recurring` class implementing the `Magento\Framework\Setup\InstallSchemaInterface`: +During this stage, the `install` function will be executed in the `Recurring` class implementing the [`\Magento\Framework\Setup\InstallSchemaInterface`]({{site.mage2000url}}lib/internal/Magento/Framework/Setup/InstallSchemaInterface.php){:target="_blank"}: ~~~ // Location: /Setup/Recurring.php @@ -111,7 +111,7 @@ After your module's schema has been initialized, your module will go through the Just like with [schema installation](#schema-installation), this stage will run only during the initial installation of your module. The purpose of data installation is usually to populate the database with initial data for your module. -During this stage, the `install` function will be executed in the `InstallData` class implementing the `Magento\Framework\Setup\InstallDataInterface`: +During this stage, the `install` function will be executed in the `InstallData` class implementing the [`Magento\Framework\Setup\InstallDataInterface`]({{site.mage2000url}}lib/internal/Magento/Framework/Setup/InstallDataInterface.php){:target="_blank"}: ~~~ // Location: /Setup/InstallData.php @@ -133,7 +133,7 @@ class \\\Setup\InstallData implements \Magento\Framework\Setup\I Just like the [schema-upgrade](#schema-upgrade) stage, data upgrade only occurs when Magento detects a previous installation. The purpose of this stage is usually to fix data that has been corrupted or populate a new data field from a schema change. -During this stage, the `upgrade` function will be executed in the `UpgradeData` class implementing the `Magento\Framework\Setup\UpgradeDataInterface`: +During this stage, the `upgrade` function will be executed in the `UpgradeData` class implementing the [`Magento\Framework\Setup\UpgradeDataInterface`]({{site.mage2000url}}lib/internal/Magento/Framework/Setup/UpgradeDataInterface.php){:target="_blank"}: ~~~ ///Setup/UpgradeData.php @@ -154,7 +154,7 @@ class \\\Setup\UpgradeData implements \Magento\Framework\Setup\U You can create a class that will run after every data installation or upgrade. The purpose of the class is usually to do final modifications to the database store after data has been installed or updated. -During this stage, the `install` function will be executed in the `RecurringData` class implementing the `Magento\Framework\Setup\InstallDataInterface`: +During this stage, the `install` function will be executed in the `RecurringData` class implementing the [`Magento\Framework\Setup\InstallDataInterface`]({{site.mage2000url}}lib/internal/Magento/Framework/Setup/InstallDataInterface.php){:target="_blank"}: ~~~ // Location: /Setup/RecurringData.php @@ -173,7 +173,7 @@ class \\\Setup\RecurringData implements \Magento\Framework\Setup ### Setup resource models -Magento provides `ModuleDataSetupInterface` and `ModuleContextInterface` to assist with database manipulations. However, if the installation/upgrade is too complex, more classes may be created to handle all the logic. In these cases, you can pass the `ModuleDataSetupInterface` resource to other classes that may require DB manipulations. +Magento provides [`ModuleDataSetupInterface`]({{site.mage2000url}}lib/internal/Magento/Framework/Setup/ModuleDataSetupInterface.php){:target="_blank"} and [`ModuleContextInterface`]({{site.mage2000url}}lib/internal/Magento/Framework/Setup/ModuleContextInterface.php){:target="_blank"} to assist with database manipulations. However, if the installation/upgrade is too complex, more classes may be created to handle all the logic. In these cases, you can pass the `ModuleDataSetupInterface` resource to other classes that may require DB manipulations. ~~~ class InstallData implements InstallDataInterface @@ -208,7 +208,7 @@ class InstallData implements InstallDataInterface ### Module context -To add more logic to your install/upgrade classes, you can use `ModuleContextInterface` provided by Magento. The context provides module information, such as current module version, to help add logic to your class. +To add more logic to your install/upgrade classes, you can use the [`ModuleContextInterface`]({{site.mage2000url}}lib/internal/Magento/Framework/Setup/ModuleContextInterface.php){:target="_blank"} provided by Magento. The context provides module information, such as current module version, to help add logic to your class. ~~~ class \Magento\Cms\Setup\InstallData implements \Magento\Framework\Setup\UpgradeDataInterface @@ -224,11 +224,11 @@ class \Magento\Cms\Setup\InstallData implements \Magento\Framework\Setup\Upgrade ### Uninstall event -The uninstall event begins when you uninstall your module using the [Component Manager](#{{site.gdeurl}}comp-mgr/compman-uninst.html) or by running the command `bin/magento module:uninstall --remove-data `. +The uninstall event begins when you uninstall your module using the [Component Manager]({{site.gdeurl}}comp-mgr/compman-uninst.html) or by running the command `bin/magento module:uninstall --remove-data `. In this stage, your module should remove all traces of its existence in the database; e.g. dropping tables, deleting data, or restoring data. -During this stage, the `uninstall` function will be executed in the `Uninstall` class implementing the `Magento\Framework\Setup\UninstallInterface`: +During this stage, the `uninstall` function will be executed in the `Uninstall` class implementing the [`Magento\Framework\Setup\UninstallInterface`]({{site.mage2000url}}lib/internal/Magento/Framework/Setup/UninstallInterface.php){:target="_blank"}: ~~~ // Location: /Setup/Uninstall.php From 002927ae47a14df383a34f25dec60a8101cd22c7 Mon Sep 17 00:00:00 2001 From: James Calcaben Date: Thu, 21 Apr 2016 14:06:45 -0500 Subject: [PATCH 759/902] Grammar fixes and example snippet added --- .../extension-dev-guide/prepare/lifecycle.md | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/guides/v2.0/extension-dev-guide/prepare/lifecycle.md b/guides/v2.0/extension-dev-guide/prepare/lifecycle.md index d597babdcb4..62b27e7bb70 100644 --- a/guides/v2.0/extension-dev-guide/prepare/lifecycle.md +++ b/guides/v2.0/extension-dev-guide/prepare/lifecycle.md @@ -41,7 +41,9 @@ When your module is initially installed, the first thing your modules does is pe If the `schema_version` of the module is found in the `setup_modules` table, then this stage will be skipped because it is assumed that the module schema has already been initialized in a previous installation. -During this stage, the `install` function will be executed in the `InstallSchema` class implementing the [`\Magento\Framework\Setup\InstallSchemaInterface`]({{site.mage2000url}}lib/internal/Magento/Framework/Setup/InstallSchemaInterface.php){:target="_blank"}: +For example, if you are installing version 2.0.0 of your module and there have been no previous installations of your module, then schema installation will proceed. Otherwise, schema installation will be skipped and your module will begin a [schema upgrade](#schema-upgrade). + +During a schema installation, the `install` function will be executed in the `InstallSchema` class implementing the [`\Magento\Framework\Setup\InstallSchemaInterface`]({{site.mage2000url}}lib/internal/Magento/Framework/Setup/InstallSchemaInterface.php){:target="_blank"}: ~~~ // File Location: /Setup/InstallSchema.php @@ -63,9 +65,9 @@ class \\\Setup\InstallSchema implements \Magento\Framework\Setup If your module already has an earlier version installed in Magento, then it will perform a schema upgrade instead of an installation. The purpose of a schema upgrade is usually to update the database structure or apply patches. -For example, when a new 2.0.1 version of your module is installed over a previous 2.0.0 version, your module's upgrade class will be executed instead of the installation class. +For example, when a new 2.0.1 version of your module is installed over a previous 2.0.0 version, your module will perform a schema upgrade instead of a [schema installation](#schema-installation). -During this phase, the `upgrade` function will be executed in the `UpgradeSchema` class implementing the [`Magento\Framework\Setup\UpgradeSchemaInterface`]({{site.mage2000url}}lib/internal/Magento/Framework/Setup/UpgradeSchemaInterface.php){:target="_blank"}: +During a schema upgrade, the `upgrade` function will be executed in the `UpgradeSchema` class implementing the [`Magento\Framework\Setup\UpgradeSchemaInterface`]({{site.mage2000url}}lib/internal/Magento/Framework/Setup/UpgradeSchemaInterface.php){:target="_blank"}: ~~~ // Location: /Setup/UpgradeSchema.php @@ -86,7 +88,7 @@ class \\\Setup\UpgradeSchema implements \Magento\Framework\Setup You can create a class in your module that will be run every time after schema installation or upgrade. The purpose of running code in this final stage of schema initialization is usually to do final modifications to the database schema after it has been installed or updated. -During this stage, the `install` function will be executed in the `Recurring` class implementing the [`\Magento\Framework\Setup\InstallSchemaInterface`]({{site.mage2000url}}lib/internal/Magento/Framework/Setup/InstallSchemaInterface.php){:target="_blank"}: +During this event, the `install` function will be executed in the `Recurring` class implementing the [`\Magento\Framework\Setup\InstallSchemaInterface`]({{site.mage2000url}}lib/internal/Magento/Framework/Setup/InstallSchemaInterface.php){:target="_blank"}: ~~~ // Location: /Setup/Recurring.php @@ -111,7 +113,7 @@ After your module's schema has been initialized, your module will go through the Just like with [schema installation](#schema-installation), this stage will run only during the initial installation of your module. The purpose of data installation is usually to populate the database with initial data for your module. -During this stage, the `install` function will be executed in the `InstallData` class implementing the [`Magento\Framework\Setup\InstallDataInterface`]({{site.mage2000url}}lib/internal/Magento/Framework/Setup/InstallDataInterface.php){:target="_blank"}: +During data installation, the `install` function will be executed in the `InstallData` class implementing the [`Magento\Framework\Setup\InstallDataInterface`]({{site.mage2000url}}lib/internal/Magento/Framework/Setup/InstallDataInterface.php){:target="_blank"}: ~~~ // Location: /Setup/InstallData.php @@ -133,7 +135,7 @@ class \\\Setup\InstallData implements \Magento\Framework\Setup\I Just like the [schema-upgrade](#schema-upgrade) stage, data upgrade only occurs when Magento detects a previous installation. The purpose of this stage is usually to fix data that has been corrupted or populate a new data field from a schema change. -During this stage, the `upgrade` function will be executed in the `UpgradeData` class implementing the [`Magento\Framework\Setup\UpgradeDataInterface`]({{site.mage2000url}}lib/internal/Magento/Framework/Setup/UpgradeDataInterface.php){:target="_blank"}: +During a data upgrade, the `upgrade` function will be executed in the `UpgradeData` class implementing the [`Magento\Framework\Setup\UpgradeDataInterface`]({{site.mage2000url}}lib/internal/Magento/Framework/Setup/UpgradeDataInterface.php){:target="_blank"}: ~~~ ///Setup/UpgradeData.php @@ -154,7 +156,7 @@ class \\\Setup\UpgradeData implements \Magento\Framework\Setup\U You can create a class that will run after every data installation or upgrade. The purpose of the class is usually to do final modifications to the database store after data has been installed or updated. -During this stage, the `install` function will be executed in the `RecurringData` class implementing the [`Magento\Framework\Setup\InstallDataInterface`]({{site.mage2000url}}lib/internal/Magento/Framework/Setup/InstallDataInterface.php){:target="_blank"}: +During this event, the `install` function will be executed in the `RecurringData` class implementing the [`Magento\Framework\Setup\InstallDataInterface`]({{site.mage2000url}}lib/internal/Magento/Framework/Setup/InstallDataInterface.php){:target="_blank"}: ~~~ // Location: /Setup/RecurringData.php From 37bb5c87583f55eb41b70dee9fd6ef1658dd28e1 Mon Sep 17 00:00:00 2001 From: James Calcaben Date: Thu, 21 Apr 2016 14:14:26 -0500 Subject: [PATCH 760/902] Add a related topic link --- guides/v2.0/extension-dev-guide/prepare/lifecycle.md | 1 + 1 file changed, 1 insertion(+) diff --git a/guides/v2.0/extension-dev-guide/prepare/lifecycle.md b/guides/v2.0/extension-dev-guide/prepare/lifecycle.md index 62b27e7bb70..b809e9c91fa 100644 --- a/guides/v2.0/extension-dev-guide/prepare/lifecycle.md +++ b/guides/v2.0/extension-dev-guide/prepare/lifecycle.md @@ -252,3 +252,4 @@ class \\\Setup\Uninstall implements \Magento\Framework\Setup\Uni
    **Related Topics** +* [Versioning policy]({{site.gdeurl}}architecture/versioning.html) From 511812174482d541763d952bcedd132bdf3ac676 Mon Sep 17 00:00:00 2001 From: James Calcaben Date: Thu, 21 Apr 2016 14:22:34 -0500 Subject: [PATCH 761/902] Fix related topics list --- guides/v2.0/extension-dev-guide/prepare/lifecycle.md | 1 + 1 file changed, 1 insertion(+) diff --git a/guides/v2.0/extension-dev-guide/prepare/lifecycle.md b/guides/v2.0/extension-dev-guide/prepare/lifecycle.md index b809e9c91fa..7cd29dc3291 100644 --- a/guides/v2.0/extension-dev-guide/prepare/lifecycle.md +++ b/guides/v2.0/extension-dev-guide/prepare/lifecycle.md @@ -252,4 +252,5 @@ class \\\Setup\Uninstall implements \Magento\Framework\Setup\Uni
    **Related Topics** + * [Versioning policy]({{site.gdeurl}}architecture/versioning.html) From 0a8c1c9e8e8cbc6ace68cfe98d67c1d668609f72 Mon Sep 17 00:00:00 2001 From: Jeanne Frontain Date: Thu, 21 Apr 2016 16:05:52 -0500 Subject: [PATCH 762/902] added first draft of security issues --- guides/v2.0/release-notes/ReleaseNotes2.0.5CE.md | 15 +++++++++++++-- guides/v2.0/release-notes/ReleaseNotes2.0.5EE.md | 16 ++++++++++++++-- 2 files changed, 27 insertions(+), 4 deletions(-) diff --git a/guides/v2.0/release-notes/ReleaseNotes2.0.5CE.md b/guides/v2.0/release-notes/ReleaseNotes2.0.5CE.md index 8057fc1c76f..abef641c27d 100644 --- a/guides/v2.0/release-notes/ReleaseNotes2.0.5CE.md +++ b/guides/v2.0/release-notes/ReleaseNotes2.0.5CE.md @@ -77,9 +77,20 @@ Backward-incompatible changes are documented in Magento Security Center. + + * Magento no longer permits an unauthenticated user to remotely execute doc on the server. Previously, an unauthenticated user could remotely execute PHP code on the server using either REST or SOAP APIs. (These APIs are enabled by default in most installations.) + + * The Magento installation code is no longer accessible once the installation process has completed. Previously, an unauthenticated user could execute PHP code on the server because the installation process would leave the /app/etc directory writable, and many administrators would not change the permissions on this directory after installation. (During installation, the system requires the /app/etc directory to be writeable.) + + + * Magento no longer allows authenticated customers to change their information using either SOAP or REST calls. Magento now confirms that the ID of the customer whose account is being edited matches the authentication token in use. Previously, a malicious user could hijack a customer account by logging in as an authenticated user, then editing the account of any other user. (The SOAP and REST APIs are enabled by default in most installations.) + + * Anonymous users can no longer retrieve the private data of registered customers. To prevent malicious attacks of this type, the quote_id_mask table of the Quote API no longer includes a cart id mask value. -We recommend that you review Magento's Security Best Practices, and confirm that all safeguards are in place to protect your system from compromise. Use this occasion to examine your system for indications of possible attack, such as strange administrator accounts, unfamiliar files on the server, etc. To receive direct notification from our security team regarding any emerging issues and solutions, sign up for the Security Alert Registry.

    System requirements

    diff --git a/guides/v2.0/release-notes/ReleaseNotes2.0.5EE.md b/guides/v2.0/release-notes/ReleaseNotes2.0.5EE.md index aa07cfaca2a..da4d94ba858 100644 --- a/guides/v2.0/release-notes/ReleaseNotes2.0.5EE.md +++ b/guides/v2.0/release-notes/ReleaseNotes2.0.5EE.md @@ -80,9 +80,21 @@ Backward-incompatible changes are documented in Magento Security Center. + + + * Magento no longer permits an unauthenticated user to remotely execute doc on the server. Previously, an unauthenticated user could remotely execute PHP code on the server using either REST or SOAP APIs. (These APIs are enabled by default in most installations.) + + * The Magento installation code is no longer accessible once the installation process has completed. Previously, an unauthenticated user could execute PHP code on the server because the installation process would leave the /app/etc directory writable, and many administrators would not change the permissions on this directory after installation. (During installation, the system requires the /app/etc directory to be writeable.) + + + * Magento no longer allows authenticated customers to change their information using either SOAP or REST calls. Magento now confirms that the ID of the customer whose account is being edited matches the authentication token in use. Previously, a malicious user could hijack a customer account by logging in as an authenticated user, then editing the account of any other user. (The SOAP and REST APIs are enabled by default in most installations.) + + * Anonymous users can no longer retrieve the private data of registered customers. To prevent malicious attacks of this type, the quote_id_mask table of the Quote API no longer includes a cart id mask value. -We recommend that you review Magento's Security Best Practices, and confirm that all safeguards are in place to protect your system from compromise. Use this occasion to examine your system for indications of possible attack, such as strange administrator accounts, unfamiliar files on the server, etc. To receive direct notification from our security team regarding any emerging issues and solutions, sign up for the Security Alert Registry.

    System requirements

    From b57516ff552446683cd76c9efaa26d7ee621e225 Mon Sep 17 00:00:00 2001 From: Jeanne Frontain Date: Thu, 21 Apr 2016 16:14:59 -0500 Subject: [PATCH 763/902] fixed minor formatting issues --- guides/v2.0/release-notes/ReleaseNotes2.0.5CE.md | 4 ++-- guides/v2.0/release-notes/ReleaseNotes2.0.5EE.md | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/guides/v2.0/release-notes/ReleaseNotes2.0.5CE.md b/guides/v2.0/release-notes/ReleaseNotes2.0.5CE.md index abef641c27d..cedcc6dfae2 100644 --- a/guides/v2.0/release-notes/ReleaseNotes2.0.5CE.md +++ b/guides/v2.0/release-notes/ReleaseNotes2.0.5CE.md @@ -77,14 +77,14 @@ Backward-incompatible changes are documented in Magento Security Center. * Magento no longer permits an unauthenticated user to remotely execute doc on the server. Previously, an unauthenticated user could remotely execute PHP code on the server using either REST or SOAP APIs. (These APIs are enabled by default in most installations.) - * The Magento installation code is no longer accessible once the installation process has completed. Previously, an unauthenticated user could execute PHP code on the server because the installation process would leave the /app/etc directory writable, and many administrators would not change the permissions on this directory after installation. (During installation, the system requires the /app/etc directory to be writeable.) + * The Magento installation code is no longer accessible once the installation process has completed. Previously, an unauthenticated user could execute PHP code on the server because the installation process would leave the /app/etc directory writable, and many administrators would not change the permissions on this directory after installation. (During installation, the system requires the /app/etc directory to be writeable.) * Magento no longer allows authenticated customers to change their information using either SOAP or REST calls. Magento now confirms that the ID of the customer whose account is being edited matches the authentication token in use. Previously, a malicious user could hijack a customer account by logging in as an authenticated user, then editing the account of any other user. (The SOAP and REST APIs are enabled by default in most installations.) diff --git a/guides/v2.0/release-notes/ReleaseNotes2.0.5EE.md b/guides/v2.0/release-notes/ReleaseNotes2.0.5EE.md index da4d94ba858..65294fd9464 100644 --- a/guides/v2.0/release-notes/ReleaseNotes2.0.5EE.md +++ b/guides/v2.0/release-notes/ReleaseNotes2.0.5EE.md @@ -80,7 +80,7 @@ Backward-incompatible changes are documented in Magento Security Center. @@ -88,7 +88,7 @@ The following list provides an overview of the security issues fixed in this rel * Magento no longer permits an unauthenticated user to remotely execute doc on the server. Previously, an unauthenticated user could remotely execute PHP code on the server using either REST or SOAP APIs. (These APIs are enabled by default in most installations.) - * The Magento installation code is no longer accessible once the installation process has completed. Previously, an unauthenticated user could execute PHP code on the server because the installation process would leave the /app/etc directory writable, and many administrators would not change the permissions on this directory after installation. (During installation, the system requires the /app/etc directory to be writeable.) + * The Magento installation code is no longer accessible once the installation process has completed. Previously, an unauthenticated user could execute PHP code on the server because the installation process would leave the /app/etc directory writable, and many administrators would not change the permissions on this directory after installation. (During installation, the system requires the /app/etc directory to be writeable.) * Magento no longer allows authenticated customers to change their information using either SOAP or REST calls. Magento now confirms that the ID of the customer whose account is being edited matches the authentication token in use. Previously, a malicious user could hijack a customer account by logging in as an authenticated user, then editing the account of any other user. (The SOAP and REST APIs are enabled by default in most installations.) From 2e421793d9e9f0665bc7b3a570ee24692258dc2e Mon Sep 17 00:00:00 2001 From: stevjohnson Date: Thu, 21 Apr 2016 18:06:19 -0500 Subject: [PATCH 764/902] Initial draft --- _includes/cloud/cli-get-started.md | 5 +- common/images/cloud_github-acct-settings.png | Bin 0 -> 26086 bytes common/images/cloud_github-acct-webhook.png | Bin 0 -> 72787 bytes common/images/cloud_github-acct-webhook2.png | Bin 0 -> 85075 bytes .../cloud/project/project-integrate-github.md | 61 +++++++++++++----- 5 files changed, 49 insertions(+), 17 deletions(-) create mode 100644 common/images/cloud_github-acct-settings.png create mode 100644 common/images/cloud_github-acct-webhook.png create mode 100644 common/images/cloud_github-acct-webhook2.png diff --git a/_includes/cloud/cli-get-started.md b/_includes/cloud/cli-get-started.md index 5d4ea3cb9c5..4baa44efd41 100644 --- a/_includes/cloud/cli-get-started.md +++ b/_includes/cloud/cli-get-started.md @@ -7,6 +7,9 @@ 3. List your projects: magento-cloud project:list +4. If necessary, clone a project. + + magento-cloud project:get 4. Change to a project directory. For example if your project is named Magento 2, `cd magento-2` @@ -17,7 +20,7 @@ magento-cloud environment:checkout - To create a new environment, use `magento-cloud environment:branch` + To create a new environment, use `magento-cloud environment:branch ` 7. Create a [snapshot]({{ site.gdeurl }}cloud/admin/admin-snap.html) of the environment. magento-cloud snapshot:create -e \ No newline at end of file diff --git a/common/images/cloud_github-acct-settings.png b/common/images/cloud_github-acct-settings.png new file mode 100644 index 0000000000000000000000000000000000000000..3e36fafa1a8891706a26e59b4befeda3bb1e0e39 GIT binary patch literal 26086 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 F{{TnW;&%W5 literal 0 HcmV?d00001 diff --git a/common/images/cloud_github-acct-webhook.png b/common/images/cloud_github-acct-webhook.png new file mode 100644 index 0000000000000000000000000000000000000000..bcceb9b698483de94daf7e0c014123bc2130eb68 GIT binary patch literal 72787 zcmb4qby!qg_coz~gs60i2#C_%2nr~vfOIzu-QArk2-4EsodeP>IW$N!zzp5Yd z_kDhUet!&H*E;*`v(MVA_PXyA{y{++?*aJ(6ciM^_wU{+p`hG@prD{uVPOE0Ug$GR z;2*Z#I}Jw^6#TBcAL_SP_!NK;)9JmuB<9LJB4TES=GXp9e?*e%PU6l^=C%$fg=ItU z01>VeAbM-!XyjmF=VW1PgYpEMmJX0VxRbxJwR3l{Ff(^TDS0>~2uSh&NF7WJ?uI^f zvamKm;W>YZ4P3##yP|As>f~zRV1lA!hrAn(^Jj7kM2bW^x3Vp0Y{OvqZtlX=%cCM9A}1#&7vtw=XIFI(N0hb61=Grw;g23Y+IA9rMn~s8*w^>& z#6!fRl{&D4;Gp^}y-w%t+pe(PY_Vmk$A9Mr9?(E(Am(5(^TyxC)6{l?E;zI+hZAJlK0m7m{BVm^Up z)rnp8f9AnMvi{I~#luoCJv;jzm`z7Vr(qH1mtcwL;6|=Q5gU`)v`cyk-k@jBjUw2d zKJ6nWBO@cwkBo_75EPsPrrbS!D{U9k$_@p5$kJygoxBOfs`x*8;%2GHi!Q!XlC*Rvd}?+!ymt*S6_PZCEu1_H^!XGy20aix zOT+YSzrCPXNv{StCFa)oBozdnY-So!zDFQn|8gKl>)^RU)^$(Hn-S{W<#Co&l$3jr ze_jg9zWV`@x}#uPO?~~u*qAu58Pu_u?GPE3moEp-Ig{i_qon{F)1iT_ISnJn5glTO zsRG{N=W^P(17FbX)=@A}l(}2^=qJ4Aodj*(pVnI8r2qP9&V8jR6!Ofd4ErA|UyWE_ zCYs!Eu!k)Oq$)5fG|3`DY%H^QccP=3Wm(7Qxj8p6`~A8v_? zM(sL9o^MGll;;1OQwR^IUv<=b&U)-46-zCztxd_n!SPm7^0EmRGj1jMKmLnFTgD%e zbzyp6#1%#fm_@3HCvpBnf1~3T;L8lpo}tC{cik<#^s}L%A^Wxy<@Nrcm(p!7>TxVP zIT@&5UoJVgG6C0+;kmDe5F_i0(iAgDVO-6Pk&qd5Kh+&6(llC!-w7`IUM$l!FmKIbp3yI{ z{1?UFoP50ajobLtx!yO4#a1RnDZ0mYb>}(LP4{d&^7?dDiXjrJ;Zs>|y&E|C5ezWU z@^1_fgT1|dTUl4f;+xI~WsTabBdG#wkr+6%UEMzx3wol+0{e}dCZ`_#C!*!mz+OCX6ClGy&Ddw1VluVR#wc}(y?dvr{`R5qTiI4WkL2~iDs*bj*XX@?p^Zl zQGZld#~Jm;j7?2#3@U3=)g)LgE-pgflICk|SKbocB1GQ0UHMMud2%M5q%np^M&gkA z%5xdp4Fkrt+Jy~l)bRFL_M0;nB8f1Z%>4Y&x;oyuxj9lXpO$+w|1o>oOIOS(G>}4m z91tNqJUzX2#B0@ifKB3WzO@#;GIp%L*R$G<^WCGy1Ksd?n zi8h-wl05MdrJ#R-Fz?}ycmpfbg z*Pfp}XQ|jcbh~pX7nfCsMlY^F@@Of*bV+$E3CG69oO~)6jrCb_e|(=$*ADSf(FUIb z>jf^xmkVp?rpcCWXc!wm#|ZQX9PX6o*hl-JScqZNPrcpE2Qjw>iwA)qK%3)+@>qw3 zfF5$HtB;k`-uz85_DN$s1LIA>P1>w_`tlzM^@?l1e<#h#&JN!b?Df}UhV%8zSu3)x zb{J(j-zDa^=rza-XaLO!7r)$c*8RD?x z`rlrspYyjKrvcMys1vH{4}$?^QOL5in{tzLkm9z{^F6me8`SI8JD*j>N1mB1pLzT@ zMAMd`L}a<(?89I{^5&?ivGJD5ew5Z6*`p?lUKb6fOT&IRN~5Z=I``z!BmWNlc766A zklpaGuy*e^kIfhsd%kzlT#WO4x=rt5+v40zuo!pvS4zi_{Al)Isww0Q$eS2>v0-5c z&bvZ@7YLgvT-O0H^8KY)cVflns?3jCT_BUsUFJ;eTo})_5^!I3k42ZGj*|RwA z|9CEvc5>qMpuPq-xh9i2(aCo1k|_FjZkk@l3RCE~gh^(-&$mEGIWq4XVP1Y*x^ABx zUn`;JOPnbqRrP+N4?2H*z&_l(gQpZ!zzfReed-O^kwzpPSe2ZD`R`0nHi1QT|z@~@{&RFmjJ6}c`AsnvIa+=!*Cwwm} zJ+yspNEBlAJwJ>x?x&8w$VifU>lFY$*R4;96S92Xz!21s(EY`-wn%J_61|=iRG8g^ z`d#@w4;nAU=?Ln06XlFGiWDac6G>gue?scoP2f|6KS7!TW&!FKu6YD`#jv_8M$bj% z)~D%r2_rhSExUuINyu7X?vnk^(%#@ActxT&z20{x61N>!eW{jK7hMZkls9u`=v88e zF5m9*C!{W@Ms5g2o|m%sO}_o~dnYzd8(n zm;W9ay}zftyQFjHCE9CWht;D{T&!Y#4UduU^PsG&v*fs6e^H&Kq@AF4oiRu28+bbG z)B$?+cZYu1uDJVZf_PmgdQo?6D@Mpal5G)%Su77PFWDDs1L(vDExcT`Mi!ZIt$pC4B|4{erc9y-UlhiOJg?cVe+4_PdAN^cnhGLIU}(_to5X z&|(J}Z#Eb$uO!R82vlsgfh@uX)D8*BefHs`J}1*E~B znR8sOD_64;4Mr}6cRMa|l73>B!kY$oQuI@iji20mUA4X5H_Zx2&ZuO(; zdBz^D_53rLSC|yYVc!Xsc;byON$Cn69vHL7kuMg<`TO`CU&~T`%at4&9XU|g{QQ0? zi{7f@p-xt{Jtjp0^D{Q(Qjmuf?{TEe>^S=e-#Ky0Wr;6*87(F}_juWz#w$#CWQi@V z6BIm5sev(tC2@t1{%lzpgXZgD-*$JF_PqPk!Ymp0tc;>)WP`@|S2?B0^&RJ0btKG| zWs~h6On^D@4-U4#FuVtQ{FNd|odlb?VX}uS0-dna?i;VTa*R&7EikuXI^sUcQYHL6 z;rfwFDWv4~sWj1jb2G3vpZ-c@Mhb3?()ExLVYzQ&tPqNDs>KBto9H3ouBhGpc=Tp> z=bgx##!Pg-nAqiwseFmt>+jL8(pS30_`l0Cc_ z7w%97ov$6?u!kg$ARD}X>ZM<@vcb;uzaxA#+7484JF!YGF(F=D;ksh@zJG06u5H@f z#xu+wLcUvQgI1!dwB{GY%{ly9ndkKONj9$oS6os8!G-D|zRZ@{abN5}p>yibeVs+0 z8HH1v$nRZ%uXmh-eOn-5gk2A>zg$NKu_Fw&ez$*5S!xU{4Vie{<-?l=FCG8~R5yh*+;=qIM&l>~c=9RC1{Z_8 zF34LEls5hM;>+`c@jH43lq>GnaIaq*iHJDYi%ubGeah;@lKiTwuhHNuupHmLDY^wG z@xhr%-!&W*Tli-7lJ3O?fipE6W7s$Ux6$_g70R^`ir%^-laz~bU7 z>(Y9wA?%{PzzMynxfwVDo(;dl@s6V;eQblvkC7o^w~vcix4(Wp2uk`?(ze-B6E}=G z8pSN6$R&iVh#PLJi^X)yY)BwMIA=m%1vN~YmyX#@{vw#1Da&CRm?6gP{J=P3Az zY}r{Hb~tK_mJc$DR@vE^%$UIQEjo)f5LKUgZp`XOb0FWh24U@=1{3n#oa9ApqH zg5~G02fT9IC75j}cS#OaHlBWYt7j_og2^kQsMAv4`i%uIB35c7xt6)y8Z-Ob>az72 z)r3xSUG+|`fE*frVtKA6dBvaOpf*oHAV?F3m!)A-)cx7hRtxP__iwo`1`ZOb;MqOX zZS5pBG`VFNUiEW4lgGSpe&M#0kw9mD6s0W=h=&MpQcgag-yA-Z8YT?+R;K4Im6Rk( zblc z0W$tnJBIE?zkVJ9MbE2p+mIt(_7Q)@3e*jN^;8(RUW7)bPR?8TJ&F{Vt>^9j8ZKyI zE`ms-)FPjJO_^kIG5Q3$P?f+Fin>Or`%+6vSM%|lomJj*oXc`6{lY1%&_SkB@)z6O z;qK)v5}A_o({GjLykz*8KQ$N5O@EjIXS_t|5hzx#XHFz6%_w3DkD{k1e2zxhLrn18 zNlCdbz0;2abibT=ke*(=*qV~5aZtV9gF3vxzwyYAlcGS=s1r}_rMk36W^hg$Rrgoq z1BwJqRKB`zpaQaz(1Hntoh(K-N56LR*V(Nyx2%0y?{sC*yx%M&y&F)M=>B8n$qPTE zg8tM#s{_P9U8`FzT@Eo~Ck=~=x;IHIEdncRuaPnWb2R+q8BYLNpMkSO{FX9}5rONQ zn@1~w%VyqOexbv)mJpyPpesye=_(WT<9yI;A-=}XBPgW|$(cS6=RqI7@kXNJ^X_55 zHrrY}lW<#)j>_$Jc=-im$p$yGjA z);9VsM9r3D4z}pz==J(`ZOyhPWs!aS{${ygXI>TfsNb)*u)I5Yem}3dnWBC^8tC3M zH_wxJMMg!bj0z~LyoQl*G`PfwY~cHhQH_EkCmI=u8Ki*A}{q z0|+F7Btg*_ywXO?mTFW&MVZS(8K$qGIhjH?n#qlJGgIyo)y#-+t%Aa$`%i0MWJDp* zD^cICvkrA)O{&dYxys+~W6F9uiHrSSV<-jvSJxc0iGYH>t1bV z(mWh5eJ7#5QfTUg!^q|Xq_%12U~nrgaIX6HU_7`85?!cg%xP!tdfyg|Cx@VnQy%s* zpgdTT()G+IYe?}_Hu^|-|4mE%Cso+!AGR6yd@jcou*wMt3Voj zbxLK>{#q`IuRc2;eLT(P6JtI*X-M1%cp;_lc6RhKoy_hgIr^-PdqO>Y7r2QPlnZV^+2yBm=@3xT>6On} zYi%H#4td9d^kU)W@^XdfnN~1NMxdmfT!?Wj} zbn^1N(#z_G_!OUh`EDvIlSA39ZIz55S)gcsD-_j|Ld2t*&ZX0E<2-!Mr8iZOVJidVN*4ndeh25(0V~M^*#dOgl#% z@^am$x!cGt8e{=W1|tNeBH9%?H7gX&C*OfrH`ogHcl3I-&k9R(2*}@Fuio=23(sf(hAiuEHr87My=3OZ`rOkTR!T#Gv@G7O3XNV)$2H{Xb_g3#i z@av8r$}Jd8Km7c9w8nygf3Alb+)i>W`g?YI_wuxwYqrUlvwB|3{btHT0cDNLtm2d+ z+wWbvmjeTMfD$4$AJ}|3J!odz|6h1!Lnr%8dZV_OM@J2d*=9G3tat0Hq2`g)2XrQ=I z;M=|`!0^Pgkr=)qlP>xcP4H=!3R*;rdB)J5`o3KogQd5XWh`0!ILwuI@I$$V;zzu8 zrnxt7598u6Ve{WVrc~ol>Qp(PQTKlGUrLo;k^i`o(*xmMiu8q4VWKi#5Prj~vZ>)1&qzWL~=bdciXH z_aO0d4mT4xo InEBgsNcP0eLDxOe#%3)optFjYM6=3w1!vbSBzw^mt_3VB8icq; z)mZz^m)5WR^wI%M^_iUoAovo9u#Ls zXlt8uT(#|%sjY{RCG~RiJWBexyT$J}!Z!z<%wCt?D-3Oyr({t-eR&o5>ozowXgtC~ z!K&@Da8JLKi>p1ADDfRM=u|z1pM7=PFdrku4|j^(`+94cq13Bi7?COGB6iBK(F>O% z1NEH%F^j;5X!!*x zyZVcuhOF+~te!#33O+P$CB4PBeMw^ecO3%1`MeQ!sKcZI`r~S)_oC$y{8H2elButriN&E7iqhsXE zoJMtXFZWulXXc68!!9c`j;d{!hDp)cp$xFg9z~`ByfW#A9SJr@pc9lZxVVsBf*^Dp zT!dbjFSJL+r`(P&w|jSk_3cMQ7Pw`GJ>%UmBGWz7Tlza#Mq!(k8H8W0sRK1jJ>8j& zn-HfD)NSPqMsUgxs%=Nxg{4X}45E_u7=1d9W0P9_n+$Sx)nG4Rm$AL<=*3@zjyRxyPLIx8Az&VW zs`aC`S<&4W+RVkkpfzbtL195_?PsmS-`dI>ooQ3F*&XlRtNx0$Y_(&9*Xos8Rd-YJ zp8rcDnP>DuvGlX<%pKi_A>>v>wpCa1Li_u*H|FwqWb{cvlrV+AfTw+cR+*%<^aRl1 z#|b%6XbQ&a)z!P&1mCh{D=UrdIH9zWNp*6xplAtKr@KdL1X|nrL@k3))qh>w9#{d;Om827c(2u^iQIn=D|FG#{E}Ji4^H zrJEV879vZeLxh`Xs82xb@rRwBArA~Blqmv@Z*=pr-V}4sR#7q5_AxpDy0tDWmGNpu z)`o>)0WD#L`T3J8=g#mZj-Az7Z3-IOdrcPSxL*sJNq#wcw=4?=ioOUldCr?`kmT{k zj(`;{8&$CB=IW`WG%h(aMMlyHNDmwnZZ>kXFo=BC+>p?#SAHIi1X_Ss&+|>cVDaxo z*G%qzXtvl?XAhN23!tCCQZcf%YS&%MTkgXAf#EZR;$jJvT9O`vkrs63Kk`=<>FS_A=L(kkK|X7@u`^Pj3q{re!G9E%q_wPbIPtVTA7Z>+ah-!+90RRKUB+9=|xN;gh`oQlHwi1`kg(w8LcS>LosQt z`-=fW#AC(ypr*35LB!6;OQr85lZ?!FOGmicjbUmu?-081v4JYztz|*Hz#t%qK+T^J zCrRo@Ud+p8a@2u=cNF^1P}#MnR-&_;WT0omP`-nCg^lk9kKpn_vv3;PWZAC7y?|V$?DB{Uq6Vv)HypX zIaL@Z_+Y9@jPnH5Qlq&p=0mebiv!DsjbGAG4enF|bFlj$F*~-M8k@l>K9Z86@OycT znp%xX7+ZK(<@k~Mo%yf6TwC@4&V$`uUHY6!PX+GN=aq|T*_vSv3oU16XVX;#&tvr( zJW;Cy&MnI&KY&6MK=CfoKyw1)^Yf7k`N#Kdvw@hIBzKZ7+%bE#hd zRzm0#4BBFQizw}OBFZc~!pE2Igw2}xMXI!e2ohV3nUnlHML^TdJ7ULXPpu!{^K=*B zm5}%PAv3^a*ztT)gM~&%N^5obRutuKwUu?t3-x6N{2n zuPbZHB?gqz6l27u)pfIB`KozxRidhMJKsV^>)jY7-OA?hH_#1QZ2wSdeqCj;j&2{6 zD*8nJF*GYTGk{)p62-#OhnQsj*PoyhHW)JPF$@M3`1+N)CeuH?E##YaIGZf=LrIyA zD6Qvf_!0|MsxSKr=>||60KEaKOPm6MGz9>x2JkANwj-1jFNZt<08A&Rn(|M^Yvp=a z{L*F3JkbRdajcu)K^}SDQ$ulVJO`y)u7^N!8W4G3xni-^*LEx1T#3H6CDtk7D7Rv& zqo8}yiRyzmP$`28{tSsW6R;nQ7T%_MiHA;#!nauC+7#Fn74y4o*1p8OHfgIadNYaa zJ!zWsOa+Ya`th3k{>YCi45#E_wy8>nGYp?wd9F1)4?Dq`3*CoLn6ab8;6`*o4Z`kb zsHLjtuWwBedx_d<_cG_^BL)qrpH?zO|C}o3|8zn4DdwfBsAl(oPk7XKl9r!Es2C>I zBd^-k8$&i?RVszITW6A9x#jk8>fbi#-|7tQ95AF=CYo{R^@l$Uh! zVZ}*;I0bl^zlUyS`LNM?N#4isddy05kRv^dqutQY#X?~?`#W>Td$t~dvZt@#xiJNSvK zc_Q5}ar&s(q2|x%!BH$pLIv8*=@C>e`1PRcq~3twM&suXtLyBOm|5$TS{HhLpANnl zEqW?;|7rN%xQvpEN|lQ@(U~A-{sKy+T$S3W z5dlvQpKy`4MAZf8p1! z*D?e76Pc!?yS2jZoasm1uJ3l)Y0K<0He03tgC}o{qrK4lm6M$vcy{KJT3X8Qd&-=8 zM3J~i7>%H~-zAq!&YqA!tPiwfo^x`3^}ap>NG7`}8Y%$vEGtktG?-~JUE6lg3k=GL ztUGyFVzIVo!7_b^&Npf|EZXSt{Q}Gt7bB3ZfY);Jg>x2e+RsA0vUcy1F;{X)(&&Zi zrqu7){q2&r|05A$*&p5k)z6**MK9_uKv8LZ=p7leTmqHdgLWw+IIUv|SIHCK0W=(` z?6LFl-P7$;fVkvgZf#8uP?MfkxCq>fHx@W}e8s^0D*%L8D{*#pU2|wWa1(AjjmU~A zzvFOKkMwkP6)cL=J>$PcmOa2KL6y6*Y-6jy_%}*T#QIDkt$a+Z9cZqJuj^#wZY^mz zwboD7>$;XvZ6L30M}}_|wIRzZI3*YLx)cERFC9af+1g4K*T0T4t%HyHTm!#lvPXTw zG;n`s2jE%s@=Yh#?d|M*9KD|=NLSz+$y55OfQj=fmkHadAOZV617tC|C#PJLyaHDB zpltDUILV4iFzLS>nztxOAQC6D0DPI-0JLO}=AD~fp|+Z)I@M=B*N@XR97^$?^38uvW3(@=8`iL&`{%nn3GO^vU7$eZ=kjk!H z?z#`u|J-VA9b?PL5M99fmm8Rv7H)4|ZA+hK{E!a-{RMUbOKq?;7bk4hU50qbmor{A zi~Tt4HgUQExxT&%^KK5mSU2*3-#%;I6hiS@#HhV_ty!cqf^ij9Lu`rgR|V*LDUT+N zIWKi#otXRwp`4n_zV&*D!28oHoGAb_Ps{B9{|_rCm92E+E3aGY{Ql-lO8IerPu1rg zXQQ61!M*@3xI}nVyx$yAANVxWSC$80fFJ?x7qAGv3@eYo>eJ>on~4`2+BO>M-1_=> zfADL${{Ole?S<>3$(|L<#dAe+<4G$hx zF-1shg&R@MUXU|_5cSJX&sOIg0(s)X^@g{av?fAo)9#?!MEb__zrlu96i@T>uya!| z9R*~f=29NJO2_Dquanbw*(LXmdhF~EQkby5ME4iiZcrJ4m9Gsg>7*9U4>MiI05l+b z|8DvBzpqYkdvfH>O6b>Gjwkf|1pmvSlhEe5t2cIS|I*UcuY@CrBID%@lR?UZM%&iDT=C6CQ7^S8VrUXO-Ua{1 zk8xR;n3&c*umR#NNMlx_-AG;4vBw7svrWx zpgV*6Z=~qL`Zq^XBJ9!Ee-Yq<2;(WqTb$in`?U@l*rE=UsYR1=J zJf?3BxqU%O2Ph%xPaGZdst!i(fmIgwN@n|UY+W5{C{~|HA9mUv(Qeh*S|rXj!m5d66~7rTD#V3U5NU zqjD1Y;!qxm=n4rVs%DZ}OEhCfYDeIjl&)?G@(_(dE-YJriOT=_+5gnQnjA?SY%er- z$tbm{K>Z^ur*P;DdAnlMc4{d!LER8s^iQ=+uA8C$Z z(?%xw?f8V;U>k8>VCd6NdTBocBYQaxPc_qp$rLXQ;iAzs!ds&0K8-}w4bf1twf2dj zO*OF<%yM}CYPd=nO^4aPj6P&5%Na*xe-GoND`X0~_kX&5uNU5KiU}rI$d{JfZZ*<6 z@>d;m({#l!AeZc+4?0ifu5Zk3Iy>9w5KMT?J}0bsJv$wCBIjPmrbpZQoiHwxz4?Wo zVus~wp?YZprx@+*G1t_}6Dgo3P1ZKKN-cXC8=3OyTJ{i=pN4)BBgal=) z@N2Ft+2C_Cv2*a+Q7|}+#%HTg3cL||za&VW^nE+A%kI@^NefXbP4!kr^xiyVBt4Jy zEcKoZsT){YJKY_(@nf(0H56aL%ZKvelF*m%u^#c*FaKR+P(uZ)rk%A{%cJeQMf4!6 z*6GFai$cCA9GNHnV<=QQuuL4QvaRc4#ma|N6AZm}v6rSkh};R`^P|~zr(5XbHAqt# zNz?B-><+H)(5Y!BoyD3!z8Rv0m*vqS8=h_+Jz2{FFFFXPIrO2fkV_X>?aT$poGY%bBaOSAD6hdKONFnh|Ku+@2#Rdd;O4x(i*2o zx;}Z7bgf;7HI`;QxYceM0^baEjXATfcl_m%A?=Q0|0GGo_F45#&*DN~o*1>+KE-t- zB7|&6p1el?f1$-5Rl9}*5+-Yk;GU^**9$xBX_{5@40)Jk*f>gg|G6FH-bK58vJ299 zgt#uv-{MIKxnxP&gxOP{qf^u;G^s8%#~qL)V%$*f0>JG( zt?bo4uq!Uggel{}>{+$&c_@17^!UxD(M!_qRW|%_N-IM`*HuHKefwn}#6BO5^4NX; zW`WY&i8X5xh*a~I@POkUL%tgY=%J-R##-Mzixpk6=g=EU)_>_(T)S(9oIvDTx2(-t zC|~MYBMG9TWL48tWTM?sI{IdBXSDLd1+1#8oOe8T-lM;OpcUw@9lCO-6MFIlIElL6 ztC7NyAFWAc5*Emeq)D_gQ>~1Kt2DYFh&}0#4Dgm#IHzy@E%;z)>*BDwcF1EBeSoyH zSW)pDmv`rY!FQA?ZDuJyYEzf@kh+yT_X;Y(Vs44fWiqG=OEjL|`tvZeJSw))~SAg{acr zW4U92DqF(OF}?-w4#wTP8DVRU%?EJD|CA7{E`}XtZ z-oBBn3GGhsw;Hd3DSls;nL(LZ2eMB$M3 z7ei!L!;?M~y+B?#{BZ_485X{n8TJN)5|Wv)DsR1$IJ*lQ8Ffq^ zXO?yPYx&2k70SWiRwo-)7P@MG*oZ_a6QREo&w#Ox=n4cN27= z$=Y7GBct3AF8ff=WecPIBg>NFx+>-g&xgmpdfHCTyCju)_Dr2k!8t@a&NLHYF@ac$ z2bY{#@X{Zip%?M@sLlsBlIUh77&az(n)>89PfKkpl;1E{_Pn%;p*PMsZJiqb5ZL+s zz5N62BP6aiYwzI%p%=|(xbKvtC<&|0AW+0Ll;rC7bFUUyU|ql)i)}EcHYFl(hG(o! zFX}%EEvd%}jRj~hY!FFkTWBk!zFttj-0}meR`%{(!&-@Ni;pUrD%+CtQVk;<7ba&Y z(3XU>Z3E?S`ZEl9x}UCJBb90Y(1nMshEcUdLT{%9tUf&l$iZpJl7^@FP%rt#G=3|W zs3c+~uVQF{`d39$55XO>+4V$~anc2DYDVX8^y_AMap~#rbw84w5e$EcogaKLF!&s> zvZ0n|yxjN9CIeba!dix$#wWM{Xk0>4$L@U6Zv4XWqgt}Ghc1(gZ51)tBgbs>qe>Hf zm+1YC@rK~>Ea6lBocy>Xa1dUmi^J={sb>GGg&$=NnN3@~@n0y4Kmi$RLNZK4BL`G# zoM6GGz1;P@twJ4AukQHIzjYu=8t<;MH~gYEs&AX=1PY7QS8u(5hqGmJuJ}!TOxEoS z8Q|oR51Ff#*dNjG_m;)JoF!|s1_da-_mGvt6KKzh>*y*p6tROOOQew)X#%n|4zp#>yeSE zairyn%^IhoJRi+ozTAPF(q8~f`SHg^AUV=gwcSh~46@na_*wGn(Gi&IkYz$n+^(;| z*t_nVAI>A>3HMyP#ccBBn#+whKh|U#eBX+6MOs2<*v&<0Ep_TM;ku7jg((p{$|JkM zI|Vdj4yM=6*o)&0<%i-3Q}NEiQd9KMMm(d8>zcrd9!J78q1tF zBVEePS8{k`QQI<-|H2p3t-PP5<2>|3^ZIr(_Zr1ClU6;;7#VaXwoeF z7?&~Hqrv5a=C*5e!Yn%MODA$q>fmCwVMEMdkn2kK$328{L{Y|pRL+`!iV-R-j8@bFe+{fVi z{=R>#{+qNd?_TefQJaFT7Q`r}uUmH5Nz~)Lj`~U#$(*f(N2J6!^mkYx>`Dr}TO8a( zj;TRLW^8OcrlO;m4R6JOTDDutcZvZw~)QXUY>b}+#0DVmm=RW%3)BlaWUc6&Ox>MX?FRhEh62ky5$smY*W(Ew!AO=GD}R1_Po8XeB?!m+1@?0dKvP+lsoO z$$Wo+!CK9`*Dko~)>wb>8h=*TJbMKfcr(@bvFRS@-E9Q!q(*g3{ z7FTH*(8l^A_)i=`VsUt=vM>Bpw`Eof+P^;#Awb;y*eU9kYQE+}<2u%VvG3p(j>=y$|pAy=4opa7d zGe;7ALPT|~Q%GJBgY*Od3meFc9uOWxGg+&&i*58+)M9pwC(_I^N{L4+mei=IEO+VX zH9$5AM0CT2eptf=O~l(>9V-q7u(zn2T)#@(EmCAJV+(JbZ zWY^AHxxbFu%q;tgZw)OevSj@`i98sCcBJ{5>=BtIHElFuo+oz{VAeU)uf}Tb!k*fwt67Z zbo*F%JADCOjkBe}-o+(7ubMlvdVT{P1ckvz{Q?nR4QmNsdB@7leWT9&c4#kMo*cK=q`!jvu`PicW_0em*xE68P4#zGA9V_oO~Kn&W$}T zm)1AenYq~>shshLQbz!7;J?oBO#_{e;YejKkNq?LkrW@q`Ub zY^6%bS5FkkX-J}p6e|ljlZc8FzwD%?Hgp?ov0LO=kagvL(W{FbxFN(CS8t})au7Y{ zs%@*X&oMSJ$W6HFLFL2GkEZgvHkF+%-|wn zJTomFZ3PT84Y}vU#5+3L`55#0^NT5ad`Zc<%ec2TKGc(t4-mAKpSq3dosOHA&?u(x zp#?efsx_=)1AV$POFoNf?ixi#+U6jtW|{t&2^ZRh}>OFUi> zYWM6?ij)L~q@*LpFkinF{n*Dhf#)i~M?&VQ0#71aN6wcGLQ7v(d}7yUeF<&WWjXGv zZ>Y53>;A3nNqbZ{_h_cIU+;}G*(n!E)vqj@xcK^H9ifC@u0=5i$=C+#=c64Xi3C6S zb?wPChMd$s>_fh0j_LZ-@sNO&+}uw-m4`iJ`KZKdc?!k&-u~l$=q-Cr?wG5^mU3P3 zS6a6H4;wR7OHH_2)X5XB!fQ%>TAESabs_=A z!ExIRtNzN@+m`}7p>RUM+4-6KG&>HTR$pcwym8VXdm#0_CfeuEQhBo>i977%T_A?ZT0vE{T z{2TkAsd4jsY#fVz|60ZOgFzlb_-1Yv+|i&6Lxc=P(qKa7Z8Yv@{oxKv=6v&y*hE6) z7T9aQc?E3In|asuttzUs9ngzqBfca1WUSuUlApD8179*VSr^!ktnpj*8?z44%U%aA zYQzqk(hmx@>$}BJsWh?}WB3qsPoJEl7<$ksuF(s6g<-pvKWjzKNy&YRGnADFSSALrGpxI8FDO&3K9w%QgqZ!$$5XX^} zgNnGq*;0>LzuC*Lj3K`YSWj-K8EW@)c@d~P*eQ@ei|fJ4U8G~hyxIQRR+~KO4MLo< z%nrI7(76;OKu5n4>lP<~x2vy_uinRfcKdsy0`fTtOaL+@f)a@0&48Y=y<*X?o<#6T zCb#f)f6?=_6osK)R~B8H%PEjQ{a`N&k@KZ%^TqdQ3o3Bt?|sD@SdwJ(@@1_JKi*`# zz`NnvuY@+#ZBY6#um}1SD=H|4$jJRsq|D2iu^CP$*Iyk2_JXbR57(%ZxK2DY&BpsXo~-Ct3J!$!k9#>$t={t`>sB!Kk<{-oe~M9!6E4>)F4|6_LYf>J;{- zrk-zVOo6t%VBNIEiQETbKQZL^qIPFfBkB9aqRBuC%dM4TOZO6LesJ_CeV{R+YZvd4dh8RkW=yY zRT7Z8knIVa3&V<~*jK5I%>(>(3gF*G--tL`^#4EN-YP7vW$X7w0t8Qjdk6u7TjQ3X z!7aEujWzBPAh;!1V6*0{U7yGsKfYrT8zz2EQhoQv~3ebG<%?4DIMM^%lg@vHwp z6a;rZF_PZ7o7ZxB z(GHA1m9ApxIOQwpCqW*g3<%GokZ;}jnjTjO?eRFH` z*6NQldb(ixJ~3)RwfT``+5MzpcZn>`eWYQkCTHEuEOUKdX6k{Ro@IVcM~CO!$TcKG zI0lbDkWDlaSQ4xyjO-p_SFjA&W{0q?)>c~%J(yn~mq;yfwU|hZ;9-j{8A0d^XWCALp!NWycjQMh)wu6&-`N?RAr=Q`N%<|~B{+Mm)1Jf9s`|*s> zV!HRR$N3+sx3>maL*6)coFZvoNkiJmQv-}HPMtbGNQuZ!Iv`V(sDOx5of->e4+RsS>yW!9Bt*H2_*g)>c_zo3W230^drJ<|4g!I<#J_p~6i6{&8 z(6)znd4uTqe6qw{>exvt(uM>bM>2HI+1s<@aXaZ51wMJ4(;Kt&9Y%|?u0VnFM5oN_ z&z@*9<6_mrKLAqkDuiuhTGK?#vi$w&nEd_H&a1-@P`u^p#U6)CnKR<`bocy^HW6wO zR`$$B%%O(1Q%98GralJ=-9ef8=K_d#wAXTXu5LpD)KZf-7ac5{z3 zvppC64G*XI8=H;sOiltDUVaxVn?`#y`<|^bHZ+rb2NwC(H+A;-Qu;<^FL#hGZvIj# zVCe`8xsrp$udHZArL<`$42OJl!t}B%W=|aIfK-Ygeyd&l|*y*nM>jLhM zA}zs%fC&B*)6(WRj4Wr@*Ez?0GCgjoYKdHAzUk_ddEwY~!0XYx0`rQsx5v-PChaP~ zb`@kDIi`pO$yBk&f_Yo?cIL$E!aN$BmSPMS~A)rF}xL zop#^FQKmSU7av8=SXq5KO)Yrj{=sU@UGhNSNNHxXNgzrx@?i@}(9PkT6rOrK&QvQ7 z*$l82kqW%BW#b>d?jC;m;)Yc(RAvM#7C04p5-+9f4*N*7D#Znp6(>|xJNlLpQ6V;7#HM4sh|giCjKlptyRoNaQwDuxrtUk@V%rKE0smUZDzSYn5U4L!VC7#b>$&|529s%WfT zAK7FndZT@zwy8hH>Ye+tNZQt@4bj@oV?=SA&J7f)vo4=jiV^Fz)_^k)84DKxK%$JW8Am-qupN99F#zBn7*VD~i} ziZ+KyveJQXT^TBvDzqNcce8eTKF)YaI@-#_;Lh!P?!FzcFEKiAwtq`kX7hyPZ4#*W z)`w2tebyv_xuMC1tFgU!L_9i|t-QG?8eV$@IEu&aZN(&yk(z;Te=xM|mHKqfrY->n z&;0D!$jd51$TM^?_`X*i$6}%3(9m;4JJ=~mY$5pBkPtFf+Ir^d9w0l(UJM~7ybewh z3+#X^?c+E&%%S20C#sKxaur>!%GAI~t!o63kN~a%(2)IsB%#yk(;_GVJH?eUyBei* z(BU+n%@?s~((l5iY8a)hLEHJD;h}*sQRHNqwp6)Y9;QT`IH4H~-aWIul$GCO>1gmK zjeC4+C<#K8A1RZxLZc@cWO?Gmb)=|S({@J_5~4SkV=PL4zHy|Px3@jIoN}PFhbm5T zQJ@(09f!Oyf0;i#b(xKpU^2WhanL3Z`ilX0@6zJ}?((5F5VDeQqQ$JKUIWCB1ui`q z&ka<#9sQVYpxVJAu$il9;#4$1Z&5yI*Kz-1^NBQPR;P<-P-@;XwYS75AlxoA@S!j_ z80*3egdTfMh%#7mFf7Lk{A4z~SisC(P{N-*Lg$=MZ1@db8|zZU#kK}u&odZCelYpz z`pt_^mk(XJ?CDRxfdgxp-rguKHp(PW3vyALe;n?m$Zw@0wsdEw32u|F4|Ti&3B!wy z4s#YjvUoLQr$?f_!B9B4Ts|)ILxL5xZw2HCC9b?p(u{=`i^7bV05iBqVo!mzMCT$T zcje`7i>VfPj3XybBB@NU>xF|+iT_C4Nc)2)+VzaQx*(d%R9-SN`q&S>>|$3|{Ef@% z$*BzeEcKReQmv%oVExL9C3QK^JVXnxWbzCG6-nu30HA)V*~PsA@0S*US|M(-EbSc+ z%kR-$r9+{8&(}h7V+X|)IL-tYWO8*V4cu9|)*2He;a=`2o*b4dx%Xx1K;4jReyD5$ zl;!#U><2w?%k*yvcBw@4sLSL~$mfZpYCZ#f)3i2FphFuS%HSUhRe^ zj@E+p89JtxzY4FV?;O`C>Cu~17LFJQS^#`>Pz5|%xw*WkS`_-@z_@-rzHK?F59{~GS_17Eib+!7K@qp}bBM z8YrRrnJ{(vWtModc?30UxTn%7J}!>46Fx;^(y$U^)5bx>^$lLmu{?eW&*?^LN)7&z%=O^lR}NdakJhAEN<(BJ9EF%6VKl$gEU)4n5hc5*&*&mZPC4U}oMxr`i~MrebhR{60%8OpL7uowPXo zk){Rnfv-P#J9@}jlA{6lBcQKf@>NJc1xw*Z%S9lR5Xd+_(IB&2y96OhuaAB5(N7~4 z$EmSKWjAi{!Ez(K$H9qDu9+f5(NZ^FoHIU`Z|dmF#f?n7EmS$6@0zk=H2@IOfAUZ`0A-XlRQLds<9oF@7#cSj* zi3aUU*OEfC{E-*!KF(+gQD-a2PX-MuNwkg!RkV-%wi0yr?fM+`WiVk%Zel1V#$>#8 zy02?mw)v}=En7(sp+>C$VQp%o?;E_c;DrmzLDtkTgG9~H@oLL$g{=36-zZxG8qd~$ zDIM$rD5Jeg5)x)x4jd)TGU#=+txs}!dP4{cs)l!R-3TG_!sHx;Q=3N59F1s>)yg{og7n{GsIr23 zcRp07m@hK#2$Ygi+>Cbo9-dErF>%+5XDCU?3?~elP@+vRtSHTo083k&bK{T}_j&&asbK$vkgwFjyz%7Z1AR~uuqs;SMsI+gU#p5J>R^cpie=TPn}4(8}h z?GLkBUs)Y#^wmG}$jPX(LdsrSmoT(`qFh4T^cbc#r1LW_$;*Q~tNzhpe>V8fcMyslvdz*}?wVg}!Bgz9}`4QAABZh5N6M zgP6gL+Kuz-|GwZu6!(7-uD{~{f3%(O|EBE%{!_wNh^HIvFWT-LQZgDbZkBgyvb!l| zP~Adb%qPA$$Q)P0hVqrnDeL{?Zgu(NQSa~Ok$vCSQv&$T~MeFOn4ShGToS zb_;>_m!SogPCY}5`9%o>B^*OO#z|J1U6YZuO1KP|`Y)dIi#}kV8`?xH%WUWLltPhU z0ZuU>6Px0Uz-|pLOxd7pg?b5DPeg_p&8Gnefy*q$Mf^jU2~&s}y`jN0%b^G3z34We zL5#vnK<@Y@QjzugW5;vycH^#B1Kiz)Hk&q2Pc+VQGxX%TkI8ItaX1TyACMM#cd(%D zB|knKVVEXuLE`RB!ZhxFBol8E@i{gv;o;Y1scwZK2s19knzUrESJCqq$;-*kM$JCc zvBB(n(q;FMP}_-Q=HuPr9RI)UO;QB<{UV!CPH*Inx8h@I{4u|?9Z z(BPk$mr=r)wx-%Dz$>b$ZKQg%aji{|o%0jq@N?wBoMWzXuBt6+>G!rv6YaeGeok{m za3WesW7s$>Phnkohx#`QZCJVqlzd(t=KCxG-d={(0@nvtqT|fgMtE&QW-^zNOkZkw8rPoTgF*^GoN(Ywlx_!op zu%XLYt>5h3y|q97WL1VP|MFONVX2SXq`HD|caG_r|1zupe3Mps!L-=gzdWh7vAiSB zWtp0Hgkp>J{qLS)Z`vn8?H0Fs&g-wO2=W%f6;CyQI+!jkw&_*kTkH!gcd=a}io85`ya z5)3t1Et~S0Q+ihz!-a#G>TvifQM`EXkjVl)4xA$|2d7?oZ`kW>a=l~d$XB(An+Iw{ z>+D}D`;4Dhnq*(v8t&ImUx;3yw_>eT7p3jHgaEoL%helpQi9f@L2-eICT#N7qrZDf z`|qM)yCiPr?9${NpR)=#fl>0KZSt;@5IP_RfeJS9^WH%rGFsLEWm|FZ*dOu!Yz5bS z`yaBoG^H8*mPdMeF2<^4!ySAHRxzBI@2r05JHP{Q@C%ME0xXS~*n5LU5fi^K&x{di zmDgd48&@=rEO~@jEOZ61N8B_p$HXT9P4mZpKfSY<+mbI!se~>Cd*TQ*(=ikGuW!i9 z=&2c73-qvS|H3pU>Y4t5i|+)?tetM(~n#3$|=lklj@S))C@PGno1?eU)!)4iXeG_F@#vB5>E$%R{?1U>c<6 ztZz%q#n8TXT_~Wzs4m$cT;Ok6@AAt+XG1~TM+#*8snSfD&7twa z0KAp9+STDawmo#m&SFgTb>!wu+mM795#d|q4b}VOwyU=YJTRBL7$=H&ZPabv#|6kD zd6hX6LZsVw6P6ea8SiZu+uXuZc#=6T<_^0ib%brdtIxR$dt-S98E5JjOQe7vj_?N) zfgr_2<&&A4cCV1MJfB?OFNZhlh5eLuz5YxZsqn^l#UNuDSw1BUO^NCR?&zULF#StHGCAViAr4v+(&pDv!$E#7K@E;t-n;Yb zXa;aSx*{GkAGxF)-E)M9xJK}Vi){T~6*%f;O_k;V2dsD;u`4>CJ#>=6TBlpRb`-x?jMzPBHjk2sRn-2cv&Y|7>Sgd&yHNq zyX%nZ$cSp0YU8b;e*!O0wc+9`-g{uajJ9D0Al&H1I6s$w!?6x|B&&GsT+CU4LgDro zy6!I34_v1%)9V$gBWW8*FJt^H)t4Y|DBVf}F}DLpcg;5q@0_zeH-5S-Pw&Mi?5CW# z(dr2-!rA5G{?3@8TPEYP&CSug zh{P-7J+fSGI9k9T(xE3Wol`O}Z~Gbxx81%=4G-zKin4>6e;n@nmNR9fti!|i;Z9GB z`_ZkyfZ0+NBLXR^I+hkOT0)(-BKiIHF_?okAiRtwuaqiHOrexE@5b^68j-Hz3P!Q@ z)-gCHJRn?hQ{+#w;tf7pNXL)D>Oxe--pEr04npYxDXaw9qdQVR1DAa(;|;vLn=e#; z-&l^g1^(IxP3eEgvF0r?_h(sY`_uwS94=Z~ttrZ@& zC;^#*SShWK9Xm}<~-@h8=kJ(d`Ij+r6(gS=kB`OKYC|7nBgbMeV=ga#hxz*Zc8O+s7ao@FSoOM*btxZ^S z55G+mF&Hg z=kYRcopYjf=7$+Ot9zt)lvhR*azWJdYza0Xd+U|=-1KmF3itBNwB6n2K(|w9IKU)u zLld&06c98-wi(poy7Zz_F{CU9E8xYB0U-c`^(js$A^J(eFjjs z0b1Wd35vSPkj{1ZYOa?4Jc5Jvm5sb=6FZ%f>Lp2Y$)_o@y-!yirLD~#24B)=vg+R2MF2 zONG~#aCnr|n>yZruk0VeKm$#gC@nc8-)yvd$O+)d)W}LVnN!vAc8Lu$Vx>4C!DpZ@ zs>!;R!>D4*Tl!6Edz#Ckg79RJpfM`g(Ij)b1hsYp*XNgD2mbF-pz6rn1;k!@jw#WI zb*GLGGUmy;IhpEkCwi)!ihYcWqZa-=h#H0SjX-`(qT#t(m5HT8{Tp}6Up4OrQNAXL zX@p>^Dly1TGMZZwXVa)rcWroIGLX z=cQHB3=$*il!y%*%eP$idE`ftX6$G$9J7B}=T*f~sfOvW_g5RraUv!2goIMLyP31m zt4WWM6wAY>08(_MB!a&&Y~pYnMBFM8%vZ5!cse&2p1i;YrpRj3DEG`C*ijEuA-Icg z2)H8m430W1oO_&wv#ymJ-o}5akj}Gnv2lFp=P;H#DyxPPx2IR!kJ7Z~+ z6S1#3Fk4pWjlr!jVoZ7etZDZ3NNJSwGhQ#Y`lNC#slmGY`3ie}>LE5RSB6oJfXZ?( z#es*~J@igXyE&sGDh(%R_V_E(wJcT+&V9bPFTieaa2`L=gmAZ2UCKmT0Ph${K+jOW z9Qx7NKLL(54Oadi7Jv<{X=%OXrZXbE1Cvuxhm=pJB>gKt@;Er%Z}=i=BG{>-)3R#_ zhZRMN`lctO23PudB=|6TYtgRTD|OHb|I~x1M~lq+N|d99KPTsX4b6%xQe-ymRT}2j z-UNiWA*!?P8ucfR$D`aD$*uT-^KRK025P^$W7ETF#nuWeMFQZs-I~JH_XxZvt58!VV9gvzgF}5tmx>hhj z`bz7Z{o?^;MJv&j_xAE;|c#~F9i?IIf6dP6WIYcp|o8g<#zk?l{Pvl;)6lGh>tZPYVOtcFjE$bm@ z!1sg=z|kkus}#x`jCM#IZ)KD@_I>z z^a=KgTlY)_e8zf}43Paj478WajUyNMaP~B_iW-HwP<>BEf^{UgN@0vQliat%DvF1a z{W%wRwzO4&`}QQA3Z{8>Md6iSP7i~NPkk`eS*}0FoOSqGOY{*3E>P0LUN!cG9AMI$ z@>p>j2#)IWhPk(<7@WLLinBuFOHvWfxFcv08%U+iFEpmDt?|kJFm=(FrZmu*Cl)*( zx-QjwtApdMrGn=R!`nQMzRa&58O>mC%O=_bGlXS8+wY&Wkte?HT#Ny9zg4~Sa#m(2 ziX7G5c3v8(Qw=DiQ)+uF&@kY>vNiFhW|Md~Us+y+MHvmIH=Zbg)n?JXP$_}0Kh-M(iNy*Bkk&>|UkyupSIuqda z6StNytHsuyLWk^4nSs)V2@f)GKK^>z;X2$vbE9{kT`4M~tIXN%0iOBMZGS3>Mgnzs zK_$~vro}c@Ib!0Xz(T5Pd`zTkGAaMsLd~GEqJ{5nY9*2kZ<;9VhunPy=?l(VCz{~d zM~kUVSO=w>VY`;#dS{#d8Nd9@W(J24%02Wol;z(v&^4qMM#*YQO7xTrn3Rm4nUeU& zh5Cb&HFJxzikwJgZ^G%7{uR|;CfIvYg(+LW8YQe?ns9i}sT@qHbUSfzXeMPpHa68h znPh%$5vNyamDda)Tc)SYUB%?lHo7n9I9jj3=cIh~56LlN@y?Uk5L$o?xmxg)?je08 z%OYywta~3?KYsQCLH6d^_VXCo0dF~yeuALT&#Mu6a*&XqRoPaCsk{-U>nmWTl|L50 zPZU_lNgb=~Fo|o-z;w{Z{QGdHqGIpOC*d%9i++akwK7YHa$W7YRQP~pSv7;;zEGZ1?LKpfn?FxGQu{EYA>f*W*Kz!q<#KNqv-}6!wN(;oE8Jbf#pA2drVs=Kw%MYB$UGvWS6LB#gWEeF z=UcUfO(5@v+vEbm-$h&;m z*`dt7iO>Y(I4>>hw&94uz0@Pl-i47pl_!zOsCP1GHSkh0pg!wg~ z?fn>zM9cA}4xkJNMwY*SJZSf754CzB9}o`EZ?YCy$<=qVa=qD|OsJ=U zq$w9b@24YOPbc1;KJDO=-k*|}!D&0;MP}>lY@Lao2w<-2kg0#v-43h~v-?o|>0-=t zd%!W*zNloKj(KDE(=Vja(id2@c5P=WaKPY!I3{Rdqh~0zx!FCQ3<~7~L6yJbF&|6L z;FTKj&z|dEjNM$46M8wtHN^>Z=9&dozTTdj0xJHJ$9M7d2xi@Ksm0;F610cX40&>!2AlI5<|G_9#97O9$lg*qEzh)YRCy>a=Y?xrjg{^N>B6 zy^l_R+XN@fPW?Iy;)jw*G-uejv7(s(NMs3Jwfg(%X01 zCqX0Hq{KbrD?yy@8rqCKO#^)wm~2}J4v6&iHVqUjTML@P*48o?mstB~YBpjq=kKgl zo0;bU2OacAukqn}Lauj?h932V2eyfl6^PDKx+D#~b{L{0;#ni3wH#8Mf!t^l`sF_d zw=u}v_Wlly6M`f4QfzNAexYBUd#;5jnvn8kbp7t_6*`!gK1jvYwq|J>s64~O95#s0 zim+tkqNtl(6bDNQ$1%DwQztkbkr4KJrv)FKp@@R%?6^s5o<|b^4guS12ccg^VILYl z(g|~#lKjd{w0+&WO|uG#0>O}-tT2`nerI<4M2A9~&x}4 zO<0eFX}d~g^2i7x507xbFSxx*md#{E+?7^FtwegEA~0cC{Pzxd*1#pB5s5!hBhfs7 zD+g8T*E~w`!b0Tok;^S;zsTO&$P^rM?ks_)8hiPYdw7T+V0tMDnL<_clwOlBYa4dKqeG)ItJ`3_Fr(U>3JLn#JnyaJf=r zhFogDeLyX1QaUsrJAJ{=c zOI(+DT1^fi)O4R9`bA}fp7(Q0tG|Ymd32!tj0D*Xzk(0i&X;O zhK2jDFgUyhf`37fm?g_v0ywX5u(xwRr%`o@HB9@p6k^QoZ9V)QqAwOXC1OE!!&31^ zWneI|gKy!g=7D!JrA{&ApeK*KX0zN@<98}N(DDfmX*uX#I|+|bGfiVV&9DnYV0Vxi zGT!Q$o*3GvXA1y)wJ^DKA|biaSnzWOX0^;6gVLFpKG{Xw##ftgfX(yEiZh%6^&~ZO za*)SyhgaJ+8$Mb9bttQdC_lD$H`}+4!!8un%FkFBjFv+Ccc11tXr*Nf2M;=T2`q?e>#GIDI2k?4#ir#(_H&UXxZmC zY52jjyK=8vghuGEx;qhQ{qo8YTD%-%wHWU)&q4a+_0OtqX^`+SA-R&K2-) zDGbi?{>-W*%q#HSP>W>@c1q6WEQi7)Mf9WiXH_Oz|EyrCp=T|QiEjj&*&qz$;<~~zHTrA4iNCTh3Ehjz4re$Zp{KOn3=S52X<2RNmv6GBVUcl#X39d?g zkVT(??g6kS(Mm@qy9&$n+cp;5=9Y4>dZd7w1IBjeOO-L@%&1!aoapPo3;0 zJY3H(I(_f3a#7r+H@$Xrgf>OMY@qU2DEYvA2|iG3bsF=YTdxkHn6%Rf>)oz#9tn1g$x})&R6y}eVBI*dpyG{t4qFC zEduxJ9Yqe7FO5PLgEX>keuMWoyxs^1GwqF05?Je{>_uO+9|+I|d5aJmm)bftY<~rG zM8eYuY(tsExI3*pcy}@^VH3P_c2BJznNpWLV`|%>j%yIXE7B757QXw4PI$~!{`b<& z?$gIh{dv_SO>eXyf)0r-%d>1o9~6(=H*@=dv2hm#Vcks0ZKN=tvqgfP~)QHc{>L^LwG7 z(a5k)9w&5Vh3EV~blG;R3viNzw}$ykAzf^5uqKN&D+siHYzsp6=?aXj=<^)CzjdG0 zi2$qPi!=%>R-~4xDDuj_9(Y>Nlv;#(QjiI!E%)IPa_f+q{+9WRS#U8N`X%7s4@>3OfhgMC(ArFp)n_Ko9*WtOCRN0ht~o9&AbP>UQ4_=Xg_zQe z;ug6cFHVJpwHJFjf>M>mF)Gt~i`5MDGSJ4nzhDBW<7-67o3Q4=NS_gy&B&$2G%PIv z#5L9ouU5OU;W`NYJi!c(iBhh`F%0$R542!5#hzSheB(Z?Lh5Oa=6&E<%ut$D!lg4$ zH6Fo+Qn1J_qI{o)55I~R1E^e;?^g*#su9ci3%aPg0A7T5IG&oyg^>qIpq_viXi>t* zY$(f5bwIQq4SB3wB@;|2ud4{^He)OYk_fq{#=fdQa|p=O@v83(|ER?&_;zPh{3YE$ zm71uqD4(-V7UR)grAlDnvv008QUP6GdcCdSluA{>%5c13`RGk`06I}vYX@#f)j@%_ ze#bk7eb$g9pteDt`C%3x=MH88bu>{HUEwCB9Aynr7+*<4WKB=(j~`(bIc(zrRQ9qV zQOln%vZ;Oq2FyhExJd22Vc1DjxtX(=kJBB*mtu~!Hf`GHz6r>c*m#{mUD4BxrKY$E zr@8N<)W95RAx~XDRINMJjxmXq=v<$2oND=I10hm(sD##W>ebr~JZU3xsWtI~w^c2L zAtjL~J#By43=Vs(jAdxu5tqvA(!%A@nJw&9Wwm3_ySS0UK%lDWPPRYo&%^1d zLfdSA;H>_7roZLgp{-UrlVxbXr<$X#9MMCh5Xw~tU7elka~XJ zHbC4P!uGmDwc(N9_b|L3|2zMHhKBb04~rjBfK;B# zMIg9AkiH)Aj7Hq+K`K?(1vBu4YCfX!a{q&s`>4&CX3>3xtNO;4P!N$pFC;a|sJbQW zdYXqY5)4W1qD%nT5Be{cX7G*61ij;&Fyl2oEE<=Q1~7GlmtkZOG|ytlGR<||qGTO6 zM>+o@D9GxPZiM{G7!$)Rb&q(2)&oQDc~6ZG1mCcpW^95^#4jHsx#rwb5pUTUb&+tF z2GYDO2u8hBBNuj$`EOLT+F!uByQPL?<2=PSRvip{XRk8F=S@XaP3vw*z`Opy>WKCl zgu078-Mu;MR?g<6lkG_0V?k2Dsz>jsJjHfX8<^nYs&n+-klM9j^EMe-pyp1BKZhKo z++g>N?XJmazlC*8(>~i)np1t2cG3ZdjGrS)Qj-WDQJewyRRc>&^616 zA+RlNphtLDs8uz^b@u}`+1R8)Q(Tv^bJRo9dnboCyMTs~p3+U|s$km)g(m5m&2d-r zIcMGEOOdT>er~PYQDb4^>7)#t&GAH1j z5Y(2CUnF7tyVo{;&rK&cAs6GT)=~8}6OZ&39F0G!Qq10OX2nGMzUWHUr z&sNa};*lNpIE@LvBsTT&{k>oNoF`Bo=0B+Rvc)XM(0MDy={)vLem4)LaX+pBo`{mUGih@e7#hj&aZkinNLO`W^dCnM{Zovrf0 zsk2$6D%QZXX&s37KHq7*zRm5P(=|IIvtB#Pm+!%$3+``k zbPdjxn^4k$q;_Ov{}Bp$HLK7AL^;G-nBhvnZS_NHV(XSpUa)>wicgvKBg%S4erR}TVy2T)9bFoN~X1>z*IW1*V{JoTnwu3u#nsHjB`QEs&NpbT{XK4q!z^1t1QEH`i zy+56*kN<6zXH&pX1bL#jEi5Dhm0ns#Kl<8BlJxg&%)j*8UZ1-M!E#K(4SOgqjOw)d zi{V+D`zuVUd7tKe`z|RCq005oGgn(MuzOVWJHB2hh}^r5!kHBxKirA(5LLA@^|eV| z%^vUHy?RH3+EQftN-=c;sQ*@U31X^!ZFl(Cmjg$=_jKSM*~@cd!CBm#s4Du;&%3XD z4fUkv>@po_x9HUyOHoi!etkRI(A(c}ULILiA7N175=fy0=Y={(-;^e!d9w3fU=zBn zUaa|FrMF&QTU&61f=4dw0wc==Jvg~-6<1m|oLb!+lWU#f#{s9Vi9`?=y!OLg$;u)v zMvvhB*l&|fxD@Vqa`iRc0vYS(Z{?{@5-$9Yn06JG~^YYaghx44$@(~GXd zzvd0TzejoEISfzS7wBxBOG6IkAdX}AValsX%vTb#-~E?lR;z=x0=8%{SWi#yXINMm zQ7jqxFPQ&E>DF_H{!5sXyc_)AS!K!pPcXUvJZyshElS7szeVXx{(w;UWcNy4Td3cBYiJYVqgnxefiJSoU zUuhBlA_xBm{QKuip`ibFHTu74$_!WJ()&i|sMJ*1hlAzhw@(}0)+%|g`6p9Ha3SCK znD$l*ysWJRz*9V8#F|r%mbT2SNc%er!FW^065i_~8{KRd?@4&Aiq%U>sUfdo%vhV3 z)uj#2RX3skrYpO(G?>XyW%@mS^J(mzrx~45xSZ)+U)r0xogqzJIi%?=ndnzMpqskE z0E*R91jy7MqRwp{c6n0G&*eNe`0uGkL5(oW7$GMu!Rr6cW!?IwRHtQNZ|{ph8fMz4 zb5#|EwQo!eHh>Ua3e0Fco+-*QIV@!po>Qc5k9noV)f;RtV0oJhLy_!pIAoN_89Dxv z=pP6pz#}}0@YAvQ&z#1G2UogxYKwPr)Gj@h@y}v(2u!J4C59B(%S~5QyG#{1wPGXl z)=q!Tet(ZBK?Q#mU~KGNC?1o^tD(@VmBWZC)NjXWZk>{iuL?rfF~cGw*#Lm<5F9!K z#JL^dNR5NaZo$i}Jr(niJ@m~oe>=ZFwgBQ8F7@Md*=s1%22Jl;IGYKB-eBv?W2&0C z?5mzm(X8I$e!Ad6KE(EcgtuZl`}M(eHBu7>v-8+Nll@X^i6hv|M5?}L-s+3h!OpcGn^n~9|o_Asu48|wQVMowP@LV!f;xc$rpCb%1*$4 zXtXB_7v;{*+tqs&~0lT7<=KQ|@O{m>u zWBL1iyK`nBC+x*cg|QW>jZZ|h`Py+Z4;8k|iunYr7|&ePEmv7Hdk|i`;6Q&I3HF?m z{U=t^nafYBi{qUVOh3ULbvi~$)egHi=f5107^qu*rj1849L;@5JfR@gyl{c`aB_1O z-k@AYre+(9!`9--GXEKJ_QkVA;G4d}_0zegI9=0hzHrg`K1T0*`i5zaG!OVr1&6b0 zG&f@LXjQd)vrL*1>GUJ0<$_D}@c}F5)L_PHd4M+E^fkptasTFdE^6_@9jzQ+Ow?Lk zf61(~0cWi*Np&)@a^MBx#Fo{5JYlxEt3O_(D=gD3R6?MZxP4U`BI00`oJ9hHJDcm} zGw^>AyIu3m25>V!173JG53Kyj*;KFSKNJdGck9vW2sXR?Dy8x=Pmqx#$9vrpmBHyE)nMb572HOLX~GlOJ?;+f^fm}=yP+#)RBBbkbbCUbENkamKL{g? zo@O+1d$8x|*k)ie9?!m@bAvs*=opDdlAXAQsq#K{#c|I4=tdQvK9lv{ zR05#GagUCf+hG&n-d{^ivQuggEC%fu_6h<&BOGm}ZlLSJC`$4WQZpcl1&&5j6Z%O!EZW^%r z!0Sqm3FRLxXJWNa>E2zA? z+{$~BoIxwT7DhYi5n6n`YYkozE!#*JYL9CM-$y&#Fvli`gU{`g_h8k!{Pt8cT zJp6OmF#GCD2AGRfH&P3?f$ob`*8|e_$gDiFy}Z18xbzH{T`WHQAS?#$CcnHH*yOF( z|LADTB{3h1VCQR_B>Vu?7~;P*gK@bmaGa}c`3lL8?ag{h=Dp;@?4?}2GC>g3g^T7O>W@!3pU`8eE zTE}rdR7r22hv*Q-+a8Jf=Xn-MGqM>=pLWwYK2=_j`0&^d$GfzLpJh1hVnHH%y~?`-T6!)Yfc z<2=&tVwft`+Z-z{(5_ryQX&jCca3+THE%`lw=y;-ubHLw*0iI>*=@ODXgGDM_n+M~ zw^TzGYJ4e!76GOeH9@2i5wR0R+(7X024C?Z%!?-RAtna$v|g0}zB^f18pT~>s2b2? zrM>~>4YsLT=|A4T$gd=lu|I8TWo;EhhBj6-MYAP{Yb84-BQUpW_HSF!0Bmxe%3GS@ z;pXy`T&sjM^yqI2Lo}x|y!Bt$7v7?JqhkaN!#b4;GJ9)o6hMTs)29*f@JM3`3Apk8 zs&m8y8Ey{2t`PG_{01Ev(xydk$qYm&L)q)`U9rZn^+P$ymNpzzke)eJJXk5~qc5E70jzSnBP@SP68_V% z-fx&7*=?Qf9)kET@wNP}lr3P+9-n>&IQno;!zhvtZL+KheWZ=Ol{fjw7%MBA%2Ql+ z&n}*xH!cnUDFng_jK3eZC^RK2b1H&mS>;B0Oo9c>U9d{57_gElB8A*EKfsar)CEP{ za$XJ;;R(gz4JD=J;@!$L$2w%YbC$It{O)Q@K1&5*TXn@X#O3J>!OLEB7NwYv@~$d4 zmCC+KCr08$bhac|RPbNFsr@Q%$v306lC$qaUc&D{jBcdoK|Dd#G;uF@kZU@SBo7~@ ze!3w&wXvta+L~qV1&O>6N_}WDT0t#$v3l=MSU)x;f|^cK*-I9c(3;3j_|xQucccKe z_WY!sN44rQKe8tQvtV(hD$>)(icIhU&UJr3d-pg?aQ^t;?opIY6+F+y?d3IR9D;3I zO34sApIG!moV?|)o+ezuz6Cy)Dx@{i8EG_#^m+!h&ganzztmKcVwqKz`y}Pj@?k=5 z^5>5XtL{N@W05NSq6!~C!)T6WR@9>ayz_wsPS=48Dmj0~()xs5_(Au*0#&uyb8JwG zhrbMF>xU>w;gu6rnviobpPX7#7ZY8~vgZ3w!*XgapDxK$U05(75u}N&w;yFPg4rYW zJ-_sJzuYd&slN)U=6*{gjf5_ntE{>Qu=#l| zQvk#X_fNvr4f6X?JUI~cFa{DMI0>^fKP`79kD8+ES55hE-=pfJq#od2718_z95#nt zGvA|$>Hp+P2x5v!BI*0P1D+3AjI!hAUCP@O>#hhJ1@tt1$0 z(`(f?IjO3RFZy6M?HhPKkv~l0c?f7ql_??dUdTlhM)Fl;AJgGs@A0_1 ztyugj8L|GjEBCC|gWb!8B24YN^~!Ng8}a#bn3MH}TT$PQ&XM+zDdRxqfY;x#2M z(|M~lv#r(`>vadz*#D(M{c-lS_&_;GPM;AO-H3UquZ{O1w@}04td4g@0>hquHW$m| zWG994YFi}A{RFi}z;3$t_NRqYH#HA^cbTahip%dtZ*Bxd4eSk=L%9i%=^MZ%4~ifK zKTr`rQmvi)IR}F#gL@xA9Ft0W6rI9p4>W^Pt1rB$=RWV$Ife`dk+aNJzJ0U7oYeEt zrNp6?C&M;^U~+OY!Gqk;gZ!?)9#Mgj+D7W%06S(dr;&-}}<_ZMFVTy0muPyT>kk}5xc5}j=hHRjl+TyMPl^;k6e zaIMAjkQP!}hrI$Pn5;WV-Jc89t>Hahl>nG|FOxjt`=@wXFt2jX<_1eSY>UXakaFcy zsoBboBE@*^*OLN!;hI4LL!ECsKuPoF(57h+LL zOnbSqbfPtsj~!Ew@zv${;+^zog-eeS2Ke~mSzw9ijvG@=EeUb)XN8)j8I_gMIkn#d zxBsY*k4`yputQH(&8QWc-K*yId};ybA}BU`yj*zrBv-S>l@B+)(?Zuvkw~91J=GcW zGZ41{E&X2LhXbd1?BS&T819Hksd~?xo%{1!2v1bMOkM_#MmK2b+=Da z?o4q}kM3avchYmIVqi;AY|hQdDr%qpbgoOop0y!uGSaH=F0`PcB8?Y6dGxx8K)rlX z(a}LWg^`yX1#buYb*CN(Op}H@-;2Ci>14=_cr~_Uh+F)F*sv0y5ZR<)b(<%CC0^z4J! zFO(S~pJ!%m`7yDv-+sk?DZS^NGwqWJrM4e>c{%rqwsl@z%=%DK=tZ>nB|_tyszZqW z!kSB-S>_;l7iym%2LM~C-rk;2WLzaPL`fz-B7whtF)lc*X1anuU5w0Mwd5+Vn(!{0Qkw+Q1dQ-OU0Ura6!LPme<&GK-86SUkrZ|; zSq-qHSYK}Qxm&sT@lr2`Yc2lA?65)cKp9`?qp)Lyk7c$MB*d??gbg7Zd|v_-R~c%& ztHD2Z2}El-?6I$|j?yxW(d}+st$N&mw?clm^y4M+h2@=hZLN)MaoP9)!PT9}+E zQUS??lDNj@mfIfb0D2u0ngpQ)s~EuN;guzyzd}`Gx^i?0U$slQ=z*$P_N>*ER*@$* z49m4_&EP{`e0_XXJfBYe^o}&R7`b--rF)_QTs65>@Q5Tf+9MxHdu2D^IzADB<$As) zi3p{K5T{z5N?rJb3jy4bW9gn8spPQAJmruEMCWXS4fFF-HW~-@N-?E`aZ)-~j zb1>Jv7kjVVKpT^H&Hc2cv9kHThwo1yWg=|o1KwNynIg=qE}r_aE*j6eP{EnVW#ml) zj*0;ozXB~8PtVF8(lUIn6J8ciHAnJM1Z=06^T?9w*saJ(grX1z)3Tv}+5WzP0%WWr zR}<8|PfS2h)RmoNmA&T)R}o6I1}4LmM+14CJ@ zZ-k1NS<6B~f)(gRT762~sMU{g6c|d2LMkfEJ53Dp;3rZAhH%nQ)c?{;CHS(2^Kd32 z!)UjJtZ;&Z@bm6+K@~8=qgt#eh?P2wvvrN-j(HIJO0r%=1PfCI*01^!!lo^v)Fs%+ zIdiVHwEie`Ol2lwoCWvfHNOb&1*J6rSCMM|`TmE%>xB*sh4gcUyA5yi3C-8#SB?TP zl~)BD)&L5IVhG>W_+>^-VQKjEv~rs3skF-ufTTPp5 zVYwemVZe54Fzn-Z8isIwO7;mGH`~O=*P?e9RMT3=^r9Xo(gg80I&2{Qr7Ii9T5PP6 zk~r^RkiLR7dzY{Xbb(tL`%DGgPRQ4pvF`>RM`P0b=sSfFP&eEKxy`NzQBTd5JoyC% zkn0#_(Sj7ll(_glT%Tcj3!7#b;W5^ZOBVJb@si$p(}wSiU`a$pdpxz{Qs$u>Am2Qz z#|LBt!_6?&UKT7(W(k$4-2$b69GNJ8#;&sHwKio;C0Om(W zzw7a-79gVZO`J*c4t$60Z%Sh5o=Pu1A`c2&UcN1IyNRTwZjYOny}{0XCD zhHLI@Op~knlm42PB@OAyd7I!qH?lv`ov{bLgai(iOPW6Whc(SF3U*^NCfX%huMrq* z?ay)z2NS!wf;00%p(Y7K6ESLGGmqEbFL9j>Ig5+U*{=C2OKN;O z@hzvtEW}o=*$HpWtY~|u#>Ty?)23J#nD7xCN$4vlNcFF}328MX zAF(Vg+*cb6C~srbbywI=T2L-%Kn@=@<(1wd4?s)G!r90owsduoGYT+Xdrt?F_>kjC ztwsmWz|7ueLp*}FwN$?3)*iWt&LVwFnPM#CyPRFHP?%Cue+Bph_}P$*RS&YNG6c_Ss) z!z*x|DiU^1pzbv+Z-g}U5E$Q58PiG<_gGA3$VC6(ry)eRG7D_}xT`|o5T4x{mCa;- zpiyEZn9J(s#p@9>NTAk{Gpw`no5AVAk8cwvSL4sQ(`!Nj)VDu1G(vBBbS`_^N>j+r zv#6=33K|-cJUzdmg}kf5Z+0d&%yimm-E8B1mL7BmEH``SRfY|lez}D>5fxweJA_nf z`kSO_FI#d1N&l|;YaIrI{I+}IqG9^Oj03J$zbe)~2)wC=_UMpJ*D{w(NmVru&&9Na zDa)+EgmPHTKl4=T-&3N^v@TLu-^*%HgzSlX+9@?U`= z6$J(FHU|?qp+gbY>*qV;&rnb52=FAq#M&(BWfh^jQ9`7iy&K=e(pGm?4gfcqV1NH+j2}jX#H3%0 zw++LTQ8()yQI~PQYKnIOXJT5PA9=o79e4Oz2dv-7zu%b93|9<(l1ZK6k1)pE=XX!`8B>S1=SL7T?aIDl@)_>eRc396r)B zm8ZKI6FAW%p^$vA`;Moblg=0)1x8^jqP0F=vDfglGb?shWFHjIKPJV}bC7 zT)+0zt*9Wk$3MskJssrxBqoNwWR_f`Dx;~(n30i@^%5tl-w7y3O!OC2vUUrMjBcG= z)QiGB@Om6^L{;Jo59EaRGY?;}032ueY&8PDQs!Kfly4Z^xB)hM2*^5QQP%S*<8-u% z*g7a|@nvtVv1dM;mRknSK!2ADC36QQGa|YYd{+@^ua8~Sv3`cQIe%bgiO_NS%G5szIa1-f=)%OKQ|JqG^`5ooKsSxo z9{~;(G;h?>)cM`p;kA)yBC0e*@UxzgNv-4dtOI?mL^z9jj%UdV`)#}3gUc$cy1b`o^E1SUf5po7k!O-dUUJ&-W5(iJe{x(0%?Jch>Pp# z|8@>F^=fNZmmi#{L^_6eJSc)JPayHET83j;(&wL7{!YSA4f?258d`7k6TuIohTmLI z#0EaXEIMbiW#a4Xb_ggb?^#bc;adM2sKQ??h@$D`R&7Br@}Z$2cpPH2(H~oG5f$Rq z7tNr@_Ufs>J!z)kNrk7j;nz8v$r$ayt9N3VCK>;VMNLhUW%W;90p6g#@BjWdFeKs$ zMgMa};(xFE?@6dRK0RTYe=kX?{}sO%?XCLXzWdvMZ~WlM@ZXDO-L7NUb<>T~?M8^| z(s9;lOq`l}D~f=dc#7<+x!&j-f-rd+-VF;O%hsC%;0yWHjgYS|7t;m)yNmu^qxDMC z&-s?mQ8w`hktCJnaR;T3p_ZvUXS2Nb7E-PMD;%k$lWHEKPp#H%maBsWvf~Sh|o3!Yj2=O zlXa6_q(ea+aZuVp~Yr*e)DX?9B-r&t#1OEf5N7IG@(wF+}n zdq2IpE79h0tye~+=j7fvwe{A~>Tr3=_J&qX^DaT`4D5K2`~clESy68LZ01xOI!?hh z>BiBA?og(C$hG`pjyE-jOJAgv`O2Oza^vQ9`Z?IKR50iEY9`7hO^kU2XE1TCd)Bv6 zMaa#}BDps=a@3f7kN)Z5;3g^8Iyct{+3I1;w$?o)H(~^LN|zO>*~7bj!JabCHBI=f zt+jbEgVEN~b@zJ;@Qrc0u=bx_Dj~r~&bzxA!DF!Q+q3P$Sa6LYAn$gPy;;#< zIq0z=K-m&GM={p*YLZaM`G!X`=#+Lbd*DK#JZLOH$kS+3EX3ewa>90VbHYFV^4;r9N=LgJEkj ze1_MJzLXZ#-p{35(JbHl+E;=p*#ZH}(VuA*HTboq7B>BBt3IyH1eUVeoDTPf0vkf& zEm^&CvacRNR|&nkk27(^sYZk_V_MV~MgNV;5Hh`&B|xLB^JlJYOMhIf);EWBr{oKE zA$G#N9;Csk6#au~AH^XYJlOGk-Qq7HiO_=`l7|vkulMAF*nAMZ$xL)|)_cKFgsQKq zi`^3+aFI~W&WI{B@86g5)E%$y9{$-Jo>X7uidNn~;$s^@Z*fB5GbbqyxKbx*5}1Km z6kl98FXr#Ar{P)3)NLQh&u10tH#z$rNHFBLm{FE-|2Kv?ZoAD+O1dkRw8vhM_mtjO z*Cl0lO*Zwrcdz3y@e2Y4QLySRYZp}ot2l$|D_vUj(+STE5Ezie)DxZ0kpe=>`iFX( z#|Z;NDa^iX|CC>CkCHYwW95?;_Xag-7(Sq@Zw6JZiiC4jBM)=#D}KkV7VF%}DS4ZL zFzlX{^$LxNE$ZyDXPwABq_PmRFb)<8ZqHsA1W8=eF<;dk zPa|2&>vCc&!6vkOnp)6d+x_8ua0pV$p^*EWUs^gj%=(5^zFE5T3(#FOoks5$S| zfG~ffXomHJ*{^f%;PD|)mINW6`qwUzHM(@<@q9hkqhkBRki@xaK}I&cHm;ZI^->Q( z=$-ypI`JbVG%7Ww0uE`ykV*+CaB1@<>hz{ie~a?ZIe13Zk`6-E+&@-2xHn7jf&q!R zj^pB7;#7{Mb2i5pX@cCqY4%NpJUkatCw@OCN3P2ed>=3>^sgH5>vb%yt48j$UPd1s zI~Ejj;zxqEssrm6KAQ}wbwVBsqYfG$yZhT)M&S-tG*xM8Nv<|;!0lam%8DAqbx>k? zSV9wglkU+%(~Lx=-diX^b+WIpwC0Cnm9{?k+j72d_PMZRL;aB6B z{~(jbHTU>Mz+tLf=Q;_KOf%+`7Dyi!M<749*A!fh*3@S2&rwr|XIPWwpq^1~bh3>@ z?E-&k_{&A74ZgW15lGr2XG$bs3LaV|KS=8BBe`3Z!j`)vEb!NMjKcq!Fr+-X4Tq|& zyBb)M%HtMtHI!koqZm*DPaN4EvY7y~APne#24NwfSEaV?_+2&ZbjNStIzmo+jy+T?@a4_cK;bC1}-MN~@h?V*2dY^ie zb8HYHgXR><@4)k|-N{1PG$E%SyQToZpYrlZlkuFDm6Z$-@E?JZl-+rotX7ahLqi>% zoiEACumzYW;IIypm__~SZv*Xqn8*)5mz_;bOmt?eOk_bK8g2igyJ@);zQ~>NTu$>@ zF8Hpgx6Hi8b(@EW!|;Fec{~Uym1;JXgucMHwtE7QAW;bXb1Mf2s#t-!+1Ugh^Vz%! zx__kL1;ND{g+if6dp`1*Kx^x^@$qQ*8S!w)tq0$B(N%+tky@A2p#KFHN{45Md1)=Y z)DqD7uN3Ei)y^Q~O&zh>ktaY3aoyycD*pDLLa0F~@FxGpPfy(z+5CUSbN_cW{C@}< z|Np;9N_PX|f5vHZaB!dwc8n}kDjkDDd7wl1^(*j$)8*ymWm5%+;2d1JMc9828=3sm z#YK>rnOQcG!w;?=>pAnJbb65c1&JNjmZ5!0QrzC8EIhPym&}_iPgCoCU$(uSNEFdp1*8Sxj_jC$1Mv) zygnPBU3!@uz&WzIqwu#}S<*_Lf6%gPlF1Xv$)~iSyE=&raM}(xa6P#4FjSoRtp9WJ zyL*k_X(jWeHg@_ZVf6h?QGqH?tXt=l`=b%%tsY6KyRr;0*u*ob`_Hce%-YCi`n0@} zuTL>Mb||$7d+dg#FuDP!L>r>Ly_+ zm1W+C&y^&>({+c|7`x8R+Li+Cl9dnF`e?kG*Esb7%+zj^Yx}&o--mz5b~hYcAIZ~ACzU#N zn*U)cF>0f~G_u&G$!p|)o*VZq&bip=hU;AVacblWwmfd)sDEl1e; z6!+-})xdt+EV4-2x(9d2#B+Ba6aaG2>E&yn7rZbLdkv9F0Rf{3xS_U3Dmu$o!Ms3O zL~<7&U1Q4{FwoEV{{5f*W0A$_GI9@}YDY1a8Hr*&sOn!cuCIRb5F`wm_hoTL10wAc zi*0V2ly{d8tmW+IIP)o`ORx2KjTm_R7uzh49tp0ToU~1kmS-x$9WOd&_kQ(o17;Nt zDFGFm(XC;rWI?!>-6ALBT|RIIX5ZC>PDBUYY`Q!-l-)uDj#fPi-hzM`@H||3Y_9>( z7@qP;oT{VzL3p!g1^^l0xKQxQR=+STp`o8|2vaxZ*$`6~ErxJUHB73=1ArpQ(Yk23 z*mPV%{=me~Z1#X9ZMU&6Kpp!0lW%dhl3kVb!nsR4Jh4V|1Cm|2Q5uWB<)ziF4b^98 zll%aty&Z|JXs1rnsG47j35j2HW$W&*;VhEbaA`N?9~>KON=4GOr3VOiBEOKZagbQcwtzHZJzA5_pS;CN@(3WEJGI5u2sl|_5g05-Scu=dS zK#p#@G^Zrt0ATtSmn+@oU7qZY>Lw03laVoqcxqdHVVIgTL*+}NKv$J?kD>{B5Y z@&#-kjlG+$amH>mCHH=3%gNnUFZ447@~~yo8?v*9G7;5e;nyLIthnLM@rz8ylIH{} zR!~XkWb9Jft#(_|;FZdsf8U%-F_(~7l~i)b`>kHoXL3^H8tcr)s~P5$aP>-0Wbc=G zW+(g7p2}kDa)@6Ry@*8l+Ty#*vlqw5VW~xXg+9*e9Zl~u`C>sIv18ZcUj>Cb7@H}g z!-_@4!K)o;uRc{ip_vjtcnUT!Bm;Vh)2!hd;@u#bBOteKbj1u_X-oRkc>`Jt(D^6} zOp^MjL9@gnB3TF&^DQ5nR|nkpgN_kuy?*0_ekPymzbt<g+LktvEO3AQEF_2%^X->?!U9=48$yCiZ!b%3xZKx(TpVxEoO$AxMh9da=tu`R zH{z5BlUSoYWJITSrBb?6k6pi9r3dzCotA-rz?CTM;us-|xC1?jF$aGuUFU|WssGlzLw z67Kt2)m$eFQ-QGj=69C%PKs{*dj?c9^K%Prahb%6QAkHa&#OL}S`>gk8_&Lo ztcnVW3&m2cibNHTvjV(y;qMn?i)A$?N56jEB5ab{7x%48X)PfLm#zfsbfT(g77Vhs zSsy2r^Fc^QP$ORy8$V^XEQFpCQF_J$C(#qGy1EYsiZl2(T^7lBA#seBxc1`ikvFvp z*_(uf@M(kmf``wvxcWHVVX0dj6D{Q7lGJyZA_{f<@qJT zzN$EVH0c_EWMPBi^LOxpA4(FcMp{X1l(%qP853<#meroBhsB#BISrGW29EG3Rlv@v z?(c)il8*25&zBOopprP>V?78?R^kvQyE?Fmi-OPMW53yV>a548;kCVimJazG*svq$ zA*w*%_GqG$Nn_W_^V(y+b{8X!lg*17Old}vXN?+RO8&Z~eqY`*__#e`w`9`a_~IjyV;yHl;hmiWl(JFhCT)EQ+3hV#(b z{u(JbD5N&WG4>{A8khZhlw~n3V^|r0;`tNC=Xmya0+OsK67-e_CiVJ{2sR#^^Uos9 zYs}y|GXQ=+eu9q-O-1@h@@+wSbL+DUR8vpYq-3wiqcyfLKfLvg>uIt_?R0{D#Oc5- zVWh>y1@EwoLFnFhnH%@L_>E*`{D%B+4(R2R^~FuYbz9||!} zx@wn*=Zp)AGjcM$Gc$!?TrGf6RmCuF`!`I3EiS|^&j>eg>A1C7^3&rYD96#=68Xnh zGBU#5FVN`Up?!Jh)quqDi#Wo|EAiturtokEmUqvV+6eOKX)Z|$zqKvQEgyv6n{$vi z-8wm5)#cZupv>jpQ9xeEewW{jNdBg#lPs{W@WblL(v0|#t-aR(_p6Gg7{K-F%1Y~q zC_HaN+~Qrvw16|4$RcqF-E>8Dudi`TaZn)EQ2A7_Q&GXuR1U;OXYy1~>YVCc6e%2s zb8A;2vJyss|29||tyQ`v%S~1U@9HQrYo43*U|S>izWJGZ9P-jRS*RpJyzyPSf009~ z)I<1dNlW>mAvqd&&bIr5yT%_kLa)K&Wp-?+*^?q1A*r4QwtnTa5)%UhJUqExnf)S? zW%E+#g3Nz%oL%>2>lTS_#%#}&SRc!pgToZ7CHIs+!lWt|O`>&1luN^>;6+7CDdIo2 z33Qc;4exW9_urOuOf;^SRae_%&)Hh0+HSbp zo2zydB#3hipppq}E1whkxnnDt^CjW`3Zzu1z(y{8C=M zYGWV?Y-5V3C*92L8bT{@Cm{Qt7$1KaWWF|;dQ^EoG0j3@(~)u$cyxbGwVryvrCh7; zdY%5;SIfQK>*Ym{mGKj%W#oiQ1#-TT-KNmvAgU7mwn!;tUrWW>;t>U(LJ2kw*mudu z>z)M=4pCkr$0p8@2g&zb3RZlc=jmTHqkG?rr7;B5!ZH6b@qO-Dn2!UgDe9{g?qBUZ zWtM95tv;yOC`>!S^-5@Zl=kn&C7leZlP?nxksn6UX_><5X{Y^8&wt`Hehmu=R#TcD zgU(7`t$5K74nbL)48w$=r)Uh^je*tOroX>nFfMxd(riGjM%2X)8<;Y~v8q^7^oFM1 zPLlRU9F})XO^wiY$g-v*8h4vz!ty3~0zM24nFk{CE}#W#1?fCe4stuiO!@0j)zomL zF&e<#V8@iL?~lgF1ySKP1yX@NLD%2aXLmg%=C$d5OCjs6%DkWa#o_ToFXKQ#LDxTM z?oWeL+gG~bNAe9LHNNQ)@y(NHGpr^(JF?}Ml6PN_VOI%l;D8HjVA0V0hfje(H>O$m zh|8j74Za&SS7Fsi6l0d`DJv@R_p(hV=m*ROo|Q?U$xX~|Aze~V@-%?aFp$4^p2GKp zSUrCAdgmBB4CxYimP9Hc0!ql2zhg{&6Jn2+1K%- zH1gLUAAtp8YNmiX5&Zq*!}0)2G|iY1gqSJlr@+#S*k2gDC4Z(x;gu|zXvdU%1ZUVd z9j%mu6JLLfii0hc7^)`i4hYC!zU11zHRoaZ$j-#OuM=MH4>nJP@>in#>c%oqQim6{ z#Z>a*JAhUhu$3~ZkqMV~+1#vmGUxI=9tj`%#VMU=y*ukaz(~Ge%9r08ljRDw&X`c+ zYo*D2nNU|pw7mfZ%`BkU8b&@EYhP_yt-v7eL1;$HgD|1nQzsGqcdSOf700gFb6S@A zmSPMCo@ca1zg!nU)tKau-^^F^zhT39iJ9+Le?JYc#x%TgbEAqWKaVFa#$`EGRxRh& zwqqP072hc}b-XkdBu=F-TeeV0a~c7W&=ik%{|_0$$6u*CS*7XGu`A4Mm)?BTYFF@^ zxkUhy@zS`q=Ay3@wzjixHAZ>Qw*Yvj;BNaSI9G5~*)Gtxy)e$k2ofFfYcQ4F;q=Rd zS*z^Y$(Ndaz=kqr74lya1r_nQF0s*Sl|Gz7#AnAxz^M){hSIs8H@c^vfvl-W3R*y zA;+esRHcmohJqp!s8Q`NSHA(x_eN>Y^bWWi;Hw&&MXA!*D?y}mgw3s16JY!DJs_y0GSGyk&c|Urtm>}q! zKzTjHUe28rFyAk!%4r(X`|P&}h<7yhJQI)BcT_}SGm3e%% z8ie_+ik{j=qY7Gil}Bf$0;j-)jV`G8ZqYps5Cl?=Q*cIl7eVg5gxPWMfWK+&9V*6S zcde#q5IWnn!WyOLI58g-XXNA0*aIpG&K`NSW{&#<0xG28vs`>B;kjC#2qSD?gxS)n z=qtn64!cPi@&Px{XAD+{Nw@4&Ft6zPXeKAkp|@B|{%X*l1NCRy+w0e(D9uKqOK5v$ z#jA~T4?)2N z-IO9Pofr8Lmj{1GBnv7dKjFqd{X7)s@c8&CF|r0dhq(09QkI1kkVP+uX?RO7ToMf2 zqb8|9Xu&Xb#ul-%L z76NCrF)j9{D;G&;S=<6c2soEJPUCq9j|2w|=bq7)%_Lz=9jHKl(?LHt?vTQ(AY7%U zQ`oli>O6fzp*%@%`y6}69%ZPgJGKoxS~LoE7WBYDOJI0$yEco?cmbWSzkh|D91HLq zT;g>ojUYYOFdTg{@*SS$QK`@scG*P`!vi?v5Qq#~dU}>!TP#^>_6?vW*uSTyMlQHb z$TsQHph|v}JXA>#dE^u#WdEaNZB)9mZYXZ^dI8jBVRbn2R?`B3zW#W+!G$lP-1qLY z#g_cC>tv4^zdQOoI4Bi)MAAeKbwnyw*mh_A>*SJ`3^}ZopiYA6n%tk0`G*Fg)k@Gg z9eJ;EE2dXmtKrd#>Oh8(eAIr&QqQrAIzqnN%dIh5dylz)*!2#KzvCzJE-FHa?#yXOn|p=4mk^q-lKWP!?R64YSqIx)&u$ke~0q>?Jp*E_e*&g&f4&F$li%%O3ySTBTEQMVUWx+#(Vmj zn<*DJ=*bZ13b(0)&y1XduI6o`tmNJbi1u(L=!XmKpgJIdaRwf9s53Pmq6BZQN-TD zs_sc=~^1UZ9Gs(%ORQJDpg{ut)+f6sgUn_FI~b!%EHt0 z?C^HTdS@z5m(!#k1B^8s;2zbnr`-HVe(ab3$j|wJi0v0OheJE|8pw-;M|?FzhlYSJ zTpw$A{R(m4ydR&g=S|M?#1|hx{6;%ttIoRGQ3Cv43a_uQdk`n&=O%U*rYi4*R3vB3 zVX2#}OvB>X99U39AlW>*^vU`|UcE%#=r_3>P z%m3D_NJ^Ijx0?90O1~}9YSYfAqz2yZGc6VX;Hg?JNx`Is6*5W%XGftOF`-OY4l0hi zYmf|tzGN$CesvnUg{a}JIKU`#klP$V%W)RvEJQZ8#qW~Jz#X07J}kI@>3HrzabMHY zB7)c&>Y4C^BVhW&(J_2yEqhiqHH*17t?`L9DdwK`s+f3Db&30(L&9me+pxNal8lxs zuj;Vnx*r^CC@nSaFbmJUV>D^~v#`#O5aD$9lJ{9fA&a%m;Q)#%kWSszt8i_2H5{Jk zH1C?{(fih+_~XtYUtFk!Sc5+$c=cNidJ+@t1fe@WLUL zt7|2aBpS$#-=Y%sF_e(gZ~;XXoMMfI+XtH-Pr<^+HE?#jBp}19B%k$iFNNFB;=N>} zAUko9PUfFEs{hvMQQbY?5F zjZ>l9ev}@a0+aX!2J%^@eO$J|jiazgKklcKPxESZN97~g_v-JfG(u2o!x>J!&)u-A zdDcGXqdcYHIB6HO?=a_uEv@#>f=j^wSREIY2bY%wXMl5*lla}w$&Va? z$CPZ`BY)JCT{y?9zT!uI(+1o5B`L^0CH*FV(-<~-GoRt<_sbhqU~rHnm5?L=_Q6A% zj8shxAi}N@f7X}#)vC%Z(wWporLt;EKo2ETagE5a7YOZ+91?~yaTU=z-Bio&5#dKJ zvV3bP?c?~3#h}iB`vXeRQXgj$P4yC_TY5q;;*;((XOjSnWmHDDCqWQ&6m0gCHBD+ct#p{h1ZBN6j5APX~ zRVrr?KZ223FaM%$KFsm$KyeQcR5MLnX^^D?8>wZaQb|=z5S$xRcw~GOJWAo!+u7pW zC$kw6uB)${rdWPAjw3n}@J)TcOI>}pJ13ZaPadEt+B;UI zo9QvCw@?Me86HJEpjarem5ChvUQ(Tw;#REQS+morZGK1oeiK1`{ib%-Gl-TsQE==% zr306ZoVflAID>=uS|5525Si+Rvk8SIqs@E9DGF0dy=HAm`At5S#8hiWk(i}U7`t#n zg51nFvv+!;m<2x=A>12RkCj`=_Zvignx2-0hZw z`bkg-4L9&Q`AuM;6z)%|O0I)75v?TmT2y?WyJ!*K?&#|^s%RtAwGH#5lZv$yFA!aq z4u*qNXk>o{R~Q%x{y%Im7{+FsFR$ z)#F%H5PioR9{p&jl<1=C2E+B(|I<9{q+`p@>NrGed5_0Sc}A&{YTL3et$x$9u4S?Y zV~sn$&zR)-Di)|=LAw=C%&#^1L0#47o@k4olJ-{3ol5x?XS85p(oNZl5U!~0^vZP* zt%pIH!9itTEjv-2V|MIO7De~XA*4dI4HP3`;Cf}ua72{$I_Fq?DkD1QRM-0v4=QKN zpxdXPvII7pF}H(qQHw};5RN~QY~Mz#Mk|Kfs^!s#3JR(NOcClCT+>8vNPS<9GFe$yVT2R6u{Q=y2pp|&xFTZXm&!7j9Q(dI8T-mqz5DR z4u&pD{NQyN7V~RiZd0Rz$f6yPgL~vboYmMPXZ$1XHci9ZqCTNZEr&|ek_)8Gn^PZ& zVdX2VuJNIYmG*YjmQH~1u&B|4ou-^hZ#&{=E_?Q84TL)P&TXrZ(Ef>qQ4aXJ%1ZbO z(>K%{zX}Qq(b4Ko2%*pykA8pTK*yD^mtlO`1EqjFAY8M|nsC?6OUd>9j5t{x$iD(-TLre#=Q3>gck^ie*E{)(rVGH+=SnMJV-w zE)IT3S6dkLs`W#Q;8Tr8ubg&X8)>T~Ai@xH8lwnQN~ir#DJMy!;%AkI0w4z4vXDo2 zx?+eW&)>8z1}RH5;xacdaF3TS&w{;t<60WF=H<*#G62;qJChnpioQuV(Zabfj;Qz8{=A69E zknDzMUJl(1P%`PNOA59AhnkngUHwd=w-87s^Eani-XrsFA1=DgN?XV5y{+Chg`@n= ztO&%~H2L%5sfQq9dm65{j* zP8Fyz(LgtsM1T=d|J<*Z@}K|nP*km~9=BJ+DP=foFiKel7ix8`tH=LE*~L8fdE$tm zzcAg4vhWnL;XwYs^k}4--(NDArF9{8!td-LJb<9=0t-rcd_w-M?B9}ACeU@pQDmQBZO4x!%x&L;Qodxi%MSBU35ai=dj0msF}j&%?e?8^o$vxtX1d)AV( z`T*eFs}@|<@bbOSEt&ljh+a#pezDOd8Cn)q$rmoGhUN}h-H>Y6vORRoLelisBIWN? zprIp6N0)%JdshneaY#vIo&O%$MNJr|ut#&)1#f6zh}u&zf}~dquxAKf6+k=uI3GBS zzqKaa(e)mDtHV4(RMvD7`_(0JaE+nyIUrcbq9sQgy8)_xmLvd9l`owvn*KqlCE)U7 zk9?j4XTLX7h!z;wVm#l~!3wtOPy+%;51Z;1yCF@*q7e$Qb4re@JK2L}{^NR6tUe^7 z_dG(pfX1HMMoM=?m(n!;R++>N-z*XNE2?{{5c@)lY} ztk}LPelBLriTCH%Lajqy>6L zpCF>vavcOWF)<4brOl73=Zz?5SyVltO}>0d)1z`?=6w<;Y-BT05UduoT#u|K zx%#q>h`XNHrUYXqyOzt>Y&ityjo=V`9SoG7riI?^aU13KiuHq(t8l@0&atHjcM;Il zR?ije{`~6fzUE}77b{C&*ZIK+Tz13W&eBzWU;vyFaj5%-N4JZTq4B_(nt+fJ@m%k3)x~4_+gYc*1>9{a&>MrHHKChN{Ee8@%r~L7 zCO_vlj&FCN&xf@dh9YB(NMLm?gV4*sI8ouy2T|P^0d@6 zg)cnMnEPC6yIiQI?&u<-rO@o?Df|GFX0+@J78<6H49Iiisw;^$KEv0G8=Q{aF7Jm| zvAnRP!U9dj_}=b+>gH`})`2%RXMP?&^r3%E`6~XK;}$_E)j6j~bUW#v(0f>oujpZy zDW-LJY2rRseWA^Ul$_i~vSsrM)gAJJAPp|aviZh;Vxo7;8MnW`;X48T4Nm2z{^`}@ z0U(9OL-|-kdo<2@SiX$ef2NNcAitTpZ^=%SfFUh9=QnPi*2qSAc&N*GCf#p?FmE>r zT5g(z*rr2ef9-M|F3P0jmj=XZous}FKaQ-7h}RPQxaphxa3yc^aQhivT;JOU%V5`?h>~OdxG4fq(HmONa^b&DC%28CVq0DhHDQNM9G1!~R zR7e>lt(2Ul)K7@3t+0d7RnW#>Bb3zmCf0{7hzy>l7#cVv<^%OUuIqd zB==nvquuOnujcoIDlOdv4%OsRTwz%L%Y9x6z{AW7Gftmm&CO~fn}oW_|3lt;Mm61i zZG$Q*DouI^L5k9QFDkt&NUzd6gcd?5A|f3Gq&Jl&(rf5JDWQc3NDYJ%2q3-Jzy$C6 znfL#^?>n>BtTi8ItvPG)>DR(O=j?J_`|RD@2g&LUabretsq=aCMdDUhX2k7t$DeL; zCWA?gEo71g?2nw836l*CxjooM9H^z*;YV>5az{+x?egBdGmYbPl0$#qF3H>NUq2UU zYyqv;10C1Jsu41YR;H>xf#yxRdU{PES8@q5d%a!`N=u1Lz98zOu0YR1IB z_?_<0sRWI#s4wK^E-1_`O^@3dkx6-VKlk=~)ur$2eu{^JQ!4ukZIiMp6_+xGb-XpQr^;553SzZr6$ zBGn3<;O~q;j9Zv9>WmE@WZdy9$&w{k?iJ1{1+(qwk4+MagCS-9u(Jzo>Y-|))|X6{ zrwVMws6b@Qr=^pAn_$u`0HMP~P9zfc$x(7k$8&BwujH=qGE95W@*7_jQ|*J;GRC## z3i=NCEb2U6Q~3;h9(3BKwXG-@e&?Ap3+~33`boV`_<$w@gXPK+YsB6ZEY}557)&hWoQ}200{t-r&K=!!-uo zo1GZ1_?+|{BMmv+WJ_F6Hd{~T`{}^4^gA(-AfBJqT#8?VJgXrIwHpcYwGr?SuRA(0 zTBmPG*S8K)QA!GYrx^kmCXH5Jo?(EOByLV0U+gA?EUi~UF*xO6ytNT2^KdS3pU5%< zD;jcvW;X2Vs@cLNjDem#U^4H_b8y%JD&$MJU)lfQr!#VnM?&8O27Hi541Ml6e(?eS z=@9{umw<=SK-?CxQA1szvH8@8Co4${HMd(Fp+Zxf2aJEcuf1a!XQO#eRcLE}T9{ZH zm$X4&2PCNh1Nl1Jw3UUlx|%KSPvQ%5++}r@mXYXHEIM9v(l#(yB521=B(3dx&09&G z&)hHRdSEke{Alu2PZKD&<$F$MmbpWof$~%2jdYjIHQYONzr6O^7tZh`7RsK)GJAg@ z=Y<7uBbFw-*Wi!MbPybKwmr?uYU2)te4ovNy~JwYz=^hJjkC^H8J~8TLyx(Q|jLk87XEvKmZ1j+~sc?&exBQlth# z6L9mmX_{!A-GaJ08gO)zR?lgH(Qt;3kw!y4pXvOv?&e&OQ-9|sr#$$AZB#Bv#voj^ zj)d>%2#`8!wbQ~VB03*(i*1G}ZB?R)0k``=2g53-XX};MyHHP0Zy<*~ksabZ#?^j> z-QHi#PpF8Lo)E#ETHCuZC4LnNrKek#54;3(i7zGYhvA>!9rACwln^`~e|3&w=Jj@G z9hfqBaTLeb9HC(}7nCK47M59)#?MP{B3a|$N@#m_qGYjvdgd_SNA}pw&HP|f8@9~A zGWt4wNn}7*gRgRwT*G_9w#>h!rTJ^H+zhIk?KIi~Me*~f;}bsU-KXwUEVN^ZX=!WI z)NDH-p;mm_Xy29{I!O)!SzjEcYrJ_bL7=WHE)*9*lfEJ2WSP9NVYWQZGIoFcAvewAd@w`@Cy4ipF z{A>m(7XmsLAIQ$?wckJD&pla)&be{Bqw2o*(Y+xQUvoB^Mk@=$7fY03T%a>kI6>)4 z!lEmlA)qa>){Gk1Oq{n9D>ZIYTq zb_2xLAlN&!z~rX5e5CvvBG zYSRc(o|)5BLagCT=$>$ct;RM($JAQMbNM3Kf!_3pD$FRfM$8eqkipKm4VAp6h-;Pb6?Wh)`dezPBAj;k)>~5 zak)Hwsc+EUu38;K5VeE}mK&9oqn~pbjf9wg^k9=O@d|g!54RW7lxSKQ%+8YO=jE~5 zIC4{F64#Re6X9yj`6$zP!N(E2nVIeaOtr0Q2etmVmFjOz>A^##m*nQHog~QAG_n-q z=J{9V-f&kFqz(+9uN8hOt8D;%zP_>4{o+qZHCtxHdsyb}(HP2FCAyZc%%zJIwIp|! zMTg~DR?((}Q4QhU+Lnq;&L+4V;k~!Z7mpZmJ9^)6Hg9)=`Rc(0M3qAdZ>e7AZ5RpfdQcW_y=O%3}6tmgA}tv`%Mm2ehQo!Ubib zdk3M|_J$PKz#1}cl^?YmxY;XdPmPbFeH1=Ogz%gXhqt!~*o@h1G*Va>{JNJHPnjf- zJeZ*GgY~Jtk@IeQ(-s#bo#iOw{XU*n)%aYZD2IRVcgp@uyYRg?mZ@oh@-gN|irwU; z5;oP}$SOOZ^>s^J^=UPtz83}re)xooSuErpW?BqNA?$$57JRKiA09Ibqk^j-Nwbo> zE9JnxxrTJdK(dYe`^65Cq_y3&EsxHsx%dDFKRQ}d*~cBytO8^Bh8wCT*J64*H^58@ zu-ci7hor`QK|w(j6kVszjY@t;qc<-%LujqEoF81R zsbz$8S4xUZ-yA36uNO{@CeASI;`AL0dQ|vA|JdOG%kpQjlzr?t0&saeq(hUJyI?7^ z+Zh42j&m}bXrU1@S+R)Uc{bD3G5klo@z=UNoz=9~b|J|sBEDh9Ap`e0)&Wg4G_qIy zs~s+);D;Rz6 zu(Q?-5|%vuoq0tnDX+RRcbRtc^82~4oKM`|pCV?Qu{>Z`8$E>G560Prz*V|Czl8ri zNR?F3hl5Zlzj`S!O(hhd8xN0hm#;Nl3r>uce2cTTTWhq}PnjLfvLCDVA6I)^?&7uR z{ZqwmsYN*%hc|FXZbmU%!~4=rIRbDF^XLLycV=>^C}&u?B(2)!G45@Q?N>Mn-QdOh z=QNKoVE`sGQs%e8PvHqx02XiyRz7#_eBBJ0%S?X$Bi{vM5xAqO{@_kR#m!a^>_tG2 zGzi0RiWd|@lV^G+xsIq6uJW*GW-tB+5}Omn2|*O+CXnEIA~uP+_`NIZ6#Y4O1*uG) zh9z8Wkd{eic$0hob2FKI+plMeOQvP>!=e;2%^&)SK#i9Yq25a*gh8^Q-nN80aw=|q zBb%_0quv=I9X*Um4YL|7GxeJP0=Vkd66Q_W)ydi8GPO=T0!6%#9M&5G^CsN#s}Mr%0f z!x(%xH1N5d`O9{)SY%DlBQqwZXKnnYcT%^XH^eDjT|#CdpD(z-$Rmsgj~dcpscelN z!zUh>Nq_!0f2Ri<8fAy^zTkN`0Qow=%}Ro&h06r*eITp}#v04fv_du4sC9!EZ!d=r zdMSVhwFco0~WVd9&>AOz$ydnq# zuCdbO1CETs=`5F}wHl#@<%;-p z-6ibdh*1!e#ldWxCp2Lk!nZR_jUFs0`*GsKB5WwfitRpap`=QJRJxnbUlbwrmRmhuM%X`I2@vi?WPffI_{Q^4xBb5%AYss{?Ww*X zguErkgIVn&x5{cnwiKlP{H)Ty+(qw127l?t@s%6cc=nK3+mcXR=A3oe{wM5_L6Ay$ ztp#1_TxXSV1d1C%>wpKg(ZWy51g9sV9t6f+uV7npCiK|F!&urKX|>pv z5GBXjS7>t7;sFq9;=ms9A^gn{mY>&CPg&-_6(pOlF*>FhD zyp0MyEqDgAN4Lfmk0RIlWjpx&RsxPiC;Oq2!o522udBP~x%F*CsSOOhHo^}9T{4=o z$tM5_ubIwIK=+WX&wj6eUUm3h&b^=3FKggpO_KO$9VT@*DELXNbvV^{JDO6>2R+dU zG2}-ue=C$BXm7SaL}56*CJb@!E-Jmeyxm!5Q z|4mS!?{DCjG)QI0d!*Sr@j!QXAW5PVSB$?P{l@5Vj?9%8FTc!POW&LoIFRp`{!2=Z zyVZZBbEW7P9y_q`L;c5ukoT?+Qb^g){oU&Y^ZZHZzpu0xN|A#4&mIILpEu^dC`=$ z_MNlUwk+*8Q)d!LJ5Sk`HL0AxOT?xw=A+*MTLPO;_C3Q7w(BN}T^cxxhf~BX{}br( z+^Q<)7%E^59@aGAddBtPCv_EV#Oi8e^2z1J?Am9WuHIU^EWv_XC6Y3F4atMu{YdQn zi@b-)&H{SD8;ZZxQa)Y~fsS#&=;e{Df?wd=hu<&y6LLO(XBz;TC#sKAk)LXMhOnY? zo;{C>s#lnB0-jz9%xF!#3bZoT@b~RcA-h* zoq+4TByBDM6We(KdhgFZ1tp8qsp{U?cFCRY+&a9w-HOJ9(G^IF z)Gli_E!w+tP;NvI`;L&Xp#X+NKAJmXWtVKH$+GOSXXu=wR5_1l`_UXFNz7B_Uh{tk z*mTYDVb>-50Ib$C)KXhrr`Y$?-y>BCo4s*|QrannYA-mQF*;%YiDab3+GygtGJ-=c zKj7nM^d95}BKrCtT^H?vJNw!23iYIu=%4P*7)2^p-8s|~YIkkgr)1&Iw`wr)3 zK5AUjMF!H+x@Im&L)O}65x*t{fOl2ub~_3FD;I!1R{$P2xKJ!EAqKbk)gh}z8y^kK-k~K=>HJ!T9FlU8$n|JN8Pu(TF3&mxbDIC!O zr|gmb&jK$NQ(Uhy$sGdUvCqvZqIDFoVbggmCzUrB89B+EN?BQ}9dX$K zitS?@_FD?gQT;aj5B(_7LeZQarbkz|lEEKaARd6Wb=e`5qYXSc<-%HLW2B(?JvdcM zssv!EPds|bjnCZ33~O`}&Qe#O%s8iXtB2!ie#1JF*_EfKn^%!J@dJ`Cib@3f21Zt` zyL}ql9!ItD88Be9bOyVc?8e_sKXWDEM(Q3`o}iN*g9AD*MHST>ljoPF0X25U(SFpk zVSJXZ)$9AuyPkv}?1TirrB?5Y!`q$E;tRjCmc6;@5a7!X+=p)n+v+;{=b?VQA;h9- z%ER05S9RIs&Pb3-ZV3bGVjQX5vLBMFy-f{|#(5pJnPYDdjh(`__K9+UGz-HGH}aH} zERC~XbFZ5Ix4)?O-5; z4Ptw=>vVTJ{$p-3{ZV=JDc)P~P<9*A7e23(oMEIR{OS_~katd%_d?UFd#64e?y{gfnzwQ^GcTjJ_T3H;ZXcE0 zi4QEVtS-t|Ow>7>(6U?0Ux`CNEvoboK7dJ+?aGB}2DPeDHeE_jiJC?sPQY>j%=Cd@q zf3y)a)Pg!PQg7Jp;l{RVE*ME1|uv0BaIQkGVMNSju@Hy(ek0Blk!#tq-X-gorQ z5ESqp=X9zedQOt@HjqgtIf5+bs4L-~KUw~0Rbk<$E&|gHRSPlkCs1Zl4@AwJUvANv zi4=$ZTM8j@na)sZF@$U$hXBa6%V;QCdhbCbb)*7?3v$H2po)~Sp_Cor6 z#61|-9?b>!0!gbz4*vT5GC%O3%AS@hhLyfHa(fTh334XPG`ZV{Y@OJqs12N@EqLY* z_oCRAsp8^FKDppj>(@xX&2QJU&6@bXiQz2?UHMg(9?0-iR+qHZA?_g8A z4y6AbY9lxt^53DF^uIjP+mCMVESKK0Q?E?x`QuCnW;WaV`{dqcAugIHHGXsL@ebgJ z9Ygci{(hks81-L)8!qW3=~K-NEw1!>hPdXr8or_OTW;d-Inve4)5_xqhBM7Rxf+m& z^z_hcXy`AU{RcaZl{1-Z?ohFe6;7_XiyjRhG&_wvpw@Y5aqo6WNO@xMK>uXwI&rcE z)eYe=bCLFmp5n*CACsciPV;tuVqmRnN;7lLtpn=+J!o?9{v-5W?{6MXYW81Ec&E=A z$s(QYGcPhFS;tG@IjSG>PD5Dd)#<*Wkp~VAwa~$4IW&5Ngu5C4Z({+gt@Hm)0HL0K z&`M&uzWrzU6tDi1!w6eewj@yN30KpWU{;{Bk%nLei# ze^*c-_q8KXKif4Jq$>Uj*Lz|-V%A#Xi;vBArT7=@KPv;0^?#b}wcxA4LH1MgFh4oOljZGwC;PXCRJ44d_*_7x#f{th{7LJMRa9wG5jj zzN5=`hhhfaxzv)cEE-iw{}#(iOj-P&;YU8gLrX^sHEO=M zi}2%56Z9y`Ojce z%lse34%L$WbGKh3eEBYH{$`_2BLx3EsgQ85!}%QJ(pzrlS8g zE7#`dpYgxZ_y1n`e_|s3zx2q@CqqSaM`=dpiA-+NtB}0;Gw;y}0}VZ$-?3I=(vb~n>8}A|5{=DYGu1qE13c5=5@g(y zBQ(Av^NmuL6KdTuGC)iE`d8fkC0ati3_9bjh3#uIq*j)MFm`L~TJHH_V;eH>}|X^PQo(;MH7Ca~G0HcbZ&xCKk|C~&6 zlg>@LQ5E*k5;aJA33fa;N?Q5p&Kdt;?i8#BtR$O+_hNHFj8s>v}aebeN%`<9J*`&-aK=mYpwe_s}x%UVxb#Dr}^SWTL{u1{lX zayhY=!Oi6S19NFDxDNNpk{S8YSN-<#uy|4K-4mJtl(!EuCRLi6Th(jjXAp0_h>rf= z`j*gxR5r^Pt2=qzLGXHGIiYvRRN=>6m zinha=%>cX)zH^5-iwb(uC@s+dy)!x|^2*d?DaQ!UDCK!*ITh>;9$XZD!0WWN zj=-v@h7S+Q?1j6}=N9Is;1m%v=bK*(e`+el#CSq}wtzDwR!ynilz+>2d*nZrmX(`I z$5m!Oh_Uv2KV|=W>TQr;NohSr3!00i<-X7#*RMrC4duKArHQ2){~Q+%H-x1#x|x;l zy4(032+%qNzdMu|OlK5dbCFs#McEgAt>Ar>5R-w*F1aa1ALvB2eJ{^`XA|>WLzNYk zghF?;?$hKv+t;X0Eg0nI-`%Rbvoa>d{NYEE>4VftKmbP9)AY!2`)FHm?Wc zqv=cnW`>WKGdCj`gHNk;O-6sd1ydA<$OC3#n{Idd*1Na!;M3oG>K?l*TnD`ZUnbn! zjdv+~V9`9gxa4deZaKFd+4SDgYo3c3TmrdDhZ}LfV5WTtY9*etcmYfB|1%VupC3^) z)oP?sEq-|CAoP9DMf+V>44u?PQbwzBgygD65RurRuQ+xDFpA^PvNOqbWL0RlSz}O^ zXLPP_dY09)eY+_pBv<<9o7d7SD|Nvyp|N8Ita1ENv9E%gVnpT0S}c`hE$=}Xg6rbK zF3~={APv){V8K5HZyJcGwm*L@3hyYQL-;fG`<92gC`(gzm;MaSh0G2uM9Ub!3q?c9 zq5=aopUD7jb!h3B&R!Tfkq8g*78&ivdtDIoL{}o<^;m1a*Ak7Af9yM;GNQcCZF&lh zy`h(jjcX5PfsOkjKoVY2%6$-t)Wn12fzRFxMraF9%k0WhBP^F|ZV+sfYUScYzcv3B z4E|~c&&?a=<>Exd%d&zbkT*2>-cH#`H%@%lGKbhB4+$t`5! zPf3lDj6Sve{>;9=OfEPN#AjeEliIn73IWS7Az+-c9LasPE4Gl8To{^`wrQmaxU8Sh z=QXllebpWe9WCGUL#$B`3WyWy5uxeLk613uXonrDVypV8rfGM?-fv z1oc6|*omgD=kkzPR?mBorem6 zn(**fzCauMb_>_sUV|4p34x9VizIhVbzB-nN=;TSH_yMqY`^af8oZhpdwwWB@~1>7 zLxvNNONQ++Q?gULmjA#St{wEYOu0T)LdnI~6(H%}LraF>6{qqCyp?^nd+8XVlj@a% zz9qp;$+fj3F%yKWPT(eshz=?UzIj&bohw@;o11SKyq>Y+fAObL^qUz+LgAmUu&m#* zI>&voH{C94y}>d?d)~RHn7|=D_i4(OpwkH(hBbeg$GP14REUZRfSMR-EKrca1KrMOrG8 zz1PC$(jYn~aV}7o!`H@|x#gzE0mO)LwNjxP)0x1JQw%dOu|-bEe%1MMTWB8 za2AX|W9C&yEBi}e>gkbB<#~ZaLf;}Ns6ClY0s{nVXKLn7cnmV{%gL=V(rf!6E|(#> zF<`CS&h~%=m+a`4T$>F}#Xwk_`Au{p44u)q0Gj33hPssR8C{@Hrj&G2x`hmT{E_NA zCrN`el!z0W7RzqOkmoQu57Mxn1c4RaH?uCs3=Kvy%PVq6W6O~%J?l8(%5usw>)hVr zK9isyq~C9&4xwi^`tdGalm+&c2JN$R1n6>VnEmj{4KX*ECeH_8P>{(zS!7(JA>_f5jXNR zo152oF1naFSz4}#X+KF8b~@8+cA@L-A%V>BWsXX%9qADs|yX^Bf}0uI#I21nF*UKO*uMm8d7VZMNwIJ zm-4h)i>?yd#mi583-8d}AiVQwoUz*r{#>KOJ6ZS5+{owmcDWyiw@m7qs!6p-haMP;!mr)*Y2TlHox4y6DExD1A za7S{IOMM}kIDi%FMWw?KkSU2;qqeaGK|W07RF_dCLx!zYzsV{t7Ul1XQaO zTD2p5n2K5ESuT_}j;0Ey?rMU$1+>gD_VOK1utSJ1-y%;jX3rIX^rTtdiVGua1r8m@ zyB!fCewbIU><`EAXdX1w&fa1U7JBF&@k;ZJjK4o$Fm1Q!?=8l!)lH+O;`i&&9nJUi zEAPPSWxhLeW3G3hJ#6`{WnSkNcT3XuDF81_y@axd;7C{0)I-vA$~|Lo+U)bYrZrbk zns17}Kl3Z64qK1>mM;|B57T;2Xn)Ts@O*aLsBID|ZXa_53l6`E`l8oeOzCIU&Wpz>L_jIDdGEQ-=mzZOfBeW&NVxzB1qWdm?5i-GS+T zj64d!@Hh}uDI)=Hx3f;;%_;%V<2xLC2vpBL$O9gMkWDRNJ)?QG1HtKxAkcoAVnd zt{qE6WI_2=pV5hV?CYjczZa|%Kx%nt3ah8^qJ5KV3VN!?)a3vcep~3*6lhcrKEw} zsQDx(MRzvkSo=^4BBl=Yj;w3Vj>J22)WOfQDtxk9Ad7Geb9~P15W&yG9KV=Y={^_Z z@o?D8_kH|wuhc1e=xtQyXSw9NPMW9vxuJGx;dS=X=j$eok^*$zCHl4tBeaVHQ;$|s zMt;wBRn*C4iz6MS^ds6fiW#L>*=v<(uyJ6?_#3&N#xy)NkKy)oqSF^zGpMErhi-Vf{}#XYxCqmK%X)GK%=u2gM^M(Y`!=6XtXU@Cmg=oA%H+DgwP6EUE$Xr&t)F zUg#!`Wkkie9CPOQm^9e*?VOuT0{Y{?WK^#aF#;$-@T>8?FCMxhS}V&yHDrA!IC~A+ zxBQfR{A=nvj4Fa2s}de-}UqeI1x!ibi7uy=$Iqe5gQAJ#w7Tpb4?ReKmBk_nnx-3*){rSrfrov)$@-OdlHXBN}8G@7!kji@-Ep4lh zy`Ap_MO53L@b)x~kR6rZ{^MBtE2jfc71lb&NuDdqjF8gmVQn@@}f{}lMiCLq+1Q5%z74|$P1t1+7)MY zGPWN3^Lq*Td43lSORXi!mOWsA6^|G>JYCiYkIhsX{@?&>?~Yt5n@w><$3U!~%4(ig zQ2AYUKb!xsK639QNHX_AvDwJN?%tUrk<$J_jB^*N>g$m+6R+ z7YaAZ9=O)+LLwZEv){G0#(stdj542%Tov#(B5wCj0;0!bsfNU|mw$P~GSp2Y3J>%* z^ra(zWj~J0C2nkV=1246N+s2~cI&!+-Ls|bhUKCCS^I8O#n00V-m=bqCQV$C^-%9^ zw`%XV1^HdU^ZbCaAl_#d+Mec!81O}GJ~JCqjJ#dA$Cna3WjWH+A8A(_Zmq}8IS?&* zX=ddTDP;kxG4f68O3!;`+wET#mOHFFeh6G_Fwp%d9$vjqE(hyhg1gX^r`-PS9D8Ow z7(hHD*fnbTfTz$l&pm%sU%li%ybzbOhFe6e;dKZL; zYtEu}8-AUj+g_v3DD;*{+oR5~Pwuc_r;z5ygl=W`TG)J2y*v1aJxBT_sV{26KeDDjDHnWYg0~f#RmV`d zz(2sz=STvv?drBudAv0eP%*8w&nY`3@qpSR_~(O5{SA$F1|$CfS>ibbcZWOKT^t!0 zb&AKtLF+a5+vqZ){c7V8w~(E#M$CbsG7C4wosVOgPBybP76 z8vPu?j+KJlK}k#l1+}3z%v6B7!%rTxRBvN0-+MH@^#u5ZoU)%lM|swQ$=QfjH#lv7 zr{C(uJa2pL(?MxA5t_s(kH@QxjCCV(=oFOWky2lOio7rnthoHRMef}iZ!fsc_eGGo z7ukEXfj&5BF$UJ+;UJv78KV)p)ivZ$T3YRtMP{03B2{s2XJj$-#Qc++B{0s#spT6< zBWvx>S&ANy(h(VBzI8$Z>RjLYu=Gwn^tOMNv!e;BsM-A{5V34kXFEEF>C&eQfNeyR z36-_nXBwv-80nV2WGEQcIpJ_-8)uOzzhDq2;X7GPt?HK9j&w^LN-_H0Y+=OML*_QP z&ylww8Gp>TH0qYq*icDumdKWU^D9X*Aol#jEkA}b8`uvi4s%&EIWPn4QlZS*?XyVe zbG5(OuH)X{X=<^~Co4YXYBr3fQ|b60Bb=lqaU%B)zSl-(Wi7R_lkVn{yi`p?tnTH?|6IV+|LiyTqLd{+|!(z-?)F~ z&WtL`gnVX}e4xJRx()p0Df~i>V>U)=Jc3#!JA0@@+(P@vyB4n@YmZ8jUxR+Taf$Lx zp>P4T5iI3dPMW6W-hyzs$_m@PfmIcZ{q9{o7`4q|I@E^<3oIMZyt>VKmLW|Lu7tOtCQHQ$@Kit z6Q|t)tHPI7Zx|xP=D8|6{(wEd)nDlE@kvXd##f~K=$DH+f3zq|+X?0|xpveAN$bIj zC1vYKO+O*WANc88pYHHDueCO1Os-XWJZa2 zzTFw-TAFXO_2Z^{He4&PW?211I(vVzk+MS6a-VUB129{bk2!cKFpsqpv;JVS!uj<} zErZAEZqMkf$^ZZ#3;sTt0#RJMd5~8mCIR2{QxBp}q*bEI{T$XnygkH;U$N-8K?q3_ zdUqOuucgg5Jw}JJd{m4%rdMGw$l#K2ZHny#j2>G}zH-l%8i?pRyCaS|dibgM#@(`I zeHp;ikKL(>+Lm+25=rIaWdTZnJOByTZ=p3chh2CJ%xGt3$-T)Rqc{zYs}q^4tWEAR zC8AX(pUQ*$T3iR$o?;))5Ad(>ZDDeigd}MXr_`BqeLcs3>|z0<&u3ediPI>-I-jVg zBx1gP2aU&*;n=$f8{L|*LHOKIE4Z)wGF(m;WTY_Bbl&{p-Tq1*j%+MEPx`Q zDJ5HMdv?)U7=DWR^#Wc^a`R+QW1HC~euCwcq(;>@?IeBMu5QEndsBwJi=a~J4Z@|2 zSRad)p0q+Fc`MrL3#{)6*(yJ3 zqp?h)&0nNtwmB@7n6}J~GIz=`Yr&L~07;0Tu8%U@bzeF=oWGshO@8G*KISRq#(!i^ zz+gvc5I?@XoU9;rBrdUnmXPf4fZsjZJ|U=}J+7G`D-l$Yrs`(dk}&T9TzvP~pj|G? zj|bM4K7sIE2H9%RZTr)deKM5&VF%l7LZ<@>H@dtUS)D_kKB=#D>3F{Rw0L`_Q_C_2 zPvwe5yOE408m|+Ihq{U0D!I)!J#B1tI3Zca(H2 zY8*PwUia_8UIU+DBJkiLHas^XGi_wpSh|tzbt(V}gn_=;Wc_K5^B4Oo;yFCKn5m#u z9?Pw7#miR17g3<+v@4lhf@bFge(CV^n2>&Bu0|tEx`T%!JA_4>uK1BVslOy?#r_PX z2)#tZ6W|M9>n;oC-1_d8)l*B>2Sw^3K+Nx4N}HnAUUQ3fqh{#*e($ZTJIbwc>+O1H zpVh>A7pp&J_(ixOVWz`g3>tFnF>B4r902{kIP>)@BpMcexG9dFJdNtDOVb_NGpnZE zkB5Hl^obtNT%>`H@II1#+omE(lWm{ld)aW_Dx}@!{^jb#ebAoUuJ}V0qnu_s@W%VJ zH-$CMkKNAUGQMTryTNY!T+6FRH{-X(_RaQh>~^!@Bl|eGB-YCf*IA^ZH(H&e4g=#P zkP51~?x<7sqF=R(o{f2!?WrfsP9A--fa`W%1gRR|v~e^j%$%38y7C zieR;w3SIIc6A$LVEuPnAWe&k9v$v3d8+hZ*2HM8pZ}lKpRbFm*w57NezscS?{S701 z+u}<{F)^KGF@SMQ4!T^DUE39wKoQWElIc|)Q>bXkPC_ySv&vs*Gg?hF1+>C{ zh=WOS9>ACdRq+-X^M0EFC1ow6fN`w1jaBaO3%aU-q=d@l7ywW{n*2+QfLx#Q*zEiUaf(b|f>n}t3UHtZ*G&OUrZ0Q~2 zIG-`aSLl+W>L&BZ=Bcz6mn^By6wJ!oZ`dq~ev5y6e9e-`{+QF`($S#Z_NRC)0;pz< z!(frO&SsvP#y)QRp}yIz=gKU#%vcN;b9T>^z;!|U83E}MZo9X_xNB12UC3UxUa&6k z-M^X;tA%DhNj>tQ%1;F2)(_zBvOjE3W+ z%s45%Cjk=N73U8@pm+Vr&T+Xoy+3i(O{<9KC+=cbl6faVp~{52NF4xUdtw(`e3u=L z50Fks1Xg4{L6lPA=<>wvd$ZTMI(v-ETi<>#c$T(gwWp3|YjMLGRtFycC6t-815Cf+ zUJU&7BOu*7BEh@4r-xsjIik+jwJz2Bd;3Nx?{zN_Tuwm6=zpW_|KDbN701FlU3-RW zyZT}q06WhM$Wyc08%#1&**8;Gju|JWjs_A=vAP^1NO(i%?2Jjjh&@rrAXMgp1-cRR zFpB+2yu{2Ik|eEN?(e@v_3RqQAZZyU)@E)Q{N=S`6Mpig{{4~Rm7u)YR;&!+19%;? zcrB=DpXHj^uDS7_nFqT4UJkgvM@>!O%x{uDnM3@=IESC)$V9rKRX>!zDO*J3_wdfb zN^B+QU3rS{?-WV_XbO&!LrZ9zqmy?<#@%L=^ml@1WJSgp7JXLIG|Q)YnZUe$rcBSD zo@$PupP&n~x_^sL3evLL2LD#;1X#9@j8_kvL}5LjD%B#7B?O?iSDH5|;6cUz&L_Pz z@gTn_-mlZ73{2a~Y6Eq+hSP!*WhgLX)3_!fvk@Z!=hWkfwh>Uehsiwe&IbncNi-PLkm94b_#i zE3ByHU|?Rz;RcBWcrD@eWht4T1H4$w_gubaeeMVJvNWV8!QISZJLED#1c7S9v=2;$ zoZq2Vv65OocRgPLwK^XnU=(4@vx{*9$EW=5ty`CQv9I0wBVRhzwl5q*T0qNlA@I%n z+sC=cmPB>5eD<7eS>9;KIoKpZMiVbV9#_KT4C-oI%fepmc54PbK8ISgoW6{BU&|I-wA;pn?GlRy$Y$baP*djzmVL5lX7E1Rcw+pMaI)eDk^z2X58>SW8W*EiHWABO^x;e6gnS9MX>A$3f zIY(#pyXiUVu8Q@uJAPGNOfV<-z!jqoSo(}lLHe|li?|BKEZjjjxKlbkkXs2030&F7 zw#v^T#4q;ykM~bc3Ml~%&6)i(`XbA2kAaQDcomqUn(|3i6DQHJG3pZ$qG&O6gNMUwk;7V%|OmG=(SiirKkBra7%WU)|Z z*B^)dNg()MQysrmIFfrM;xqviI@}T6_%59>AdaSFc zN3dkaAGcRW)tCAFhk4kHSb1M90g~gs(mmE7piGM7D~3p#&r6fOLxp+d5z3V!l|xJD^*U976~K9z*~AS~*sT;;W40XLda=SWUNg z_?M{=3fqk@dJ^4LO>%B$;vm=Kj( zr$lUy?R)Zx@g7X)p{5A>TF0;^gyAYzfxga4=qsAPpmU19&24KVH%2WKMSCcj;e=ok zfPFwcklF2FiZFeMh-&WsVY^{OJYrr(5qfF+~ zq^O*J^UE8nM>e&cd~~KvFCvF`4^ya>M;`>|?H?CpF<9EvoAj1O#F-jY`BmH$sCs07 z2jAeCu@YXJcAG4DZ3h!8oQU zEGS;i*>nRsZs@a@0wCUQXHt7BKF`=SElyRF2>l3b_8oCkKKNy1p`si{?XekY=k_s( z51F+MpvD7mgn)&i_eSQ_K3^Q(BSABLK3X!b;C)~X)O6=sML#9QJc|g60#N--39?j>?csOcctoC*L?Y{ zWXG)mW5y=P9dn4j?ea@aPm8{b=kd()nRP1r3v;b7+23F`rXb#lQwHA1MoN_b1Y{Qj ztIu}Y>Js~|WY{Tdvcod8)Os)+(|ZrEZYF>D|7hw;!=X^yFbN^P9HQtLDKvey6J=@a z3XS1Jp%_i}iELw=tYgZEnCwDhUlLg}mKjTApA;Q4cE>iO#*%#*<_uro_jUh!e?8ar zUhjL|&vRY(bKeUk>S`?ovFbft^ij=BgrgZTwegLkh#RTN;pV_ZFt!;6LltfLzr`Rx zA0H)tk7y59dVpJKG<3jV_Slq8iGX%{^xe1EHQ??+Cm!CEg5G~BD9SER8ecapAw_iz z`q4p?X1-Og_;oL=)wa<4e_L96O8^U#gTYqKjecpL?yI|?qzl+Cb0D{JL9A;)-FNfLsBNVys+>kfa|f9T|ULU-P+ zpFGRof@36AXx6rqu;mX!*jhLBOzte$^Iw$J1|vfSZ7i4UhmSj1rFU$)vQ^wivI#{- zCT9iD>?hGb}vaTaeBjs12Yy8yB|)qp6AddpTLUT8!-Ie|0j{&=XBRa07gKomk=l zFGt12^@ZDHA{{ZIsW1FFp{(}ci_v1VbuQ)+xBQ&fO^%OYwEVht8AGt= zm7oK;0ac=oIfd55?oI)L$Z3kq!t8y2z?8DHsmN0;PCT@HytJV;y+r)QrpYqxjOAgY zGW)}V6-j4CNH4qw%Oz1|VcRZoP|7pR@4d7dQTyCm-57!R(-xS?!bQjA(mXl8%FbG@ zDf>2x#ACKrmV;%*rUO~5q)zg3ddO{^Fws~mxpRzFf$LzgOJQxZuF9i+)ePepSlNzE z&%u~3A_5gHVoe+-C44@Qe_Vs6hVy$)^jLq4thbQpQVTt1=T%m~?WKW4vF~N>iJwTj zlOgycBgLm>>{IL3D23^y{D82uZcMQivYAw>JS`3-i9~~&XYhva9L4~h-~M3FW=CW9 zZZluHy0r!aU@g*TI9)x(&kg!_?~1BtZgVhQj<{4p@K9SWYb{xr26Km$X}j_`WdkE& zHvIgMcjSy7^XCxxJij`KP??bM>RJYmvV+lRbzE)4G1I`YPjW9;(qP5)(Qd=ywwiok z(d$`yBL)^l7KzsbZjLL*1FBQRC)f=-+N%^<&XAswD8)HZ<;P zb6Ej0LV@(hP3M3uA3`ps93;o%R2LWPZ?-Jomzqi|8XB1KsmIS_OGks?vtAKEzKd4^ zxm30qDVA^@*N$^FLw>q zDBaKKCcGzYD2a4Rg*+(IvF(QG>xRFJgOYOzQcHE~vr#bjl_}I-o;Cnl)=kTu)-EwR zsKagM>^GP4Cmq0F{%MiD&sP=Y<*z7~U!0!;4tU(cMoiHVzyTad{TEJ%7X`3M9W!1% zn@?ZmAdKUF)A;If9=^5*WDIy4MQmtrPrjYbiWKl(QH~c=MI+`m&f$GW%g2ePb~_v* z?U=fqZ*Hr7#wfzqJxy+H&-}Ll+VWIi=cIXuyFXLTk;Mai+wkKHYurEvU1L#)T+dgE zT*hWDcpbOchuUh4>&G<5(Ii5EF?=FWN9rJ-f;4WtC65*xM{AJakq#fym5KvZb zrkuGwGsCV8lp<5K2EWZ4;}Tahy!OSTs;ahHroV$w(4Ft%RP8;e`1+P~LP}E-bkqTO zFCeOi-d@=Y0^BV#=8=StO1WpLRwJ0mC4q1}*}{OSlGLWJE5Tk02@;$EhylAAje6Mv z_X4XQuEpdV){n}%*Rbe4<5DBz^FA=AErPNVV>g1WT^X6Uwo7zA^&XTK29Usr&RgZF zgP0n~&Zc>ePHQVBU0py{A#)mmopzbuf5FA81$SC&V&(u&goG*>24p;EIb&a2!Yw3w z0yUmsKBP-*mR&>mW~0!CP1EE!;#WO=>PqXU0-SzN_8g&kh8LM->i}7}N{FpCGQ;Ty z!4*4lr1L^$CdP+4%Wrwa`z(l5@4Lj;&Yew&3#R5+DE5^rQqim5XXl`^WR6q2jNpMj z{LW`&|NE%Z3=hNKIScTCi?e0%E(dd~@jv`=FslLJ(B0X@+`sY;Kiz5?DR6t`?>6Rl zU6$~;Yf`P(DFHhY7{Hv|&sN+#8Y&NlT#u$+6J1po0jo-x@{}iU9pa1Lznb>>cjO!j zmr6N$77XnI#Y2Yy$48|i(c18Wn#W#_!%NYU6Cr=i`slqmlr?uH>aco>pXgFK+T8ii zsY~UTfY?_uhc>A{G5BkCYr63N*KSM_S$*YC#KX=18*$1?3xoVG&eXu5(D>JizZNNE Ya{8;Bo(b#I>tbWU_=c&$J3Uy$Ke->~=l}o! literal 0 HcmV?d00001 diff --git a/common/images/cloud_github-acct-webhook2.png b/common/images/cloud_github-acct-webhook2.png new file mode 100644 index 0000000000000000000000000000000000000000..43e1a29ca67fbfae4cbba94c28c00149fbb6b0e1 GIT binary patch literal 85075 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%0A2j=A%CSzl>bk^dZ$k_rEh7&j{V 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%0DCxei6 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 WAu --token= {--repository=USER/REPOSITORY | --repository=ORGANIZATION/REPOSITORY} [--build-pull-requests={true|false} --fetch-branches={true|false} + magento-cloud integration:add --type=github --project= --token= {--repository=USER/REPOSITORY | --repository=ORGANIZATION/REPOSITORY} [--build-pull-requests={true|false} --fetch-branches={true|false} where - `` is your Magento Enterprise Cloud Edition project ID + `` is your Magento Enterprise Cloud Edition project ID - `` is the token you got in the preceding section + `` is the token you got in the preceding section - `--repository=USER/REPOSITORY` is how you specify your personal, private GitHub repository + `--repository=USER/REPOSITORY` is how you specify your personal, private GitHub repository - `--repository=ORGANIZATION/REPOSITORY` is how you specify an organization repository + `--repository=ORGANIZATION/REPOSITORY` is how you specify an organization repository - `--build-pull-requests` is an optional parameter that instructs Magento Cloud to deploy after you merge a pull request (`true` by default) + `--build-pull-requests` is an optional parameter that instructs Magento Cloud to deploy after you merge a pull request (`true` by default) - `--fetch-branches` is an optional parameter that causes Magento Cloud to track branches and deploy after you update a branch (`true` by default) + `--fetch-branches` is an optional parameter that causes Magento Cloud to track branches and deploy after you update a branch (`true` by default) - Example 1: Enable the GitHub integration for a personal, private repository: + **Example 1**: Enable the GitHub integration for a personal, private repository: - TBD + magento-cloud integration:add --type=github --project=ov58dlacU2e --token= --repository=myUserName/myrepo - Example 2: Enable the GitHub integration for an organization repository: + **Example 2**: Enable the GitHub integration for an organization repository: - TBD + magento-cloud integration:add --type=github --project=ov58dlacU2e --token= --repository=Magento/teamrepo +6. Enter the required information when prompted. Sample output: - TBD + Created integration wp2f2thlmxwcg (type: github) + Repository: myUserName/myrepo + Build PRs: yes + Fetch branches: yes + Payload URL: https://us.magento.cloud/api/projects/ov58dlacU2e/integrations/wO8a0eoamxwcg/hook + 5. Copy the Payload URL displayed by the command and continue with the next section. ## Add the webhook {#cloud-int-gh-hook} -TBD +To add the webhook to your GitHub repository: + +1. In your GitHub repository, click **Settings** as the following figure shows. + + ![Go to your GitHub's account settings]({{ site.baseurl }}common/images/cloud_github-acct-settings.png) +2. In the left navigation bar, click **Webhooks & services**. +3. In the right pane, click **Add webhook** as the following figure shows. + + ![Add the webhook to your account]({{ site.baseurl }}common/images/cloud_github-acct-webhook.png) +4. Enter the following information: + + * **Payload URL**: Enter the URL displayed by the command in the preceding section. + * **Content type**: Click **application/json** + * **Secret**: Enter a verification secret. + * **Which events would you like to trigger this webhook?**: Click **Send me everything** + * Select the **Active** check box. + + The following figure shows an example: + + ![Add the webhook to your account]({{ site.baseurl }}common/images/cloud_github-acct-webhook2.png) +5. Click **Add Webhook** ## Verify it works {#cloud-int-gh-verify} TBD From 8f3010db9a5a28a62f9a777a375f971413cc8a4b Mon Sep 17 00:00:00 2001 From: stevjohnson Date: Thu, 21 Apr 2016 18:08:52 -0500 Subject: [PATCH 765/902] Updates --- guides/v2.0/cloud/project/project-integrate-github.md | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/guides/v2.0/cloud/project/project-integrate-github.md b/guides/v2.0/cloud/project/project-integrate-github.md index 935745880bd..f5029041a33 100644 --- a/guides/v2.0/cloud/project/project-integrate-github.md +++ b/guides/v2.0/cloud/project/project-integrate-github.md @@ -21,7 +21,9 @@ github_link: cloud/project/project-integrate-github.md * [Verify it works](#cloud-int-gh-verify) ## About the GitHub integration {#cloud-int-gh-about} -The GitHub integration enables you to manage your Magento Enterprise Cloud Edition environments directly from your GitHub repository. We strongly recommend you use a *private* GitHub repository. +The GitHub integration enables you to manage your Magento Enterprise Cloud Edition environments directly from your GitHub repository. The integration manages content already in GitHub and synchronizes it with Magento Enterprise Cloud Edition. Therefore, before you begin, make sure your project and environments are in a GitHub repository. + +We strongly recommend you use a *private* GitHub repository. This integration enables you to: @@ -122,10 +124,13 @@ To add the webhook to your GitHub repository: The following figure shows an example: ![Add the webhook to your account]({{ site.baseurl }}common/images/cloud_github-acct-webhook2.png) -5. Click **Add Webhook** +5. Click **Add webhook** ## Verify it works {#cloud-int-gh-verify} -TBD +To verify the integration works: + +1. Make a change in a local branch and push it to the GitHub repository with which you integrated. +2. In the Magento Cloud CLI, pull the change to an environment. #### Related topics From 974535ce00c3c64e3f7b64f7e90cca5125b16e9b Mon Sep 17 00:00:00 2001 From: Ryan Fowler Date: Fri, 22 Apr 2016 02:15:38 -0700 Subject: [PATCH 766/902] Updated page to remove redundant 'built-in' --- guides/v2.0/config-guide/bootstrap/mage-profiler.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/guides/v2.0/config-guide/bootstrap/mage-profiler.md b/guides/v2.0/config-guide/bootstrap/mage-profiler.md index 1702dc35541..1a03195037b 100644 --- a/guides/v2.0/config-guide/bootstrap/mage-profiler.md +++ b/guides/v2.0/config-guide/bootstrap/mage-profiler.md @@ -20,7 +20,7 @@ Magento profiling enables you to: * Enable a built-in profiler - You can use a built-in built-in profiler with Magento to perform tasks such as analyzing performance. (The nature of profiling depends on the analytical tools you use. We support multiple formats, including HTML.) + You can use a built-in profiler with Magento to perform tasks such as analyzing performance. (The nature of profiling depends on the analytical tools you use. We support multiple formats, including HTML.) * Displays dependency graphs on a Magento page. A *dependency graph* is a list of object dependencies and all of their all their dependencies, and all the dependencies for those dependencies, and so on. @@ -45,4 +45,4 @@ Magento provides the base functionality in -You can set the value of `MAGE_PROFILER` in any of the ways discussed in Set the value of bootstrap parameters. \ No newline at end of file +You can set the value of `MAGE_PROFILER` in any of the ways discussed in Set the value of bootstrap parameters. From 13e5a2b9aba9f5803270bf0f4d4cabc1caad7a63 Mon Sep 17 00:00:00 2001 From: Dmitry Shevtsov Date: Fri, 22 Apr 2016 12:27:37 +0300 Subject: [PATCH 767/902] MTF generate.php for pages and repository - update in all topics --- _includes/mtf/page-generator.html | 4 ++-- guides/v2.0/mtf/create_test/create_new_test.md | 2 +- guides/v2.0/mtf/mtf_entities/mtf_fixture-repo.md | 2 +- guides/v2.0/mtf/mtf_entities/mtf_page.md | 4 ++-- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/_includes/mtf/page-generator.html b/_includes/mtf/page-generator.html index 20fc2af7c0c..b9e2b279c3f 100644 --- a/_includes/mtf/page-generator.html +++ b/_includes/mtf/page-generator.html @@ -1,3 +1,3 @@ -

    To apply all changes you've made to the page (XML file), run the page generator.

    -
    php <magento2>/dev/tests/functional/utils/page.php
    +

    To apply all changes you've made to the page (XML file), run the class generator.

    +
    php <magento2>/dev/tests/functional/utils/generate.php

    The page will be updated in the <magento2>/dev/tests/functional/generated directory.

    \ No newline at end of file diff --git a/guides/v2.0/mtf/create_test/create_new_test.md b/guides/v2.0/mtf/create_test/create_new_test.md index 25ad01586b7..aa9229aab36 100644 --- a/guides/v2.0/mtf/create_test/create_new_test.md +++ b/guides/v2.0/mtf/create_test/create_new_test.md @@ -1029,7 +1029,7 @@ This block must be added to `SynonymsIndex` class. To do this: 3) Launch the generating tool to update the page class: - php /dev/tests/functional/utils/generate.php + php /dev/tests/functional/utils/generate.php And now we can add `` to each variation of a data set `/dev/tests/functional/tests/app/Magento/Search/Test/TestCase/CreateSynonymEntityTest.xml`: diff --git a/guides/v2.0/mtf/mtf_entities/mtf_fixture-repo.md b/guides/v2.0/mtf/mtf_entities/mtf_fixture-repo.md index b20605f218e..97974537f08 100644 --- a/guides/v2.0/mtf/mtf_entities/mtf_fixture-repo.md +++ b/guides/v2.0/mtf/mtf_entities/mtf_fixture-repo.md @@ -489,7 +489,7 @@ Later you installed a new module Magento_CustomerNew module that changed Custome After the repository generation - php /dev/tests/functional/utils/generate/repository.php) + php /dev/tests/functional/utils/generate.php you have the following code in the Customer repository (`/dev/tests/functional/generated/Magento/Customer/Test/Repository/Customer.php`): diff --git a/guides/v2.0/mtf/mtf_entities/mtf_page.md b/guides/v2.0/mtf/mtf_entities/mtf_page.md index 6614366e8fa..b0b55bc6b38 100644 --- a/guides/v2.0/mtf/mtf_entities/mtf_page.md +++ b/guides/v2.0/mtf/mtf_entities/mtf_page.md @@ -176,7 +176,7 @@ We should create `dev/tests/functional/tests/app/Magento/Review/Test/Page/Produc And generate the updated page: - php /dev/tests/functional/utils/generate/page.php + php /dev/tests/functional/utils/generate.php The result is in the `/dev/tests/functional/generated/Magento/Catalog/Test/Page/Product/CatalogProductView.php` with the following code: @@ -390,7 +390,7 @@ To use the `editForm` block from the Magento_NewModule we must follow: Enter in terminal: - php /dev/tests/functional/utils/generate/page.php + php /dev/tests/functional/utils/generate.php Now when you call `editForm` block from the `CatalogCategoryEdit` page, the `\Magento\NewModule\Test\Block\Adminhtml\Category\Edit\CategoryForm` class will be used. From b4dc7caca80dc3028df53063cd86668522944ca7 Mon Sep 17 00:00:00 2001 From: Oleksandra Marchenko Date: Fri, 22 Apr 2016 16:00:27 +0300 Subject: [PATCH 768/902] Updated info about setting template --- .../frontend-dev-guide/layouts/xml-manage.md | 23 +++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/guides/v2.0/frontend-dev-guide/layouts/xml-manage.md b/guides/v2.0/frontend-dev-guide/layouts/xml-manage.md index 4ccafd44241..da33437987c 100644 --- a/guides/v2.0/frontend-dev-guide/layouts/xml-manage.md +++ b/guides/v2.0/frontend-dev-guide/layouts/xml-manage.md @@ -186,22 +186,37 @@ Example: pass the image to the `logo` block. {%endhighlight xml%} -

    Set the template used by a block

    +## Set the template used by a block {#set_template} -To set the template for a block, pass it using the `` instruction. +There are two ways to set the template for a block: -Example: change template of the page title block: +- using the `template` attribute +- using the `` instruction + +Both approaches are demonstrated in the following examples of changing the template of the page title block. + +**Example 1:** + +{%highlight xml%} + +{%endhighlight%} + +**Example 2:** {%highlight xml%} - Namespace_Module::title_new.phtml + %Namespace_Module::title_new.phtml% {%endhighlight%} The path to the template is specified relatively to the `view//templates/` directory of the module. The `` corresponds to the area for which the layout file is used. +
    +

    Template values specified as attributes have higher priority during layout generation, than the ones specified using <argument>. It means, that if for a certain block, a template is set as attribute, it will override the value you specify in <argument> for the same block.

    +
    +

    Modify block arguments

    To modify block arguments, use the `` instruction. From 1a63e3043338f2f085c86f79af439e6b9657c3dc Mon Sep 17 00:00:00 2001 From: stevjohnson Date: Fri, 22 Apr 2016 08:18:57 -0500 Subject: [PATCH 769/902] Finish GitHub integration --- guides/v2.0/cloud/project/project-integrate-github.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/guides/v2.0/cloud/project/project-integrate-github.md b/guides/v2.0/cloud/project/project-integrate-github.md index f5029041a33..2d5d4aeffe0 100644 --- a/guides/v2.0/cloud/project/project-integrate-github.md +++ b/guides/v2.0/cloud/project/project-integrate-github.md @@ -11,8 +11,6 @@ level3_subgroup: integrate github_link: cloud/project/project-integrate-github.md --- - - #### Contents * [About the GitHub integration](#cloud-int-gh-about) * [Generate a GitHub token](#cloud-int-gh-token) @@ -129,7 +127,7 @@ To add the webhook to your GitHub repository: ## Verify it works {#cloud-int-gh-verify} To verify the integration works: -1. Make a change in a local branch and push it to the GitHub repository with which you integrated. +1. Make a change in the GitHub repository with which you integrated. 2. In the Magento Cloud CLI, pull the change to an environment. From f03bd84be06c86a0dfd9b95b5b31269ad7adf9f2 Mon Sep 17 00:00:00 2001 From: Steve Johnson Date: Fri, 22 Apr 2016 06:33:36 -0700 Subject: [PATCH 770/902] Spell check Cloud guide --- guides/v2.0/cloud/env/environments-start.md | 2 +- guides/v2.0/cloud/project/project-routes-more-redir.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/guides/v2.0/cloud/env/environments-start.md b/guides/v2.0/cloud/env/environments-start.md index c32ad2bc369..7093d57cdaa 100644 --- a/guides/v2.0/cloud/env/environments-start.md +++ b/guides/v2.0/cloud/env/environments-start.md @@ -72,7 +72,7 @@ All commands are shown with required options only. Get help for any command by a : Merge changes in this environment with its parent. `magento-cloud environment:synchronize -p -e {code|data}` -: Sycnronize (that is, `git pull`) code and/or data from the parent to this environment +: Synchronize (that is, `git pull`) code and/or data from the parent to this environment `magento-cloud variable:list` : List variables in this environment diff --git a/guides/v2.0/cloud/project/project-routes-more-redir.md b/guides/v2.0/cloud/project/project-routes-more-redir.md index d39609f8384..6af52da4a55 100644 --- a/guides/v2.0/cloud/project/project-routes-more-redir.md +++ b/guides/v2.0/cloud/project/project-routes-more-redir.md @@ -71,7 +71,7 @@ Required, a partial (`"/destination"` or `"//destination"`) or full URL (`"http: ### `regexp` {#cloud-route-partial-regexp} Optional, defaults to `false`. Specifies whether the path key should be interpreted as - a PCRE regular expression. In the following example, a request to `http://example.com/regexp/a/b/c/match` redirectS to `http://example.com/a/b/c`: + a PCRE regular expression. In the following example, a request to `http://example.com/regexp/a/b/c/match` redirects to `http://example.com/a/b/c`: {% highlight yaml %} From 6158e2450b9d75fa2d8a6265f67a91db391467a8 Mon Sep 17 00:00:00 2001 From: stevjohnson Date: Fri, 22 Apr 2016 08:36:14 -0500 Subject: [PATCH 771/902] Adjust figure width --- guides/v2.0/cloud/project/project-integrate-github.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/guides/v2.0/cloud/project/project-integrate-github.md b/guides/v2.0/cloud/project/project-integrate-github.md index 2d5d4aeffe0..48d9c8ef7b2 100644 --- a/guides/v2.0/cloud/project/project-integrate-github.md +++ b/guides/v2.0/cloud/project/project-integrate-github.md @@ -106,11 +106,11 @@ To add the webhook to your GitHub repository: 1. In your GitHub repository, click **Settings** as the following figure shows. - ![Go to your GitHub's account settings]({{ site.baseurl }}common/images/cloud_github-acct-settings.png) + ![Go to your GitHub's account settings]({{ site.baseurl }}common/images/cloud_github-acct-settings.png){:width="650px"} 2. In the left navigation bar, click **Webhooks & services**. 3. In the right pane, click **Add webhook** as the following figure shows. - ![Add the webhook to your account]({{ site.baseurl }}common/images/cloud_github-acct-webhook.png) + ![Add the webhook to your account]({{ site.baseurl }}common/images/cloud_github-acct-webhook.png){:width="650px"} 4. Enter the following information: * **Payload URL**: Enter the URL displayed by the command in the preceding section. @@ -121,7 +121,7 @@ To add the webhook to your GitHub repository: The following figure shows an example: - ![Add the webhook to your account]({{ site.baseurl }}common/images/cloud_github-acct-webhook2.png) + ![Add the webhook to your account]({{ site.baseurl }}common/images/cloud_github-acct-webhook2.png){:width="650px"} 5. Click **Add webhook** ## Verify it works {#cloud-int-gh-verify} From 462e697c37393f0bad12ff9affe423c63a06e107 Mon Sep 17 00:00:00 2001 From: Jeanne Frontain Date: Fri, 22 Apr 2016 09:48:58 -0500 Subject: [PATCH 772/902] need to switch branches --- guides/v2.0/release-notes/ReleaseNotes2.0.5CE.md | 2 +- guides/v2.0/release-notes/ReleaseNotes2.0.5EE.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/guides/v2.0/release-notes/ReleaseNotes2.0.5CE.md b/guides/v2.0/release-notes/ReleaseNotes2.0.5CE.md index cedcc6dfae2..25f322dd17d 100644 --- a/guides/v2.0/release-notes/ReleaseNotes2.0.5CE.md +++ b/guides/v2.0/release-notes/ReleaseNotes2.0.5CE.md @@ -84,7 +84,7 @@ The following list provides an overview of the security issues fixed in this rel * Magento no longer permits an unauthenticated user to remotely execute doc on the server. Previously, an unauthenticated user could remotely execute PHP code on the server using either REST or SOAP APIs. (These APIs are enabled by default in most installations.) - * The Magento installation code is no longer accessible once the installation process has completed. Previously, an unauthenticated user could execute PHP code on the server because the installation process would leave the /app/etc directory writable, and many administrators would not change the permissions on this directory after installation. (During installation, the system requires the /app/etc directory to be writeable.) + * The Magento installation code is no longer accessible once the installation process has completed. Previously, an unauthenticated user could execute PHP code on the server because the installation process would leave the /app/etc directory writeable, and many administrators would not change the permissions on this directory after installation. (During installation, the system requires the /app/etc directory to be writeable.) * Magento no longer allows authenticated customers to change their information using either SOAP or REST calls. Magento now confirms that the ID of the customer whose account is being edited matches the authentication token in use. Previously, a malicious user could hijack a customer account by logging in as an authenticated user, then editing the account of any other user. (The SOAP and REST APIs are enabled by default in most installations.) diff --git a/guides/v2.0/release-notes/ReleaseNotes2.0.5EE.md b/guides/v2.0/release-notes/ReleaseNotes2.0.5EE.md index 65294fd9464..5f7906b396e 100644 --- a/guides/v2.0/release-notes/ReleaseNotes2.0.5EE.md +++ b/guides/v2.0/release-notes/ReleaseNotes2.0.5EE.md @@ -88,7 +88,7 @@ The following list provides an overview of the security issues fixed in this rel * Magento no longer permits an unauthenticated user to remotely execute doc on the server. Previously, an unauthenticated user could remotely execute PHP code on the server using either REST or SOAP APIs. (These APIs are enabled by default in most installations.) - * The Magento installation code is no longer accessible once the installation process has completed. Previously, an unauthenticated user could execute PHP code on the server because the installation process would leave the /app/etc directory writable, and many administrators would not change the permissions on this directory after installation. (During installation, the system requires the /app/etc directory to be writeable.) + * The Magento installation code is no longer accessible once the installation process has completed. Previously, an unauthenticated user could execute PHP code on the server because the installation process would leave the /app/etc directory writeable, and many administrators would not change the permissions on this directory after installation. (During installation, the system requires the /app/etc directory to be writeable.) * Magento no longer allows authenticated customers to change their information using either SOAP or REST calls. Magento now confirms that the ID of the customer whose account is being edited matches the authentication token in use. Previously, a malicious user could hijack a customer account by logging in as an authenticated user, then editing the account of any other user. (The SOAP and REST APIs are enabled by default in most installations.) From a2c4d33623120c6268f8e239ea029980271e6df0 Mon Sep 17 00:00:00 2001 From: Jeanne Frontain Date: Fri, 22 Apr 2016 10:14:38 -0500 Subject: [PATCH 773/902] fixed broken link to MTF --- guides/v2.0/architecture/tech-stack.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guides/v2.0/architecture/tech-stack.md b/guides/v2.0/architecture/tech-stack.md index 36397b48c3d..89c5608f50e 100644 --- a/guides/v2.0/architecture/tech-stack.md +++ b/guides/v2.0/architecture/tech-stack.md @@ -80,7 +80,7 @@ Magento is compatible with but not supported for: Magento also provides a automated testing suites that include unit, integration, functional and performance test scripts, as well as JavaScript tests and tools for static code analysis. Components include PHPUnit for the unit test framework and Selenium for the functional test framework. -This framework is located in `dev/tests`. The functional testing framework `mtf` can be found in a [separate repository](https://github.com/magento/mtf). For more information, see the [Magento Testing Framework]({{ site.gdeurl }}mtf/mtf.html) guide. +This framework is located in `dev/tests`. The functional testing framework `mtf` can be found in a [separate repository](https://github.com/magento/mtf). For more information, see the [Magento Testing Framework]({{ site.gdeurl }}mtf/mtf_introduction.html) guide.

    Related topics

    From c40ff7724ecdefaf059403153018c1957bc31c3c Mon Sep 17 00:00:00 2001 From: Jeanne Frontain Date: Fri, 22 Apr 2016 10:37:57 -0500 Subject: [PATCH 774/902] fixed subgroup field of security intro --- guides/v2.0/architecture/security_intro.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guides/v2.0/architecture/security_intro.md b/guides/v2.0/architecture/security_intro.md index 5e1217d2e2a..d58b4d86ca1 100644 --- a/guides/v2.0/architecture/security_intro.md +++ b/guides/v2.0/architecture/security_intro.md @@ -1,7 +1,7 @@ --- layout: default group: arch-guide -subgroup: +subgroup: Architectural Basics title: Security overview menu_title: Security menu_order: From de1d2a646ff057e802b94018e5d283bb01c69119 Mon Sep 17 00:00:00 2001 From: Jeanne Frontain Date: Fri, 22 Apr 2016 11:11:38 -0500 Subject: [PATCH 775/902] added Safwan's comments to security issues --- guides/v2.0/release-notes/ReleaseNotes2.0.5CE.md | 4 ++-- guides/v2.0/release-notes/ReleaseNotes2.0.5EE.md | 5 ++--- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/guides/v2.0/release-notes/ReleaseNotes2.0.5CE.md b/guides/v2.0/release-notes/ReleaseNotes2.0.5CE.md index 25f322dd17d..8509e1ecf4e 100644 --- a/guides/v2.0/release-notes/ReleaseNotes2.0.5CE.md +++ b/guides/v2.0/release-notes/ReleaseNotes2.0.5CE.md @@ -82,12 +82,12 @@ This release includes several enhancements to improve the security of your Magen The following list provides an overview of the security issues fixed in this release. We describe each issue in greater detail in the Magento Security Center. - * Magento no longer permits an unauthenticated user to remotely execute doc on the server. Previously, an unauthenticated user could remotely execute PHP code on the server using either REST or SOAP APIs. (These APIs are enabled by default in most installations.) + * Magento no longer permits an unauthenticated user to remotely execute doc on the server through APIs. Previously, an unauthenticated user could remotely execute PHP code on the server using either REST or SOAP APIs. (These APIs are enabled by default in most installations.) * The Magento installation code is no longer accessible once the installation process has completed. Previously, an unauthenticated user could execute PHP code on the server because the installation process would leave the /app/etc directory writeable, and many administrators would not change the permissions on this directory after installation. (During installation, the system requires the /app/etc directory to be writeable.) - * Magento no longer allows authenticated customers to change their information using either SOAP or REST calls. Magento now confirms that the ID of the customer whose account is being edited matches the authentication token in use. Previously, a malicious user could hijack a customer account by logging in as an authenticated user, then editing the account of any other user. (The SOAP and REST APIs are enabled by default in most installations.) + * Magento no longer allows authenticated customers to change other customers' account information using either SOAP or REST calls. Magento now confirms that the ID of the customer whose account is being edited matches the authentication token in use. Previously, a malicious user could hijack a customer account by logging in as an authenticated user, then editing the account of any other user. (The SOAP and REST APIs are enabled by default in most installations.) * Anonymous users can no longer retrieve the private data of registered customers. To prevent malicious attacks of this type, the quote_id_mask table of the Quote API no longer includes a cart id mask value. diff --git a/guides/v2.0/release-notes/ReleaseNotes2.0.5EE.md b/guides/v2.0/release-notes/ReleaseNotes2.0.5EE.md index 5f7906b396e..ab679f8de9a 100644 --- a/guides/v2.0/release-notes/ReleaseNotes2.0.5EE.md +++ b/guides/v2.0/release-notes/ReleaseNotes2.0.5EE.md @@ -86,17 +86,16 @@ This release includes several enhancements to improve the security of your Magen The following list provides an overview of the security issues fixed in this release. We describe each issue in greater detail in the Magento Security Center. - * Magento no longer permits an unauthenticated user to remotely execute doc on the server. Previously, an unauthenticated user could remotely execute PHP code on the server using either REST or SOAP APIs. (These APIs are enabled by default in most installations.) + * Magento no longer permits an unauthenticated user to remotely execute doc on the server through APIs. Previously, an unauthenticated user could remotely execute PHP code on the server using either REST or SOAP APIs. (These APIs are enabled by default in most installations.) * The Magento installation code is no longer accessible once the installation process has completed. Previously, an unauthenticated user could execute PHP code on the server because the installation process would leave the /app/etc directory writeable, and many administrators would not change the permissions on this directory after installation. (During installation, the system requires the /app/etc directory to be writeable.) - * Magento no longer allows authenticated customers to change their information using either SOAP or REST calls. Magento now confirms that the ID of the customer whose account is being edited matches the authentication token in use. Previously, a malicious user could hijack a customer account by logging in as an authenticated user, then editing the account of any other user. (The SOAP and REST APIs are enabled by default in most installations.) + * Magento no longer allows authenticated customers to change other customers' account information using either SOAP or REST calls. Magento now confirms that the ID of the customer whose account is being edited matches the authentication token in use. Previously, a malicious user could hijack a customer account by logging in as an authenticated user, then editing the account of any other user. (The SOAP and REST APIs are enabled by default in most installations.) * Anonymous users can no longer retrieve the private data of registered customers. To prevent malicious attacks of this type, the quote_id_mask table of the Quote API no longer includes a cart id mask value. -

    System requirements

    Our technology stack is built on PHP and MySQL. Magento 2.0.1 and later supports PHP 5.5, 5.6, 7.0.2, and MySQL 5.6. For more information, see System Requirements. From 1b95363a354dd6ce01fe7e8baa0a84fc4eb9b3e4 Mon Sep 17 00:00:00 2001 From: stevjohnson Date: Fri, 22 Apr 2016 11:44:00 -0500 Subject: [PATCH 776/902] Fixed front matter in Release Notes --- .../v2.0/release-notes/ReleaseNotes2.0.3CE.md | 6 +- .../v2.0/release-notes/ReleaseNotes2.0.3EE.md | 7 +- .../v2.0/release-notes/ReleaseNotes2.0.4CE.md | 7 +- .../v2.0/release-notes/ReleaseNotes2.0.4EE.md | 7 +- .../v2.0/release-notes/ReleaseNotes2.0.5CE.md | 7 +- .../v2.0/release-notes/ReleaseNotes2.0.5EE.md | 7 +- guides/v2.0/release-notes/changes.md | 194 ------------------ guides/v2.0/release-notes/community.md | 92 --------- 8 files changed, 20 insertions(+), 307 deletions(-) delete mode 100644 guides/v2.0/release-notes/changes.md delete mode 100644 guides/v2.0/release-notes/community.md diff --git a/guides/v2.0/release-notes/ReleaseNotes2.0.3CE.md b/guides/v2.0/release-notes/ReleaseNotes2.0.3CE.md index b401657b824..9de2ed9d5de 100644 --- a/guides/v2.0/release-notes/ReleaseNotes2.0.3CE.md +++ b/guides/v2.0/release-notes/ReleaseNotes2.0.3CE.md @@ -1,9 +1,11 @@ --- layout: default group: release-notes -subgroup: +subgroup: Release Notes +title: Magento EE 2.0.3 Release Notes +menu_title: Magento EE 2.0.3 Release Notes +menu_order: 2 github_link: release-notes/ReleaseNotes2.0.3CE.md -redirect_from: ---

    Magento Community Edition 2.0.3

    diff --git a/guides/v2.0/release-notes/ReleaseNotes2.0.3EE.md b/guides/v2.0/release-notes/ReleaseNotes2.0.3EE.md index 6d7d07c329f..1c94dd29aa3 100644 --- a/guides/v2.0/release-notes/ReleaseNotes2.0.3EE.md +++ b/guides/v2.0/release-notes/ReleaseNotes2.0.3EE.md @@ -1,10 +1,11 @@ --- layout: default group: release-notes -subgroup: -title: +subgroup: Release Notes +title: Magento EE 2.0.3 Release Notes +menu_title: Magento EE 2.0.3 Release Notes +menu_order: 3 github_link: release-notes/ReleaseNotes2.0.3EE.md -redirect_from: ---

    Magento Enterprise Edition 2.0.3

    diff --git a/guides/v2.0/release-notes/ReleaseNotes2.0.4CE.md b/guides/v2.0/release-notes/ReleaseNotes2.0.4CE.md index b51b1cf44b8..a1f772c6ae8 100644 --- a/guides/v2.0/release-notes/ReleaseNotes2.0.4CE.md +++ b/guides/v2.0/release-notes/ReleaseNotes2.0.4CE.md @@ -2,11 +2,10 @@ layout: default group: release-notes subgroup: Release Notes -title: Release Notes -menu_title: Magento CE Release Notes -menu_order: 1 +title: Magento CE 2.0.4 Release Notes +menu_title: Magento CE 2.0.4 Release Notes +menu_order: 5 github_link: release-notes/ReleaseNotes2.0.4CE.md -redirect_from: ---

    Magento Community Edition 2.0.4

    diff --git a/guides/v2.0/release-notes/ReleaseNotes2.0.4EE.md b/guides/v2.0/release-notes/ReleaseNotes2.0.4EE.md index 1d80880345e..5edf81b3af7 100644 --- a/guides/v2.0/release-notes/ReleaseNotes2.0.4EE.md +++ b/guides/v2.0/release-notes/ReleaseNotes2.0.4EE.md @@ -2,11 +2,10 @@ layout: default group: release-notes subgroup: Release Notes -title: Release Notes -menu_title: Magento EE Release Notes -menu_order: 2 +title: Magento EE 2.0.4 Release Notes +menu_title: Magento EE 2.0.4 Release Notes +menu_order: 6 github_link: release-notes/ReleaseNotes2.0.4EE.md -redirect_from: ---

    Magento Enterprise Edition 2.0.4

    diff --git a/guides/v2.0/release-notes/ReleaseNotes2.0.5CE.md b/guides/v2.0/release-notes/ReleaseNotes2.0.5CE.md index 8b1fef2f53e..eb502e2ffc2 100644 --- a/guides/v2.0/release-notes/ReleaseNotes2.0.5CE.md +++ b/guides/v2.0/release-notes/ReleaseNotes2.0.5CE.md @@ -2,11 +2,10 @@ layout: default group: release-notes subgroup: Release Notes -title: Release Notes -menu_title: Magento CE Release Notes -menu_order: 1 +title: Magento CE 2.0.5 Release Notes +menu_title: Magento CE 2.0.5 Release Notes +menu_order: 9 github_link: release-notes/ReleaseNotes2.0.5CE.md -redirect_from: ---

    Magento Community Edition 2.0.5

    diff --git a/guides/v2.0/release-notes/ReleaseNotes2.0.5EE.md b/guides/v2.0/release-notes/ReleaseNotes2.0.5EE.md index 6188b1915db..5600ca256f4 100644 --- a/guides/v2.0/release-notes/ReleaseNotes2.0.5EE.md +++ b/guides/v2.0/release-notes/ReleaseNotes2.0.5EE.md @@ -2,11 +2,10 @@ layout: default group: release-notes subgroup: Release Notes -title: Release Notes -menu_title: Magento EE Release Notes -menu_order: 2 +title: Magento EE 2.0.5 Release Notes +menu_title: Magento EE 2.0.5 Release Notes +menu_order: 10 github_link: release-notes/ReleaseNotes2.0.5EE.md -redirect_from: ---

    Magento Enterprise Edition 2.0.5

    diff --git a/guides/v2.0/release-notes/changes.md b/guides/v2.0/release-notes/changes.md deleted file mode 100644 index 932bc36bc68..00000000000 --- a/guides/v2.0/release-notes/changes.md +++ /dev/null @@ -1,194 +0,0 @@ ---- -layout: default -group: -title: -menu_title: Changes in this release -github_link: release-notes/changes.md -redirect_from: /guides/v1.0/release-notes/changes.html ---- - -

    Contents

    - - - - - -* Unit tests now located in module directories -* Updating to version 0.42.0-beta11 or later from beta10 or earlier -* Magento sample data is available only if you update composer.json -* Improvements to the Magento Admin and Setup Wizard -* Changes to the Magento framework -* Miscellaneous changes - -

    Unit tests now located in module directories

    -For you to run PHPUnit-based tests, you must first run `/composer install` to download the PHPUnit component and create the `vendor/bin/phpunit` executable. - -This way, you no longer have to download PHPUnit for your operating system; you can use the one provided with Magento instead. - -See the following sections for more information: - -* Relocate unit test code -* Run unit tests - -

    Relocate unit test code

    -Code for unit tests must be located in a directory named `Test/Unit` in the module's directory structure. A sample follows: - - __/ - |__/app/code/Magento/Catalog - |__/Controller - |__/Model - |__/Test - |__/Unit - | |-- SomeUnitTest.php - -To transition your existing tests to using the new directories, we recommend the following: - -1. Resolve any conflicts between your working branch and the master or develop branch. -2. Refactor your tests by moving them to the directories. - - Be sure to update the namespace of the test. - -3. Fix any references to the `TestFramework` files because they moved from `Magento\TestFramework\` to `Magento\Framework\TestFramework\Unit\` - -4. Fix any references to classes that were in the same namespace as your tests. - - Because the test namespace changed, you must add an alias for the old namespace. - -

    Run unit tests

    -To run *all* unit tests, enter the following commands in the order shown: - - cd /dev/Test/Unit - ../../../vendor/bin/phpunit . - - cd /dev/Test/Integration - ../../../vendor/bin/phpunit . - - -* This should automatically discover any tests as defined by that phpunit configuration file (which might in turn refer to a test suite implementation) -* That test suite implementation searches for corresponding tests in known component locations - -To run *individual* tests, enter the following commands in the order shown: - - cd - ../bin/phpunit Tests // run defined component tests - - cd /app/code/Magento/Catalog/Test/Integration - ../../../../../../vendor/bin/phpunit . // run integration tests defined for the Magento_Catalog module - - -

    Updating to version 0.42.0-beta11 or later from beta10 or earlier

    -This change applies to the following situation only: - -* You currently have version 0.42.0-beta10 or earlier -* You're updating to version 0.42.0-beta11 or later - -
    -

    As a result of this change, you must first uninstall the Magento software and then reinstall it.

    -
    -{% include install/versionbeta10upgr.html %} - -For details, see Updating to version 0.42.0-beta11 or later from beta10 or earlier - -

    Magento sample data is available only if you update composer.json

    - -To install the optional Magento 2 sample data, you must update `composer.json`, run `composer update`, and run the Magento 2 installer to update the database. - -
    - -

    Magento 2 versions 0.42.0-beta10 and later require you to install only one sample data package instead of two. This package is currently named "magento/sample-data": "0.42.0-beta10". Be sure to confirm the current version at packages.magento.com.

    -

    If you're installing sample data for an earlier version, see Sample data for earlier Magento versions.

    -
    - -See Enable optional Magento sample data. - -

    Improvements to the Magento Admin and Setup Wizard

    -* You can enable or disable modules when you install the Magento 2 software using either the Setup Wizard or command line. -* Compressed and resized images -* Added new base styles for the Admin re-design -* Added WAI-ARIA attributes are to the Search Autocomplete on the storefront -* Added visual style for the 'skip to content' attribute on the storefront -* Fixed the style of persistent login messages on the storefront for all themes -* Fixed the style of scrolling for Categories with long names in the Admin -* Fixed the "css/print.css" file path on the storefront pages for all themes - * You can enable or disable modules during installation using either the CLI install or the Setup Wizard. -* Added WAI-ARIA attributes to: - * Storefront Layered Navigation - * Customer Dropdown - * Storefront Product Page Tabs - * Storefront Cart Summary collapsible panels - * Storefront forms and notifications - * Storefront Checkout pages - * Category page product item - * Related products -* Updated the design of Enable Cookies CMS page -* Utilized Magento error handler in the Setup application to convert errors and warnings to exceptions - -

    Changes to the Magento framework

    -* Eliminated remnants of the `Magento_Core` module: - * Moved Application Emulation from the `Magento_Core` module to the `Magento_Store` module - * Moved Validator Factory from the `Magento_Core` module to the Magento Framework - * Added a new `Magento_MediaStorage` module to store components of the `Magento_Core` module -* Renamed `Magento\Framework\Controller\Result\JSON` to meet PSR standard -* Version used in SOAP declarations is now taken from routes declared in `webapi.xml` -* Moved/refactored the `Magento\IO\Sftp` adapter into the Filesystem library -* Replaced `Zend_Locale` with native PHP implementation -* Replaced `Zend_Date` with native PHP `DateTime` object/functions -* Removed the Magento IO library -* Implemented Extensible Attributes generation -* Moved Specific Helper Components From `Magento/Core` to `Magento/Framework` -* Replaced `\Magento\Framework\Model\Exception` with `LocalizedException` -* Configuration components moved to new `Magento_Config` module -* Variables components are moved to new `Magento_Variable` module -* Preferences, shared instance creation and compiled factory accelerated by 3% -* Fixed "HEADERS ALREADY SENT" error when controller action outputs directly -* Layout Models are moved from Core module to appropriate modules -* View components are moved from Core to Theme module -* Rest of theme related configuration files are refactored -* `StoreManagerInterface` is moved from `Framework` to `App` directory -* ZF1 controller libraries are updated -* HTML response minified -* Added `setCustomAttribute` and `setCustomAttributes` methods to `ExtensibleDataInterface` -* Added setter methods to data object interfaces -* Replaced builders with factories -* Added `DataObjectHelper.php`, which contains the common set of methods of all builders -* Refactored `__()` to return `Phrase` object -* Allowed usage of `LocalizedException` on the framework's library level -* Added expiration/lifetime management of storefront resources -* Unified Magento Test Framework configurations format for Framework, TestCase variations and TestCase scenario configurations -* JavaScript test suites divided into `frontend`, `adminhtml`, and `lib` suites -* Implemented image compression on server side upload -* Implemented storefront page resources sorting -* Removed the magic `__call` method usage in templates -* Introduced Jasmine + PhantomJS JavaScript testing infrastructure -* Refactored and covered with tests the classes with a Change Risk Anti-Patterns index value of more than 50 -* Moved Theme Management changes, Design changes, Design\Backend modules, and Observer components from the Core module to the Theme module -* Moved Debug Hints models from the Core module to the newly added Developer module -* Moved URL components, Factory, and EntityFactory from the Core module to the Magento Framework - -

    Miscellaneous changes

    -* Eliminate inline JavaScript code -* Fixed cross-site scripting vulnerability issues -* Addressed naming inconsistencies in REST routes -* Refactored Catalog and related modules to use mutable data object interfaces -* Refactored Sales and related modules to use mutable data interfaces -* Added client-side LESS files compilation to reduce page load time in developer mode -* Adding items to a cart no longer causes a page reload because it's now an Ajax call -* Existing Builders were replaced with DataFactories in Customer and Tax modules -* Refactored controller actions in the Checkout and CMS modules -* Increased coverage with static tests for `.phtml` files -* Moved Cookie related functionality from `Theme` and `Core` modules to a new `Cookie` module -* Moved minfication configuration settings to the `View` library level - Added Varnish 4 support -* Added CSS minification -* Implemented caching for WebAPI configuration -* Refactored controller actions in the `Sales` module -* Refactored controller actions in the `Customer` module -* Refactored API code for the `CheckoutAgreements` module -* Refactored API code for the `GiftMessage` module -* Refactored API for the `Checkout `module -* Implemented `SalesRule` as a standalone Magento module -* Performed custom EAV entities code and DB tables cleanup - -* Added PHPMD and PHPCS annotations to the code base -* Removed the ability to process online payments \ No newline at end of file diff --git a/guides/v2.0/release-notes/community.md b/guides/v2.0/release-notes/community.md deleted file mode 100644 index 37303995563..00000000000 --- a/guides/v2.0/release-notes/community.md +++ /dev/null @@ -1,92 +0,0 @@ ---- -layout: default -group: -title: Release Notes -menu_title: Community requests -menu_node: -menu_order: 9 -github_link: release-notes/community.md -redirect_from: /guides/v1.0/release-notes/community.html ---- - -

    Community requests

    -We thank the Magento community for suggesting the following: - -* [#533] (https://github.com/magento/magento2/issues/533) -- Remove Allow all access in .htaccess -* [#850] (https://github.com/magento/magento2/issues/850) -- HTML Profiler and pub/static Resources -* [#919] (https://github.com/magento/magento2/issues/919) -- System information error when error is fixed but page wasn't refreshed -* [#987] (https://github.com/magento/magento2/pull/987) -- Fix mod_expires for dynamic content -* [#1004] (https://github.com/magento/magento2/issues/1004) -- Problem with template luma -* [#1014] (https://github.com/magento/magento2/issues/1014) -- php index.php update - Class Magento\Store\Model\StoreManagerInterface does not exist -* [#1015] (https://github.com/magento/magento2/issues/1015) -- After success setup/index.php update - "Missing required argument $engines of Magento\Framework\View\TemplateEngineFactory" -* [#1016] (https://github.com/magento/magento2/issues/1016) -- Backend JavaScript Errors (new installation) -* [#1020] (https://github.com/magento/magento2/issues/1020) -- Bug generating Sitemap Cron expression -* [#1029] (https://github.com/magento/magento2/issues/1029) -- Admin dashboard Most Viewed Products Tab issue (without product list) -* [#1035] (https://github.com/magento/magento2/issues/1035) -- Bug in Magento\Framework\Simplexml\Element::appendChild -* [#1042] (https://github.com/magento/magento2/issues/1042) -- Lost catalog rewrite url after page/list-mode/limit changed -* [#1045] (https://github.com/magento/magento2/issues/1045) -- Bad rendering frontend category menu -* [#1048] (https://github.com/magento/magento2/pull/1048) -- Make possible to upload SVG logo by admin -* [#1052] (https://github.com/magento/magento2/pull/1052) -- Fix history cleanup for missed cron jobs -* [#1062] (https://github.com/magento/magento2/pull/1062) -- Add check to see if PHP > 5.6 and always_populate_raw_post_data = -1 -* [#1082] (https://github.com/magento/magento2/pull/1082) -- Fix incorrect variable name ($schema -> $scheme) -* [#1086] (https://github.com/magento/magento2/issues/1086) -- Email message containing non English character is displayed incorrectly on the receiver -* [#1088] (https://github.com/magento/magento2/pull/1088) -- Add developer mode example to .htaccess -* [#1107] (https://github.com/magento/magento2/issues/1107) -- Serious security issue in Customer Address edit section -* [#899](https://github.com/magento/magento2/issues/899)—When accessing any category - error report generated -* [#986](https://github.com/magento/magento2/pull/986)—Make it possible to exclude classes (directories) for compilation -* [#1054](https://github.com/magento/magento2/pull/1054)—Fix typo in MAGE_MODE -* [#1035](https://github.com/magento/magento2/issues/1035)—Bug in Magento\Framework\Simplexml\Element::appendChild -* [#1053](https://github.com/magento/magento2/issues/1053)—#865: add getParams/setParam to RequestInterface -* [#1066](https://github.com/magento/magento2/issues/1066)—Cannot install Magento 2 on Ubuntu when using PHP 5.5.16-1+deb.sury.org~precise+1 -* [#1027](https://github.com/magento/magento2/issues/1027)—Can't add new subcategory -* [#921](https://github.com/magento/magento2/issues/921)—Change resource ids from Magento_Adminhtml::* to Magento_Backend -* [#790](https://github.com/magento/magento2/issues/790)—Magento API fails in a CGI env (zf1 issue) -* [#909](https://github.com/magento/magento2/issues/909)—Manage Titles in popup window front-end issue -* [#996](https://github.com/magento/magento2/issues/996)—Pager block should support url "fragment". -* [#985](https://github.com/magento/magento2/pull/985)—Allow camel case in vendorname for menus -* [#1025](https://github.com/magento/magento2/pull/1025)—Wrong parameter for getting base url for 'media' path in "Image" form element. -* [#593](https://github.com/magento/magento2/issues/593)—Allow to use "0" as customer group -* [#804](https://github.com/magento/magento2/issues/804)—Comment about VAT number displayed under different field in Customer Configuration -* [#963](https://github.com/magento/magento2/pull/963)—Default Accept header -* [#995](https://github.com/magento/magento2/pull/995)—Prevent a warning in activated developer mode when 'plugins' is no array -* [#866](https://github.com/magento/magento2/issues/866)—Configurable product attribute scope -* [#965](https://github.com/magento/magento2/pull/965)—extra tests for current interception behavior -* [#979](https://github.com/magento/magento2/pull/979)—Adding OSL license file name -* [#978](https://github.com/magento/magento2/pull/978)—Added ignore rule for media assets in WYSIWYG directory -* [#877](https://github.com/magento/magento2/pull/877)—Made Topmenu HTML Editable -* [#906](https://github.com/magento/magento2/pull/906)—Add tests for View\Layout\Reader\Block and slight refactoring -* [#682](https://github.com/magento/magento2/issues/682)—\Magento\Framework\Pricing\PriceCurrencyInterface depends on Magento application code -* [#581](https://github.com/magento/magento2/issues/581)—About ByPercent.php under different currencies -* [#964](https://github.com/magento/magento2/pull/964)—Improving documentation for jMeter performance tests -* [#871](https://github.com/magento/magento2/issues/871)—Replace Symfony2/Yaml in composer -* [#990](https://github.com/magento/magento2/pull/990)—add @see annotation before class to make it recognizable by IDE -* [#988](https://github.com/magento/magento2/pull/988)—Prevent Varnish from creating cache variations of static files -* [#792](https://github.com/magento/magento2/issues/792)—Failed to set ini option "session.save_path" to value -* [#796](https://github.com/magento/magento2/issues/796)—install.log cannot be created with open_basedir restriction -* [#823](https://github.com/magento/magento2/issues/823)—Installation bug -* [#920](https://github.com/magento/magento2/issues/920)—"web setup wizard is not accessible" error message but the setup wizard is actually accessible -* [#829](https://github.com/magento/magento2/issues/829)—[API] OAuth1.0 request token request failing / Consumer key has expired -* [#658](https://github.com/magento/magento2/issues/658)—Inline translate malfunctioning -* [#950](https://github.com/magento/magento2/pull/950)—Fix for the missed trailing end of line in indexer.php usage help text -* [#932](https://github.com/magento/magento2/pull/932)—Migration tool - not all input has comments -* [#959](https://github.com/magento/magento2/pull/959)—Replace UTF8 'en dash' with minus in error message -* [#911](https://github.com/magento/magento2/pull/911)—Fix test assertion and slight cleanup refactoring -* [#936](https://github.com/magento/magento2/pull/936)—Bugfix for regions with single quote in name -* [#902](https://github.com/magento/magento2/pull/902)—Add integration test for View\Page\Config\Reader\Html -* [#925](https://github.com/magento/magento2/pull/925)—Failed test due to Class not following the naming conventions -* [#943](https://github.com/magento/magento2/pull/943)—magento2-925 Failed Test due to Class not following the naming conventions -* [#968](https://github.com/magento/magento2/pull/968)—Apply pattern matching datasource config files -* [#949](https://github.com/magento/magento2/pull/949)—Added 'status' command for cache cli script / Also improved readability -* [#876](https://github.com/magento/magento2/pull/876)—[BUGFIX] Fixed German translation "Warenkorbrn" -* [#880](https://github.com/magento/magento2/pull/880)—Naming fix in DI compiler.php - rename binary to isbinary to stay consistent -* [#913](https://github.com/magento/magento2/pull/913)—Specify date fixture and fix expectations -* [#874](https://github.com/magento/magento2/pull/874)—Prevent special characters finding their way into layout handle due to SKU being used -* [#903](https://github.com/magento/magento2/pull/903)—Small cleanup refactoring -* [#905](https://github.com/magento/magento2/pull/905), [#907](https://github.com/magento/magento2/pull/907), [#908](https://github.com/magento/magento2/pull/908)—Change interpret() return value to conform with Layout\ReaderInterface -* [#913](https://github.com/magento/magento2/pull/913)—Specify date fixture and fix expectations -* [#853](https://github.com/magento/magento2/pull/853)—Fix spelling error in Customer module xml -* [#858](https://github.com/magento/magento2/pull/858)—Clicking CMS page in the Magento Admin takes you to the dashboard -* [#858](https://github.com/magento/magento2/issues/816)—Clicking CMS page takes you to the dashboard -* [#859](https://github.com/magento/magento2/pull/859)—Fix email template creation date not being persisted -* [#860](https://github.com/magento/magento2/pull/860)—Fix currency and price renderer -* [#683](https://github.com/magento/magento2/pull/683)—CMS Router not routing correctly From 99b6caf505e9f8f52767812aff92560f6cb17031 Mon Sep 17 00:00:00 2001 From: James Calcaben Date: Fri, 22 Apr 2016 15:15:36 -0500 Subject: [PATCH 777/902] Fix the search box bug The cause of the bug is from the use of the searchResultsState cookie. When a search is initiated, the cookie is enabled. There was logic in the code that called the function to show the search results box when the cookie was set. So when a search result was clicked and it opened up a new window, the cookie was never reset and an empty search result box was displayed in the new window. This bug only happened sporadically because the cookie was unique per section. For example, if you did a search and you were in the architecture section, if you clicked on a search result that was in the same section, you would see this bug. Otherwise, you would not. Changes in this commit involved removing the check for the cookie since it didn't really do anything except cause the bug. Code has been cleaned up some by moving initialization code under the document ready function and moving the functions outside of it. --- common/js/devdocs.js | 101 ++++++++++++++++++++++--------------------- 1 file changed, 52 insertions(+), 49 deletions(-) diff --git a/common/js/devdocs.js b/common/js/devdocs.js index 3447559fad2..15573a99005 100644 --- a/common/js/devdocs.js +++ b/common/js/devdocs.js @@ -1,12 +1,6 @@ -$(function() { - - if ($.cookie('searchResultsState') ==1) { - //show search results page +$(document).ready(function(){ + if(getURLParameter("cx")) showSearchBox(); - } else { - $.cookie('searchResultsState', '0'); - hideSearchBox(); - } $('#searchbox').submit(function(event) { showSearchBox(); @@ -24,56 +18,65 @@ $(function() { hideSearchBox(); }); - function showSearchBox () { - - $('#searchResultsBox').fadeIn(300, function () { - // Callback function that focuses on input - $('#searchResultsBox input.gsc-input').first().focus(); - }); - $('.searchResultsBack').fadeIn(300); - $.cookie('searchResultsState', '1'); - $('body').addClass('search-active'); - + // ** Menu ** + var menustate =""; + if ( $('LI.level3Child').is("LI.active")) { + menustate = $('LI.active').attr('data-menunode'); + $('#' + menustate).show(); //show parent + $('#' + menustate).removeClass('caretRight').addClass('caretDown') //submenu open indication + $('.' + menustate).show(); //show submenu } - function hideSearchBox () { + var thirdTier = ""; + $('.level3Parent').click(function(){ + thirdTier = $(this).attr('id'); + if($('.' + thirdTier).is(":visible")) { + $(this).removeClass('caretDown').addClass('caretRight') + $('.' + thirdTier).slideUp(200); + } else { + $(this).removeClass('caretRight').addClass('caretDown') + $('.' + thirdTier).slideDown(200); + } + return false; + }); - $('#searchResultsBox').fadeOut(300, function () { - // Callback function that focuses out of input - $('#searchResultsBox input.gsc-input').first().blur(); - }); - $('.searchResultsBack').fadeOut(300); - $.cookie('searchResultsState','0'); +}); - $('body').removeClass('search-active'); +//Function to get URL parameter values +function getURLParameter(sParam) { + var sPageURL = window.location.search.substring(1); + var sURLVariables = sPageURL.split('&'); + for (var i = 0; i < sURLVariables.length; i++) + { + var sParameterName = sURLVariables[i].split('='); + if (sParameterName[0] == sParam) + { + return sParameterName[1]; + } + } +} - } +function showSearchBox () { + $('#searchResultsBox').fadeIn(300, function () { + // Callback function that focuses on input + $('#searchResultsBox input.gsc-input').first().focus(); + }); + $('.searchResultsBack').fadeIn(300); + $.cookie('searchResultsState', '1'); + $('body').addClass('search-active'); -// ** Menu ** -var menustate =""; -if ( $('LI.level3Child').is("LI.active")) { - menustate = $('LI.active').attr('data-menunode'); - $('#' + menustate).show(); //show parent - $('#' + menustate).removeClass('caretRight').addClass('caretDown') //submenu open indication - $('.' + menustate).show(); //show submenu } +function hideSearchBox () { + $('#searchResultsBox').fadeOut(300, function () { + // Callback function that focuses out of input + $('#searchResultsBox input.gsc-input').first().blur(); + }); + $('.searchResultsBack').fadeOut(300); + $.cookie('searchResultsState','0'); -var thirdTier = ""; -$('.level3Parent').click(function(){ -thirdTier = $(this).attr('id'); -if($('.' + thirdTier).is(":visible")) { - $(this).removeClass('caretDown').addClass('caretRight') - $('.' + thirdTier).slideUp(200); - } else { - $(this).removeClass('caretRight').addClass('caretDown') - $('.' + thirdTier).slideDown(200); - } -return false; -}); - - + $('body').removeClass('search-active'); -}); //end devdocs +} From bd500c14cb6b31767d0268e1e31e0a0014f310a3 Mon Sep 17 00:00:00 2001 From: James Calcaben Date: Fri, 22 Apr 2016 15:43:33 -0500 Subject: [PATCH 778/902] Remove incorrect information about using Mage::getModel --- .../ext-best-practices/extension-coding/working-with-arch-bp.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guides/v2.0/ext-best-practices/extension-coding/working-with-arch-bp.md b/guides/v2.0/ext-best-practices/extension-coding/working-with-arch-bp.md index 0ead3eabbb6..2a52692ad6a 100644 --- a/guides/v2.0/ext-best-practices/extension-coding/working-with-arch-bp.md +++ b/guides/v2.0/ext-best-practices/extension-coding/working-with-arch-bp.md @@ -45,7 +45,7 @@ In addition to understanding fundamental programming designs/concepts, you are e - Instead of adding conditions directly to a collection's select object, use Magento native collection's method addFieldToFilter(field_name, field_value). ### Use Dependency Injection - Direct class instantiation is not recommended because the class can be rewritten. If the class is created directly, any rewrites will not be applied and it breaks Magento's class rewrite capability. We encourage you to use the `Mage::getModel` method or [dependency injection]({{ site.gdeurl }}extension-dev-guide/depend-inj.html) to get an instance of a class. + Direct class instantiation is not recommended because the class can be rewritten. If the class is created directly, any rewrites will not be applied and it breaks Magento's class rewrite capability. We encourage you to become familiar with how we use [dependency injection]({{ site.gdeurl }}extension-dev-guide/depend-inj.html) to get an instance of a class. ### Follow Model-View-Control (MVC) Pattern Make sure your extension adheres to the MVC Pattern, and that it does not violate any of its principles. From 1155b5f5ae02dd7823da6fca9918ae0ee1bff4e7 Mon Sep 17 00:00:00 2001 From: James Calcaben Date: Fri, 22 Apr 2016 16:57:13 -0500 Subject: [PATCH 779/902] Revise the content about using low-level functionality --- .../extension-coding/security-performance-data-bp.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/guides/v2.0/ext-best-practices/extension-coding/security-performance-data-bp.md b/guides/v2.0/ext-best-practices/extension-coding/security-performance-data-bp.md index 33803687665..69f1260b4f1 100644 --- a/guides/v2.0/ext-best-practices/extension-coding/security-performance-data-bp.md +++ b/guides/v2.0/ext-best-practices/extension-coding/security-performance-data-bp.md @@ -23,7 +23,9 @@ You should make sure that your extension handles data with care in order to prev --- ### Avoid Using Low-Level Functionality - Be sure not to use low-level functionality that is explicitly prohibited by the framework or specification under which the software is supposed to operate. The use of low-level functionality can violate the specification in unexpected ways that effectively disable built-in protection mechanisms, introduce exploitable inconsistencies, or otherwise expose the functionality to attack. + The Magento application is made up of a variety of components that work together to perform different business functions. We discourage the use of low-level functionality such as the PHP `curl_*` functions and encourage the use of high-level components such as [`\Magento\Framework\HTTP\Adapter\Curl`]({{site.mage2000url}}lib/internal/Magento/Framework/HTTP/Adapter/Curl.php). The use of low-level functionality can make Magento behave in unexpected ways that effectively disable built-in protection mechanisms, introduce exploitable inconsistencies, or otherwise expose the application to attack. + + For a list of discouraged low-level functions, we suggest you look at the [list of forbidden functions](https://github.com/magento-ecg/coding-standard/blob/master/Ecg/Sniffs/Security/ForbiddenFunctionSniff.php){:target="_blank"} for [Magento's code sniffer](https://github.com/magento-ecg/coding-standard){:target="_blank"}. ### Use Wrappers Instead of Superglobal Variables Make sure that your Magento application uses Magento wrapper objects, and does not directly use PHP superglobals: From 48457e510fe8d6e994c3de4a35591f90e959575d Mon Sep 17 00:00:00 2001 From: Tyler Date: Sat, 23 Apr 2016 01:00:11 -0400 Subject: [PATCH 780/902] Correct grammar in theme-create.md --- guides/v2.0/frontend-dev-guide/themes/theme-create.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guides/v2.0/frontend-dev-guide/themes/theme-create.md b/guides/v2.0/frontend-dev-guide/themes/theme-create.md index 7166a2ca871..d67b2a01aaf 100644 --- a/guides/v2.0/frontend-dev-guide/themes/theme-create.md +++ b/guides/v2.0/frontend-dev-guide/themes/theme-create.md @@ -209,7 +209,7 @@ The necessity of declaration depends on whether your theme has a declare it in layout. +
  • if your logo image name or format is not default, you need to declare it in layout.
  • Your theme has a parent theme: From a0e91a2f470dfcbdee86af9d5b3523dc8187ffb0 Mon Sep 17 00:00:00 2001 From: deepanshu27193 Date: Sat, 23 Apr 2016 12:18:02 +0530 Subject: [PATCH 781/902] Some Typo Mistake --- guides/v2.0/rest/anonymous-api-security.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guides/v2.0/rest/anonymous-api-security.md b/guides/v2.0/rest/anonymous-api-security.md index 80ee99e8a3c..051561aa98a 100644 --- a/guides/v2.0/rest/anonymous-api-security.md +++ b/guides/v2.0/rest/anonymous-api-security.md @@ -53,7 +53,7 @@ The following table lists the APIs that are no longer available to an anonymous

    Preventing anonymous access to these APIs could cause third-party integrations to fail. If a third-party integration calls any of these web APIs, it will receive an authentication error instead of the expected response. In this case, you might need to disable this feature.

    -

    To disable this feature, log in to the Admin panel and navigate to System > Configuration > Services > Magento Web API. Then select Yes from the Allow Anonymous Guest Access menu.

    +

    To disable this feature, log in to the Admin panel and navigate to Stores > Configuration > Services > Magento Web API > Web API Security. Then select Yes from the Allow Anonymous Guest Access menu.

    From dd45ec5e0074e21805fc97a2455721fe42a29aa4 Mon Sep 17 00:00:00 2001 From: Ryan Fowler Date: Sun, 24 Apr 2016 01:37:28 -0700 Subject: [PATCH 782/902] Update to bio page In general, it's not recommended to switch person perspectives in the same paragraph in the English language. It's best to choose one and stick with it consistently. As I read this, it wasn't clear to me which context was intended. If the intent was to speak to the reader, then using second person pronouns consistently would be desirable. If the intent was third person, then using Classy Llama throughout would be desirable. Either way, switching between within the same paragraph doesn't reflect kindly on the company. I have edited the paragraph to be in first person context...but if it's more desirable to speak to the reader, then modifying the text accordingly would be appropriate. My intentions are only to assist in a positive reflection upon Classy Llama. Thank you --- guides/v2.0/howdoi/howdoi_bios.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guides/v2.0/howdoi/howdoi_bios.md b/guides/v2.0/howdoi/howdoi_bios.md index 5c40b3b72ed..7339142c118 100644 --- a/guides/v2.0/howdoi/howdoi_bios.md +++ b/guides/v2.0/howdoi/howdoi_bios.md @@ -13,7 +13,7 @@ Thanks so much to the following community members, partners, and Magento fans wh | Contributor name and image | Bio and Magento Creds | |---|---| -| Classy Llama | When it comes down to it, Classy Llama offers only one service: helping eCommerce merchants succeed. As a full-service agency, they have the tools to help you build, grow, and support your Magento site. Every engagement with Classy Llama is as unique as the needs of the businesses we serve. With more than 100 Magento sites and 350 customizations and integrations under their belt, they know what it takes to create a great eCommerce experience. They pair high-efficiency, high-visibility processes with dedicated teams and some of the best developers in the world. Outside of Magento itself, the Classy Llama team was one of the biggest contributors of code to the new platform. Contact them to learn how they can help your business grow. | +| Classy Llama | When it comes down to it, we offer only one service: helping eCommerce merchants succeed. As a full-service agency, we have the tools to help merchants build, grow, and support their Magento site. Every engagement with us is as unique as the needs of the businesses we serve. With more than 100 Magento sites and 350 customizations and integrations under our belt, we know what it takes to create a great eCommerce experience. We pair high-efficiency, high-visibility processes with dedicated teams and some of the best developers in the world. Outside of Magento itself, our team was one of the biggest contributors of code to the new platform. Contact us to learn how we can help a business grow. | | [Vinai Kopp](http://vinaikopp.com/blog/list) | A web developer for most of his life, Vinai has specialized in Magento since 2008. He started training Magento developers in 2010 and became a certified Magento U trainer in 2011. Besides work, he loves learning and the Magento community, two things that go together very well. He is passionate about software craftsmanship and producing high quality solutions. | From a85fe3f5766f542d4a2bf0eea4f9c1218d5ff561 Mon Sep 17 00:00:00 2001 From: Javier Eguiluz Date: Mon, 25 Apr 2016 10:13:22 +0200 Subject: [PATCH 783/902] Added the case when the installation hangs while loading data This just happened to me while installing Magento. I found the solution here: http://magento.stackexchange.com/questions/92976/installation-hangs-while-installing-data --- .../install-gde/trouble/tshoot_sample-data.md | 43 +++++++++++++------ 1 file changed, 31 insertions(+), 12 deletions(-) diff --git a/guides/v2.0/install-gde/trouble/tshoot_sample-data.md b/guides/v2.0/install-gde/trouble/tshoot_sample-data.md index 1afeaaefa68..30267b6cc58 100644 --- a/guides/v2.0/install-gde/trouble/tshoot_sample-data.md +++ b/guides/v2.0/install-gde/trouble/tshoot_sample-data.md @@ -12,45 +12,64 @@ github_link: install-gde/trouble/tshoot_sample-data.md

    Errors installing optional sample data

    ### Symptom + Error in the console log during sample data installation using the Setup Wizard: - Module 'Magento_CatalogRuleSampleData': - [ERROR] exception 'Magento\Framework\Exception\LocalizedException' with message 'Can't create directory /var/www/html/magento2/var/generation/Magento/CatalogRule/Model/.' in /var/www/html/magento2/lib/internal/Magento/Framework/Code/Generator.php:103 + Module 'Magento_CatalogRuleSampleData': + [ERROR] exception 'Magento\Framework\Exception\LocalizedException' with message 'Can't create directory /var/www/html/magento2/var/generation/Magento/CatalogRule/Model/.' in /var/www/html/magento2/lib/internal/Magento/Framework/Code/Generator.php:103 - (more) + (more) - Next exception 'ReflectionException' with message 'Class Magento\CatalogRule\Model\RuleFactory does not exist' in /var/www/html/magento2/lib/internal/Magento/Framework/Code/Reader/ClassReader.php:29 + Next exception 'ReflectionException' with message 'Class Magento\CatalogRule\Model\RuleFactory does not exist' in /var/www/html/magento2/lib/internal/Magento/Framework/Code/Reader/ClassReader.php:29 - (more) + (more) These exceptions result from file system permissions settings. #### Solution + Set file system ownership and permissions again as a user with `root` privileges. ### Symptom During installation of optional sample data, a message similar to the following displays: - PHP Fatal error: Call to undefined method Magento\Catalog\Model\Resource\Product\Interceptor::getWriteConnection() in /var/www/magento2/app/code/Magento/SampleData/Module/Catalog/Setup/Product/Gallery.php on line 144 + PHP Fatal error: Call to undefined method Magento\Catalog\Model\Resource\Product\Interceptor::getWriteConnection() in /var/www/magento2/app/code/Magento/SampleData/Module/Catalog/Setup/Product/Gallery.php on line 144 #### Solution During sample data installation, disable SELinux using a resource such as: -* crypt.gen.nz -* CentOS documentation +* crypt.gen.nz +* CentOS documentation ### Symptom + Other errors display, such as: - [Magento\Setup\SampleDataException] Error during sample data installation: Class Magento\Sales\Model\Service\OrderFactory does not exist + [Magento\Setup\SampleDataException] Error during sample data installation: Class Magento\Sales\Model\Service\OrderFactory does not exist #### Solution There are known issues with using sample data with the Magento 2 develop branch. Use the master branch instead. You can switch to the master branch as follows: - cd - git checkout master - git pull origin master + cd + git checkout master + git pull origin master + +### Symptom + +The installation hangs before the sample data installation finishes: + + (more) + + Module 'Magento_CustomerSampleData': + Installing data... + + (the installation doesn't continue) + +This error occurs when the maximum execution time of your PHP scripts is lower than the time it takes to load the sample data (which can be a lot of time). + +#### Solution +Increase the maximum execution time of your PHP scripts temporarily setting the `max_execution_time` PHP directive to a high value (e.g. `max_execution_time = 600` for 10 minutes). From 2d084f7f0be89ab0f9d31af0d32c3c33ed8e6b92 Mon Sep 17 00:00:00 2001 From: Javier Eguiluz Date: Mon, 25 Apr 2016 10:15:00 +0200 Subject: [PATCH 784/902] Restored the tabs as indentation characters --- .../install-gde/trouble/tshoot_sample-data.md | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/guides/v2.0/install-gde/trouble/tshoot_sample-data.md b/guides/v2.0/install-gde/trouble/tshoot_sample-data.md index 30267b6cc58..587fa5820c3 100644 --- a/guides/v2.0/install-gde/trouble/tshoot_sample-data.md +++ b/guides/v2.0/install-gde/trouble/tshoot_sample-data.md @@ -15,14 +15,14 @@ github_link: install-gde/trouble/tshoot_sample-data.md Error in the console log during sample data installation using the Setup Wizard: - Module 'Magento_CatalogRuleSampleData': - [ERROR] exception 'Magento\Framework\Exception\LocalizedException' with message 'Can't create directory /var/www/html/magento2/var/generation/Magento/CatalogRule/Model/.' in /var/www/html/magento2/lib/internal/Magento/Framework/Code/Generator.php:103 + Module 'Magento_CatalogRuleSampleData': + [ERROR] exception 'Magento\Framework\Exception\LocalizedException' with message 'Can't create directory /var/www/html/magento2/var/generation/Magento/CatalogRule/Model/.' in /var/www/html/magento2/lib/internal/Magento/Framework/Code/Generator.php:103 - (more) + (more) - Next exception 'ReflectionException' with message 'Class Magento\CatalogRule\Model\RuleFactory does not exist' in /var/www/html/magento2/lib/internal/Magento/Framework/Code/Reader/ClassReader.php:29 + Next exception 'ReflectionException' with message 'Class Magento\CatalogRule\Model\RuleFactory does not exist' in /var/www/html/magento2/lib/internal/Magento/Framework/Code/Reader/ClassReader.php:29 - (more) + (more) These exceptions result from file system permissions settings. @@ -34,7 +34,7 @@ These exceptions result from file system permissions settings. During installation of optional sample data, a message similar to the following displays: - PHP Fatal error: Call to undefined method Magento\Catalog\Model\Resource\Product\Interceptor::getWriteConnection() in /var/www/magento2/app/code/Magento/SampleData/Module/Catalog/Setup/Product/Gallery.php on line 144 + PHP Fatal error: Call to undefined method Magento\Catalog\Model\Resource\Product\Interceptor::getWriteConnection() in /var/www/magento2/app/code/Magento/SampleData/Module/Catalog/Setup/Product/Gallery.php on line 144 #### Solution @@ -47,26 +47,26 @@ During sample data installation, disable SELinux using a resource such as: Other errors display, such as: - [Magento\Setup\SampleDataException] Error during sample data installation: Class Magento\Sales\Model\Service\OrderFactory does not exist + [Magento\Setup\SampleDataException] Error during sample data installation: Class Magento\Sales\Model\Service\OrderFactory does not exist #### Solution There are known issues with using sample data with the Magento 2 develop branch. Use the master branch instead. You can switch to the master branch as follows: - cd - git checkout master - git pull origin master + cd + git checkout master + git pull origin master ### Symptom The installation hangs before the sample data installation finishes: - (more) + (more) - Module 'Magento_CustomerSampleData': - Installing data... + Module 'Magento_CustomerSampleData': + Installing data... - (the installation doesn't continue) + (the installation doesn't continue) This error occurs when the maximum execution time of your PHP scripts is lower than the time it takes to load the sample data (which can be a lot of time). From a88f6beccc9b2b520c27578ab47d98eaf28d5b67 Mon Sep 17 00:00:00 2001 From: Javier Eguiluz Date: Mon, 25 Apr 2016 10:15:55 +0200 Subject: [PATCH 785/902] Reverted more unrelated changes --- guides/v2.0/install-gde/trouble/tshoot_sample-data.md | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/guides/v2.0/install-gde/trouble/tshoot_sample-data.md b/guides/v2.0/install-gde/trouble/tshoot_sample-data.md index 587fa5820c3..7203e63ca11 100644 --- a/guides/v2.0/install-gde/trouble/tshoot_sample-data.md +++ b/guides/v2.0/install-gde/trouble/tshoot_sample-data.md @@ -12,7 +12,6 @@ github_link: install-gde/trouble/tshoot_sample-data.md

    Errors installing optional sample data

    ### Symptom - Error in the console log during sample data installation using the Setup Wizard: Module 'Magento_CatalogRuleSampleData': @@ -27,7 +26,6 @@ Error in the console log during sample data installation using the Setup Wizard: These exceptions result from file system permissions settings. #### Solution - Set file system ownership and permissions again as a user with `root` privileges. ### Symptom @@ -40,11 +38,10 @@ During installation of optional sample data, a message similar to the following During sample data installation, disable SELinux using a resource such as: -* crypt.gen.nz -* CentOS documentation +* crypt.gen.nz +* CentOS documentation ### Symptom - Other errors display, such as: [Magento\Setup\SampleDataException] Error during sample data installation: Class Magento\Sales\Model\Service\OrderFactory does not exist From 07ee34e3b94117d2ffcf558d083437797249117b Mon Sep 17 00:00:00 2001 From: Oleksandra Marchenko Date: Mon, 25 Apr 2016 14:39:08 +0300 Subject: [PATCH 786/902] added review comments --- guides/v2.0/frontend-dev-guide/layouts/xml-manage.md | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/guides/v2.0/frontend-dev-guide/layouts/xml-manage.md b/guides/v2.0/frontend-dev-guide/layouts/xml-manage.md index da33437987c..d61517236ef 100644 --- a/guides/v2.0/frontend-dev-guide/layouts/xml-manage.md +++ b/guides/v2.0/frontend-dev-guide/layouts/xml-manage.md @@ -198,7 +198,7 @@ Both approaches are demonstrated in the following examples of changing the templ **Example 1:** {%highlight xml%} - + {%endhighlight%} **Example 2:** @@ -206,12 +206,16 @@ Both approaches are demonstrated in the following examples of changing the templ {%highlight xml%} - %Namespace_Module::title_new.phtml% + %Namespace_Module::new_template.phtml% {%endhighlight%} -The path to the template is specified relatively to the `view//templates/` directory of the module. The `` corresponds to the area for which the layout file is used. +In both example, the template is specified according to the following: + + * `Namespace_Module:` defines the module the template belongs to. For example, `Magento_Catalog`. + * `new_template.phtml`: the path to the template relatively to the `templates` directory. It might be `/view//templates` or `//templates`. +

    Template values specified as attributes have higher priority during layout generation, than the ones specified using <argument>. It means, that if for a certain block, a template is set as attribute, it will override the value you specify in <argument> for the same block.

    From ab63815fbb22166cee630b05765eb54b8f346f75 Mon Sep 17 00:00:00 2001 From: Dmitry Shevtsov Date: Mon, 25 Apr 2016 18:41:27 +0300 Subject: [PATCH 787/902] MTF Testing guide - API functional description added --- atom.xml | 25 ------------------------- guides/v2.0/test/testing.md | 6 ++++-- 2 files changed, 4 insertions(+), 27 deletions(-) delete mode 100644 atom.xml diff --git a/atom.xml b/atom.xml deleted file mode 100644 index 6a47ec01866..00000000000 --- a/atom.xml +++ /dev/null @@ -1,25 +0,0 @@ ---- -layout: null ---- - - - -{{ site.name }} - - -{{ site.time | date_to_xmlschema }} -{{ site.url }} - -{{ site.author.name }} -{{ site.author.email }} - -{% for post in site.posts limit:10 %} - -{{ post.title }} - -{{ post.date | date_to_xmlschema }} -{{ site.url }}{{ post.id }} -{{ post.content | xml_escape }} - -{% endfor %} - \ No newline at end of file diff --git a/guides/v2.0/test/testing.md b/guides/v2.0/test/testing.md index df394d8a702..86ab790b30d 100644 --- a/guides/v2.0/test/testing.md +++ b/guides/v2.0/test/testing.md @@ -15,8 +15,10 @@ When talking about testing in Magento 2, we have to distinguish between differen For more information, see the [Magento Testing Framework Guide]({{ site.gdeurl }}mtf/mtf_introduction.html). * **API Functional** - TBD - + The Web API testing framework allows you to test Magento Web API from the client application point of view. + + For more information, see the [Web API functional testing]({{ site.gdeurl }}get-started/web-api-functional-testing.html + * **Integration** Integration tests run Magento PHP code in varying degrees of isolation. They tend to be a lot more low-level then functional tests. Because they do not utilize a browser to execute the tests, they can be a lot more granular in what they test. They also tend to run a lot quicker then functional tests. From 3de2e4d0ea1d88ec2c3c3bca5e48530f4d2e550e Mon Sep 17 00:00:00 2001 From: Dmitry Shevtsov Date: Mon, 25 Apr 2016 18:46:59 +0300 Subject: [PATCH 788/902] MTF Testing guide - link to atom removed from header.html - broken link fixed in testing.md --- _includes/header.html | 1 - guides/v2.0/test/testing.md | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/_includes/header.html b/_includes/header.html index be974213008..2d0143876c3 100644 --- a/_includes/header.html +++ b/_includes/header.html @@ -13,7 +13,6 @@ - diff --git a/guides/v2.0/test/testing.md b/guides/v2.0/test/testing.md index 86ab790b30d..ed16f740fec 100644 --- a/guides/v2.0/test/testing.md +++ b/guides/v2.0/test/testing.md @@ -17,7 +17,7 @@ When talking about testing in Magento 2, we have to distinguish between differen * **API Functional** The Web API testing framework allows you to test Magento Web API from the client application point of view. - For more information, see the [Web API functional testing]({{ site.gdeurl }}get-started/web-api-functional-testing.html + For more information, see the [Web API functional testing]({{ site.gdeurl }}get-started/web-api-functional-testing.html) * **Integration** Integration tests run Magento PHP code in varying degrees of isolation. They tend to be a lot more low-level then functional tests. Because they do not utilize a browser to execute the tests, they can be a lot more granular in what they test. They also tend to run a lot quicker then functional tests. From 1d5bda9d8da795f0aec1c98b995625bf5e8b1c23 Mon Sep 17 00:00:00 2001 From: Jeanne Frontain Date: Mon, 25 Apr 2016 13:47:06 -0500 Subject: [PATCH 789/902] synced with Elena's project wiki and removed security isues --- .../v2.0/release-notes/ReleaseNotes2.0.5CE.md | 49 ++----- .../v2.0/release-notes/ReleaseNotes2.0.5EE.md | 55 ++------ .../release-notes/removed from 2.0.5 notes.md | 130 ++++++++++++++++++ 3 files changed, 160 insertions(+), 74 deletions(-) create mode 100644 guides/v2.0/release-notes/removed from 2.0.5 notes.md diff --git a/guides/v2.0/release-notes/ReleaseNotes2.0.5CE.md b/guides/v2.0/release-notes/ReleaseNotes2.0.5CE.md index 0730d0f6def..1f6a81f9d8c 100644 --- a/guides/v2.0/release-notes/ReleaseNotes2.0.5CE.md +++ b/guides/v2.0/release-notes/ReleaseNotes2.0.5CE.md @@ -14,32 +14,32 @@ We are pleased to present Magento Community Edition 2.0.5. This release includes Backward-incompatible changes are documented in Magento 2.0 Backward Incompatible Changes. +

    Migration toolkits

    +The Data Migration Tool helps transfer existing Magento 1.x store data to Magento 2.x. This command-line interface includes verification, progress tracking, logging, and testing functions. For installation instructions, see Install the Data Migration Tool. + +The Code Migration Toolkit helps transfer existing Magento 1.x store extensions and customizations to Magento 2.0.x. The command-line interface includes scripts for converting Magento 1.x modules and layouts. +

    Fixed issues

    Upgrade and Installation

    - * Magento now successfully registers installed themes in the theme table during production mode. (GITHUB-2797) * Magento no longer assumes hard-coded root category IDs or default category IDs. Previously, Magento used hard-coded IDs for these values, which could produce inconsistent data during store installation. - * Zip archives on **repo.magento.com** are now compressed. +

    Import/Export

    -

    Performance

    + * Product import now works successfully in a multi-store environment. Previously, Magento would display the following error message, “URL key for specified store already exists”, when importing products into a multi-store configuration. * Export performance has been enhanced. Pages no longer hang randomly, and CPU usage is no longer pegged. (GITHUB-3217) - * The performance of the Sync button has been enhanced. - -

    APIs

    +

    Database

    - * The Orders API now exposes the shipping address. This corrects an issue with using this API to integrate with third-party systems. (GITHUB-2628) + * Magento no longer duplicates queries to the database from the Catalog page. Instead, if Magento has already loaded specific data during request processing, it re-uses it instead of duplicating the query. - * When you create a shipment and invoice using the REST API, order status now changes as expected from Processing to Complete. Previously, Magento would create the order invoice and shipment, but would continue to display order status as Processing. - -* The Credit Memo API now correctly refunds orders or updates an order's status. Previously, credit memos created through APIs did not update order status or make refunds. + * Magento no longer duplicates SQL queries on CMS and Category pages. Previously, significant duplications occurred. @@ -53,43 +53,24 @@ Backward-incompatible changes are documented in Magento Security Center. - - * Magento no longer permits an unauthenticated user to remotely execute doc on the server through APIs. Previously, an unauthenticated user could remotely execute PHP code on the server using either REST or SOAP APIs. (These APIs are enabled by default in most installations.) - - * The Magento installation code is no longer accessible once the installation process has completed. Previously, an unauthenticated user could execute PHP code on the server because the installation process would leave the /app/etc directory writeable, and many administrators would not change the permissions on this directory after installation. (During installation, the system requires the /app/etc directory to be writeable.) - - - * Magento no longer allows authenticated customers to change other customers' account information using either SOAP or REST calls. Magento now confirms that the ID of the customer whose account is being edited matches the authentication token in use. Previously, a malicious user could hijack a customer account by logging in as an authenticated user, then editing the account of any other user. (The SOAP and REST APIs are enabled by default in most installations.) - * Anonymous users can no longer retrieve the private data of registered customers. To prevent malicious attacks of this type, the quote_id_mask table of the Quote API no longer includes a cart id mask value. +

    Security

    +This release includes functional enhancements to improve the performance of your Magento 2.0 installation. It does not include specific security fixes.

    System requirements

    diff --git a/guides/v2.0/release-notes/ReleaseNotes2.0.5EE.md b/guides/v2.0/release-notes/ReleaseNotes2.0.5EE.md index 0b357dd7b3c..62ddbbca557 100644 --- a/guides/v2.0/release-notes/ReleaseNotes2.0.5EE.md +++ b/guides/v2.0/release-notes/ReleaseNotes2.0.5EE.md @@ -14,85 +14,60 @@ We are pleased to present Magento Enterprise Edition 2.0.5. This release include Backward-incompatible changes are documented in Magento 2.0 Backward Incompatible Changes. +

    Migration toolkits

    +The Data Migration Tool helps transfer existing Magento 1.x store data to Magento 2.x. This command-line interface includes verification, progress tracking, logging, and testing functions. For installation instructions, see Install the Data Migration Tool. + +The Code Migration Toolkit helps transfer existing Magento 1.x store extensions and customizations to Magento 2.0.x. The command-line interface includes scripts for converting Magento 1.x modules and layouts. +

    Fixed issues

    Upgrade and Installation

    - * Magento now successfully registers installed themes in the theme table during production mode. (GITHUB-2797) * Magento no longer assumes hard-coded root category IDs or default category IDs. Previously, Magento used hard-coded IDs for these values, which could produce inconsistent data during store installation. - * Zip archives on **repo.magento.com** are now compressed. +

    Import/Export

    -

    Performance

    + * Product import now works successfully in a multi-store environment. Previously, Magento would display the following error message, “URL key for specified store already exists”, when importing products into a multi-store configuration. * Export performance has been enhanced. Pages no longer hang randomly, and CPU usage is no longer pegged. (GITHUB-3217) - * The performance of the Sync button has been enhanced. - - - -

    APIs

    - - * The Orders API now exposes the shipping address. This corrects an issue with using this API to integrate with third-party systems. (GITHUB-2628) +

    Database

    - * When you create a shipment and invoice using the REST API, order status now changes as expected from Processing to Complete. Previously, Magento would create the order invoice and shipment, but would continue to display order status as Processing. - -* The Credit Memo API now correctly refunds orders or updates an order's status. Previously, credit memos created through APIs did not update order status or make refunds. + * Magento no longer duplicates queries to the database from the Catalog page. Instead, if Magento has already loaded specific data during request processing, it re-uses it instead of duplicating the query. + * Magento no longer duplicates SQL queries on CMS and Category pages. Previously, significant duplications occurred. -

    Miscellaneous

    * (GITHUB-3459) -* Magento no longer displays an error when you select **Admin > Admin Log > Archive**. Previously, you'd receive the following error: **‘DateTime::__construct(): Failed to parse time string (2016022707) at position 8 (0): Unexpected character**. - - * Magento now displays the expected color swatch when you select a color swatch for a configurable product. Previously, Magento did not change the color when you selected a swatch. * HTML template magnification now properly handles commented code. - * Magento no longer duplicates SQL queries on CMS and Category pages. Previously, significant duplications occurred. - * Deleting one of several custom options no longer deletes all options. Previously, deleting one option from the Product page also deleted all other custom options. (GITHUB-2989) - * Google no longer indexes the Admin URL. Previously, Google indexed the Admin side meta tag. The frontend meta tag was not affected. - * When FPC is enabled, the CAPTCHA image differs for every user. Previously, the CAPTCHA image on the registration page remained the same for every customer after FPC was enabled. - * You can now use Redis for session storage without modifying the php.ini file. You can also lock session storage to prevent simultaneous write access. + * Google no longer indexes the Admin URL. Previously, Google indexed the Admin side meta tag. The frontend meta tag was not affected. - * Resetting the Product Attributes Mass Update Admin form works as expected. Previously, resetting the form resulted in an exception error. + * Magento no longer sends a subscription success email whenever a customer enters his email address to subscribe to a newsletter. Users receive a 'thank you for your subscription' message and a subscription success email only when registering for the first time. -

    Custom attributes

    + * Guests can now successfully click on the product page link for any item in an emailed shared wishlist. * Custom customer attributes are now saved at checkout. - * Magento now loads custom attribute values for customer and address forms. - - - - -

    Security enhancements

    -This release includes several enhancements to improve the security of your Magento 2.0 installation. While there are no confirmed attacks related to these issues to date, certain vulnerabilities can potentially be exploited to access customer information or take over administrator sessions. We recommend that you upgrade your existing Magento 2.0 installation to the latest version as soon as possible. - -The following list provides an overview of the security issues fixed in this release. We describe each issue in greater detail in the Magento Security Center. - - - * Magento no longer permits an unauthenticated user to remotely execute doc on the server through APIs. Previously, an unauthenticated user could remotely execute PHP code on the server using either REST or SOAP APIs. (These APIs are enabled by default in most installations.) - * The Magento installation code is no longer accessible once the installation process has completed. Previously, an unauthenticated user could execute PHP code on the server because the installation process would leave the /app/etc directory writeable, and many administrators would not change the permissions on this directory after installation. (During installation, the system requires the /app/etc directory to be writeable.) - - * Magento no longer allows authenticated customers to change other customers' account information using either SOAP or REST calls. Magento now confirms that the ID of the customer whose account is being edited matches the authentication token in use. Previously, a malicious user could hijack a customer account by logging in as an authenticated user, then editing the account of any other user. (The SOAP and REST APIs are enabled by default in most installations.) - * Anonymous users can no longer retrieve the private data of registered customers. To prevent malicious attacks of this type, the quote_id_mask table of the Quote API no longer includes a cart id mask value. +

    Security

    +This release includes functional enhancements to improve the performance of your Magento 2.0 installation. It does not include specific security fixes.

    System requirements

    diff --git a/guides/v2.0/release-notes/removed from 2.0.5 notes.md b/guides/v2.0/release-notes/removed from 2.0.5 notes.md new file mode 100644 index 00000000000..cffecaabac1 --- /dev/null +++ b/guides/v2.0/release-notes/removed from 2.0.5 notes.md @@ -0,0 +1,130 @@ +--- +layout: default +group: release-notes +subgroup: Release Notes +title: Magento EE 2.0.5 Release Notes +menu_title: Magento EE 2.0.5 Release Notes +menu_order: +github_link: release-notes/ReleaseNotes2.0.5EE.md +--- + + +

    Fixed issues

    + + +

    Upgrade and Installation

    + * Magento now successfully registers installed themes in the theme table during production mode. (GITHUB-2797) + + + * Zip archives on **repo.magento.com** are now compressed. + + +

    Performance

    + + + * The performance of the Sync button has been enhanced. + + + +

    APIs

    + + * The Orders API now exposes the shipping address. This corrects an issue with using this API to integrate with third-party systems. (GITHUB-2628) + + * When you create a shipment and invoice using the REST API, order status now changes as expected from Processing to Complete. Previously, Magento would create the order invoice and shipment, but would continue to display order status as Processing. + +* The Credit Memo API now correctly refunds orders or updates an order's status. Previously, credit memos created through APIs did not update order status or make refunds. + + + +

    Miscellaneous

    + + + +* Magento no longer displays an error when you select **Admin > Admin Log > Archive**. Previously, you'd receive the following error: **‘DateTime::__construct(): Failed to parse time string (2016022707) at position 8 (0): Unexpected character**. + + + * Google no longer indexes the Admin URL. Previously, Google indexed the Admin side meta tag. The frontend meta tag was not affected. + + + * You can now use Redis for session storage without modifying the php.ini file. You can also lock session storage to prevent simultaneous write access. + + * Resetting the Product Attributes Mass Update Admin form works as expected. Previously, resetting the form resulted in an exception error. + + +

    Custom attributes

    + + + * Magento now loads custom attribute values for customer and address forms. + + + + +

    Security enhancements

    +This release includes several enhancements to improve the security of your Magento 2.0 installation. While there are no confirmed attacks related to these issues to date, certain vulnerabilities can potentially be exploited to access customer information or take over administrator sessions. We recommend that you upgrade your existing Magento 2.0 installation to the latest version as soon as possible. + +The following list provides an overview of the security issues fixed in this release. We describe each issue in greater detail in the Magento Security Center. + + + * Magento no longer permits an unauthenticated user to remotely execute doc on the server through APIs. Previously, an unauthenticated user could remotely execute PHP code on the server using either REST or SOAP APIs. (These APIs are enabled by default in most installations.) + + * The Magento installation code is no longer accessible once the installation process has completed. Previously, an unauthenticated user could execute PHP code on the server because the installation process would leave the /app/etc directory writeable, and many administrators would not change the permissions on this directory after installation. (During installation, the system requires the /app/etc directory to be writeable.) + + + * Magento no longer allows authenticated customers to change other customers' account information using either SOAP or REST calls. Magento now confirms that the ID of the customer whose account is being edited matches the authentication token in use. Previously, a malicious user could hijack a customer account by logging in as an authenticated user, then editing the account of any other user. (The SOAP and REST APIs are enabled by default in most installations.) + + * Anonymous users can no longer retrieve the private data of registered customers. To prevent malicious attacks of this type, the quote_id_mask table of the Quote API no longer includes a cart id mask value. + + +

    System requirements

    +Our technology stack is built on PHP and MySQL. Magento 2.0.1 and later supports PHP 5.5, 5.6, 7.0.2, and MySQL 5.6. For more information, see +System Requirements. + + +

    Installation instructions

    + +

    New installations

    +New users can now complete a full installation of Magento Enterprise Edition 2.0.5 from an archive file. + +#####Download a new installation##### +1. Go to the Magento website, and click **My Account**. Then, log in to your account. +2. In the panel on the left, choose **Downloads**. Choose **Magento Enterprise Edition 2.x**, and do the following: + + a. Click **Magento Enterprise Edition 2.x Release**. + + b. In the list, choose **Version 2.0.5**. + + c. Click **Download**. + +3. Follow the instructions to upgrade and verify your installation. If you need help, go to the **Support** tab of your Magento account, and **Open a Ticket**. + + +

    Upgrade existing installations

    +If you installed Magento Enterprise Edition 2.0.0 from an archive, you must perform some additional tasks before you can upgrade your installation. Current users of Magento 2.0.0/2.0.1/2.0.2/2.0.3/2.0.4 must first update the installer from the command line. Then, update the installation from the Web Setup Wizard or command line. For detailed instructions, see the technical bulletin. + + +#####Upgrade an existing installation from the Setup Wizard##### + +1. Log in to the Admin panel with Administrator privileges. + +2. On the Admin sidebar, click **System**. Under **Tools**, choose **Web Setup Wizard**. + +3. Click **System Upgrade**. Follow the onscreen instructions to complete the upgrade. + +For more information, see Upgrade the Magento installation and components. + +#####Magento Partners##### +Magento partners can download the release and the release notes in PDF format from the Partner Portal. + +1. Log in to the Partner Portal. +2. Under Magento Enterprise Edition, choose **Magento Enterprise Edition 2.x**. +3. Find the **Magento Enterprise Edition 2.x Release**, and choose **Version 2.0.5**. + + + + + + + + + + From a9f00de6dd5cef8201982726565fd49b0e399180 Mon Sep 17 00:00:00 2001 From: Jeanne Frontain Date: Mon, 25 Apr 2016 13:53:28 -0500 Subject: [PATCH 790/902] removed extraneous file --- .../release-notes/removed from 2.0.5 notes.md | 130 ------------------ 1 file changed, 130 deletions(-) delete mode 100644 guides/v2.0/release-notes/removed from 2.0.5 notes.md diff --git a/guides/v2.0/release-notes/removed from 2.0.5 notes.md b/guides/v2.0/release-notes/removed from 2.0.5 notes.md deleted file mode 100644 index cffecaabac1..00000000000 --- a/guides/v2.0/release-notes/removed from 2.0.5 notes.md +++ /dev/null @@ -1,130 +0,0 @@ ---- -layout: default -group: release-notes -subgroup: Release Notes -title: Magento EE 2.0.5 Release Notes -menu_title: Magento EE 2.0.5 Release Notes -menu_order: -github_link: release-notes/ReleaseNotes2.0.5EE.md ---- - - -

    Fixed issues

    - - -

    Upgrade and Installation

    - * Magento now successfully registers installed themes in the theme table during production mode. (GITHUB-2797) - - - * Zip archives on **repo.magento.com** are now compressed. - - -

    Performance

    - - - * The performance of the Sync button has been enhanced. - - - -

    APIs

    - - * The Orders API now exposes the shipping address. This corrects an issue with using this API to integrate with third-party systems. (GITHUB-2628) - - * When you create a shipment and invoice using the REST API, order status now changes as expected from Processing to Complete. Previously, Magento would create the order invoice and shipment, but would continue to display order status as Processing. - -* The Credit Memo API now correctly refunds orders or updates an order's status. Previously, credit memos created through APIs did not update order status or make refunds. - - - -

    Miscellaneous

    - - - -* Magento no longer displays an error when you select **Admin > Admin Log > Archive**. Previously, you'd receive the following error: **‘DateTime::__construct(): Failed to parse time string (2016022707) at position 8 (0): Unexpected character**. - - - * Google no longer indexes the Admin URL. Previously, Google indexed the Admin side meta tag. The frontend meta tag was not affected. - - - * You can now use Redis for session storage without modifying the php.ini file. You can also lock session storage to prevent simultaneous write access. - - * Resetting the Product Attributes Mass Update Admin form works as expected. Previously, resetting the form resulted in an exception error. - - -

    Custom attributes

    - - - * Magento now loads custom attribute values for customer and address forms. - - - - -

    Security enhancements

    -This release includes several enhancements to improve the security of your Magento 2.0 installation. While there are no confirmed attacks related to these issues to date, certain vulnerabilities can potentially be exploited to access customer information or take over administrator sessions. We recommend that you upgrade your existing Magento 2.0 installation to the latest version as soon as possible. - -The following list provides an overview of the security issues fixed in this release. We describe each issue in greater detail in the Magento Security Center. - - - * Magento no longer permits an unauthenticated user to remotely execute doc on the server through APIs. Previously, an unauthenticated user could remotely execute PHP code on the server using either REST or SOAP APIs. (These APIs are enabled by default in most installations.) - - * The Magento installation code is no longer accessible once the installation process has completed. Previously, an unauthenticated user could execute PHP code on the server because the installation process would leave the /app/etc directory writeable, and many administrators would not change the permissions on this directory after installation. (During installation, the system requires the /app/etc directory to be writeable.) - - - * Magento no longer allows authenticated customers to change other customers' account information using either SOAP or REST calls. Magento now confirms that the ID of the customer whose account is being edited matches the authentication token in use. Previously, a malicious user could hijack a customer account by logging in as an authenticated user, then editing the account of any other user. (The SOAP and REST APIs are enabled by default in most installations.) - - * Anonymous users can no longer retrieve the private data of registered customers. To prevent malicious attacks of this type, the quote_id_mask table of the Quote API no longer includes a cart id mask value. - - -

    System requirements

    -Our technology stack is built on PHP and MySQL. Magento 2.0.1 and later supports PHP 5.5, 5.6, 7.0.2, and MySQL 5.6. For more information, see -System Requirements. - - -

    Installation instructions

    - -

    New installations

    -New users can now complete a full installation of Magento Enterprise Edition 2.0.5 from an archive file. - -#####Download a new installation##### -1. Go to the Magento website, and click **My Account**. Then, log in to your account. -2. In the panel on the left, choose **Downloads**. Choose **Magento Enterprise Edition 2.x**, and do the following: - - a. Click **Magento Enterprise Edition 2.x Release**. - - b. In the list, choose **Version 2.0.5**. - - c. Click **Download**. - -3. Follow the instructions to upgrade and verify your installation. If you need help, go to the **Support** tab of your Magento account, and **Open a Ticket**. - - -

    Upgrade existing installations

    -If you installed Magento Enterprise Edition 2.0.0 from an archive, you must perform some additional tasks before you can upgrade your installation. Current users of Magento 2.0.0/2.0.1/2.0.2/2.0.3/2.0.4 must first update the installer from the command line. Then, update the installation from the Web Setup Wizard or command line. For detailed instructions, see the technical bulletin. - - -#####Upgrade an existing installation from the Setup Wizard##### - -1. Log in to the Admin panel with Administrator privileges. - -2. On the Admin sidebar, click **System**. Under **Tools**, choose **Web Setup Wizard**. - -3. Click **System Upgrade**. Follow the onscreen instructions to complete the upgrade. - -For more information, see Upgrade the Magento installation and components. - -#####Magento Partners##### -Magento partners can download the release and the release notes in PDF format from the Partner Portal. - -1. Log in to the Partner Portal. -2. Under Magento Enterprise Edition, choose **Magento Enterprise Edition 2.x**. -3. Find the **Magento Enterprise Edition 2.x Release**, and choose **Version 2.0.5**. - - - - - - - - - - From 051bf7534d09415781c69f1e212ed2a57c415456 Mon Sep 17 00:00:00 2001 From: Jeanne Frontain Date: Mon, 25 Apr 2016 14:05:38 -0500 Subject: [PATCH 791/902] entered description for 47255 --- guides/v2.0/release-notes/ReleaseNotes2.0.5CE.md | 5 ++--- guides/v2.0/release-notes/ReleaseNotes2.0.5EE.md | 5 +++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/guides/v2.0/release-notes/ReleaseNotes2.0.5CE.md b/guides/v2.0/release-notes/ReleaseNotes2.0.5CE.md index 1f6a81f9d8c..43bee6e291f 100644 --- a/guides/v2.0/release-notes/ReleaseNotes2.0.5CE.md +++ b/guides/v2.0/release-notes/ReleaseNotes2.0.5CE.md @@ -45,8 +45,7 @@ The Code Migrati

    Miscellaneous

    - * (GITHUB-3459) - + * Selecting the Use Aggregated Data option now correctly displays Dashboard data. (GITHUB-3459) * Magento now displays the expected color swatch when you select a color swatch for a configurable product. Previously, Magento did not change the color when you selected a swatch. @@ -70,7 +69,7 @@ The
    Code Migrati

    Security

    -This release includes functional enhancements to improve the performance of your Magento 2.0 installation. It does not include specific security fixes. +This release includes functional enhancements to improve the performance of your Magento 2.0 installation. It does not include security fixes.

    System requirements

    diff --git a/guides/v2.0/release-notes/ReleaseNotes2.0.5EE.md b/guides/v2.0/release-notes/ReleaseNotes2.0.5EE.md index 62ddbbca557..cbcd8989d2f 100644 --- a/guides/v2.0/release-notes/ReleaseNotes2.0.5EE.md +++ b/guides/v2.0/release-notes/ReleaseNotes2.0.5EE.md @@ -40,8 +40,9 @@ The
    Code Migrati * Magento no longer duplicates SQL queries on CMS and Category pages. Previously, significant duplications occurred. +

    Miscellaneous

    - * (GITHUB-3459) + * Selecting the Use Aggregated Data option now correctly displays Dashboard data. (GITHUB-3459) * Magento now displays the expected color swatch when you select a color swatch for a configurable product. Previously, Magento did not change the color when you selected a swatch. @@ -67,7 +68,7 @@ The
    Code Migrati

    Security

    -This release includes functional enhancements to improve the performance of your Magento 2.0 installation. It does not include specific security fixes. +This release includes functional enhancements to improve the performance of your Magento 2.0 installation. It does not include security fixes.

    System requirements

    From c36b440bb858f762d26d26f2255d707509ca8282 Mon Sep 17 00:00:00 2001 From: Jeanne Frontain Date: Mon, 25 Apr 2016 14:25:58 -0500 Subject: [PATCH 792/902] fixed link --- guides/v2.0/release-notes/ReleaseNotes2.0.5CE.md | 6 +++--- guides/v2.0/release-notes/ReleaseNotes2.0.5EE.md | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/guides/v2.0/release-notes/ReleaseNotes2.0.5CE.md b/guides/v2.0/release-notes/ReleaseNotes2.0.5CE.md index 43bee6e291f..b63816f8fa9 100644 --- a/guides/v2.0/release-notes/ReleaseNotes2.0.5CE.md +++ b/guides/v2.0/release-notes/ReleaseNotes2.0.5CE.md @@ -17,7 +17,7 @@ Backward-incompatible changes are documented in
    Data Migration Tool helps transfer existing Magento 1.x store data to Magento 2.x. This command-line interface includes verification, progress tracking, logging, and testing functions. For installation instructions, see Install the Data Migration Tool. -The Code Migration Toolkit helps transfer existing Magento 1.x store extensions and customizations to Magento 2.0.x. The command-line interface includes scripts for converting Magento 1.x modules and layouts. +The Code Migration Toolkit helps transfer existing Magento 1.x store extensions and customizations to Magento 2.0.x. The command-line interface includes scripts for converting Magento 1.x modules and layouts.

    Fixed issues

    @@ -55,12 +55,12 @@ The Code Migrati * Deleting one of several custom options no longer deletes all options. Previously, deleting one option from the Product page also deleted all other custom options. (GITHUB-2989) - * When FPC is enabled, the CAPTCHA image differs for every user. Previously, the CAPTCHA image on the registration page remained the same for every customer after FPC was enabled. + * When Full Page Cache (FPC) is enabled, the CAPTCHA image differs for every user. Previously, the CAPTCHA image on the registration page remained the same for every customer after FPC was enabled. * Google no longer indexes the Admin URL. Previously, Google indexed the Admin side meta tag. The frontend meta tag was not affected. - * Magento no longer sends a subscription success email whenever a customer enters his email address to subscribe to a newsletter. Users receive a 'thank you for your subscription' message and a subscription success email only when registering for the first time. + * Magento no longer sends a subscription success email whenever a customer enters his email address to subscribe to a newsletter. Users receive a "thank you for your subscription" message and a subscription success email only when registering for the first time. * Guests can now successfully click on the product page link for any item in an emailed shared wishlist. diff --git a/guides/v2.0/release-notes/ReleaseNotes2.0.5EE.md b/guides/v2.0/release-notes/ReleaseNotes2.0.5EE.md index cbcd8989d2f..3a36cca97f6 100644 --- a/guides/v2.0/release-notes/ReleaseNotes2.0.5EE.md +++ b/guides/v2.0/release-notes/ReleaseNotes2.0.5EE.md @@ -17,7 +17,7 @@ Backward-incompatible changes are documented in Data Migration Tool helps transfer existing Magento 1.x store data to Magento 2.x. This command-line interface includes verification, progress tracking, logging, and testing functions. For installation instructions, see Install the Data Migration Tool. -The Code Migration Toolkit helps transfer existing Magento 1.x store extensions and customizations to Magento 2.0.x. The command-line interface includes scripts for converting Magento 1.x modules and layouts. +The Code Migration Toolkit helps transfer existing Magento 1.x store extensions and customizations to Magento 2.0.x. The command-line interface includes scripts for converting Magento 1.x modules and layouts.

    Fixed issues

    @@ -53,12 +53,12 @@ The Code Migrati * Deleting one of several custom options no longer deletes all options. Previously, deleting one option from the Product page also deleted all other custom options. (GITHUB-2989) - * When FPC is enabled, the CAPTCHA image differs for every user. Previously, the CAPTCHA image on the registration page remained the same for every customer after FPC was enabled. + * When Full Page Cache (FPC) is enabled, the CAPTCHA image differs for every user. Previously, the CAPTCHA image on the registration page remained the same for every customer after FPC was enabled. * Google no longer indexes the Admin URL. Previously, Google indexed the Admin side meta tag. The frontend meta tag was not affected. - * Magento no longer sends a subscription success email whenever a customer enters his email address to subscribe to a newsletter. Users receive a 'thank you for your subscription' message and a subscription success email only when registering for the first time. + * Magento no longer sends a subscription success email whenever a customer enters his email address to subscribe to a newsletter. Users receive a "thank you for your subscription" message and a subscription success email only when registering for the first time. * Guests can now successfully click on the product page link for any item in an emailed shared wishlist. From 07210b12455cac3c4bc4ce53833b91b5b6865601 Mon Sep 17 00:00:00 2001 From: Jeanne Frontain Date: Mon, 25 Apr 2016 14:35:20 -0500 Subject: [PATCH 793/902] edited intro --- guides/v2.0/release-notes/ReleaseNotes2.0.5CE.md | 2 +- guides/v2.0/release-notes/ReleaseNotes2.0.5EE.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/guides/v2.0/release-notes/ReleaseNotes2.0.5CE.md b/guides/v2.0/release-notes/ReleaseNotes2.0.5CE.md index b63816f8fa9..645f721710c 100644 --- a/guides/v2.0/release-notes/ReleaseNotes2.0.5CE.md +++ b/guides/v2.0/release-notes/ReleaseNotes2.0.5CE.md @@ -9,7 +9,7 @@ github_link: release-notes/ReleaseNotes2.0.5CE.md ---

    Magento Community Edition 2.0.5

    -We are pleased to present Magento Community Edition 2.0.5. This release includes miscellaneous performance and API enhancements. +We are pleased to present Magento Community Edition 2.0.5. This release includes miscellaneous functional fixes that enhance product performance, especially during import and export operations, and database queries. Backward-incompatible changes are documented in
    Magento 2.0 Backward Incompatible Changes. diff --git a/guides/v2.0/release-notes/ReleaseNotes2.0.5EE.md b/guides/v2.0/release-notes/ReleaseNotes2.0.5EE.md index 3a36cca97f6..d025be0857e 100644 --- a/guides/v2.0/release-notes/ReleaseNotes2.0.5EE.md +++ b/guides/v2.0/release-notes/ReleaseNotes2.0.5EE.md @@ -9,7 +9,7 @@ github_link: release-notes/ReleaseNotes2.0.5EE.md ---

    Magento Enterprise Edition 2.0.5

    -We are pleased to present Magento Enterprise Edition 2.0.5. This release includes miscellaneous performance and API enhancements. +We are pleased to present Magento Enterprise Edition 2.0.5. This release includes miscellaneous functional fixes that enhance product performance, especially during import and export operations, and database queries. Backward-incompatible changes are documented in Magento 2.0 Backward Incompatible Changes. From cc1c6cc11fc443702a430857338a72fdf2d394fb Mon Sep 17 00:00:00 2001 From: Jeanne Frontain Date: Mon, 25 Apr 2016 15:16:29 -0500 Subject: [PATCH 794/902] added Elena's comments --- .../v2.0/release-notes/ReleaseNotes2.0.5CE.md | 17 ++++++++--------- .../v2.0/release-notes/ReleaseNotes2.0.5EE.md | 13 ++++--------- 2 files changed, 12 insertions(+), 18 deletions(-) diff --git a/guides/v2.0/release-notes/ReleaseNotes2.0.5CE.md b/guides/v2.0/release-notes/ReleaseNotes2.0.5CE.md index 645f721710c..8beac671780 100644 --- a/guides/v2.0/release-notes/ReleaseNotes2.0.5CE.md +++ b/guides/v2.0/release-notes/ReleaseNotes2.0.5CE.md @@ -9,15 +9,11 @@ github_link: release-notes/ReleaseNotes2.0.5CE.md ---

    Magento Community Edition 2.0.5

    -We are pleased to present Magento Community Edition 2.0.5. This release includes miscellaneous functional fixes that enhance product performance, especially during import and export operations, and database queries. +We are pleased to present Magento Community Edition 2.0.5. This release includes miscellaneous functional fixes. Backward-incompatible changes are documented in Magento 2.0 Backward Incompatible Changes. -

    Migration toolkits

    -The Data Migration Tool helps transfer existing Magento 1.x store data to Magento 2.x. This command-line interface includes verification, progress tracking, logging, and testing functions. For installation instructions, see Install the Data Migration Tool. - -The Code Migration Toolkit helps transfer existing Magento 1.x store extensions and customizations to Magento 2.0.x. The command-line interface includes scripts for converting Magento 1.x modules and layouts.

    Fixed issues

    @@ -68,10 +64,6 @@ The Code Mig -

    Security

    -This release includes functional enhancements to improve the performance of your Magento 2.0 installation. It does not include security fixes. - -

    System requirements

    Our technology stack is built on PHP and MySQL. Magento 2.0.1 and later support PHP 5.5, 5.6, 7.0.2, and MySQL 5.6. For more information, see
    System Requirements. @@ -120,6 +112,13 @@ Developers who contribute to the CE codebase can Data Migration Tool helps transfer existing Magento 1.x store data to Magento 2.x. This command-line interface includes verification, progress tracking, logging, and testing functions. For installation instructions, see Install the Data Migration Tool. + +The Code Migration Toolkit helps transfer existing Magento 1.x store extensions and customizations to Magento 2.0.x. The command-line interface includes scripts for converting Magento 1.x modules and layouts. + + + diff --git a/guides/v2.0/release-notes/ReleaseNotes2.0.5EE.md b/guides/v2.0/release-notes/ReleaseNotes2.0.5EE.md index d025be0857e..ca05aee30fc 100644 --- a/guides/v2.0/release-notes/ReleaseNotes2.0.5EE.md +++ b/guides/v2.0/release-notes/ReleaseNotes2.0.5EE.md @@ -9,15 +9,12 @@ github_link: release-notes/ReleaseNotes2.0.5EE.md ---

    Magento Enterprise Edition 2.0.5

    -We are pleased to present Magento Enterprise Edition 2.0.5. This release includes miscellaneous functional fixes that enhance product performance, especially during import and export operations, and database queries. +We are pleased to present Magento Enterprise Edition 2.0.5. This release includes miscellaneous functional fixes. Backward-incompatible changes are documented in Magento 2.0 Backward Incompatible Changes. -

    Migration toolkits

    -The Data Migration Tool helps transfer existing Magento 1.x store data to Magento 2.x. This command-line interface includes verification, progress tracking, logging, and testing functions. For installation instructions, see Install the Data Migration Tool. -The Code Migration Toolkit helps transfer existing Magento 1.x store extensions and customizations to Magento 2.0.x. The command-line interface includes scripts for converting Magento 1.x modules and layouts.

    Fixed issues

    @@ -66,11 +63,6 @@ The Code Mig - -

    Security

    -This release includes functional enhancements to improve the performance of your Magento 2.0 installation. It does not include security fixes. - -

    System requirements

    Our technology stack is built on PHP and MySQL. Magento 2.0.1 and later supports PHP 5.5, 5.6, 7.0.2, and MySQL 5.6. For more information, see
    System Requirements. @@ -115,7 +107,10 @@ Magento partners can download the release and the release notes in PDF format fr 2. Under Magento Enterprise Edition, choose **Magento Enterprise Edition 2.x**. 3. Find the **Magento Enterprise Edition 2.x Release**, and choose **Version 2.0.5**. +

    Migration toolkits

    +The Data Migration Tool helps transfer existing Magento 1.x store data to Magento 2.x. This command-line interface includes verification, progress tracking, logging, and testing functions. For installation instructions, see Install the Data Migration Tool. +The Code Migration Toolkit helps transfer existing Magento 1.x store extensions and customizations to Magento 2.0.x. The command-line interface includes scripts for converting Magento 1.x modules and layouts. From ebb22548369fcddfbf8acc069bdb83625e6d8581 Mon Sep 17 00:00:00 2001 From: James Calcaben Date: Mon, 25 Apr 2016 15:48:28 -0500 Subject: [PATCH 795/902] Add clarifications and links to code --- .../extension-coding/security-performance-data-bp.md | 4 ++-- .../extension-coding/working-with-arch-bp.md | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/guides/v2.0/ext-best-practices/extension-coding/security-performance-data-bp.md b/guides/v2.0/ext-best-practices/extension-coding/security-performance-data-bp.md index 69f1260b4f1..e2cdc384586 100644 --- a/guides/v2.0/ext-best-practices/extension-coding/security-performance-data-bp.md +++ b/guides/v2.0/ext-best-practices/extension-coding/security-performance-data-bp.md @@ -28,11 +28,11 @@ You should make sure that your extension handles data with care in order to prev For a list of discouraged low-level functions, we suggest you look at the [list of forbidden functions](https://github.com/magento-ecg/coding-standard/blob/master/Ecg/Sniffs/Security/ForbiddenFunctionSniff.php){:target="_blank"} for [Magento's code sniffer](https://github.com/magento-ecg/coding-standard){:target="_blank"}. ### Use Wrappers Instead of Superglobal Variables - Make sure that your Magento application uses Magento wrapper objects, and does not directly use PHP superglobals: + Make sure that your Magento application does not directly use any PHP superglobals such as: ``` $GLOBALS, $_SERVER, $_GET, $_POST, $_FILES, $_COOKIE, $_SESSION, $_REQUEST, $_ENV ``` - . + . Instead use the [`Magento\Framework\HTTP\PhpEnvironment\Request`]({{site.mage2000url}}lib/internal/Magento/Framework/HTTP/PhpEnvironment/Request.php){:target="_blank"} wrapper class to safely access these values. ### Use the Correct MySQL Data Types MySQL offers a range of numeric, string, and time data types. If you are storing a date, use a DATE or DATETIME field. Using an INTEGER or STRING can make SQL queries more complicated, if not impossible. It is often tempting to invent your own data formats; for example, storing serialized PHP objects in string. Database management may be easier, but MySQL will become a dumb data store and it may lead to problems later. diff --git a/guides/v2.0/ext-best-practices/extension-coding/working-with-arch-bp.md b/guides/v2.0/ext-best-practices/extension-coding/working-with-arch-bp.md index 2a52692ad6a..6d180489229 100644 --- a/guides/v2.0/ext-best-practices/extension-coding/working-with-arch-bp.md +++ b/guides/v2.0/ext-best-practices/extension-coding/working-with-arch-bp.md @@ -39,10 +39,10 @@ In addition to understanding fundamental programming designs/concepts, you are e For example: - - Instead of creating custom validators from scratch, implement the `\Magento\Framework\Validator\ValidatorInterface`. + - Instead of creating custom validators from scratch, implement the [`\Magento\Framework\Validator\ValidatorInterface`]({{site.mage2000url}}lib/internal/Magento/Framework/Validator/ValidatorInterface.php){:target="_blank"}. - Instantiating a database connection can be expensive and unneccessary. Magento provides resource models for performing SQL commands. (See [Persistence Layer]({{site.gdeurl}}architecture/archi_perspectives/persist_layer.html)) - Consider using Magento framework conventions instead of low-level or PHP functionality. - - Instead of adding conditions directly to a collection's select object, use Magento native collection's method addFieldToFilter(field_name, field_value). + - Use the [`Magento\Framework\Data\Collection`]({{site.mage2000url}}lib/internal/Magento/Framework/Data/Collection.php){:target="_blank"} class to retrieve a collection of filtered objects instead of directly querying the database. ### Use Dependency Injection Direct class instantiation is not recommended because the class can be rewritten. If the class is created directly, any rewrites will not be applied and it breaks Magento's class rewrite capability. We encourage you to become familiar with how we use [dependency injection]({{ site.gdeurl }}extension-dev-guide/depend-inj.html) to get an instance of a class. From 4ba5a1e8cd73ff7a6b27c837e0306b6221142ccb Mon Sep 17 00:00:00 2001 From: Jeanne Frontain Date: Mon, 25 Apr 2016 17:34:36 -0500 Subject: [PATCH 796/902] added links to github issues --- guides/v2.0/release-notes/ReleaseNotes2.0.5CE.md | 6 +++--- guides/v2.0/release-notes/ReleaseNotes2.0.5EE.md | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/guides/v2.0/release-notes/ReleaseNotes2.0.5CE.md b/guides/v2.0/release-notes/ReleaseNotes2.0.5CE.md index 8beac671780..d79630652bb 100644 --- a/guides/v2.0/release-notes/ReleaseNotes2.0.5CE.md +++ b/guides/v2.0/release-notes/ReleaseNotes2.0.5CE.md @@ -27,7 +27,7 @@ Backward-incompatible changes are documented in (GITHUB-3217) @@ -41,14 +41,14 @@ Backward-incompatible changes are documented in (GITHUB-3459) * Magento now displays the expected color swatch when you select a color swatch for a configurable product. Previously, Magento did not change the color when you selected a swatch. * HTML template magnification now properly handles commented code. - * Deleting one of several custom options no longer deletes all options. Previously, deleting one option from the Product page also deleted all other custom options. (GITHUB-2989) + * Deleting one of several custom options no longer deletes all options. Previously, deleting one option from the Product page also deleted all other custom options. (GITHUB-2989) * When Full Page Cache (FPC) is enabled, the CAPTCHA image differs for every user. Previously, the CAPTCHA image on the registration page remained the same for every customer after FPC was enabled. diff --git a/guides/v2.0/release-notes/ReleaseNotes2.0.5EE.md b/guides/v2.0/release-notes/ReleaseNotes2.0.5EE.md index ca05aee30fc..e619440a10a 100644 --- a/guides/v2.0/release-notes/ReleaseNotes2.0.5EE.md +++ b/guides/v2.0/release-notes/ReleaseNotes2.0.5EE.md @@ -28,7 +28,7 @@ Backward-incompatible changes are documented in (GITHUB-3217)

    Database

    @@ -39,7 +39,7 @@ Backward-incompatible changes are documented in (GITHUB-3459) * Magento now displays the expected color swatch when you select a color swatch for a configurable product. Previously, Magento did not change the color when you selected a swatch. @@ -47,7 +47,7 @@ Backward-incompatible changes are documented in (GITHUB-2989) * When Full Page Cache (FPC) is enabled, the CAPTCHA image differs for every user. Previously, the CAPTCHA image on the registration page remained the same for every customer after FPC was enabled. From 0efccbe941bae11e799a3716e718c9c4dd6f4b1c Mon Sep 17 00:00:00 2001 From: Ben Date: Tue, 26 Apr 2016 13:59:21 +0100 Subject: [PATCH 797/902] Update ui_components_js.md Add a space between component's and template --- guides/v2.0/ui-components/ui_components_js.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guides/v2.0/ui-components/ui_components_js.md b/guides/v2.0/ui-components/ui_components_js.md index 0cac5e1bf46..320cc6559a7 100644 --- a/guides/v2.0/ui-components/ui_components_js.md +++ b/guides/v2.0/ui-components/ui_components_js.md @@ -25,7 +25,7 @@ A UI component's behavior, configuration and structure is defined by the followi - The available configuration options and methods for components of a certain type, defined in the component's .js file. - - The actual configuration and structure of a particular component, specified in the component's configuration `.xml` file, in the scope of the `` node. The configuration file also extends properties, specifies the component'stemplate and the path to the component's `.js` file. + - The actual configuration and structure of a particular component, specified in the component's configuration `.xml` file, in the scope of the `` node. The configuration file also extends properties, specifies the component's template and the path to the component's `.js` file. All these properties, options, and methods are available in the component template's scope. From c0bdae9e928aa89789487459765fa0449abd8b76 Mon Sep 17 00:00:00 2001 From: Oleksandra Marchenko Date: Tue, 26 Apr 2016 16:06:58 +0300 Subject: [PATCH 798/902] corrected the info --- .../v2.0/javascript-dev-guide/widgets/jquery-widgets-about.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guides/v2.0/javascript-dev-guide/widgets/jquery-widgets-about.md b/guides/v2.0/javascript-dev-guide/widgets/jquery-widgets-about.md index 2ba59fec3db..60e52a17cd2 100644 --- a/guides/v2.0/javascript-dev-guide/widgets/jquery-widgets-about.md +++ b/guides/v2.0/javascript-dev-guide/widgets/jquery-widgets-about.md @@ -39,5 +39,5 @@ This guide discusses the following widgets:
    -

    Magento out of the box does not contain jQuery UI styles. To be able to use them, you need to download them from https://jqueryui.com/download/ to the %your_theme_dir%/web/css or %your_module_dir%/view/%area/web/css directory.

    +

    Magento out of the box does not contain jQuery UI styles. Also, it is not recommended to download them as is, because it can break the default design. To use certain iQuery UI styles, you need to add them manually in your custom stylesheets in the %your_theme_dir%/web/css or %your_module_dir%/view/%area/web/css directory.

    \ No newline at end of file From e18ce5ae03debf47971b098a0f5ac54b8713a42e Mon Sep 17 00:00:00 2001 From: James Calcaben Date: Tue, 26 Apr 2016 09:37:01 -0500 Subject: [PATCH 799/902] Change headings to sentence case --- .../security-performance-data-bp.md | 20 +++++++++---------- .../extension-coding/working-with-arch-bp.md | 6 +++--- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/guides/v2.0/ext-best-practices/extension-coding/security-performance-data-bp.md b/guides/v2.0/ext-best-practices/extension-coding/security-performance-data-bp.md index e2cdc384586..ecc5b3d8206 100644 --- a/guides/v2.0/ext-best-practices/extension-coding/security-performance-data-bp.md +++ b/guides/v2.0/ext-best-practices/extension-coding/security-performance-data-bp.md @@ -22,44 +22,44 @@ You should make sure that your extension handles data with care in order to prev --- -### Avoid Using Low-Level Functionality +### Avoid using low-level functionality The Magento application is made up of a variety of components that work together to perform different business functions. We discourage the use of low-level functionality such as the PHP `curl_*` functions and encourage the use of high-level components such as [`\Magento\Framework\HTTP\Adapter\Curl`]({{site.mage2000url}}lib/internal/Magento/Framework/HTTP/Adapter/Curl.php). The use of low-level functionality can make Magento behave in unexpected ways that effectively disable built-in protection mechanisms, introduce exploitable inconsistencies, or otherwise expose the application to attack. For a list of discouraged low-level functions, we suggest you look at the [list of forbidden functions](https://github.com/magento-ecg/coding-standard/blob/master/Ecg/Sniffs/Security/ForbiddenFunctionSniff.php){:target="_blank"} for [Magento's code sniffer](https://github.com/magento-ecg/coding-standard){:target="_blank"}. -### Use Wrappers Instead of Superglobal Variables +### Use wrappers instead of superglobal variables Make sure that your Magento application does not directly use any PHP superglobals such as: ``` $GLOBALS, $_SERVER, $_GET, $_POST, $_FILES, $_COOKIE, $_SESSION, $_REQUEST, $_ENV ``` . Instead use the [`Magento\Framework\HTTP\PhpEnvironment\Request`]({{site.mage2000url}}lib/internal/Magento/Framework/HTTP/PhpEnvironment/Request.php){:target="_blank"} wrapper class to safely access these values. -### Use the Correct MySQL Data Types +### Use the correct MySQL data types MySQL offers a range of numeric, string, and time data types. If you are storing a date, use a DATE or DATETIME field. Using an INTEGER or STRING can make SQL queries more complicated, if not impossible. It is often tempting to invent your own data formats; for example, storing serialized PHP objects in string. Database management may be easier, but MySQL will become a dumb data store and it may lead to problems later. -### Get the Correct Data from the Correct Object +### Get the correct data from the correct object Be sure to retrieve data from the correct object. For example, get SKU data from the Product instead of the Order object. -### Avoid Raw SQL Queries +### Avoid raw SQL queries Raw SQL queries can lead to potential security vulnerabilities and database portability issues. Use data adapter capabilities (Varien_Db_Adapter_Pdo_Mysql by default) to build and execute queries and move all data access code to a resource model. Use prepared statements to make sure that queries are safe to execute. -### Use Well-Defined Indexes +### Use well-defined indexes Foreign keys should have indexes. If you're using a field in a WHERE clause of an SQL query you should have an index on it. Such indexes should cover multiple columns based on the queries needed. As a general rule of thumb, indexes should be applied to any column named in the WHERE clause of a SELECT query. For example, assume we have a user table with a numeric ID (the primary key) and an email address. During log on, MySQL must locate the correct ID by searching for an email. With an index, MySQL can use a fast search algorithm to locate the email almost instantly. Without an index, MySQL must check every record in sequence until the address is found. It's tempting to add indexes to every column, however, they are regenerated during every table INSERT or UPDATE. That can hit performance; only add indexes when necessary. -### Avoid Using Global Events +### Avoid using global events Only on rare occasions would it be necessary to use a global event. You should use frontend or adminhtml to narrow the scope instead. -### Use Magento Data Collections +### Use Magento data collections Execution of a SQL query is one of the most resource-taxing operations. Running SQL queries in a loop often results in a performance bottleneck. To load the EAV model, several heavy queries are required to execute. As the number of executed queries is multiplied with the number of categories, the result is extremely inefficient and slow code. Instead of loading models in a loop, Magento data collections can help to load a set of models in a very efficient manner. -### Validate Input and Properly Encode or Escape Output +### Validate input and properly encode or escape output Remember to always validate data from non-trusted data sources. Sanitizing data coming into your extension and produced by it will improve overall security. For example, to prevent XSS vulnerability, avoid creating methods that output non-validated user-supplied data without proper HTML encoding. -### Always Encrypt Sensitive Data or Configurations +### Always encrypt sensitive data or configurations Never store sensitive information in clear text within a resource that might be accessible to another control sphere. This type of information should be encrypted or otherwise protected. diff --git a/guides/v2.0/ext-best-practices/extension-coding/working-with-arch-bp.md b/guides/v2.0/ext-best-practices/extension-coding/working-with-arch-bp.md index 6d180489229..f51f8deb892 100644 --- a/guides/v2.0/ext-best-practices/extension-coding/working-with-arch-bp.md +++ b/guides/v2.0/ext-best-practices/extension-coding/working-with-arch-bp.md @@ -34,7 +34,7 @@ In addition to understanding fundamental programming designs/concepts, you are e ### Check your extension configurations Make sure your extension is configured correctly in each of your extension's configuration files. Invalid or unexpected values will cause your extension to behave incorrectly within Magento. -### Know and Leverage the Magento 2 Framework +### Know and leverage the Magento 2 framework There have been some significant changes from Magento 1. Be sure to study the capabilities and standards of the Magento 2 Framework. For example: @@ -44,10 +44,10 @@ In addition to understanding fundamental programming designs/concepts, you are e - Consider using Magento framework conventions instead of low-level or PHP functionality. - Use the [`Magento\Framework\Data\Collection`]({{site.mage2000url}}lib/internal/Magento/Framework/Data/Collection.php){:target="_blank"} class to retrieve a collection of filtered objects instead of directly querying the database. -### Use Dependency Injection +### Use dependency injection Direct class instantiation is not recommended because the class can be rewritten. If the class is created directly, any rewrites will not be applied and it breaks Magento's class rewrite capability. We encourage you to become familiar with how we use [dependency injection]({{ site.gdeurl }}extension-dev-guide/depend-inj.html) to get an instance of a class. -### Follow Model-View-Control (MVC) Pattern +### Follow Model-View-Control (MVC) pattern Make sure your extension adheres to the MVC Pattern, and that it does not violate any of its principles. Some important things to check in your extensions: From 2773e67e5909d15ece100d704a12277b2ab6a6d2 Mon Sep 17 00:00:00 2001 From: David Alger Date: Tue, 26 Apr 2016 10:30:17 -0500 Subject: [PATCH 800/902] Correct example crontab configuration * Removes redundant `*/1` and uses simpler `*` for minute configuration * Makes use of log files clearer * Strips unnecessary output from the log (constant, hey we ran!) * Removes the trailing `&` from the commands. This is not needed because everything run by crontab is already run in the background, so it's redundant. --- _includes/config/setup-cron.md | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/_includes/config/setup-cron.md b/_includes/config/setup-cron.md index e6700bcbcce..c5eaf48462c 100644 --- a/_includes/config/setup-cron.md +++ b/_includes/config/setup-cron.md @@ -35,15 +35,14 @@ For example, A text editor displays. (You might need to choose a text editor first.) - */1 * * * * -c /bin/magento cron:run [>> &] - */1 * * * * -c /update/cron.php [>> &] - */1 * * * * -c /bin/magento setup:cron:run [>> &] + * * * * * -c /bin/magento cron:run | grep -v "Ran jobs by schedule" >> /var/log/magento.cron.log + * * * * * -c /update/cron.php >> /var/log/update.cron.log + * * * * * -c /bin/magento setup:cron:run >> /var/log/setup.cron.log where -* `` is the absolute file system path to your PHP binary -* `` is the path to a `php.ini` file to use for the cron job -* `[>> &]` is an optional but recommended string that appends cron output to a file. This is particularly useful for troubleshooting errors. +* `` is the absolute file system path to your PHP binary +* `` is the path to a `php.ini` file to use for the cron job The first command (`magento cron:run`) reindexes indexers, send automated e-mails, generates the sitemap, and so on. Usually it's associated with the PHP command line `.ini` file. The other two commands are used by the Component Manager and System Upgrade. @@ -51,8 +50,8 @@ For example, if the PHP binary is located in `/usr/bin`, you installed Magento i Example: - */1 * * * * /usr/bin/php -c /etc/php5/apache2/php.ini /var/www/magento2/bin/magento cron:run >> /var/www/magento2/var/log/magento.cron.log& - */1 * * * * /usr/bin/php -c /etc/php5/apache2/php.ini /var/www/magento2/update/cron.php >> /var/www/magento2/var/log/update.cron.log& - */1 * * * * /usr/bin/php -c /etc/php5/apache2/php.ini /var/www/magento2/bin/magento setup:cron:run >> /var/www/magento2/var/log/setup.cron.log& + * * * * * /usr/bin/php -c /etc/php5/apache2/php.ini /var/www/magento2/bin/magento cron:run | grep -v "Ran jobs by schedule" >> /var/www/magento2/var/log/magento.cron.log + * * * * * /usr/bin/php -c /etc/php5/apache2/php.ini /var/www/magento2/update/cron.php >> /var/www/magento2/var/log/update.cron.log + * * * * * /usr/bin/php -c /etc/php5/apache2/php.ini /var/www/magento2/bin/magento setup:cron:run >> /var/www/magento2/var/log/setup.cron.log -Save your changes to the crontab and exit the editor. \ No newline at end of file +Save your changes to the crontab and exit the editor. From 3186b858636daa82b8a93fba414d66ef1c1f7476 Mon Sep 17 00:00:00 2001 From: Oleksandra Marchenko Date: Tue, 26 Apr 2016 19:03:58 +0300 Subject: [PATCH 801/902] Added TOC in the debug-theme topic --- guides/v2.0/frontend-dev-guide/themes/debug-theme.md | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/guides/v2.0/frontend-dev-guide/themes/debug-theme.md b/guides/v2.0/frontend-dev-guide/themes/debug-theme.md index a0bddbab3a2..14a300060d8 100644 --- a/guides/v2.0/frontend-dev-guide/themes/debug-theme.md +++ b/guides/v2.0/frontend-dev-guide/themes/debug-theme.md @@ -13,7 +13,13 @@ redirect_from: /guides/v1.0/frontend-dev-guide/themes/debug-theme.html When you create a Magento theme, you might need to create override files for default theme and module view files. To do so, you must determine which template, layout, and style files Magento uses. This topic describes how to do this. -

    Locate templates

    +**Contents** + +* TOC +{:toc} + + +## Locate templates {#debug-theme-templ} To locate the template that is responsible for a specific part of the storefront or Admin, you can use Magento built-in template hints. @@ -49,7 +55,7 @@ A search through the app directory for occurrences of "minicart-wrapper" in `.ph Since it is not recommended to edit the default files, you need to add overriding files if you want to customize the template. For details about overriding templates please refer to Customizing Theme Template. -

    Locate layouts

    +## Locate layouts {#debug-theme-layout} Just like templates, layouts are saved on a per-module basis. You can easily locate the layout file by determining in which module the templates for the element you are interested in reside in. To locate the template, you can use Template Hints or text search in the app directory, as described previously . After you have determined the module, you can search for the layout in the following locations: @@ -76,7 +82,7 @@ Let's search for the layout following the fallback scheme: After you located the necessary layout file, you can create your custom layout file with the corresponding name in your theme folder to add extending or overriding content. Please see Customizing Theme Layouts for more details. -

    Locate styles

    +## Locate styles {#debug-theme-style} To locate a CSS rule that is applied to a certain element, find the template for the page that contains the element. Or you can use browser debugging tools, to locate the class name. After you find the class name, use text search in the theme and module styles directories to locate the `.less` or `.css` file that defines the class. Perform the search according to the following fallback scheme: From dff6da40ee6682b106542a1706b015f7b646c372 Mon Sep 17 00:00:00 2001 From: James Calcaben Date: Tue, 26 Apr 2016 11:27:32 -0500 Subject: [PATCH 802/902] Fix reference to MySQL class --- .../extension-coding/security-performance-data-bp.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guides/v2.0/ext-best-practices/extension-coding/security-performance-data-bp.md b/guides/v2.0/ext-best-practices/extension-coding/security-performance-data-bp.md index ecc5b3d8206..41871d03d71 100644 --- a/guides/v2.0/ext-best-practices/extension-coding/security-performance-data-bp.md +++ b/guides/v2.0/ext-best-practices/extension-coding/security-performance-data-bp.md @@ -41,7 +41,7 @@ You should make sure that your extension handles data with care in order to prev Be sure to retrieve data from the correct object. For example, get SKU data from the Product instead of the Order object. ### Avoid raw SQL queries - Raw SQL queries can lead to potential security vulnerabilities and database portability issues. Use data adapter capabilities (Varien_Db_Adapter_Pdo_Mysql by default) to build and execute queries and move all data access code to a resource model. Use prepared statements to make sure that queries are safe to execute. + Raw SQL queries can lead to potential security vulnerabilities and database portability issues. Use data adapter capabilities ([`Magento\Framework\DB\Adapter\Pdo\Mysql`]({{site.mage2000url}}lib/internal/Magento/Framework/DB/Adapter/Pdo/Mysql.php){:target="_blank"} by default) to build and execute queries and move all data access code to a resource model. Use prepared statements to make sure that queries are safe to execute. ### Use well-defined indexes Foreign keys should have indexes. If you're using a field in a WHERE clause of an SQL query you should have an index on it. Such indexes should cover multiple columns based on the queries needed. As a general rule of thumb, indexes should be applied to any column named in the WHERE clause of a SELECT query. From 075f95a00aff56effee4bc551bdc5519723c3395 Mon Sep 17 00:00:00 2001 From: stevjohnson Date: Tue, 26 Apr 2016 13:40:21 -0500 Subject: [PATCH 803/902] Remove mention of setting mage_mode in .htaccess --- .../v2.0/config-guide/cli/config-cli-subcommands-mode.md | 4 ++-- .../config-guide/varnish/config-varnish-configure.md | 9 +-------- 2 files changed, 3 insertions(+), 10 deletions(-) diff --git a/guides/v2.0/config-guide/cli/config-cli-subcommands-mode.md b/guides/v2.0/config-guide/cli/config-cli-subcommands-mode.md index c6bcf99c347..ae21f36e04d 100644 --- a/guides/v2.0/config-guide/cli/config-cli-subcommands-mode.md +++ b/guides/v2.0/config-guide/cli/config-cli-subcommands-mode.md @@ -13,7 +13,7 @@ github_link: config-guide/cli/config-cli-subcommands-mode.md #### Contents * Overview of setting Magento modes * Display the current mode -* Change modes +* Change modes

    Overview of setting Magento modes

    To improve security and ease-of-use, we added a command that switches Magento modes from developer to production and vice versa. When doing so, we set file permissions and ownership appropriately. @@ -135,7 +135,7 @@ A message similar to the following displays: Current application mode: developer. -

    Change modes

    +

    Change modes

    Command usage: magento deploy:mode:set {mode} [-s|--skip-compilation] diff --git a/guides/v2.0/config-guide/varnish/config-varnish-configure.md b/guides/v2.0/config-guide/varnish/config-varnish-configure.md index 598ccd6dbb6..7ef35f0f7f7 100644 --- a/guides/v2.0/config-guide/varnish/config-varnish-configure.md +++ b/guides/v2.0/config-guide/varnish/config-varnish-configure.md @@ -184,14 +184,7 @@ Now you can verify that Varnish is serving pages by looking at HTML response hea Before you can look at headers, you must set Magento for developer mode. There are several ways to do it, the simplest of which is to modify `.htaccess` in the Magento 2 root. You can also use the `magento deploy:mode:set` command. #### Set Magento for developer mode -To set Magento for developer mode using its `.htaccess` file: - -1. Log in to the Magento server as, or switch to, the Magento file system owner. -2. Open `/.htaccess` in a text editor. -3. Uncomment the following line: - - SetEnv MAGE_MODE developer -4. Save your changes to `.htaccess` and exit the text editor. +To set Magento for developer mode, use the [`magento deploy:mode:set`]({{ site.gdeurl }}config-guide/cli/config-cli-subcommands-mode.html#config-mode-change) command. #### Look at the Varnish log Make sure Varnish is running then enter the following command on the Varnish server: From 3b0f8149d504074f5ff5e1fc501faf78bb6a8f34 Mon Sep 17 00:00:00 2001 From: Kevin Harper Date: Tue, 26 Apr 2016 14:47:21 -0500 Subject: [PATCH 804/902] review draft --- .../authentication/gs-authentication-oauth.md | 276 ++++++++---------- .../authentication/oauth-errors.md | 107 +++++++ .../get-started/authentication/oauthflow.png | Bin 30969 -> 47228 bytes guides/v2.0/howdoi/webapi/integration.md | 38 ++- 4 files changed, 266 insertions(+), 155 deletions(-) create mode 100644 guides/v2.0/get-started/authentication/oauth-errors.md diff --git a/guides/v2.0/get-started/authentication/gs-authentication-oauth.md b/guides/v2.0/get-started/authentication/gs-authentication-oauth.md index 6a359b27777..097718fdfb9 100644 --- a/guides/v2.0/get-started/authentication/gs-authentication-oauth.md +++ b/guides/v2.0/get-started/authentication/gs-authentication-oauth.md @@ -9,75 +9,108 @@ github_link: get-started/authentication/gs-authentication-oauth.md redirect_from: /guides/v1.0/get-started/authentication/gs-authentication-oauth.html --- -Third-party applications that integrate with Magento can use OAuth-based authentication as one of the ways to access Magento Web APIs. This authentication method uses an OAuth 1.0a handshake process. - -For details about OAuth 1.0a, see [The OAuth 1.0 Protocol](https://tools.ietf.org/html/rfc5849) - -To configure your third-party application (represented as an Integration in Magento) to use OAuth-based authentication to access Magento's Web APIs, read these sections: - +Magento OAuth authentication is based on [OAuth 1.0a](https://tools.ietf.org/html/rfc5849), an open standard for secure API authentication. OAuth is a token-passing mechanism that allows a system to control which external applications have access to internal data without revealing or storing any user IDs or passwords. + +In Magento, a third-party extension that uses OAuth for authentication is called an [_integration_]( {{ site.gdeurl }}/howdoi/webapi/integration.html ). An integration defines which resources the extension can access. The extension can be granted access to all resources or a customized subset of resources. + +As the process of registering the integration proceeds, Magento creates the tokens that the extension needs for authentication. It first creates a request token. This token is short-lived and must be exchanged for access token. Access tokens are long-lived and will not expire unless the merchant revokes access to the extension. + +## Contents +* [OAuth overview](#overview) +* [Activate an integration](#activate) +* [2-legged Oauth handshake](#oauth-handshake) +* [Access the web APIs](#web-api-access) +* [Generating Oauth signatures](#oauth-signature) +* [OAuth Error Codes](oauth-errors.html) + +## OAuth overview {#overview} + +The following diagram shows the OAuth authentication process. Each step is described further. ![OAuth flow](oauthflow.png) -

    Integration registration

    +1. **Create an integration**. The merchant creates an integration from Admin. Magento generates a consumer key and a consumer secret. + +2. **Activate the integration**. The OAuth process begins when the merchant activates the integration. Magento sends the OAuth consumer key and secret, an OAuth verifier, and the store URL to the external application via HTTPS post. -As a merchant, you must register your external application as an Integration with the Magento Instance. Integration can be registered in the Magento admin (System > Extensions > Integrations). +3. **Process activation information**. The integrator must store the activation information. The OAuth authentication process cannot begin until the merchant has logged in to the external application. -An integration contains details like the endpoint that receives Oauth credentials and list of APIs to which access is requested. See [Create an integration]({{ gdeurl }}/howdoi/webapi/integration.html) for information about configuring an integration +3. **Call the application's login page**. Magento calls the page defined in the **Identity Link** field in Admin. -

    HTTP POST with OAuth credentials

    +4. **Merchant logs in to the external application.** If the log in is successful, the application returns to the location specified in the call. The log in page is dismissed. -This is the preceding step before the 2-legged Oauth handshake starts. Only an administrator with access to Integration grid in the backend can initiate this. +5. **Ask for a request token**. The application uses the `POST /oauth/token/request` REST API to ask for a request token. The `Authorization` header includes the consumer key and other information. See [Get a request token](#pre-auth-token) for details about this token request. -An admin may choose to select **Save and Activate** during integration creation or click on **Activate** against a previously saved integration from the Integration grid. +6. **Send the request token**. Magento returns a request token and request token secret. -This action submits the credentials to the endpoint specified when creating the Integration. +7. **Ask for an access token**. The application uses the `POST /oauth/token/access` REST API to ask for an access token. The `Authorization` header includes the request token and other information. See [Get an access token](#get-access-token) for details about this token request. -The use of an HTTPS for the endpoint to pass credentials eliminates this risk to a certain extent. +8. **Magento sends the access token**. If this request is successful, Magento returns an access token and access token secret. -HTTP POST from Magento to the Integration endpoint will contain these attributes: +9. **The application can access Magento resources.** All requests sent to Magento must use the full set of request parameters in `Authorization` header. See [Access the web APIs](#web-api-access) for more information. + +## Activate an integration {#activate} + +The integration must be configured from the Magento Admin (**System > Extensions > Integrations**). The configuration includes a callback URL and an identity link URL. The callback URL specifies where OAuth credentials can be sent when using OAuth for token exchange. The identity link points to the login page of the third-party application that is integrating with Magento. + +When the integration is created, Magento generates a consumer key and a consumer secret. + +A merchant can choose to select **Save and Activate** when the integration is created. Alternatively, the merchant can click on **Activate** against a previously saved integration from the Integration grid. + +Activating the integration submits the credentials to the endpoint specified when creating the Integration. An HTTP POST from Magento to the Integration endpoint will contain these attributes: * Magento store URL. For example, `http://my-magento-store.com/`. * oauth_verifier * OAuth consumer key * OAuth consumer key secret -Integrations use the passed credentials to get a request token, which is a pre-authorized token. Integrations then use credentials plus the request token to get a long-lived access token. +Integrations use this information to get a request token. -

    2-legged Oauth Handshake

    +## OAuth handshake details {#oauth-handshake} The process of completing the Oauth handshake requires that you * [Get a request token](#pre-auth-token) * [Get an access token](#get-access-token) -

    Get a request token

    +This process is known has a 2-legged OAuth handshake. -This is the first step in the 2-legged Oauth handshake. However, you must use these credentials to get an access token in less than three minutes, or the credentials are disabled for security reasons. The expiration time can be changed from the admin panel. +### Get a request token {#pre-auth-token} -A request token is a temporary token that the user exchanges for an access token. To get a request token from Magento: +A request token is a temporary token that the user exchanges for an access token. Use the following API to get a request token from Magento: `POST /oauth/token/request` -You must include these request parameters in the `Authorization` request header in the call: - -* `oauth_consumer_key`. The consumer key value that you retrieve after you register the application. -* `oauth_signature_method`. The name of the signature method used to sign the request. Must have this value: `HMAC-SHA1`. -* `oauth_signature`. A generated value (signature). -* `oauth_nonce`. A random value that is uniquely generated by the application. -* `oauth_timestamp`. A positive integer, expressed in the number of seconds since January 1, 1970 00:00:00 GMT. -* `oauth_version`. The OAuth version. +You must include these request parameters in the `Authorization` header in the call: + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ParameterDescription
    oauth_consumer_keyThe consumer key is generated when you create the integration.
    oauth_signature_methodThe name of the signature method used to sign the request. Must have this value: HMAC-SHA1.
    oauth_signatureA generated value (signature).
    oauth_nonceA random value that is uniquely generated by the application.
    oauth_timestampA positive integer, expressed in the number of seconds since January 1, 1970 00:00:00 GMT.
    oauth_versionThe OAuth version.
    The response contains these fields: @@ -88,21 +121,50 @@ A valid response looks like this: `oauth_token=4cqw0r7vo0s5goyyqnjb72sqj3vxwr0h&oauth_token_secret=rig3x3j5a9z5j6d4ubjwyf9f1l21itrr` -

    Get an access token

    +### Get an access token {#get-access-token} -The customer cannot use the request token until it has been authorized. To get an access token from Magento: +The request token must be exchanged for an access token. Use the following API to get an access token from Magento: `POST /oauth/token/access` -You must include these request parameters in the `Authorization` request header in the call: - -* `oauth_consumer_key`. The consumer key value provided after the registration of the application. -* `oauth_nonce`. A random value, uniquely generated by the application. -* `oauth_signature_method`. The name of the signature method used to sign the request. Can have one of the following values: `HMAC-SHA1`, `RSA-SHA1`, or `PLAINTEXT`. -* `oauth_signature`. A generated value (signature). -* `oauth_timestamp`. A positive integer, expressed in the number of seconds since January 1, 1970 00:00:00 GMT. -* `oauth_token`. The `oauth_token` value, or request token, obtained in [Get a request token](#pre-auth-token). -* `oauth_verifier`. The verification code that is tied to the consumer and request token. +You must include these request parameters in the `Authorization` header in the call: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ParameterDescription
    oauth_consumer_keyThe consumer key value that you retrieve after you register the integration.
    oauth_nonceA random value that is uniquely generated by the application.
    oauth_signatureA generated value (signature).
    oauth_signature_methodThe name of the signature method used to sign the request. Must have this value: HMAC-SHA1.
    oauth_timestampA positive integer, expressed in the number of seconds since January 1, 1970 00:00:00 GMT.
    oauth_versionThe OAuth version.
    oauth_tokenThe oauth_token value, or request token, obtained in Get a request token.
    oauth_verifierThe verification code that is tied to the consumer and request token.
    A valid response looks like this: `oauth_token=0lnuajnuzeei2o8xcddii5us77xnb6v0&oauth_token_secret=1c6d2hycnir5ygf39fycs6zhtaagx8pd` @@ -112,9 +174,9 @@ The response contains these fields: * `oauth_token`. The access token that provides access to protected resources. * `oauth_token_secret`. The secret that is associated with the access token. -

    Access the web APIs

    +## Access the web APIs {#web-api-access} -After the Integration is authorized to make API calls, 3rd party applications (registered as Integrations in Magento) can invoke Magento web APIs by using the access token. +After the Integration is authorized to make API calls, 3rd party extensions (registered as Integrations in Magento) can invoke Magento web APIs by using the access token. To use the access token to make web API calls: @@ -122,15 +184,14 @@ To use the access token to make web API calls: You must include these request parameters in the `Authorization` request header in the call: -* `oauth_consumer_key`. The customer key value provided after the registration of the application. +* `oauth_consumer_key`. The customer key value provided after the registration of the extension. * `oauth_nonce`. A random value, uniquely generated by the application. * `oauth_signature_method`. The name of the signature method used to sign the request. Valid values are: `HMAC-SHA1`, `RSA-SHA1`, and `PLAINTEXT`. * `oauth_signature`. A generated value (signature). * `oauth_timestamp`. A positive integer, expressed in the number of seconds since January 1, 1970 00:00:00 GMT. * `oauth_token`. The `oauth_token`, or access token, value obtained in Get an access token. - -

    The OAuth signature

    +## The OAuth signature {oauth-signature} All OAuth handshake requests and Web Api requests include the signature as part of Authorization header. Its generated as follows: @@ -150,101 +211,10 @@ Use the ampersand (`&`) character to concatenate these attributes and parameters To generate the signature, you must use the HMAC-SHA1 signature method. The signing key is the concatenated values of the consumer secret and token secret separated by the ampersand (`&`) character (ASCII code 38), even if empty. You must use parameter encoding to encode each value. -

    OAuth error codes

    -When the third-party application makes an invalid request to Magento, the following OAuth-related errors can occur: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    HTTP codeError codeText representationDescription
    4001version_rejectedThe oauth_version parameter does not correspond to the "1.0" value.
    4002parameter_absentA required parameter is missing in the request. The name of the missing parameter is specified additionally in the response.
    4003parameter_rejectedThe type of the parameter or its value do not meet the protocol requirements (for example, array is passed instead of the string).
    4004timestamp_refusedThe timestamp value in the oauth_timestamp parameter is incorrect.
    4015nonce_usedThe nonce-timestamp combination has already been used.
    4006signature_method_rejectedThe signature method is not supported. The following methods are supported: HMAC-SHA1.
    4017signature_invalidThe signature is invalid.
    4018consumer_key_rejectedThe Consumer Key has incorrect length or does not exist.
    4019token_usedAn attempt of authorization of an already authorized token or an attempt to exchange a not temporary token for a permanent one.
    40110token_expiredThe temporary token has expired. At the moment, the mechanism of expiration of temporary tokens is not implemented and the current error is not used.
    40111token_revokedThe token is revoked by the user who authorized it.
    40112token_rejectedThe token is not valid, or does not exist, or is not valid for using in the current type of request.
    40113verifier_invalidThe confirmation string does not correspond to the token.
    +Related topics +[Create an integration]( {{ site.gdeurl }}/howdoi/webapi/integration.html ) +[OAuth error codes]( {{ site.gdeurl }}/get-started/authentication/oauth-errors.html ) +[Construct a request]( {{ site.gdeurl }}/get-started/gs-web-api-request.html ) -

    Next step

    - -

    Related topic

    - +Configure services as web APIs +[Configure services as web APIs]( {{ site.gdeurl }}/extension-dev-guide/service-contracts/service-to-web-service.html ) diff --git a/guides/v2.0/get-started/authentication/oauth-errors.md b/guides/v2.0/get-started/authentication/oauth-errors.md new file mode 100644 index 00000000000..a77d42da8db --- /dev/null +++ b/guides/v2.0/get-started/authentication/oauth-errors.md @@ -0,0 +1,107 @@ +--- +layout: default +group: get-started +subgroup: B_Authentication +title: OAuth error codes +menu_title: OAuth error codes +menu_order: 3 +github_link: get-started/authentication/oauth-errors.md +--- + +When the third-party application makes an invalid request to Magento, the following OAuth-related errors can occur: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    HTTP codeError codeText representationDescription
    4001version_rejectedThe oauth_version parameter does not correspond to the "1.0" value.
    4002parameter_absentA required parameter is missing in the request. The name of the missing parameter is specified additionally in the response.
    4003parameter_rejectedThe type of the parameter or its value do not meet the protocol requirements (for example, array is passed instead of the string).
    4004timestamp_refusedThe timestamp value in the oauth_timestamp parameter is incorrect.
    4015nonce_usedThe nonce-timestamp combination has already been used.
    4006signature_method_rejectedThe signature method is not supported. The following methods are supported: HMAC-SHA1.
    4017signature_invalidThe signature is invalid.
    4018consumer_key_rejectedThe Consumer Key has incorrect length or does not exist.
    4019token_usedAn attempt of authorization of an already authorized token or an attempt to exchange a not temporary token for a permanent one.
    40110token_expiredThe temporary token has expired. At the moment, the mechanism of expiration of temporary tokens is not implemented and the current error is not used.
    40111token_revokedThe token is revoked by the user who authorized it.
    40112token_rejectedThe token is not valid, or does not exist, or is not valid for using in the current type of request.
    40113verifier_invalidThe confirmation string does not correspond to the token.
    + +

    Next step

    + +

    Related topic

    + diff --git a/guides/v2.0/get-started/authentication/oauthflow.png b/guides/v2.0/get-started/authentication/oauthflow.png index 16ed8e13a864644adcf9fcf1b697026592b932e8..d0a772b95792ec53f35f43222633557d61ca9ee2 100644 GIT binary patch literal 47228 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 literal 30969 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 z zqjZd4R?yj&dW2m{1A0?rg0bsRx{H14rqP*@W3;QtyWa05D+7G@N|Tk7pNVy+j^D}l z1#^n0dC zZNC_-nH&-%FfMOzWZo2+F8(oneA~fpZ*APF)KG_PvT-ZyQ1cRFF;!)R*&<2R|0R(N6_0%depZvW;&akT$)f`^V0Ser?r@T zhY0+@Sv#a$ zpq3DZGjcAiAaSrqKA7K(UVc43$5}r$Dn;zm_H15Im+_bn@we*(p3fah!G&i8s@a(k}W%t6qX_R@yh%Ck!-hmxL8I4*>8;pFVQ|q9?xH* z6-ZWK?ORiP*Oaq!PsDQj%He7U6cb2vqTHD`gLIV?y4?|m>4P+h4PCpF?_Uf%i{T^ zja^JSTZm|*cRDPbA-|(w!$B}pe`>ZgKy8qiv%KKxHY{@Kg>{XNR9UA!8`dVD=s%|)RgvpmN^yOI-^(;>slsZhmuFcj1 z>F=7APS^#6ue!5I$J@UAvx|+h7eB)JqZ5#;!FLQ3+%p8K1B(c2`zHP6a!K`3$)cg2 z4yS@#x^v&$wq4e5l3PE>?Mq87cAVU(a^5}`FtZnNdA>!%J{HLUWb+4F zuxrue`}_+*4uCZmZcIAJm!%voW4pxmMBPdmJ!d1zTuN?f6r!m-ecrH-oFi!s8C#q8 zNoZ^EdDVM|95lu#>74SL55MqX`uKUOZT+CX)nq=5ZjEoanD?c)z(=)QR{NBGuToNP z2EO&FXeh&pw1)luXgPsyhs$ju^NP=RUEnw-E<4BEHN{<>ibPg89S z)p*tFS)pM)!S2bZ?yYzprHmdQNs!U(H84$F8gTx6!!zGkO3MGFdQ5o6`!Y=TFPsRC zO#41rP|8rT`)()2!Q_U0M_321DBn*mkEPN_6{8OF8*iv43G7pw^bl@(t3@HVjxZVb zjkX~@QGfI=j?AuiQTiRQVtW9|v3Kqc0{Dh=91^n9+~unDv1GC}yoe))NB*9D#dZ6R z>yy94BgTWRVLV@CkRf@djrL++mjLT;sc$k>HyDLXjMh~hR@TXvHQue}*wbvVY*5X$ zkQ^($FgsK#ij`x95&<*ztPpe_Q^EEd2!+p?TXCLh3h)`7heaAp>SS2e_{R!0=aV z4$Tr)Sy;*2POfWCDu1F`Dfpg|_9Dp~4e8&8Y>@5w-+&OG zmHfPc{}}Ke5B#6^z`ibQ%`o+ys$3(G$@M(GS$w%dK~qAgV57{La^~w!0D&^WMyx1s z{qhZ9Tp(_NV-zl*GX{-09xc4OJRXgZ?2r~`pa`V)ZLs0`r%iF&t%pacO?Unrg#76B z)RwnIqxVUEEKV^97=D)h@%OIw!KeRKE7E!u7@qE*1#0B~vTtidC}eG0adN-G?|~^= z`hVIAiDdgzoifAaYsdzQ-s5G_8qi+LD2QPP0Il4u??Qj8R}S>*E4X@^)un0`(#)R0 zEN=W;({c;2_?G2#lK!ato31zPiJ9_vcH0iGOO9QntHYv%&>J6d;TVd??*TK=)ZHyQwFqva)8 z&tt@>EJ^ZD<P+ypOPV6MUiitv3*T)^M8wlHUZOyWXxi^6M=a&tEb}nA2V9-0gcmA zm3}f|udaOGk*v-6(+8J7$n=@*?s?m33Nx!lv@tvDv1kq+EH>>F=m^1#5i$LVcVK!G z!LrN>cz?#jw*_pX1j8S(8ZEKR4iWKZ0(11?kE{i9g>aeMN`D$s&Z)=JFl6G7<0r-e z?>mN?4i`_6qXsICBZLqcseq&2nvxoVO}bGgsiw3*cWJ+fDQpuNFChu)?kE1s*#8?FCles7;!imL#;BeKXi@VDP4NByuDOy0&dr^~nn12d zJy8?9@i%B_;9@?F>pLCbvUYOolYd-Z3%LBqY$=C1ce+sZe$T9lI4+X2)6_?r>lj24 zDP9|mVqCiNPyYG?Vdod%e?GIWkh9QY>cKReA%^m?Kh4)&9H2g$v}vIWZ=m9~)RD3N z_la_VMTNFRq++yWn{ZO9dhENa;|x0A8iFsQ$dk8T{q30KLqM6ZRDW193UCf5Pxx9v z3`hYJNuXA3HtPD4>7tmMeM3chNCYV&TP2I8+^!zw`p)N1>;cIgz|u;a$Jc+3s{I0{ zuG^{G%syK*CiB{S;hL~1p0}ghU+7Zt8AnX@?4Jq81Blytxy#^v68F_9?viywUdXT` zoe50prXKYPax)1!1U+ObS%|(z`c;%c^WTy-K44|95i~Ry90t;e(Hcb6XibGhOyDC;yHZT#({# zNcPWd8Fg8>PYTw@hYMCYrXQDV)F(5Posy$Scd!wMH90E5A2T^TFD3pvuYhTQxyk-l z;g1^R`Xrxv3+h{xo?~Yp4$>p>d-d^)AF{QN`oHJ=Gp1kB7G4!sHH5K#@g-`=L5)f3 znFu(2vA*%wT3R3>XbZ%2=ZGo^@SO$F!YDOTP}2csU=uTyej_LUgZB27zX9?FW(EB3 z$Al`HjlA)Dc%`~m;uYS?JYuL_=hOAaH2|!5exL7qAQL%)I7!4cC5r8bcX>gcDK-CQ zAIZeI^ku&NrS_wrgd=;*``pTm+mTIwqd4>AqNzXn_Ryw*H7n*tP=I2tm`|s+L*Vz2N)k zuVBE8ft0VqS_*A)E*Ov!aTC0KvEa`#1`37L?*fZZD0w{EgM4<#%nYLkWXy9O57p@T zdoziDh*PK|qZm*S@avqt|J}#P{8bScnDkp>LPRQmcarzXK4r4Km30BgcCZW2;-~}V zHSi=Y=HPNU=O21yl0hj1kmfj_v-r+}K|yIR-)_b#dTRvBe*L>SZflrZzRdb19?%s; z8LN7hp3ggF0b*VKKRnUHO7#q+4<9P#&U9)#>fE6U;dXhHVm$W|?s=NGzi4$GE z4>UK!j@C+CJKufVzYYm~>-DFBp&I9fRzR5=1T;XW)ZhV89wh&$Io<1^=(Ppq%%o$Fww10{s2vqZjpf*9s^RK*Q!qJ53Cp zFA4LlFRv*Bc>+jbsOV>@WX|rPg_du-cd{U@tK$)t75-R1*UnjDxN<5Ea{t)7ENQbN zGH<)fL#F*!R6JjnHAJ)tVD44BvOy~Q?p=#%G^dO1Q8%Q0em>m{R|-ku*h%tU|2fa( zvD&x2I+5iv820;KA})wZMm5he!QxkaV*gJEy#M&k9vWJios=s~0;7^{vwrgn@f4XY zJH?;9J_94fIU)0@7|B<1R6|K7D08^KKsQzHOgNG^3Xl%Oo`C@-lFKyzGZe2Z)C`w< zrg4Cts_8G*ma*yk=`aRP+U?rs@l$N;aIEI0o{-RaXzKH_(%@dA%z!D4*2SpK_&?{q zr>ScsSE-B=422>A#voRg$7C|w!$g#{W;CX}~xg)T8~Y zYhEM9Ft=GP&z%}z#e8X!HPfuIZj*^3}3Ua*#1hHW;C9m zwG}Tw?E8XPZT4Bf!t9}Hnnfxu{SUR(0jlM7P1NTAD&8zYu*(v7fMD%FcJuPZl{ti` zcYvNZRSE%$5LynwJcFYMKntQh>^SlOVDO^KWDex>t1!>Abo0L2>|;$4Y^fZQ4_HtJ zkZyFU9Hm&Hbr>T8Zryz^W^=|)EY;2?>*XRvmhPHu*1++L5eoD$EM)m+%Bv<~va7AZ zBKzOY)%fY58vNXmeIfWEk?FXI8*AfT>ML!Trnv$q*)R>yWf|{y1NPq9?3bHKY)r0a zKq;ToGDQqwiD7?&w5t+ay?0sxZt{LF)@k^TMN=(DbF5JoeU!56y}kgtbGn?K zqk6^EhP5>u+e`5}QSu%!yg15U!acTw!Yv>Nptt$geGO9X+P~`Ak?mc0Y+8)6VX$W`GDR@(8*M0LG z$MeOSn5KR_R5nc#0r>TEJS@$y$sH5TWGMXgPACum*;?+l7)z3k1jAsKgAa?t(9UTP zwu3mdQ>16e9k-Gbh<37<+F0H8tyPl9*rC?xk+OZkR|G%lTj^0}I9HmeF$?JnpB9SE z6}X?)a&Nv#y$fBRvm!!NZO`ole;Clj8WXG#0<)jht&gTotb_lTM(B;6<)G(SYAE*c zWh$sf*cEBi>14i)yXp?_$zt3FQZP!sdVh;v0CTPZ8sav+4jbT4^ROBP>Hz`a!3%DR>N2+xloWT0ne)X{!;Rjo~0oKRz^-R~k zG(R`Wa~nf0G0np0kvVvPEi8~qOx<@FsIdEJ)i^hq=~qbx}{` zQ0DgX7)t%;$xct5no}=pMvlYu$!7SVecuqtW9=njhp%rGK1GL?xs|*GVRzx}OcF?u zo&lnPf7sNl@xnOIDd!eO`)-f3rMn#0eDG`VETn6X><`zmAHVfK?EwVf<5}mnTotXk zg>V;tRw|x6$80NJ8z%xweqOhj8I!=*nyi#ASz_jw?$#`BoE)Xgo*w(=+ctD{Nvak9RCq}24~n8p3%Z)5#^Z6CFg2DH zQK2R)^RmBk^Pmu$-ldK=UqB3~!+4-$T(7ZS)4cZPfJlobKL^gGGj4P#C~t`1c)z&$ zS2mM|J{%JOx;G3=If8~v&MRpW^6UI)q8tn&iF~^_cy_*!Fk$231*@wa?kCB4+pWg zAr9$pj8nQk$U~~T47=MQy-N}_TA(eCV0v?(RG=_r!3DgU(EFXm9#aSedRg5E2IG@T%$X#MlyL7i%m~t?Z>LpxGCrpCzdL3#^q*VBqy3;DiM7Mwh0m}v7uQ;A{7ns;)X}U zjweDv>49e)Oh?hWv(~dhhDXoiUB0@l3aGht#wYFZ&_4&1Oy<+m$hggw+rJpV2~Uzl z>~jqc2R&2FfLf;>m+C{OkWAO-({^e}Cop*>o_mBq_KD~q+Uro8;q^Tknuh1(-c7uY+9wV0@iu{Q1=0E0L8D` zkSDihb!E0ji!E~0;7d;iC{KPZRu}br0m~`IZDuFI0&=PlRi#g&(Dw~NEupuq-|3_w z%aWnOdTUM&B$Ji)UcV}Z*7^b}ve}YROmV`FLP>MWbF%pMC?!eLO$0?&Hl3jWzN=BY z!&Ep*#wK`B_2;e=tMu-FHnLyWCxqKYWhhbPFohgQ#4gu?c(;;f!QmNYlpb58vRhB`H+ zPo7=+e49>R-3VZ}3+;X*7XxF_%6*LiY(9esoq`mM=l+#t9%v3I>~1P&?035AZTfXK zml`uu&`G>U4_x}B{I}<75nrusNDk>t<5@h9DY9zHznCKPOrnKpJFF2>?ka8{4DEa& zckW^tVxqHY#-p z65+8iY8H==EuZiQSuu;Qxk;b)(% znF4jP@Eb&(w-gBJ0W^Su+^8@IX4hu6zQ5t+&>xXJ-E09Hai-EDAH{hbb3yqYav>Z< zLEYR?<3TXHc1MC?@+|(m-k0gdXsPxDie@bMY!ZO^WK>pJ;e5j zR><)x+esBwUQvN_1qzyR4x+zZhcZo-0h+%vSOpI; zmFNrCo{ATlM1ptd^Djd-gR#-wGAnZEva9@2a=G3oOs-tAAGAMqoU>&fWnm#Dj?>av zW8V`B1|jlzOCm&d5&w&dsVn23v6SF!^GK};+r zqtGj{!zjcEP{BqK0se+s8x(n5Q#J8u!>4?Vq_v?&Ty-Z<%)_BK;oXV8hq=&1C zL3zPw3B==9#SPwS+a>A0l1n(Ta@yXxz)~!PfzZ>z1^>|9Bu~jOE7Z`4*$R@F#Ru^q zqZ1iT(%u>)U#cwY;d0;K6^=1vKITFXMVZ`34?3E4A9b2hM~meBBaGd)1#dp|2w+ztM#duT0by5o*$V#snpRQbsLqNmRb5lsTyP%(|9)>L4I zvXUh{PMNp7XB#1f_{P!3P6PiwA6(au%4hj3buxlJ{=iHqxQfdL@2pJBUn9ikL5Yj<nS5ujp`VYIO^DHVP>;;WMUMJ&wsOQ zaZ%>9SjAR&%{<>@5CQhv*UEDnCB>N0Q&k$O@z(uF@g&Q*sJXEhx+^IaGQ}jicdE2d z#UdPybb`mc1s|-bm16a3c~3SNA!Df*Ri^{M-lr8}=6ExPOltbZjmkCJtUMN@Ae)>- zfkZR$lL4G+5cQJHyH}f@Zo2Z0#-H3Dajx2$;VW4udj`n|i&&8DtA*cX;4#16rT4Vu zF&W(%S8f@k3q8u{x$5tY@7>BeS2Wmb`x%5QDqKM&d*N50pt9iV9%GqI8ARoTox{RF zJu~d?NlX8ssET8GN0JP3q~L=v=-K{dK%euk=F|od4vLDrQ>e6)rF3w>zJ7P6(hx+*F&WM~_5H(fGdA(u>om#la z^wG$ptJW_>F-vT0-5w_%5!NO=K6B(RAyDgtA^IIafG?lR6rx>RnI8H7}w z06t?e`!hP4!)%p`DsUS`s3z9TrfOk%WSUqe8_QvnaHvTZ~Q!m@Tw=9>u2$t9- z&pi-R_xeXbamChVTfL9y`#AcKeB#m0ybM4r_aNah^{s0E`H~^sV3HeP!No$g~e#&5xtq!t{la z)X;5f$9p11(*`)ai4rY$Y?vtzPGVEgt(6OABPx{X_L3D=f}fF@)fK=cpGp7d_$j9M z25*_KIqWC^DO$da8q2oJ%Hh2#5!C$#fLh=AIqsxpki<1N0dyk3)eR+S--pAb2C*|# zCfz*H+}u;2s>3R`01z^Sq~=*Yz_|%MwE`Y{CCTV}1>h?;`G1VpIzB(>xO9~|&nn*K zTZP^CzFTJ+I1A!hmM>Sy2D-0y&Hbz2atH8B#wt#Tb8=|&Of6*xO3 zg)zseRqUO}?TV(@+sApxb2_PpVGf< zQ}vpgLGgY#E_Esb*)j9dlG^E{52aF<>Or@2R_f!1^>?g2>a(M1)7<`x1Rri~4_$v( zH>K-`1Mr%b63VBQ*Afl43P+9M0~j8D$E_ku7IX(+{sXW5_3&Z!6&2t^K#jsY{Tu_! zD@wviXrQ3W(rO$LTC6+#L5Ysv$O2lv*ZIvM!lDWZ7B$TnR+_Xj+Fu>!%j^5?XIi%L z*od{+&`mkL!pF$cue415#QnEUA|FGD#d$$P(Q8HaUZu%m`0=2DuhkMA!#8ei{!J?? z#C%3Kzo`;@k)2MttW>=VG^j}MLd^XG(^&7_9qOv{aIobY(4;^=$(;rU=jnMrTRjDgpXasq8=FVMFqHxm7nPensZMorgXa6+gsBv^13;BNpkSil)k|jQgH-cef$} z6>|nYZk69re~^qk>raU}|7cXbNV4D$Z4*n$(pKY-k1cku0kE48W;|oJszvpGR2)Ti z#oXIK9NYYw7Bfw{J<)J3NTz-b0191EvP&WvH2|J4pmIn z6~KHxg9n4N#dB}RZ`ixnc5j^MCbefm>LODVKDBNZ?32~fOdKAG4{^u6LR&3G*Y9ip z(Lle70yNM$!?{AHL)p{Y|Ffj2t0EDQc)hQqBxA`J#Ys4x=rLjA(&INx05J6qP_i^= z@4UoqgjbTO?01amJK;?55ueUtny@^XBjE{Iixc@GZ8HA8=-rGrar6d9K)}_}M=;vT zCa%-#`sWovW7s$~ry4@;oEAX1MGK#En4)yo; zk%~l7$S#T`Df?~;S&Hn-$V|crA^VoCg*FP=_kD{I$xdmp8{3SKEsSN1eI46#-uOJ< z@AX{YKj3+;>-ohs&ilO2a-VbG=bZbz?$`TUvGjVpBj)u=Wh$~cy^hA0qpO##X7e_o zWOx1W3_elkSk1g z#WZcIL{d6Z$aJFl_K(fidONRwg7_E8ah{zT1=yPiKR5d+3^=@MywcMWL3Za17ZA5U zJ9cV&yV+hGaG!m^`kJB8%UogLigl#nEAo zb$gw1sx)0Mz-nH*>s~XvwdI)mm{iwRQM)zDU(#RU_x)C^h)dG!P>E_%qOADLysMQ& z(!$Kg6q(V1iYqsh{d?`@+nV$J?igh0Q@iv9ESFm&pNKz*_W*JI9TUfVD`V1BJvIGs z1K?7uEQ+@rT+h3yO5RJ;3NMQA0Gx8CQ+ zqwK5F8|A6!8&Z&}eCRS- z<@Z6a=zieWQl-HG@o29%$=7=$6r>!=U1wxl{|K;duX~q7BL;fX2xKmzhCBVe%~MUH zU|dL54Is|4Npv#KPSY)#tmZjv{w8)IkL#ie$*g+Rz_Bn7oJvg8=LRQGUhChn_{5zN zMB+r=ZDFd9DY&Y_ydHb6DFzB(Ni?~vZoCJvU(-`_QMt@yLHCa+N&<9sXl%HBoYkU5cAD zXQbFqUAwH=3I6Qzow$jNml@>Zh;n%zls)LgyX72k=*wTCLOv&@EU%q!AvL2QWmr;p0+= zP5as`={zxuFhbbOhfx*?*&%_9v#N zD%klYeroQIVnCF*Pfbf5WDW+p6?>LN7{G8h&Zh+)OhaRUQiG@Cl`9yztMP`RlZP-b zMKCY-e)V|B^Hh@@)TU1#lu*G0GR1}R_X9QP568x*mk6e6o^2!nvcq{x z4(Z1EF`!N?ippZA5A?_mpr-745-ybimHE@WD0iST+x!5vHXK7LRDEtVOe?@~fB@v~ z1)1)3FDjdYmrT174#@BWTY+k!cF$S)(op{!ClWUR>|2RgLipUV;FrgE_OY(_H3JrG zL*mX%7y^|tl}7X0qaFEGPCh6gA@Y3zL$G#@=GZGI+7 z8zNP9O{^KEFMX^exi(HS9kkgAOw+Nfzkw1*uT~KSHdlg)fs95wr>wE73E>URvgw4r zM|6{iu+PAg5DvK!*6}uhqEg+#~+b^lbQDBLC5=*V)U0 zC@kIYZ}1|*@+U{B+yFo8KM>3&Fdz}jV|`aoP@-#PvdytrmB(};`|~s4I2b|Ba~Y2u z9xTk*CDPm-8~9x8CDP$>Ac7Unm}keo&t*~5QLvmZ@@u&&y@gZB5=z#5bRkpgQWQNg zjsCDL?>P?;k!Q9vI#;w^fX7>IXV-hVhah}4azJT8?iAHY+s58)@B14rPDP zW}V3qehioZXNoF(srnq592+D|Zb8Z?jEE{+&U?mZxA^H7BEI%8M}7c;(!13Z2rY{rp=I&swQhAv5ikwnDlC**pyWFM&xrb) z)4@kstOk-*o@p8Z6BT$C0;B~ro(FAThje;i@eb4vHfR-89?0^7CZrJ_yW|( zq4&IyS?Id}vSf8;p{XoWKqW_xzu<#(jRojI+sL<68!F3ZAerq}tO8VHE-SpuFfBt73v5^0bDb1gkQ@M^o`+Zj;jaUPfedTe4P{<{-jwr! zb8Se}5r8n215NV$;JJ_64mhB`3V^{u-owCwfJsoo-pRhk#cs>p2n>fr0N@AuEGO%c zw+->&7OJZPuS&33W$mqBCs%@!{hK-qx%~Sth{wB!pZBd)DbTgZd{BiSXMEh9P(6nXj5%g{WfoYR1D}>DJz3Azc3E@~t4^4A{R- zltVpH1Z~=TOVATUL=_CUH)ge&S`PiSo_PI6uz7;n=tGUqx;lYx)sg_%fFZ^th;K+= z(xskoip@`g=v+U8vmdZptIr<)yNrp{h&GE^__(t*ztfdM6yn>Eu+vrzmq*moHrDe? zS>%`r`}XH9^~?%{OFANKdhGyX`XVdu(uUI5#H?tG36?sM#vu_zk4If;fNEgv( z{so%Lyyw+)w5z~gFW0j@w%BIbu)==amrtyAaW1%cye~S#V-nZ(#l*L7iLmyvZVQTO ztj||itDSzQQK}IgyJu6?pqY44xMs~gblK*6edz?a>W!p6)gC3<92EtTTpV+=ZTu08 zIv$#h>Bg3`xG=Z8jvjvhm!Dl&UiS0*eBrvr?Hw@C6N=W+(QSaBv1>vw(|nK>zpiqE zS*DdocYufGqW891!z&a6(If1a=YIyx2|&29-*v(OI?2xTZM5`ZSUtdQ?dTTWC$C5~ z@NlUfSzyh*ONtSeATc&CierfG^a-&=CJpn-E@mfkTJ+|F!fSb$*bo2WSMBH#UU9S3S zMR<$1T~8RBCs~w<&37RI3$m)q_PPSXB2?OZ++Mf#Q7lXrjn+|F8GB6pp7X6H1JRZz zow2&DB}L;f(Bl)V(M!(zfc2-0-vvS+u%jXN4%hAJ#0B(o?kl5rj?*c#k9jDoP-|OA|DnQZ5AW>43QR(*Fkj!qYbV8R;oGKC_KJO5@c)M|dd@$4DjYC)M=3be{e5cL_YxV{%@5_w_xyEqi>PVjB zLTOYy`s4Vcr!TvsBJu`W2M)sVe%)I`s6y`XAn$rFqS5 zYfqpLd{24vCT6+6ucU9buqwW}V+z*M?t1^rQc8+uTE3D)W%(|x3!%m`_M_|Xhc}4n-rf1D;*D-Po zSE3cRpV`u?xxn7EDNso@qc^2f(c3R7>O4pC^9!*{7H3Xj@6?JHN;L(5u%?XOQNC@6wez<}J#+pC{0` zIHTbO(oFn7TTDKaRr~}wJbTw`GRZedW`|`n$jFX;m?rGz^%GXxu(7vnNkBTSt9A@I zeD+c8uwye$-;b?YJ^Xc6dZEw!E^_|voX`=HYqWV?vfJ*KY?G3S*osHhMSY4j;j2arO@#+cVtiyh;uVZ1|9A{@MJKI?gwsFUx?Qxar&PQS zcbNAx9mUEpKV3!mlP%Lur0%Y2c+wiY#_Vr`bHH-kx-jDyRH9W7Co9z-!fBLz z-a=FOX<~8`SKRjY!WbLk*{WaPHcM;ulH&xOuw~ub3=H z$BAcpW6RqgnZz^xc0E?Qiy_1o>FoXWF81q_!xWS6d>pzuJ)Wx<9$%)_rAt!B49I%p zE*|s7AXAnRgd75+QGrkAN28v~T>$pwquRt3d#iuR$WnapRBgD*L9(o6#@#WF|NYES z1&)ZImk8qzNfK&9!xgF$j=rjVAsl=}I1-8f`w2z}UOiVZpfufD;$bf%n#UY-RP+RY zH7RuY$H%5FpT=_~3VprGz146#CEww0E2=>6YSa#2Y;rvRm@3_MkKB%nl-|+DYK)0Z zjF?Ctd2LTD%Y>63{=h0Q+QBiVHb99iyYu4W5C`3P}1DT#m5C?9q6xt|eQte58X zipHYN8P%3g77a&gJ+^-|iL86A7T7fe`&cc+s3(cI@)b7_Ia(9Rx3Ot;zmUt@d?q!! zR-$jVgM)v?Z2j`~nd;ZB5q(-1ixuLve_tW^6yb{BF&TzG*<)TdG9?huv=1{p+^F2P z@8e_!rZCC`n(@r}qccuAoi?#0o)!GpY)@e;h#^ATwS^vm3qx{~xF0&{>tJEy-5ie^@nJ53-Yp}|P zxpRxlbh5sC8Pz!Fo4i4+S%2|rbk_i=pV3k>=SZj{U_ECmnNd4qBL%phv_TU!7GqNQoc$<56peYOOck8 zf8R_bB~``0lw+DH=L^j3MO89vj8c?(4N=6IZ{no>s%OE8ZpFL2;eoG0$EK(tzY$!* zk*~?OvZeN}LL@mapEpjO;Grb1=u24gxca-($4>EiuNsE37IF++0B&dOdEc_a)?OCT zM4{!Or!|xBmju$ok7^~fM%U)DB=tScPYA(W32$MQ$Qhq`IuGutrq;CCfo6?Jfdi=$ zJgww`YN(%(_cz^|WUP>$LD4$9u7Z^m3}&siinAL|mJ%qn!+rQ=WX9(voHG{COoa}0 zq&Nzl5uCt@A|xH9bD6^7?0q~o#B3r4I&@8eQ%SmY3ltaj6qqo|3kv&3n-OqCb`}Bp zoCy|l!N}x9NXkyYi4sy3rE`s94jj2E^OMAr7bW&cxo6ERHXE&$E(xnO=9?sz9zQboy{;0IVzd)hY+;xV`re`7gmg;;{ zrI=&lBkwW$&7VJ4EnRJk|8!+#diidD?hF4@RaG%ru%3*z=`a7Y%O9#GZZtqpqC@x) z%xnf`yjiYqaAJ79_nbyVV;3hcn)gn2G0EVIK<90azJQi3ClIt4@X7&@#-b-Wx@zYbIY&BJnp_g|Ie$Fp+lN%#3afVwBc3 zc7@MrvN>}8d92#tUObjw!#6UMt`mRHP33F0;`9-+l~g*MgxmzDi+?xg5!JYPJI^72 zDZtkuP2&YGW@aX3TffjtRLpgNK87k-uqEz2Qh)Wx%O}`UPUJRT%U?~V z%#qiBc=gkh>b;aHYgY;5VVbhqb549K4&Z=1=tl=Rji^k)j#`2RsZB1Z22Wjnm7R3` z9q;Pk5|hGJTDBg^cjEG3vBeCm^RGvNC049%=x(yyZ9}2vD12L7V};9PYqG~&A7Gi! z))?+tNg2iV*U@c5%e%*_PM)Tpn@X%MPXU_eo&3ZdYT!s?jXRUP@1xnc5wOr4dpay& z{mR2VgxN%9o2gZOdWqEy!>m6Y)v@eyuF9`5Ns(D0Xt6Q>-JeGIunN`MZMd_uk@^ku z)anmq+Cw|{%VO!V^Mn0gBBv}=w`e)6QC8WZTmtg*Y!lRIT*NOC(XJnHUf4a{4grO| z-&Q!M=&1(2zQQ9vH^m)H#}$&JQ1I+O57imRTdskbt`HRrX@Dyw`QT6#j*idz)3{=QW`2Sd#%G}CL`q$Ylah<5F?4~p; zOkCdpY;?87e`lbi&~5y^j}^9(xeX34IKQWVLwS`Rk?wyJ{BdmMgxvm;Kz9dw+Rkyl znJ*?ET>aHs*0hn^mvw?RT_)b!;*FgOm#K{PqO(cG+EI*;sAzX)x1*zoKW;VWlvc9E z+}RYUBQIgL4$SPvWAsT* z(I(#1tuv8B7?#>r%o}W~M>?aA&%kVKa?hS+Qg>6_%2o4qm6L&#qg({I zL%2r_fpVD2wm6+X%@0zgY|dIihKvrFCYcQS4}q{W=%7)$%q|I8p;%zOL?mm0D??(k8_oD+f1L1BD%@}>8ETTGxnp|>Z2 z0Sp6~c_YVspdHNvsFsp>c5#YOsOBujvyg@S@dDI$wO=`msvL4<4h=b5LYc)teVy7? zz(Yj^xM^5L7`gVDEKbwc3ucp3Q0W8bQK{}`pET5B574P{JC>uoBUeGiRivg)$W(O# z@6j#O7|7EE_LPxl_GuQl*@2CffbGuE1C0*^-KP+%g+y_o2>cF= z$E5O(fXw-4Dq)bD3APRVc4OH_`mX~7p=Lf3JPx^;lp#GAhabB|7N`wmm3nEB1=L4I z4qW2R6`=8vApXBV-_IR#u>ME{1<%26eWNM|k7o+~oW-DmKOeovhzK6WiS;Aiz5~Ne zbLEL!9m{opgV$}mqR?6y5Wogy8T`#1N*$;Sjj%?xv=*o)NZ9d*|@2(`SIt?!@#_|C109zySm*dzR%0DB++iZay&lG1p4Y{F6XNE(-+W zeo5pXh7izIXg7V`90gtF92V{lq)ODbJPgK%R`3{*Vo~3!byzMmOu)a|pW1ltUvFIp zLiqJOHu1lUq52J0#8RcOL*@slNe{r~KnS&{?7=N1)YT%uRAC#;WAU%Iekg;{JA-oH k-y`fd=|2hR>mFHwm4@h=Pj3_Wq%oPgik5QW&HGRP3!~pa?*IS* diff --git a/guides/v2.0/howdoi/webapi/integration.md b/guides/v2.0/howdoi/webapi/integration.md index da6f3ea838d..7745a40746c 100755 --- a/guides/v2.0/howdoi/webapi/integration.md +++ b/guides/v2.0/howdoi/webapi/integration.md @@ -12,10 +12,11 @@ github_link: howdoi/webapi/integration.md An **integration** enables third-party services to call the Magento web APIs. The Magento APIs currently supports Accounting, Enterprise Resource Planning (ERP), Customer Relationship Management (CRM), Product Information Management (PIM), and marketing automation systems out of the box. -Implementing an integration requires little knowledge of PHP or Magento internal processes. However, you will need a working knowledge of +Implementing a simple integration requires little knowledge of PHP or Magento internal processes. However, you will need a working knowledge of * [Magento REST or SOAP Web APIs](../../get-started/bk-get-started-api.html) * [Web API authentication](../../get-started/authentication/gs-authentication.html) +* [OAuth-based authentication]( {{ site.gdeurl }}/get-started/authentication/gs-authentication-oauth.html ) Before you begin creating a module, make sure that you have a working installation of Magento 2.0, and the [Magento System Requirements](../../install-gde/system-requirements.html). @@ -26,6 +27,7 @@ To create an integration, follow these general steps: 2. [Add files specific to the integration.](#files) 3. [Install the module.](#install) 4. [Check the integration.](#check) +5. [Integrate with your application.](#integrate)

    Create a skeletal module

    @@ -274,8 +276,40 @@ Use the following steps to install your module:

    Check your integration

    Log in to Magento and navigate to **Settings > Extensions > Integrations**. The integration should be displayed in the grid. -

    Related Topics

    +

    Integrate with your application

    + +The location specified in the `identity_link_url` parameter must point to a page that can handle login requests. The location specified in the `endpoint_url` parameter (**Callback URL** in Admin) must be able to process OAuth token exchanges. You must create two pages to manage these types of requests. + +### Login page {#login} + +When a merchant clicks the **Activate** button in Admin, a pop-up login page for the third-party application displays. Magento sends values for `oauth_consumer_key` and `success_call_back` parameters. The application must store the value for`oauth_consumer_key` tie it to the login ID. Use the `success_call_back` parameter to return control back to Magento. + +### Callback page {#callback} +The callback page must be able to perform the following tasks: + +* Receive an initial HTTPS POST that Magento sends when the merchant activates integration. This post contains the Magento store URL, an `oauth_verifier`, the OAuth consumer key, and the OAuth consumer secret. The consumer key and secret are generated when the integration is created. + +* Ask for a request token. A request token is a temporary token that the user exchanges for an access token. Use the following API to get a request token from Magento: + + `POST /oauth/token/request` + + See [Get a request token]( {{ site.gdeurl }}/get-started/authentication/gs-authentication-oauth.html#pre-auth-token ) for more details about this call. + +* Parse the request token response. The response contains an `oauth_token` and `oauth_token_secret`. + +* Ask for a access token. The request token must be exchanged for an access token. Use the following API to get a request token from Magento: + + `POST /oauth/token/access` + + See [Get an access token]( {{ site.gdeurl }}/get-started/authentication/gs-authentication-oauth.html#get-access-token ) for more details about this call. + +* Parse the access token response. The response contains an `oauth_token` and `oauth_token_secret`. These values will be different than those provided in the request token response. + +* Save the access token and other OAuth parameters. The access token and OAuth parameters must be specified in the `Authorization` header in each call to Magento. + +## Related Topics - [Web API authentication](../../get-started/authentication/gs-authentication.html) +- [OAuth-based authentication]( {{ site.gdeurl }}/get-started/authentication/gs-authentication-oauth.html ) - [Magento System Requirements](../../install-gde/system-requirements.html) - [Create the module file structure](../../extension-dev-guide/module-file-structure.html) - [Create a component](../../extension-dev-guide/create_component.html) From fef5f43d165e31f6611ad0ef130d9a82030fb487 Mon Sep 17 00:00:00 2001 From: Kevin Harper Date: Tue, 26 Apr 2016 15:01:40 -0500 Subject: [PATCH 805/902] review draft --- .../gs-authentication-session.md | 3 +- .../kh-gs-authentication-oauth.md | 342 ------------------ 2 files changed, 1 insertion(+), 344 deletions(-) delete mode 100644 guides/v2.0/get-started/authentication/kh-gs-authentication-oauth.md diff --git a/guides/v2.0/get-started/authentication/gs-authentication-session.md b/guides/v2.0/get-started/authentication/gs-authentication-session.md index 0920449a092..2f7175bedb5 100644 --- a/guides/v2.0/get-started/authentication/gs-authentication-session.md +++ b/guides/v2.0/get-started/authentication/gs-authentication-session.md @@ -4,7 +4,7 @@ group: get-started subgroup: B_Authentication title: Session-based authentication menu_title: Session-based authentication -menu_order: 3 +menu_order: 4 github_link: get-started/authentication/gs-authentication-session.md redirect_from: /guides/v1.0/get-started/authentication/gs-authentication-session.html --- @@ -37,4 +37,3 @@ The web API framework establishes the identity of the admin user based on logged
  • Configure services as web APIs
  • - diff --git a/guides/v2.0/get-started/authentication/kh-gs-authentication-oauth.md b/guides/v2.0/get-started/authentication/kh-gs-authentication-oauth.md deleted file mode 100644 index 0c7e9e96901..00000000000 --- a/guides/v2.0/get-started/authentication/kh-gs-authentication-oauth.md +++ /dev/null @@ -1,342 +0,0 @@ ---- -layout: default -group: get-started -subgroup: B_Authentication -title: OAuth-based authentication -menu_title: OAuth-based authentication -menu_order: 2 -github_link: get-started/authentication/gs-authentication-oauth.md -redirect_from: /guides/v1.0/get-started/authentication/gs-authentication-oauth.html ---- - -

    OAuth overview

    - -Third-party applications that integrate with Magento can use OAuth-based authentication to access Magento Web APIs. This authentication method uses the OAuth 1.0a handshake process. - -For details about OAuth 1.0a, see [The OAuth 1.0 Protocol](https://tools.ietf.org/html/rfc5849) - -To configure your third-party application (represented as an Integration in Magento) to use OAuth-based authentication to access Magento's Web APIs, read these sections: - - - -

    Register an external application

    - -All third-party applications that integrate with Magento must be registered as an Integration. As a merchant, you must register your external application as an Integration with the Magento Instance. Integration can be registered in the Magento admin (System > Extensions > Integrations). - -An integration contains details like the endpoint that receives Oauth credentials and list of APIs to which access is requested. See [Create an integration]({{ gdeurl }}/howdoi/webapi/integration.html) for information about configuring an integration - -

    Get a request token

    -The first step to authenticate a user is to retrieve a Request Token from Magento. This is a temporary token that will later be exchanged for an Access Token. You must use these credentials to get an access token in less than three minutes, or the credentials are disabled for security reasons. The expiration time can be changed from the admin panel. - -**where in the admin panel?** - -To ask for a Request Token from Magento: - -`POST /oauth/token/request` - -You must include these request parameters in the `Authorization` request header in the call: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ParameterDescription
    oauth_consumer_keyThe consumer key value that you retrieve after you register the application.
    oauth_signature_methodThe name of the signature method used to sign the request. Must have this value: HMAC-SHA1.
    oauth_signatureA generated value (signature).
    oauth_nonceA random value that is uniquely generated by the application.
    oauth_timestampA positive integer, expressed in the number of seconds since January 1, 1970 00:00:00 GMT.
    oauth_versionThe OAuth version.
    - -**Insert sample here** - -The response contains these fields: - - - - - - - - - - - - - -
    ParameterDescription
    oauth_tokenThe token to be used when requesting an access token.
    oauth_token_secretA secret value that establishes ownership of the token..
    - -A valid response looks like this: - -`oauth_token=4cqw0r7vo0s5goyyqnjb72sqj3vxwr0h&oauth_token_secret=rig3x3j5a9z5j6d4ubjwyf9f1l21itrr` - -

    Get an access token

    - -The customer cannot use the request token until it has been authorized. To get an access token from Magento: - -`POST /oauth/token/access` - -You must include these request parameters in the `Authorization` request header in the call: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ParameterDescription
    oauth_consumer_keyThe consumer key value that you retrieve after you register the application.
    oauth_nonceA random value that is uniquely generated by the application.
    oauth_signatureA generated value (signature).
    oauth_signature_methodThe name of the signature method used to sign the request. Must have this value: HMAC-SHA1.
    oauth_timestampA positive integer, expressed in the number of seconds since January 1, 1970 00:00:00 GMT.
    oauth_versionThe OAuth version.
    oauth_tokenThe oauth_token value, or request token, obtained in Get a request token.
    oauth_verifierThe verification code that is tied to the consumer and request token.
    - -The response contains these fields: - - - - - - - - - - - - - -
    ParameterDescription
    oauth_tokenThe access token that provides access to protected resources.
    oauth_token_secretThe secret that is associated with the access token.
    - -A valid response looks like this: -`oauth_token=0lnuajnuzeei2o8xcddii5us77xnb6v0&oauth_token_secret=1c6d2hycnir5ygf39fycs6zhtaagx8pd` - - -

    Integration registration

    - - - -

    HTTP POST with OAuth credentials

    - -This is the preceding step before the 2-legged Oauth handshake starts. Only an administrator with access to Integration grid in the backend can initiate this. - -An admin may choose to select **Save and Activate** during integration creation or click on **Activate** against a previously saved integration from the Integration grid. - -This action submits the credentials to the endpoint specified when creating the Integration. - -The use of an HTTPS for the endpoint to pass credentials eliminates this risk to a certain extent. - -HTTP POST from Magento to the Integration endpoint will contain these attributes: - -* Magento store URL. For example, `http://my-magento-store.com/`. -* oauth_verifier -* OAuth consumer key -* OAuth consumer key secret - -Integrations use the passed credentials to get a request token, which is a pre-authorized token. Integrations then use credentials plus the request token to get a long-lived access token. - -

    2-legged Oauth Handshake

    - -The process of completing the Oauth handshake requires that you - -* [Get a request token](#pre-auth-token) -* [Get an access token](#get-access-token) - -

    Get a request token

    - - - -

    Get an access token

    - - - -

    Access the web APIs

    - -After the Integration is authorized to make API calls, 3rd party applications (registered as Integrations in Magento) can invoke Magento web APIs by using the access token. - -To use the access token to make web API calls: - -`GET /rest/V1/products/1234` - -You must include these request parameters in the `Authorization` request header in the call: - -* `oauth_consumer_key`. The customer key value provided after the registration of the application. -* `oauth_nonce`. A random value, uniquely generated by the application. -* `oauth_signature_method`. The name of the signature method used to sign the request. Valid values are: `HMAC-SHA1`, `RSA-SHA1`, and `PLAINTEXT`. -* `oauth_signature`. A generated value (signature). -* `oauth_timestamp`. A positive integer, expressed in the number of seconds since January 1, 1970 00:00:00 GMT. -* `oauth_token`. The `oauth_token`, or access token, value obtained in Get an access token. - - -

    The OAuth signature

    - -All OAuth handshake requests and Web Api requests include the signature as part of Authorization header. Its generated as follows: - -You concatenate a set of URL-encoded attributes and parameters to construct the signature base string. - -Use the ampersand (`&`) character to concatenate these attributes and parameters: - - -1. HTTP method -2. URL -3. `oauth_nonce` -4. `oauth_signature_method` -5. `oauth_timestamp` -6. `oauth_version` -7. `oauth_consumer_key` -8. `oauth_token` - -To generate the signature, you must use the HMAC-SHA1 signature method. The signing key is the concatenated values of the consumer secret and token secret separated by the ampersand (`&`) character (ASCII code 38), even if empty. You must use parameter encoding to encode each value. - -

    OAuth error codes

    -When the third-party application makes an invalid request to Magento, the following OAuth-related errors can occur: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    HTTP codeError codeText representationDescription
    4001version_rejectedThe oauth_version parameter does not correspond to the "1.0" value.
    4002parameter_absentA required parameter is missing in the request. The name of the missing parameter is specified additionally in the response.
    4003parameter_rejectedThe type of the parameter or its value do not meet the protocol requirements (for example, array is passed instead of the string).
    4004timestamp_refusedThe timestamp value in the oauth_timestamp parameter is incorrect.
    4015nonce_usedThe nonce-timestamp combination has already been used.
    4006signature_method_rejectedThe signature method is not supported. The following methods are supported: HMAC-SHA1.
    4017signature_invalidThe signature is invalid.
    4018consumer_key_rejectedThe Consumer Key has incorrect length or does not exist.
    4019token_usedAn attempt of authorization of an already authorized token or an attempt to exchange a not temporary token for a permanent one.
    40110token_expiredThe temporary token has expired. At the moment, the mechanism of expiration of temporary tokens is not implemented and the current error is not used.
    40111token_revokedThe token is revoked by the user who authorized it.
    40112token_rejectedThe token is not valid, or does not exist, or is not valid for using in the current type of request.
    40113verifier_invalidThe confirmation string does not correspond to the token.
    - -

    Next step

    - -

    Related topic

    - From e572ad53b40d81476269dae1a236d50d425054ee Mon Sep 17 00:00:00 2001 From: Kevin Harper Date: Tue, 26 Apr 2016 15:09:29 -0500 Subject: [PATCH 806/902] review draft --- guides/v2.0/get-started/authentication/oauth-errors.md | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/guides/v2.0/get-started/authentication/oauth-errors.md b/guides/v2.0/get-started/authentication/oauth-errors.md index a77d42da8db..3ca88b08ec2 100644 --- a/guides/v2.0/get-started/authentication/oauth-errors.md +++ b/guides/v2.0/get-started/authentication/oauth-errors.md @@ -97,11 +97,5 @@ When the third-party application makes an invalid request to Magento, the follow -

    Next step

    - -

    Related topic

    - +## Related topic +[gs-authentication-oauth.html](OAuth-based authentication) From 90c462b9f92561da8c7f3dcac19dde0dc4d7c8a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafael=20Corr=C3=AAa=20Gomes?= Date: Tue, 26 Apr 2016 17:10:11 -0300 Subject: [PATCH 807/902] Last version C.E. --- guides/v2.0/install-gde/install/cli/dev_options.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/guides/v2.0/install-gde/install/cli/dev_options.md b/guides/v2.0/install-gde/install/cli/dev_options.md index e97aea0dbe0..ca2e9179fd6 100644 --- a/guides/v2.0/install-gde/install/cli/dev_options.md +++ b/guides/v2.0/install-gde/install/cli/dev_options.md @@ -13,7 +13,7 @@ redirect_from: guides/v2.0/install-gde/install/dev_updater.md The following topics apply to you *only* if you used `git clone` to install the Magento CE GitHub repository. This usually means you contribute code to the Magento CE codebase. * To update the Magento software, use `git pull origin` and `composer update` -* To change versions from `develop` to a release version like `2.0.2`, you must uninstall the Magento software and install the released version. +* To change versions from `develop` to a release version like `2.0.4`, you must uninstall the Magento software and install the released version. * To add, remove, or update components, modify `composer.json` and run `composer update` * To reinstall the Magento software, modify the product version in `composer.json`, run `composer update`, then reinstall the Magento software @@ -24,4 +24,4 @@ The following topics apply to you *only* if you used `git clone` to install the -*[contributing developer]: A developer who contributes code to the Magento 2 CE codebase \ No newline at end of file +*[contributing developer]: A developer who contributes code to the Magento 2 CE codebase From 8153d607b232c8248c1fe4d095c6cc91aa9d3720 Mon Sep 17 00:00:00 2001 From: Kevin Harper Date: Tue, 26 Apr 2016 15:19:25 -0500 Subject: [PATCH 808/902] review draft --- .../get-started/authentication/gs-authentication-oauth.md | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/guides/v2.0/get-started/authentication/gs-authentication-oauth.md b/guides/v2.0/get-started/authentication/gs-authentication-oauth.md index 097718fdfb9..444cec8c9bb 100644 --- a/guides/v2.0/get-started/authentication/gs-authentication-oauth.md +++ b/guides/v2.0/get-started/authentication/gs-authentication-oauth.md @@ -21,12 +21,9 @@ As the process of registering the integration proceeds, Magento creates the toke * [2-legged Oauth handshake](#oauth-handshake) * [Access the web APIs](#web-api-access) * [Generating Oauth signatures](#oauth-signature) -* [OAuth Error Codes](oauth-errors.html) ## OAuth overview {#overview} - The following diagram shows the OAuth authentication process. Each step is described further. - ![OAuth flow](oauthflow.png) 1. **Create an integration**. The merchant creates an integration from Admin. Magento generates a consumer key and a consumer secret. @@ -211,10 +208,8 @@ Use the ampersand (`&`) character to concatenate these attributes and parameters To generate the signature, you must use the HMAC-SHA1 signature method. The signing key is the concatenated values of the consumer secret and token secret separated by the ampersand (`&`) character (ASCII code 38), even if empty. You must use parameter encoding to encode each value. -Related topics +## Related topics [Create an integration]( {{ site.gdeurl }}/howdoi/webapi/integration.html ) [OAuth error codes]( {{ site.gdeurl }}/get-started/authentication/oauth-errors.html ) [Construct a request]( {{ site.gdeurl }}/get-started/gs-web-api-request.html ) - -Configure services as web APIs [Configure services as web APIs]( {{ site.gdeurl }}/extension-dev-guide/service-contracts/service-to-web-service.html ) From 12124b51da9f7992b49026d6d3475a44da6dc52b Mon Sep 17 00:00:00 2001 From: stevjohnson Date: Tue, 26 Apr 2016 15:56:35 -0500 Subject: [PATCH 809/902] PR#629. Proofreading --- .../v2.0/install-gde/trouble/tshoot_sample-data.md | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/guides/v2.0/install-gde/trouble/tshoot_sample-data.md b/guides/v2.0/install-gde/trouble/tshoot_sample-data.md index 7203e63ca11..5ed8c6cfeae 100644 --- a/guides/v2.0/install-gde/trouble/tshoot_sample-data.md +++ b/guides/v2.0/install-gde/trouble/tshoot_sample-data.md @@ -56,17 +56,23 @@ There are known issues with using sample data with the Magento 2 develop branch. ### Symptom -The installation hangs before the sample data installation finishes: +The installation stops before the sample data installation finishes. An example follows: (more) Module 'Magento_CustomerSampleData': Installing data... - (the installation doesn't continue) +Sample data installation does not finish. -This error occurs when the maximum execution time of your PHP scripts is lower than the time it takes to load the sample data (which can be a lot of time). +This error occurs when the maximum configured execution time of your PHP scripts is exceeded. Because sample data can take a long time to load, you can increase the value during your installation. #### Solution -Increase the maximum execution time of your PHP scripts temporarily setting the `max_execution_time` PHP directive to a high value (e.g. `max_execution_time = 600` for 10 minutes). +As a user with `root` privileges, modify `php.ini` to increase the value of `max_execution_time` to 600 or more. (600 seconds is 10 minutes. You can increase the value to whatever you want.) You should change `max_execution_time` back to its previous value after the installation is successful. + +If you're not sure where `php.ini` is located, enter the following command: + + php --ini + +The value of `Loaded Configuration File` is the `php.ini` you must modify. From 16050fb87cbc21eaa882782f3c52daad9fae28ee Mon Sep 17 00:00:00 2001 From: Kevin Harper Date: Tue, 26 Apr 2016 16:00:04 -0500 Subject: [PATCH 810/902] review draft --- .../authentication/gs-authentication-oauth.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/guides/v2.0/get-started/authentication/gs-authentication-oauth.md b/guides/v2.0/get-started/authentication/gs-authentication-oauth.md index 444cec8c9bb..a3cc35e567d 100644 --- a/guides/v2.0/get-started/authentication/gs-authentication-oauth.md +++ b/guides/v2.0/get-started/authentication/gs-authentication-oauth.md @@ -28,13 +28,13 @@ The following diagram shows the OAuth authentication process. Each step is descr 1. **Create an integration**. The merchant creates an integration from Admin. Magento generates a consumer key and a consumer secret. -2. **Activate the integration**. The OAuth process begins when the merchant activates the integration. Magento sends the OAuth consumer key and secret, an OAuth verifier, and the store URL to the external application via HTTPS post. +2. **Activate the integration**. The OAuth process begins when the merchant activates the integration. Magento sends the OAuth consumer key and secret, an OAuth verifier, and the store URL to the external application via HTTPS post to the page defined in the **Callback Link** field in Admin. See [Activate an integration](#activate) for more information. -3. **Process activation information**. The integrator must store the activation information. The OAuth authentication process cannot begin until the merchant has logged in to the external application. +3. **Process activation information**. The integrator must store the activation information. They parameters will be used to ask for a request token. 3. **Call the application's login page**. Magento calls the page defined in the **Identity Link** field in Admin. -4. **Merchant logs in to the external application.** If the log in is successful, the application returns to the location specified in the call. The log in page is dismissed. +4. **Merchant logs in to the external application.** If the login is successful, the application returns to the location specified in the call. The login page is dismissed. 5. **Ask for a request token**. The application uses the `POST /oauth/token/request` REST API to ask for a request token. The `Authorization` header includes the consumer key and other information. See [Get a request token](#pre-auth-token) for details about this token request. @@ -56,10 +56,10 @@ A merchant can choose to select **Save and Activate** when the integration is cr Activating the integration submits the credentials to the endpoint specified when creating the Integration. An HTTP POST from Magento to the Integration endpoint will contain these attributes: -* Magento store URL. For example, `http://my-magento-store.com/`. -* oauth_verifier -* OAuth consumer key -* OAuth consumer key secret +* `store_base_url` For example, `http://my-magento-store.com/`. +* `oauth_verifier` +* `oauth_consumer_key` +* `oauth_consumer_key_secret` Integrations use this information to get a request token. @@ -188,7 +188,7 @@ You must include these request parameters in the `Authorization` request header * `oauth_timestamp`. A positive integer, expressed in the number of seconds since January 1, 1970 00:00:00 GMT. * `oauth_token`. The `oauth_token`, or access token, value obtained in Get an access token. -## The OAuth signature {oauth-signature} +## The OAuth signature {#oauth-signature} All OAuth handshake requests and Web Api requests include the signature as part of Authorization header. Its generated as follows: From ab64e04fed77cb68a77411450a95a0e1d210fc2c Mon Sep 17 00:00:00 2001 From: stevjohnson Date: Tue, 26 Apr 2016 16:27:25 -0500 Subject: [PATCH 811/902] Issue#628. Clarify that you should set ulimit for all types of rollback --- _includes/install/ulimit.md | 37 ++++++++++++++++++ .../comp-mgr/prereq/prereq_compman-ulimit.md | 38 +------------------ .../install/cli/install-cli-backup.md | 4 ++ 3 files changed, 43 insertions(+), 36 deletions(-) create mode 100644 _includes/install/ulimit.md diff --git a/_includes/install/ulimit.md b/_includes/install/ulimit.md new file mode 100644 index 00000000000..d5e3ac5e275 --- /dev/null +++ b/_includes/install/ulimit.md @@ -0,0 +1,37 @@ +
    + +### Why to set ulimit +Rolling back to a previous backup can silently fail, resulting in incomplete data being written to the file system or database. (This includes all types of rollbacks, including using System Upgrade, Component Manager, or the [`magento setup:rollback`]({{ site.gdeurl }}install-gde/install/cli/install-cli-backup.html##instgde-cli-uninst-roll) command.) + +In some cases, a very long query string causes the user's allocated memory space to run out of memory because of too many recursive calls. + +### How to set ulimit +We recommend setting the `ulimit` for the Magento file system user to a value of 65536 or more. + +You can do this either on the command line or you can make it a permanent setting for the user by editing their shell script. + +Before you continue, if you haven't done so already, switch to the Magento file system owner. + +Command: + + ulimit -s 65536 + +You can change this to a larger value if needed. + +
    +

    The syntax for ulimit depends on the UNIX shell you use. The preceding setting should work with CentOS and Ubuntu with the Bash shell. However, for Mac OS, the correct setting is ulimit -S 65532. Consult a man page or operating system reference for more information.

    +
    + +To optionally set the value in the user's Bash shell: + +1. If you haven't done so already, switch to the Magento file system owner. +2. Open `/home//.bashrc` in a text editor. +3. Add the following line: + + ulimit -s 65536 + +4. Save your changes to `.bashrc` and exit the text editor. + +
    +

    We recommend you avoid setting a value for pcre.recursion_limit in php.ini because it can result in incomplete rollbacks with no failure notice.

    +
    \ No newline at end of file diff --git a/guides/v2.0/comp-mgr/prereq/prereq_compman-ulimit.md b/guides/v2.0/comp-mgr/prereq/prereq_compman-ulimit.md index beeedae800d..db0085cf247 100644 --- a/guides/v2.0/comp-mgr/prereq/prereq_compman-ulimit.md +++ b/guides/v2.0/comp-mgr/prereq/prereq_compman-ulimit.md @@ -9,39 +9,5 @@ menu_node: github_link: comp-mgr/prereq/prereq_compman-ulimit.md --- -## Issue -Rolling back to a previous backup using either the Component Manager or System Upgrade can silently fail, resulting in incomplete data being written to the file system or database. - -### Details -In some cases, a very long query string causes the user's allocated memory space to run out of memory because of too many recursive calls. We're aware of this issue and are working on a solution. - -### Workaround -Until a solution is available, we recommend setting the `ulimit` for the Magento file system user to a value of 65536 or more. - -You can do this either on the command line or you can make it a permanent setting for the user by editing their shell script. - -If you haven't done so already, switch to the Magento file system owner. - -Command: - - ulimit -s 65536 - -You can change this to a larger value if needed. - -
    -

    The syntax for ulimit depends on the UNIX shell you use. The preceding setting should work with CentOS and Ubuntu with the Bash shell. However, for Mac OS, the correct setting is ulimit -S 65532. Consult a man page or operating system reference for more information.

    -
    - -To optionally set the value in the user's Bash shell: - -1. If you haven't done so already, switch to the Magento file system owner. -2. Open `/home//.bashrc` in a text editor. -3. Add the following line: - - ulimit -s 65536 - -4. Save your changes to `.bashrc` and exit the text editor. - -
    -

    We recommend you avoid setting a value for pcre.recursion_limit in php.ini because it can result in incomplete rollbacks with no failure notice.

    -
    \ No newline at end of file +## Set ulimit for the web server user +{% include install/ulimit.md %} \ No newline at end of file diff --git a/guides/v2.0/install-gde/install/cli/install-cli-backup.md b/guides/v2.0/install-gde/install/cli/install-cli-backup.md index 3efef4cea8e..feba062bef2 100644 --- a/guides/v2.0/install-gde/install/cli/install-cli-backup.md +++ b/guides/v2.0/install-gde/install/cli/install-cli-backup.md @@ -19,6 +19,7 @@ See one of the following sections: * Overview of backup * First steps +* [Set ulimit for the web server user](#instgde-cli-ulimit) * Back up * Roll back @@ -37,6 +38,9 @@ After backing up, you can roll back at a {% include install/first-steps-cli.html %} In addition to the command arguments discussed here, see Common arguments. +## Set ulimit for the web server user {#instgde-cli-ulimit} +{% include install/ulimit.md %} +

    Backing up

    Command usage: From 0fb2aecc0cc67988baa7a80f23e1f9e7a04e9a9f Mon Sep 17 00:00:00 2001 From: Alessandro Ronchi Date: Wed, 27 Apr 2016 10:57:39 +0200 Subject: [PATCH 812/902] Add URL to retrieve entire list of service names --- guides/v2.0/soap/bk-soap.md | 1 + 1 file changed, 1 insertion(+) diff --git a/guides/v2.0/soap/bk-soap.md b/guides/v2.0/soap/bk-soap.md index a64d44ef857..31d523d383f 100644 --- a/guides/v2.0/soap/bk-soap.md +++ b/guides/v2.0/soap/bk-soap.md @@ -26,6 +26,7 @@ Additional information about SOAP APIs will be published in a future sprint.
    ## List of Service Names per Module +The entire list can be retrieved here: `http:///soap/default?wsdl_list=1` ###Backend backendModuleServiceV1: `http:///soap/default?wsdl&services=backendModuleServiceV1` From 9b72ae733aa2cb323a6cc2d1dc403336339ff57e Mon Sep 17 00:00:00 2001 From: Oleksandra Marchenko Date: Wed, 27 Apr 2016 12:16:27 +0300 Subject: [PATCH 813/902] added review commetns --- .../v2.0/javascript-dev-guide/widgets/jquery-widgets-about.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guides/v2.0/javascript-dev-guide/widgets/jquery-widgets-about.md b/guides/v2.0/javascript-dev-guide/widgets/jquery-widgets-about.md index 60e52a17cd2..ceedd5df0cc 100644 --- a/guides/v2.0/javascript-dev-guide/widgets/jquery-widgets-about.md +++ b/guides/v2.0/javascript-dev-guide/widgets/jquery-widgets-about.md @@ -39,5 +39,5 @@ This guide discusses the following widgets:
    -

    Magento out of the box does not contain jQuery UI styles. Also, it is not recommended to download them as is, because it can break the default design. To use certain iQuery UI styles, you need to add them manually in your custom stylesheets in the %your_theme_dir%/web/css or %your_module_dir%/view/%area/web/css directory.

    +

    Magento out of the box does not contain jQuery UI styles. Also, it is not recommended to download them as is, because it can break the default Magento design. To use certain jQuery UI styles, you need to add them manually in your custom stylesheets in the %your_theme_dir%/web/css or %your_module_dir%/view/%area/web/css directory.

    \ No newline at end of file From 7288e954f1e8242ee4577fc8fc95c099274ae296 Mon Sep 17 00:00:00 2001 From: Jeanne Frontain Date: Wed, 27 Apr 2016 11:17:09 -0500 Subject: [PATCH 814/902] added link to data migration repo --- guides/v2.0/release-notes/ReleaseNotes2.0.5CE.md | 2 +- guides/v2.0/release-notes/ReleaseNotes2.0.5EE.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/guides/v2.0/release-notes/ReleaseNotes2.0.5CE.md b/guides/v2.0/release-notes/ReleaseNotes2.0.5CE.md index d79630652bb..f3b53b92d4f 100644 --- a/guides/v2.0/release-notes/ReleaseNotes2.0.5CE.md +++ b/guides/v2.0/release-notes/ReleaseNotes2.0.5CE.md @@ -113,7 +113,7 @@ Developers who contribute to the CE codebase can Data Migration Tool helps transfer existing Magento 1.x store data to Magento 2.x. This command-line interface includes verification, progress tracking, logging, and testing functions. For installation instructions, see Install the Data Migration Tool. +The Data Migration Tool helps transfer existing Magento 1.x store data to Magento 2.x. This command-line interface includes verification, progress tracking, logging, and testing functions. For installation instructions, see Install the Data Migration Tool. Consider exploring or contributing to the Magento Data Migration repository. The Code Migration Toolkit helps transfer existing Magento 1.x store extensions and customizations to Magento 2.0.x. The command-line interface includes scripts for converting Magento 1.x modules and layouts. diff --git a/guides/v2.0/release-notes/ReleaseNotes2.0.5EE.md b/guides/v2.0/release-notes/ReleaseNotes2.0.5EE.md index e619440a10a..b77c184faa0 100644 --- a/guides/v2.0/release-notes/ReleaseNotes2.0.5EE.md +++ b/guides/v2.0/release-notes/ReleaseNotes2.0.5EE.md @@ -108,7 +108,7 @@ Magento partners can download the release and the release notes in PDF format fr 3. Find the **Magento Enterprise Edition 2.x Release**, and choose **Version 2.0.5**.

    Migration toolkits

    -The Data Migration Tool helps transfer existing Magento 1.x store data to Magento 2.x. This command-line interface includes verification, progress tracking, logging, and testing functions. For installation instructions, see Install the Data Migration Tool. +The Data Migration Tool helps transfer existing Magento 1.x store data to Magento 2.x. This command-line interface includes verification, progress tracking, logging, and testing functions. For installation instructions, see Install the Data Migration Tool. Consider exploring or contributing to the Magento Data Migration repository. The Code Migration Toolkit helps transfer existing Magento 1.x store extensions and customizations to Magento 2.0.x. The command-line interface includes scripts for converting Magento 1.x modules and layouts. From 22c23e045d876163ab7e52284cc39a85ff894459 Mon Sep 17 00:00:00 2001 From: James Calcaben Date: Wed, 27 Apr 2016 11:59:15 -0500 Subject: [PATCH 815/902] Add content about coding standards and using the PHP_CodeSniffer tool --- .../extension-coding/common-programming-bp.md | 11 +++++++++++ .../extension-coding/working-with-arch-bp.md | 4 ++++ 2 files changed, 15 insertions(+) diff --git a/guides/v2.0/ext-best-practices/extension-coding/common-programming-bp.md b/guides/v2.0/ext-best-practices/extension-coding/common-programming-bp.md index 922dc9f19da..6dbf999767b 100644 --- a/guides/v2.0/ext-best-practices/extension-coding/common-programming-bp.md +++ b/guides/v2.0/ext-best-practices/extension-coding/common-programming-bp.md @@ -23,6 +23,17 @@ You should do your best to adhere to common programming best practices to reduce --- +### Follow a set of coding standards +Coding standards are a set of guidelines that describe how code should be written. These standards define coding practices that determine the style of the code. Whether you are a solo developer or part of a team, following a set of coding standards will help make your code consistent and maintainable. + +[Magento's Coding Standards]({{site.gdeurl}}coding-standards/bk-coding-standards.html) are based on the following: + +* [Zend Coding standards](http://framework.zend.com/manual/1.12/en/coding-standard.html){:target="_blank"} +* [PSR2](http://www.php-fig.org/psr/psr-2/){:target="_blank"} +* [PSR4](http://www.php-fig.org/psr/psr-4/){:target="_blank"} + +To help you stick to coding standards, we recommend using the [PHP_CodeSniffer tool](https://github.com/squizlabs/PHP_CodeSniffer){:target="_blank"}. + ### Write and utilize re-usable code Avoid using redundant or duplicate code. Instead of copying and pasting the same code throughout application, create a single class or method and reference it when needed. As a general rule of thumb, be sure to reuse code as much as possible. diff --git a/guides/v2.0/ext-best-practices/extension-coding/working-with-arch-bp.md b/guides/v2.0/ext-best-practices/extension-coding/working-with-arch-bp.md index f51f8deb892..0e5ba9b14fa 100644 --- a/guides/v2.0/ext-best-practices/extension-coding/working-with-arch-bp.md +++ b/guides/v2.0/ext-best-practices/extension-coding/working-with-arch-bp.md @@ -56,3 +56,7 @@ In addition to understanding fundamental programming designs/concepts, you are e - Make sure that CSS, JavaScript, HTML, and XML code are all in the appropriate files (i.e. they should not be inline). - Use appropriate logic in a Block, Helper, Template, Controller, or Model. - Ensure correct module design. + +### Use the PHP_CodeSniffer tool + +[PHP_CodeSniffer](https://github.com/squizlabs/PHP_CodeSniffer){:target="_blank"} is a set of PHP scripts that checks your code for violations of a particular coding standard. It can be used in conjunction with the [ECG Magento Code Sniffer Coding Standard](https://github.com/magento-ecg/coding-standard){:target="_blank"} to check your code for some of the more common Magento and PHP problems. Using these two tools will ensure that your extension code meets many of [Magento's coding standards]({{site.gdeurl}}coding-standards/bk-coding-standards.html). It also has the added benefits of keeping your code clean and maintainable. From 1ce79a8f2a563491bd3ec8e22a2151c833a70229 Mon Sep 17 00:00:00 2001 From: Kevin Harper Date: Wed, 27 Apr 2016 13:46:50 -0500 Subject: [PATCH 816/902] fixed typo --- guides/v2.0/get-started/web-api-functional-testing.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/guides/v2.0/get-started/web-api-functional-testing.md b/guides/v2.0/get-started/web-api-functional-testing.md index 6dcee4cbf66..3dfae2a3c14 100644 --- a/guides/v2.0/get-started/web-api-functional-testing.md +++ b/guides/v2.0/get-started/web-api-functional-testing.md @@ -10,7 +10,7 @@ redirect_from: /guides/v1.0/get-started/web-api-functional-testing.html --- -The Web API testing framework allows you to test Magento Web API from the client application point of view. The tests can used with either REST or SOAP. The REST or SOAP adapter that runs the tests is specified in PHPUnit configuration. See [How to Run the Tests](#howto) for more information. +The Web API testing framework allows you to test Magento Web API from the client application point of view. The tests can be used with either REST or SOAP. The REST or SOAP adapter that runs the tests is specified in PHPUnit configuration. See [How to Run the Tests](#howto) for more information.

    Implementation Details

    @@ -26,7 +26,7 @@ In the Web API functional tests only, the custom annotation `@magentoApiDataFix

    If data was added to the DB using @magentoApiDataFixture, it will not be automatically cleared after test execution. The data is cleared when @magentoDataFixture is used.

    - + Do not define fixtures in `dev/tests/api-functional`. Instead, they must be taken from `dev/tests/integration`. The integration framework defines most necessary fixtures, and they should be reused during Web API functional testing. If the existing set of fixtures is insufficient, add new fixtures under `dev/tests/integration`. The fixtures will then be available for both testing frameworks. To keep your test environment clean, clear all entities created in fixture files or within tests itself from the DB after test execution. This can be done either directly in tearDown or by a corresponding rollback for the fixture file. This file should be named the same as a fixture, but with `_rollback` suffix. @@ -38,7 +38,7 @@ All Web API functional tests should inherit from the generic test case `Magento\ {% highlight php %} How to Run the Tests

    Prerequisites

    -1. Install the PHP Soap extension. +1. Install the PHP Soap extension. Copy `php_soap.dll` or `php_soap.so` to your PHP extensions directory. Edit your `php.ini` file and enable the PHP Soap extension. Usually this means deleting the leading semi-colon in front of the extension. Then restart Apache. From f7fbc69b7bd5d762100b717b7a46172a974a6e76 Mon Sep 17 00:00:00 2001 From: stevjohnson Date: Wed, 27 Apr 2016 14:14:53 -0500 Subject: [PATCH 817/902] PR#631. Proofreading --- _includes/config/setup-cron.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/_includes/config/setup-cron.md b/_includes/config/setup-cron.md index c5eaf48462c..db3e455b9c3 100644 --- a/_includes/config/setup-cron.md +++ b/_includes/config/setup-cron.md @@ -14,7 +14,7 @@ To find the web server configuration, run a -#### Find the PHP binary +#### Find the PHP binary and php.ini path To display the path to your PHP binary, enter which php @@ -42,11 +42,12 @@ A text editor displays. (You might need to choose a text editor first.) where * `` is the absolute file system path to your PHP binary -* `` is the path to a `php.ini` file to use for the cron job +* `` is the path to a `php.ini` file to use for the cron job +* `| grep -v "Ran jobs by schedule"` filters this message from the log, making any errors easier to spot The first command (`magento cron:run`) reindexes indexers, send automated e-mails, generates the sitemap, and so on. Usually it's associated with the PHP command line `.ini` file. The other two commands are used by the Component Manager and System Upgrade. -For example, if the PHP binary is located in `/usr/bin`, you installed Magento in `/var/www/html/magento2`, and all commands use the web server's `php.ini`, enter +For example, if the PHP binary is located in `/usr/bin`, you installed Magento in `/var/www/html/magento2`, and all commands use the web server's `/etc/php5/apache2/php.ini`, enter Example: From 0a95d77a1536e2ad46d779617082ddfa3704bf94 Mon Sep 17 00:00:00 2001 From: dougkm Date: Wed, 27 Apr 2016 14:16:14 -0700 Subject: [PATCH 818/902] Update bk-cloud.md updating to align with marketing --- guides/v2.0/cloud/bk-cloud.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guides/v2.0/cloud/bk-cloud.md b/guides/v2.0/cloud/bk-cloud.md index 8726e8ac990..1f578a60121 100644 --- a/guides/v2.0/cloud/bk-cloud.md +++ b/guides/v2.0/cloud/bk-cloud.md @@ -23,7 +23,7 @@ It's fully automated and happens almost instantly. Magento Enterprise Cloud Edit middleman between your code and deployment. ### Details -* Every Magento Enterprise Cloud Edition plan includes six active environments for development and staging. (Additional active environments are available at additional cost.) +* Every Magento Enterprise Cloud Edition plan includes eight active environments for development and staging. (Additional active environments are available at additional cost.) You can have as many *inactive* environments as you wish. * You can add fully managed services like MySQL, Elasticsearch, Redis, RabbitMQ, and so on, without requiring external add-ons. From 62b7fa6024c0185a8f22b6bdd149d3767353d285 Mon Sep 17 00:00:00 2001 From: Matt Mombrea Date: Wed, 27 Apr 2016 17:41:32 -0400 Subject: [PATCH 819/902] Typo in variable name for fastcgi_param --- guides/v2.0/config-guide/multi-site/ms_nginx.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/guides/v2.0/config-guide/multi-site/ms_nginx.md b/guides/v2.0/config-guide/multi-site/ms_nginx.md index 9d52dfc43d4..e514570f50e 100644 --- a/guides/v2.0/config-guide/multi-site/ms_nginx.md +++ b/guides/v2.0/config-guide/multi-site/ms_nginx.md @@ -38,9 +38,9 @@ Add the following two lines: ... fastcgi_param MAGE_RUN_TYPE website; - fastcgi_param MAGE_RUN_CODE $MAGE_RUN_MODE; + fastcgi_param MAGE_RUN_CODE $MAGE_RUN_CODE; ... Step 3: Reload your nginx configuration as a user with `root` privileges: - service nginx reload \ No newline at end of file + service nginx reload From 7401824daa291b9840a05e056fbf376861a2c08d Mon Sep 17 00:00:00 2001 From: Dmitry Shevtsov Date: Thu, 28 Apr 2016 14:07:28 +0300 Subject: [PATCH 820/902] MAGETWO-52368: [FEATURE] Vagrant project to build devdocs repo locally - vagrant project deploying github-pages added - how-to README added --- .gitignore | 2 ++ vagrant/README.md | 27 +++++++++++++++++++++++++++ vagrant/Vagrantfile | 21 +++++++++++++++++++++ vagrant/bootstrap.sh | 28 ++++++++++++++++++++++++++++ 4 files changed, 78 insertions(+) create mode 100644 vagrant/README.md create mode 100644 vagrant/Vagrantfile create mode 100644 vagrant/bootstrap.sh diff --git a/.gitignore b/.gitignore index 48e8d3d5495..310500bfc45 100644 --- a/.gitignore +++ b/.gitignore @@ -35,3 +35,5 @@ ignore Rakefile Gemfile Gemfile.lock +/vagrant/.vagrant +!/vagrant/bootstrap.sh \ No newline at end of file diff --git a/vagrant/README.md b/vagrant/README.md new file mode 100644 index 00000000000..2932094af6c --- /dev/null +++ b/vagrant/README.md @@ -0,0 +1,27 @@ +# Deploy devdocs locally + +You can deploy devdocs site locally using this vagrant project. Vagrant enables you to create a virtual machine with all the software needed to build the devdocs project on a virtual machine. The generated web-site is accessible through browser from your machine as localhost using IP: **127.0.0.1:4000** by default. + +## Setup + +1. Download or clone [devdocs repository](https://github.com/magento/devdocs). +2. [Install VirtualBox](https://www.virtualbox.org/wiki/Downloads). +3. [Install Vagrant](https://www.vagrantup.com/). + +## Create VM and environment + +1. Using a terminal change a directory to `devdocs/vagrant` on your host. (The directory where this README is located.) + Example: `cd ~/devdocs/vagrant` +2. Enter in the terminal `vagrant up` +3. Wait for some time until vagrant create a virtual machine with ready-to-go environment. + +## Run Jekyll + +1. Enter in terminal `vagrant ssh -c 'cd /jekyll/devdocs; jekyll serve --host=0.0.0.0'` +2. In browser on your machine, open http://127.0.0.1:4000/ + +## Customize environment + +You can set the following parameters in `Vagrantfile` +- `RAM` is RAM size on virtual machine. Default is "1024" MB. +- `HOST_PORT` is a localhost port that enables you to observe the generated HTML site from your machine. Default is "4000". \ No newline at end of file diff --git a/vagrant/Vagrantfile b/vagrant/Vagrantfile new file mode 100644 index 00000000000..986a3ed5a74 --- /dev/null +++ b/vagrant/Vagrantfile @@ -0,0 +1,21 @@ +# -*- mode: ruby -*- +# vi: set ft=ruby : + +HOST_NAME = "devdocs.magento.vg" +RAM = "1024" +HOST_PORT = "4000" + +# All Vagrant configuration is done below. The "2" in Vagrant.configure +# configures the configuration version (we support older styles for +# backwards compatibility). Please don't change it unless you know what +# you're doing. +Vagrant.configure(2) do |config| + config.vm.box = "ubuntu/trusty64" + config.vm.provision :shell, path: "bootstrap.sh" + config.vm.hostname = HOST_NAME + config.vm.network :forwarded_port, guest: 4000, host: HOST_PORT + config.vm.synced_folder "../.", "/jekyll/devdocs" + config.vm.provider "virtualbox" do |v| + v.customize ['modifyvm', :id, '--name', HOST_NAME, '--memory', RAM] + end +end \ No newline at end of file diff --git a/vagrant/bootstrap.sh b/vagrant/bootstrap.sh new file mode 100644 index 00000000000..603b0ae4b10 --- /dev/null +++ b/vagrant/bootstrap.sh @@ -0,0 +1,28 @@ +#!/usr/bin/env bash + +# Specify all parameters +RUBY_VERSION=2.1.7 +RVM_PATH=/usr/local/rvm + +# Get information on the newest versions of Ubuntu packages +sudo apt-get update + +# Install Ubuntu packages +sudo apt-get install build-essential nodejs git -y + +# Install Ruby +if [ ! -e $RVM_PATH ]; then + gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 + curl -sSL https://get.rvm.io | bash -s +fi + +source $RVM_PATH/scripts/rvm + +rvm use --install $RUBY_VERSION --default + +# Install gems +gem install github-pages -v 76 +gem install pygments.rb + +# Clean up +sudo apt-get autoremove -y \ No newline at end of file From cadf14d39535957265a2bfd872333db4e79d15be Mon Sep 17 00:00:00 2001 From: Dmitry Shevtsov Date: Thu, 28 Apr 2016 20:18:46 +0300 Subject: [PATCH 821/902] MAGETWO-52368: [FEATURE] Vagrant project to build devdocs repo locally - project and readme extended --- vagrant/README.md | 40 +++++++++++++++++++++++++++++++++++----- vagrant/Vagrantfile | 11 +++++------ vagrant/bootstrap.sh | 6 +++++- 3 files changed, 45 insertions(+), 12 deletions(-) diff --git a/vagrant/README.md b/vagrant/README.md index 2932094af6c..eab832f8dfe 100644 --- a/vagrant/README.md +++ b/vagrant/README.md @@ -15,13 +15,43 @@ You can deploy devdocs site locally using this vagrant project. Vagrant enables 2. Enter in the terminal `vagrant up` 3. Wait for some time until vagrant create a virtual machine with ready-to-go environment. -## Run Jekyll +## Browse devdocs site -1. Enter in terminal `vagrant ssh -c 'cd /jekyll/devdocs; jekyll serve --host=0.0.0.0'` -2. In browser on your machine, open http://127.0.0.1:4000/ +In your browser, open http://127.0.0.1:4000/ + +## Useful CLI commands + +All commands must be run in the terminal from the directory that contains `Vagrantfile`. + +### For Jekyll + +- Stop Jekyll server. (Stops devdocs site generation.) + `vagrant ssh -c "kill $(ps aux | grep '[j]ekyll' | awk '{print $2}')` +- Run Jekyll server. (Generates devdocs site.) + `vagrant ssh -c 'cd /jekyll/devdocs; jekyll serve --host=0.0.0.0'` +- Reload Jekyll server. (Regenerates devdocs site.) + `vagrant ssh -c "kill $(ps aux | grep '[j]ekyll' | awk '{print $2}'); cd /jekyll/devdocs; jekyll serve --host=0.0.0.0"` + +### For Virtual machine + +- Shut down the running virtual machine + `vagrant halt` +- Start and configure the virtual machine + `vagrant up` +- Stop and remove the virtual machine + `vagrant destroy` +- Reload virtual machine to apply changes in `Vagrantfile` + `vagrant reload` +- Reload virtual machine to apply changes in `Vagrantfile` and `bootstrap.sh` + `vagrant reload --provision` +- Reload virtual machine to apply changes in `bootstrap.sh` + `vagrant provision` + +[More Vagrant commands](https://www.vagrantup.com/docs/cli/up.html) ## Customize environment You can set the following parameters in `Vagrantfile` -- `RAM` is RAM size on virtual machine. Default is "1024" MB. -- `HOST_PORT` is a localhost port that enables you to observe the generated HTML site from your machine. Default is "4000". \ No newline at end of file +- `NAME` is a name of virtual machine (default: "magento.devdocs"). +- `RAM` is a RAM size on virtual machine (default: "1024" MB). +- `HOST_PORT` is a localhost port that enables you to observe the generated HTML site from your machine (default: "4000"). \ No newline at end of file diff --git a/vagrant/Vagrantfile b/vagrant/Vagrantfile index 986a3ed5a74..f5618c136cf 100644 --- a/vagrant/Vagrantfile +++ b/vagrant/Vagrantfile @@ -1,9 +1,9 @@ # -*- mode: ruby -*- # vi: set ft=ruby : -HOST_NAME = "devdocs.magento.vg" -RAM = "1024" -HOST_PORT = "4000" +NAME="magento.devdocs" +HOST_PORT="4000" +RAM="1024" # All Vagrant configuration is done below. The "2" in Vagrant.configure # configures the configuration version (we support older styles for @@ -12,10 +12,9 @@ HOST_PORT = "4000" Vagrant.configure(2) do |config| config.vm.box = "ubuntu/trusty64" config.vm.provision :shell, path: "bootstrap.sh" - config.vm.hostname = HOST_NAME - config.vm.network :forwarded_port, guest: 4000, host: HOST_PORT + config.vm.network :forwarded_port, guest: "4000", host: HOST_PORT config.vm.synced_folder "../.", "/jekyll/devdocs" config.vm.provider "virtualbox" do |v| - v.customize ['modifyvm', :id, '--name', HOST_NAME, '--memory', RAM] + v.customize ['modifyvm', :id, '--name', NAME, '--memory', RAM] end end \ No newline at end of file diff --git a/vagrant/bootstrap.sh b/vagrant/bootstrap.sh index 603b0ae4b10..fe50b123d70 100644 --- a/vagrant/bootstrap.sh +++ b/vagrant/bootstrap.sh @@ -25,4 +25,8 @@ gem install github-pages -v 76 gem install pygments.rb # Clean up -sudo apt-get autoremove -y \ No newline at end of file +sudo apt-get autoremove -y + +# Run Jekyll + +cd /jekyll/devdocs && jekyll serve --host=0.0.0.0 \ No newline at end of file From 611d43f158fbf9bbaa90a4147a04a5f9b6116030 Mon Sep 17 00:00:00 2001 From: Dmitry Shevtsov Date: Thu, 28 Apr 2016 20:25:33 +0300 Subject: [PATCH 822/902] MAGETWO-52368: [FEATURE] Vagrant project to build devdocs repo locally - stop jekyll command fix --- vagrant/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vagrant/README.md b/vagrant/README.md index eab832f8dfe..a6448f0e29d 100644 --- a/vagrant/README.md +++ b/vagrant/README.md @@ -26,7 +26,7 @@ All commands must be run in the terminal from the directory that contains `Vagra ### For Jekyll - Stop Jekyll server. (Stops devdocs site generation.) - `vagrant ssh -c "kill $(ps aux | grep '[j]ekyll' | awk '{print $2}')` + `vagrant ssh -c "kill $(ps aux | grep '[j]ekyll' | awk '{print $2}')"` - Run Jekyll server. (Generates devdocs site.) `vagrant ssh -c 'cd /jekyll/devdocs; jekyll serve --host=0.0.0.0'` - Reload Jekyll server. (Regenerates devdocs site.) From 056ee40332362c2e06e9cb02b50f261d44d6865f Mon Sep 17 00:00:00 2001 From: Gordon Knoppe Date: Thu, 28 Apr 2016 20:39:39 +0100 Subject: [PATCH 823/902] Update ReleaseNotes2.0.5CE.md - Minify not magnify --- guides/v2.0/release-notes/ReleaseNotes2.0.5CE.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guides/v2.0/release-notes/ReleaseNotes2.0.5CE.md b/guides/v2.0/release-notes/ReleaseNotes2.0.5CE.md index f3b53b92d4f..a01e0bcb990 100644 --- a/guides/v2.0/release-notes/ReleaseNotes2.0.5CE.md +++ b/guides/v2.0/release-notes/ReleaseNotes2.0.5CE.md @@ -45,7 +45,7 @@ Backward-incompatible changes are documented in (GITHUB-2989) From f03a3fd90f675316d25475a430616de1708abacb Mon Sep 17 00:00:00 2001 From: mage2-team Date: Thu, 28 Apr 2016 13:02:52 -0700 Subject: [PATCH 824/902] MAGETWO-49336: Publication of breaking changes --- _includes/changes/ce_changes.html | 88 +++++++++++++------------------ _includes/changes/ee_changes.html | 4 ++ 2 files changed, 40 insertions(+), 52 deletions(-) diff --git a/_includes/changes/ce_changes.html b/_includes/changes/ce_changes.html index 263e15874eb..207ede8c5ff 100644 --- a/_includes/changes/ce_changes.html +++ b/_includes/changes/ce_changes.html @@ -169,6 +169,10 @@

    Class

    Magento\Catalog\Observer\AddCatalogToTopmenuItemsObserver Class was removed. + + Magento\Catalog\Model\Webapi\Product\Option\Type\File\Validator + Class was removed. + Magento\Catalog\Model\ResourceModel\Product\Attribute\Backend\Media Class was removed. @@ -505,6 +509,14 @@

    Class

    Magento\Framework\Session\SaveHandler::__construct [public] Method parameter changed. + + Magento\Framework\Search\Adapter\Mysql\Filter\Builder\Range::CONDITION_NEGATION_PART_GREATER_THAN + Constant has been added. + + + Magento\Framework\Search\Adapter\Mysql\Filter\Builder\Range::CONDITION_NEGATION_PART_LOWER_THAN + Constant has been added. + Magento\Framework\Pricing\Render\PriceBox::DEFAULT_LIFETIME Constant has been added. @@ -557,6 +569,10 @@

    Class

    Magento\Framework\Config\ConfigOptionsListConstants::SESSION_SAVE_REDIS Constant has been added. + + Magento\Framework\Composer\ComposerInformation::COMPOSER_DEFAULT_REPO_KEY + Constant has been added. + Magento\Framework\App\Cron::__construct [public] Method parameter changed. @@ -2021,6 +2037,18 @@

    Class

    Magento\Paypal\Controller\Adminhtml\Billing\Agreement\View::ADMIN_RESOURCE Constant has been added. + + Magento\Paypal\Block\Express\Shortcut::__construct + [public] Method parameter changed. + + + Magento\Paypal\Block\Express\Shortcut::$_paypalData + [protected] Property has been removed. + + + Magento\Paypal\Block\Express\Shortcut::$currentCustomer + [protected] Property has been removed. + Magento\Paypal\Block\Adminhtml\System\Config\Field\Hidden::_decorateRowHtml [protected] Method parameter changed. @@ -2261,58 +2289,6 @@

    Class

    Magento\Eav\Model\Entity\AbstractEntity::$_defaultAttributes [protected] Property has been removed. - - Magento\Downloadable\Model\LinkRepository::saveLink - [protected] Method has been removed. - - - Magento\Downloadable\Model\LinkRepository::updateLink - [protected] Method has been removed. - - - Magento\Downloadable\Model\LinkRepository::__construct - [public] Method parameter changed. - - - Magento\Downloadable\Model\LinkRepository::$linkDataObjectFactory - [protected] Property has been removed. - - - Magento\Downloadable\Model\LinkRepository::$fileContentUploader - [protected] Property has been removed. - - - Magento\Downloadable\Model\LinkRepository::$jsonEncoder - [protected] Property has been removed. - - - Magento\Downloadable\Model\SampleRepository::saveSample - [protected] Method has been removed. - - - Magento\Downloadable\Model\SampleRepository::updateSample - [protected] Method has been removed. - - - Magento\Downloadable\Model\SampleRepository::__construct - [public] Method parameter changed. - - - Magento\Downloadable\Model\SampleRepository::$downloadableType - [protected] Property has been removed. - - - Magento\Downloadable\Model\SampleRepository::$sampleDataObjectFactory - [protected] Property has been removed. - - - Magento\Downloadable\Model\SampleRepository::$fileContentUploader - [protected] Property has been removed. - - - Magento\Downloadable\Model\SampleRepository::$jsonEncoder - [protected] Property has been removed. - Magento\Downloadable\Model\Product\Type::save [public] Method has been removed. @@ -2377,6 +2353,10 @@

    Class

    Magento\CustomerImportExport\Model\Import\Address::COLUMN_POSTCODE Constant has been added. + + Magento\Customer\Observer\AfterAddressSaveObserver::__construct + [public] Method parameter changed. + Magento\Customer\Model\AccountManagement::XML_PATH_MINIMUM_PASSWORD_LENGTH Constant has been added. @@ -3769,6 +3749,10 @@

    Interface

    Magento\Catalog\Api\Data\ProductAttributeInterface::CODE_WEIGHT Constant has been added. + + Magento\Framework\Config\DesignResolverInterface + Interface was added. + Magento\Vault\Model\VaultPaymentInterface Interface was added. diff --git a/_includes/changes/ee_changes.html b/_includes/changes/ee_changes.html index b2b72fce9c1..2bf98d31de3 100644 --- a/_includes/changes/ee_changes.html +++ b/_includes/changes/ee_changes.html @@ -621,6 +621,10 @@

    Class

    Magento\Support\Controller\Adminhtml\Backup\Download::$file [protected] Property has been removed. + + Magento\Support\Console\Command\UtilityCheckCommand::INPUT_KEY_HIDE_PATHS + Constant has been added. + Magento\Solr\SearchAdapter\ConnectionManager::__construct [public] Method parameter changed. From 88520da2ba5ad31cec3d832da86ec880f478c59e Mon Sep 17 00:00:00 2001 From: stevjohnson Date: Thu, 28 Apr 2016 16:55:15 -0500 Subject: [PATCH 825/902] Changed name of sample repository --- guides/v2.0/cloud/project/project-conf-files_magento-app.md | 4 ++-- guides/v2.0/cloud/project/project-conf-files_routes.md | 2 +- guides/v2.0/cloud/project/project-conf-files_services.md | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/guides/v2.0/cloud/project/project-conf-files_magento-app.md b/guides/v2.0/cloud/project/project-conf-files_magento-app.md index 2901e03bf7c..8a52e753263 100644 --- a/guides/v2.0/cloud/project/project-conf-files_magento-app.md +++ b/guides/v2.0/cloud/project/project-conf-files_magento-app.md @@ -29,12 +29,12 @@ Magento Enterprise Cloud Edition supports multiple applications per project but This file controls the application and the way it is built and deployed on Magento Enterprise Cloud Edition. -[Sample `.magento.app.yaml`](https://github.com/platformsh-redbull/mc-base/blob/master/.magento.app.yaml){:target="_blank"} +[Sample `.magento.app.yaml`](https://github.com/magento/magento-cloud/blob/master/.magento.app.yaml){:target="_blank"} The following sections discuss properties in `.magento.app.yaml`. ## Defaults {#cloud-yaml-default} -`.magento.app.yaml` has many default values; see the [sample `.magento.app.yaml`](https://github.com/platformsh-redbull/mc-base/blob/master/.magento.app.yaml){:target="_blank"}. +`.magento.app.yaml` has many default values; see the [sample `.magento.app.yaml`](https://github.com/magento/magento-cloud/blob/master/.magento.app.yaml){:target="_blank"}. ## `name` property {#name} `name` identifies the application in the project. Magento Enterprise Cloud Edition diff --git a/guides/v2.0/cloud/project/project-conf-files_routes.md b/guides/v2.0/cloud/project/project-conf-files_routes.md index f292cf7355f..6470725e910 100644 --- a/guides/v2.0/cloud/project/project-conf-files_routes.md +++ b/guides/v2.0/cloud/project/project-conf-files_routes.md @@ -30,7 +30,7 @@ systems. This one configuration file handles routes for all systems. This file is located at `.magento/routes.yaml` in your project. -[Sample `routes.yaml`](https://github.com/platformsh-redbull/mc-base/blob/master/.magento/routes.yaml){:target="_blank"} +[Sample `routes.yaml`](https://github.com/magento/magento-cloud/blob/master/.magento/routes.yaml){:target="_blank"} ## Defaults {#cloud-yaml-routes-default} If you do not have a `routes.yaml` file, the following default is used: diff --git a/guides/v2.0/cloud/project/project-conf-files_services.md b/guides/v2.0/cloud/project/project-conf-files_services.md index 3cdb4ad2efb..06c3463c12e 100644 --- a/guides/v2.0/cloud/project/project-conf-files_services.md +++ b/guides/v2.0/cloud/project/project-conf-files_services.md @@ -23,7 +23,7 @@ Magento Enterprise Cloud Edition provides [*services*](#cloud-yaml-services-type This file is located at `.magento/services.yaml` in your project. -[Sample `services.yaml` file](https://github.com/platformsh-redbull/mc-base/blob/master/.magento/services.yaml){:target="_blank"} +[Sample `services.yaml` file](https://github.com/magento/magento-cloud/blob/master/.magento/services.yaml){:target="_blank"} The following sections discuss properties in `services.yaml`. From 2ba6317052822b928a9df02fd980802caaff7d5b Mon Sep 17 00:00:00 2001 From: Dmitry Shevtsov Date: Fri, 29 Apr 2016 12:02:31 +0300 Subject: [PATCH 826/902] MAGETWO-52368: [FEATURE] Vagrant project to build devdocs repo locally - readme extended --- vagrant/README.md | 77 ++++++++++++++++++++++++++++++++--------------- 1 file changed, 52 insertions(+), 25 deletions(-) diff --git a/vagrant/README.md b/vagrant/README.md index a6448f0e29d..c30e5d16fbf 100644 --- a/vagrant/README.md +++ b/vagrant/README.md @@ -10,48 +10,75 @@ You can deploy devdocs site locally using this vagrant project. Vagrant enables ## Create VM and environment -1. Using a terminal change a directory to `devdocs/vagrant` on your host. (The directory where this README is located.) +1. Using a terminal, change a directory to `devdocs/vagrant` on your host. (The directory where this README is located.) Example: `cd ~/devdocs/vagrant` -2. Enter in the terminal `vagrant up` +2. Enter in your terminal `vagrant up` 3. Wait for some time until vagrant create a virtual machine with ready-to-go environment. ## Browse devdocs site -In your browser, open http://127.0.0.1:4000/ +In your browser, visit http://127.0.0.1:4000/ -## Useful CLI commands +## Customize environment + +You can change the following parameters in `Vagrantfile` + +- `NAME` is a name of virtual machine (default: "magento.devdocs"). +- `HOST_PORT` is a localhost port that enables you to observe the generated site from your host (default: "4000"). +- `RAM` is a RAM size on virtual machine (default: "1024" MB). + +## Useful CLI scripts and commands All commands must be run in the terminal from the directory that contains `Vagrantfile`. -### For Jekyll +### Scripts - Stop Jekyll server. (Stops devdocs site generation.) - `vagrant ssh -c "kill $(ps aux | grep '[j]ekyll' | awk '{print $2}')"` + ```bash + vagrant ssh -c "kill $(ps aux | grep '[j]ekyll' | awk '{print $2}')" + ``` - Run Jekyll server. (Generates devdocs site.) - `vagrant ssh -c 'cd /jekyll/devdocs; jekyll serve --host=0.0.0.0'` + ```bash + vagrant ssh -c 'cd /jekyll/devdocs; jekyll serve --host=0.0.0.0' + ``` - Reload Jekyll server. (Regenerates devdocs site.) - `vagrant ssh -c "kill $(ps aux | grep '[j]ekyll' | awk '{print $2}'); cd /jekyll/devdocs; jekyll serve --host=0.0.0.0"` - -### For Virtual machine - + ```bash + vagrant ssh -c "kill $(ps aux | grep '[j]ekyll' | awk '{print $2}'); cd /jekyll/devdocs; jekyll serve --host=0.0.0.0" + ``` + +### Commands + +- Connect to the running virtual machine. You can run Jekyll commands inside the virtual machine from the `/jekyll/devdocs` directory. + ```bash + vagrant ssh + ``` + To terminate the connection run the command: + ```bash + exit + ``` - Shut down the running virtual machine - `vagrant halt` + ```bash + vagrant halt + ``` - Start and configure the virtual machine - `vagrant up` + ```bash + vagrant up + ``` - Stop and remove the virtual machine - `vagrant destroy` + ```bash + vagrant destroy + ``` - Reload virtual machine to apply changes in `Vagrantfile` - `vagrant reload` + ```bash + vagrant reload + ``` - Reload virtual machine to apply changes in `Vagrantfile` and `bootstrap.sh` - `vagrant reload --provision` + ```bash + vagrant reload --provision + ``` - Reload virtual machine to apply changes in `bootstrap.sh` - `vagrant provision` - -[More Vagrant commands](https://www.vagrantup.com/docs/cli/up.html) - -## Customize environment + ```bash + vagrant provision + ``` -You can set the following parameters in `Vagrantfile` -- `NAME` is a name of virtual machine (default: "magento.devdocs"). -- `RAM` is a RAM size on virtual machine (default: "1024" MB). -- `HOST_PORT` is a localhost port that enables you to observe the generated HTML site from your machine (default: "4000"). \ No newline at end of file +[More Vagrant commands](https://www.vagrantup.com/docs/cli/up.html). \ No newline at end of file From ceef85621d2d397a81df5fbdd7e5318dd36447cc Mon Sep 17 00:00:00 2001 From: Dmytro Poperechnyy Date: Fri, 29 Apr 2016 16:43:20 +0300 Subject: [PATCH 827/902] Update cli-howto.md --- guides/v2.0/extension-dev-guide/cli-cmds/cli-howto.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guides/v2.0/extension-dev-guide/cli-cmds/cli-howto.md b/guides/v2.0/extension-dev-guide/cli-cmds/cli-howto.md index dd055ea2ac9..f19ded56ac7 100644 --- a/guides/v2.0/extension-dev-guide/cli-cmds/cli-howto.md +++ b/guides/v2.0/extension-dev-guide/cli-cmds/cli-howto.md @@ -40,7 +40,7 @@ Following is a summary of the process: 1. Create a Command class (the recommended location is `/Console/Command`). See `app/code/Magento/CommandExample/Console/Command` for examples. -2. Declare your Command class in `Magento\Framework\Console\CommandList` using dependency injection (`/etc/di.xml`). +2. Declare your Command class in `Magento\Framework\Console\CommandListInterface` using dependency injection (`/etc/di.xml`). 3. Clean the cache and compiled code directories: cd /var From 620f157638fe2ba040802ce01b083294916cfbb9 Mon Sep 17 00:00:00 2001 From: Javier Eguiluz Date: Fri, 29 Apr 2016 17:03:05 +0200 Subject: [PATCH 828/902] Fixed a minor error in "Manage the cache" article --- guides/v2.0/config-guide/cli/config-cli-subcommands-cache.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guides/v2.0/config-guide/cli/config-cli-subcommands-cache.md b/guides/v2.0/config-guide/cli/config-cli-subcommands-cache.md index db03f7a4488..3b501ba7770 100644 --- a/guides/v2.0/config-guide/cli/config-cli-subcommands-cache.md +++ b/guides/v2.0/config-guide/cli/config-cli-subcommands-cache.md @@ -72,7 +72,7 @@ Magento 2 has the following cache types:

    full_page

    Generated HTML pages.

    If necessary, Magento cleans up this cache automatically, but third-party developers can put any data in any segment of the cache.

    -

    Clean or flush this cache type after modifying code level that affects HTML output. It’s recommended to keep this cache enabled to because caching HTML improves performance significantly.

    +

    Clean or flush this cache type after modifying code level that affects HTML output. It’s recommended to keep this cache enabled because caching HTML improves performance significantly.

    Reflection

    From 03f30527b1e71c033f9816f09e48f624edf768bd Mon Sep 17 00:00:00 2001 From: Oleksandra Marchenko Date: Fri, 29 Apr 2016 18:51:03 +0300 Subject: [PATCH 829/902] Added a note about using UI in module naming --- guides/v2.0/howdoi/checkout/checkout_address.md | 3 +-- guides/v2.0/howdoi/checkout/checkout_carrier.md | 2 +- guides/v2.0/howdoi/checkout/checkout_edit_form.md | 3 ++- guides/v2.0/howdoi/checkout/checkout_form.md | 2 +- guides/v2.0/howdoi/checkout/checkout_new_step.md | 2 +- guides/v2.0/howdoi/checkout/checkout_order.md | 2 +- guides/v2.0/howdoi/checkout/checkout_payment.md | 2 +- guides/v2.0/howdoi/checkout/checkout_zip.md | 2 +- 8 files changed, 9 insertions(+), 9 deletions(-) diff --git a/guides/v2.0/howdoi/checkout/checkout_address.md b/guides/v2.0/howdoi/checkout/checkout_address.md index 2e81d6f0474..db344656210 100644 --- a/guides/v2.0/howdoi/checkout/checkout_address.md +++ b/guides/v2.0/howdoi/checkout/checkout_address.md @@ -35,11 +35,10 @@ All the steps are described further. Your shipping address renderer must be implemented as a JavaScript UI component. That is, it must be a RequireJS module, and must return a factory function, that takes a configurable object. -For the sake of compatibility, upgradability and easy maintenance, do not edit the default Magento code. Instead add your customizations in a separate module. For your checkout customization to be applied correctly, your custom module must depend on the Magento_Checkout module. Module dependencies are specified in the [module's `composer.json`]({{site.gdeurl}}extension-dev-guide/build/composer-integration.html). +For the sake of compatibility, upgradability and easy maintenance, do not edit the default Magento code. Instead add your customizations in a separate module. For your checkout customization to be applied correctly, your custom module must depend on the `Magento_Checkout` module. Module dependencies are specified in the [module's `composer.json`]({{site.gdeurl}}extension-dev-guide/build/composer-integration.html). Do not use `Ui` for your custom module name, because `%Vendor%_Ui` notation, required when specifying paths, might cause issues. In your custom module directory, create the component's `.js` file (shipping address renderer). It must be located under the `/view/frontend/web/js/view/` directory. - The general view of the shipping address renderer is the following: {%highlight js%} diff --git a/guides/v2.0/howdoi/checkout/checkout_carrier.md b/guides/v2.0/howdoi/checkout/checkout_carrier.md index 29e187b60c5..689ea81b6d4 100644 --- a/guides/v2.0/howdoi/checkout/checkout_carrier.md +++ b/guides/v2.0/howdoi/checkout/checkout_carrier.md @@ -27,7 +27,7 @@ Shipping carrier validation rules declare which fields of the shipping address a During checkout, if the shipping address fields declared in the rules are filled, the further validation of fields' values (for example, whether a carrier is available for the specified country) is carried on the server side. -For the sake of compatibility, upgradability, and easy maintenance, do not edit the default Magento code, add your customizations in a separate module. For your checkout customization to be applied correctly, your custom module should [depend]({{site.gdeurl}}extension-dev-guide/build/composer-integration.html) on the Magento_Checkout module. +For the sake of compatibility, upgradability, and easy maintenance, do not edit the default Magento code, add your customizations in a separate module. For your checkout customization to be applied correctly, your custom module should [depend]({{site.gdeurl}}extension-dev-guide/build/composer-integration.html) on the `Magento_Checkout` module. Do not use `Ui` for your custom module name, because `%Vendor%_Ui` notation, required when specifying paths, might cause issues. In your `/view/frontend/web/js/model` directory, create a `.js` file implementing the validation rules. diff --git a/guides/v2.0/howdoi/checkout/checkout_edit_form.md b/guides/v2.0/howdoi/checkout/checkout_edit_form.md index cb2d8ecafd5..294e0964d9c 100644 --- a/guides/v2.0/howdoi/checkout/checkout_edit_form.md +++ b/guides/v2.0/howdoi/checkout/checkout_edit_form.md @@ -33,6 +33,7 @@ There are more details about each step in the following sections. For the sake of compatibility, upgradability, and easy maintenance, do not edit the default Magento code. Instead, add your customizations in a separate module. For your checkout customization to be applied correctly, your custom module should [depend]({{site.gdeurl}}extension-dev-guide/build/composer-integration.html) on the Magento_Checkout module. +Do not use `Ui` for your custom module name, because `%Vendor%_Ui` notation, required when specifying paths, might cause issues. ## Implement the HTML template for the field {#template} @@ -89,7 +90,7 @@ In this file, add content similar to the following: - %your_module%/form/element/%your_template% + %Vendor_Module%/form/element/%your_template% diff --git a/guides/v2.0/howdoi/checkout/checkout_form.md b/guides/v2.0/howdoi/checkout/checkout_form.md index cb67ceab1c6..662057446a4 100644 --- a/guides/v2.0/howdoi/checkout/checkout_form.md +++ b/guides/v2.0/howdoi/checkout/checkout_form.md @@ -25,7 +25,7 @@ Magento provides the ability to add a custom form to any of the checkout steps: [Set Magento to developer mode]({{site.gdeurl}}config-guide/cli/config-cli-subcommands-mode.html) while you perform all customizations and debugging. -For the sake of compatibility, upgradability, and easy maintenance, do not edit the default Magento code. Instead, add your customizations in a separate module. For your checkout customization to be applied correctly, your custom module should [depend]({{site.gdeurl}}extension-dev-guide/build/composer-integration.html) on the Magento_Checkout module. +For the sake of compatibility, upgradability, and easy maintenance, do not edit the default Magento code. Instead, add your customizations in a separate module. For your checkout customization to be applied correctly, your custom module should [depend]({{site.gdeurl}}extension-dev-guide/build/composer-integration.html) on the `Magento_Checkout` module. Do not use `Ui` for your custom module name, because `%Vendor%_Ui` notation, required when specifying paths, might cause issues. ## Create the JS implementation of the form UI component {#component} diff --git a/guides/v2.0/howdoi/checkout/checkout_new_step.md b/guides/v2.0/howdoi/checkout/checkout_new_step.md index a38aad3682a..00f6dcbbb54 100644 --- a/guides/v2.0/howdoi/checkout/checkout_new_step.md +++ b/guides/v2.0/howdoi/checkout/checkout_new_step.md @@ -27,7 +27,7 @@ This topic describes how to create the frontend part of the component, implement To create the view part of the new checkout step: -1. Add a module directory (not covered in this topic). See [Build your module]({{site.gdeurl}}extension-dev-guide/build.html) for details). All custom files must be stored there. For your checkout customization to be applied correctly, your custom module should depend on the Magento_Checkout module. +1. Add a module directory (not covered in this topic). See [Build your module]({{site.gdeurl}}extension-dev-guide/build.html) for details). All custom files must be stored there. For your checkout customization to be applied correctly, your custom module should depend on the `Magento_Checkout` module. Do not use `Ui` for your custom module name, because `%Vendor%_Ui` notation, required when specifying paths, might cause issues. 1. Create the `.js` file implementing the view model. 2. Create an `.html` template for the component. diff --git a/guides/v2.0/howdoi/checkout/checkout_order.md b/guides/v2.0/howdoi/checkout/checkout_order.md index 6660291bf2a..e0ec7375ff9 100644 --- a/guides/v2.0/howdoi/checkout/checkout_order.md +++ b/guides/v2.0/howdoi/checkout/checkout_order.md @@ -20,7 +20,7 @@ To add custom validations before the order placement action, you must do the fol ## Create the validator {#validator} -For the sake of compatibility, upgradability and easy maintenance, do not edit the default Magento code, add your customizations in a separate module. For your checkout customization to be applied correctly, your custom module should [depend]({{site.gdeurl}}extension-dev-guide/build/composer-integration.html) on the Magento_Checkout module. +For the sake of compatibility, upgradability and easy maintenance, do not edit the default Magento code, add your customizations in a separate module. For your checkout customization to be applied correctly, your custom module should [depend]({{site.gdeurl}}extension-dev-guide/build/composer-integration.html) on the `Magento_Checkout` module. Do not use `Ui` for your custom module name, because `%Vendor%_Ui` notation, required when specifying paths, might cause issues. In your custom module directory, create a `.js` file implementing the validator. It should be located under `/view/frontend/web/js/model` directory. diff --git a/guides/v2.0/howdoi/checkout/checkout_payment.md b/guides/v2.0/howdoi/checkout/checkout_payment.md index a85d956d9b0..4433cea6062 100644 --- a/guides/v2.0/howdoi/checkout/checkout_payment.md +++ b/guides/v2.0/howdoi/checkout/checkout_payment.md @@ -29,7 +29,7 @@ All the steps are described further. ## Create the .js component file {#create} -Your payment method renderer must be implemented as a UI component. For the sake of compatibility, upgradability and easy maintenance, do not edit the default Magento code, add your customizations in a separate module. For your checkout customization to be applied correctly, your custom module should depend on the Magento_Checkout module. Module dependencies are specified in the [module's `composer.json`]({{site.gdeurl}}extension-dev-guide/build/composer-integration.html). +Your payment method renderer must be implemented as a UI component. For the sake of compatibility, upgradability and easy maintenance, do not edit the default Magento code, add your customizations in a separate module. For your checkout customization to be applied correctly, your custom module should depend on the `Magento_Checkout` module. Module dependencies are specified in the [module's `composer.json`]({{site.gdeurl}}extension-dev-guide/build/composer-integration.html). Do not use `Ui` for your custom module name, because `%Vendor%_Ui` notation, required when specifying paths, might cause issues. In you custom module directory create the component's `.js` file (payment method renderer). It must be located under the `/view/frontend/web/js/view/` directory. For example in the Magento modules, the payment methods renderers are stored in the `/view/frontend/web/js/view/payment/method-renderer/` directory. diff --git a/guides/v2.0/howdoi/checkout/checkout_zip.md b/guides/v2.0/howdoi/checkout/checkout_zip.md index 60b424f1bcc..8481b250fe8 100644 --- a/guides/v2.0/howdoi/checkout/checkout_zip.md +++ b/guides/v2.0/howdoi/checkout/checkout_zip.md @@ -18,7 +18,7 @@ This topic describes how a developer can add custom input masks. In Magento the input masks for the **ZIP code** field are specified in the `/etc/zip_codes.xml`. Input masks are specified per country, and are entered in the form of regular expressions. The syntax of defined by the [zip_code.xsd]({{site.mage2000url}}app/code/Magento/Directory/etc/zip_codes.xsd) scheme. -For the sake of compatibility, upgradability, and easy maintenance, do not edit the default Magento code. Add your customizations in a separate, custom module. For your ZIP code input mask customization to be applied correctly, your custom module should depend on the Magento_Directory module. +For the sake of compatibility, upgradability, and easy maintenance, do not edit the default Magento code. Add your customizations in a separate, custom module. For your ZIP code input mask customization to be applied correctly, your custom module should depend on the `Magento_Directory` module. Do not use `Ui` for your custom module name, because `%Vendor%_Ui` notation, required when specifying paths, might cause issues. To add custom ZIP code input masks or change the default ones, create a new `zip_code.xml` in the `/etc` directory. From da3ce3797385adbf483fe890e6528555977eb274 Mon Sep 17 00:00:00 2001 From: Oleksandra Marchenko Date: Fri, 29 Apr 2016 19:22:14 +0300 Subject: [PATCH 830/902] added a note about troubleshooting a theme --- guides/v2.0/frontend-dev-guide/themes/theme-apply.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/guides/v2.0/frontend-dev-guide/themes/theme-apply.md b/guides/v2.0/frontend-dev-guide/themes/theme-apply.md index 17d2b682269..cfe76f03891 100644 --- a/guides/v2.0/frontend-dev-guide/themes/theme-apply.md +++ b/guides/v2.0/frontend-dev-guide/themes/theme-apply.md @@ -80,5 +80,8 @@ A system message notifies you that invalidated cache types must be refreshed. ## Troubleshooting (if the changes do not get applied) -If the changes you configure in the Admin are not applied after you clear the cache and reload the page, delete all files in the `pub/static/frontend` and `var/view_preprocessed` directories, then reload the pages. You can delete the files manually or run the `grunt clean:` command in CLI. For details about using Grunt in Magento see [Installing and configuring Grunt]({{site.gdeurl}}frontend-dev-guide/css-topics/css_debug.html#grunt_prereq). +If the changes you configure in the Admin are not applied after you clear the cache and reload the page, try the following: +- Delete all files in the `pub/static/frontend` and `var/view_preprocessed` directories, then reload the pages. You can delete the files manually or run the `grunt clean:` command in CLI. For details about using Grunt in Magento see [Installing and configuring Grunt]({{site.gdeurl}}frontend-dev-guide/css-topics/css_debug.html#grunt_prereq). + +- In your Magento database, in the `theme` table, check if the `type` value for your custom theme is "0". If it is "1" or "2", change it to "0". You can use a database tool such as [phpMyAdmin]({{site.gdeurl}}install-gde/prereq/optional.html#install-optional-phpmyadmin) or do it manually from the command line. From 6859b2e062d3ea588e2bf8320018d57512b8f97c Mon Sep 17 00:00:00 2001 From: James Calcaben Date: Fri, 29 Apr 2016 13:52:20 -0500 Subject: [PATCH 831/902] Fix info div --- guides/v2.0/ext-best-practices/admin/placement-and-design.md | 1 + 1 file changed, 1 insertion(+) diff --git a/guides/v2.0/ext-best-practices/admin/placement-and-design.md b/guides/v2.0/ext-best-practices/admin/placement-and-design.md index b1f7756ba06..483dc9595b3 100644 --- a/guides/v2.0/ext-best-practices/admin/placement-and-design.md +++ b/guides/v2.0/ext-best-practices/admin/placement-and-design.md @@ -98,6 +98,7 @@ These are extensions which provide additional functionality to Magento that do n There will be a new, dedicated section designed for such exclusive extensions. When feature-level extensions are installed, those extensions will live under this section. The exact final name of this new section has not been decided (we welcome your feedback), but in the image below it is named Extensions. ![Feature Placement]({{site.baseurl}}common/images/ext-best-practices/feature-placement.png){:height="190px" width="350px"} +

    The name and icon for this section is still TBD.

    This new section is a future proposal, and we welcome feedback about if and how advertisements should be displayed here.

    From 1b0b79ba60e7eb18efa3551395c8cf2db20ae3c2 Mon Sep 17 00:00:00 2001 From: chrone Date: Sun, 1 May 2016 00:10:11 +0700 Subject: [PATCH 832/902] Fix backtick typo in PHP memcached extension array Then: 'save' => 'memcached`, Now: 'save' => 'memcached', --- guides/v2.0/config-guide/memcache/memcache_magento.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guides/v2.0/config-guide/memcache/memcache_magento.md b/guides/v2.0/config-guide/memcache/memcache_magento.md index 82b3790e5cb..25200ff644a 100644 --- a/guides/v2.0/config-guide/memcache/memcache_magento.md +++ b/guides/v2.0/config-guide/memcache/memcache_magento.md @@ -34,7 +34,7 @@ To configure Magento to use memcache: 'session' => array ( - 'save' => 'memcached’, + 'save' => 'memcached', 'save_path' => ':' ), From 1629bd717332461b1ad1512faf9522b87c6d3079 Mon Sep 17 00:00:00 2001 From: Matthias Zeis Date: Sat, 30 Apr 2016 20:05:10 +0200 Subject: [PATCH 833/902] fix typos and make minor wording improvements --- guides/v2.0/migration/migration-overview-how.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/guides/v2.0/migration/migration-overview-how.md b/guides/v2.0/migration/migration-overview-how.md index 73cb08db3f0..2b7b2c03153 100644 --- a/guides/v2.0/migration/migration-overview-how.md +++ b/guides/v2.0/migration/migration-overview-how.md @@ -22,13 +22,13 @@ This document uses the following terminology to discuss the Data Migration Tool: * Data: Migrates database assets in bulk * Delta: Migrates incremental changes (for example, orders and inventory) -This guide provides information about migration using Data Migration Tool that can transfer and adapt data from Magento 1 to Magento 2 stores. The migration in overall is split into three phase (or "modes"). Migration of settings, migration of data and migration of delta. Each mode splits into steps. Every step responsible for transferring some particular data. (e.g. URL Rewrite step, EAV step, Settings step ...) At the beginning, when is run, step checks tables structure of Magento 1 and Magento 2 for their consistency. Then the actual data is transferred to Magento 2 and in the end this data is checked to ensure that everything was transferred properly. +This guide provides information about migration using Data Migration Tool that can transfer and adapt data from Magento 1 to Magento 2 stores. The migration in overall is split into three phases (or "modes"): migration of settings, migration of data and migration of delta. Each mode splits into steps. Every step is responsible for transferring particular data (e.g. URL Rewrite step, EAV step, Settings step ...). At the begin of a run, a step checks the table structures of Magento 1 and Magento 2 for their consistency. Then the actual data is transferred to Magento 2. In the end this data is checked to ensure that everything was transferred properly. This section previews your migration experience by providing a high-level overview of the Data Migration Tool.

    Conceptual overview

    -There are many differences between Magento 1 and Magento 2 in the structure and format of data that is stored in database. And each version of Magento 1, for example 1.8.0.0 or 1.9.0.0, has its own unique changes in data structure. The Data Migration Tool understands all these changes and can properly transform it for usage in Magento 2 store. Most of these differences are declared in *Map files*. Using the Map file a Step will know that, for example, a table from Magento 1 was renamed in Magento 2 and will be able to transfer data properly to destination table. In the case where there are no differences in data structure or data format the Data Migration Tool will transfer data as is to the Magento 2 database, including data from tables created by extensions. When differences are not declared in Map files then the Data Migration Tool will not start migration process and will display an error. +There are many differences between Magento 1 and Magento 2 in the structure and format of data that is stored in database. Each version of Magento 1, for example 1.8.0.0 or 1.9.0.0, has its own unique changes in data structure. The Data Migration Tool understands all these changes and can properly transform it for usage in Magento 2 store. Most of these differences are declared in *Map files*. Using the Map file a Step will know that, for example, a table from Magento 1 was renamed in Magento 2 and will be able to transfer data properly to destination table. In the case where there are no differences in data structure or data format the Data Migration Tool will transfer data as is to the Magento 2 database, including data from tables created by extensions. When differences are not declared in Map files then the Data Migration Tool will not start migration process and will display an error. Mapping files are discussed in more detail in Data Migration Tool Internal Specification. From 4b21e05d73563f39d4d00f97234e8ed9adafcb7d Mon Sep 17 00:00:00 2001 From: stevjohnson Date: Tue, 3 May 2016 10:09:04 -0500 Subject: [PATCH 834/902] PR#645. Proofreading --- guides/v2.0/migration/migration-overview-how.md | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/guides/v2.0/migration/migration-overview-how.md b/guides/v2.0/migration/migration-overview-how.md index 2b7b2c03153..72af19d8306 100644 --- a/guides/v2.0/migration/migration-overview-how.md +++ b/guides/v2.0/migration/migration-overview-how.md @@ -22,13 +22,22 @@ This document uses the following terminology to discuss the Data Migration Tool: * Data: Migrates database assets in bulk * Delta: Migrates incremental changes (for example, orders and inventory) -This guide provides information about migration using Data Migration Tool that can transfer and adapt data from Magento 1 to Magento 2 stores. The migration in overall is split into three phases (or "modes"): migration of settings, migration of data and migration of delta. Each mode splits into steps. Every step is responsible for transferring particular data (e.g. URL Rewrite step, EAV step, Settings step ...). At the begin of a run, a step checks the table structures of Magento 1 and Magento 2 for their consistency. Then the actual data is transferred to Magento 2. In the end this data is checked to ensure that everything was transferred properly. +This guide provides information about migration using Data Migration Tool that can transfer and adapt data from Magento 1 to Magento 2 stores. The migration in overall is split into three phases (or "modes"): + +* Configuration settings +* Data +* Delta (that is, changes since the last run) + +Each mode is divided into steps, each of which is responsible for transferring particular data (for example, URL rewrite step, EAV step, settings step, and so on). At the begin of a run, a step checks the table structures of Magento 1 and Magento 2 for consistency. Then the actual data is transferred to Magento 2. In the end, this data is verified. This section previews your migration experience by providing a high-level overview of the Data Migration Tool.

    Conceptual overview

    +The data migration tool recognizes the differences in database structure between Magento 1.x versions. Most of these database structural differences are declared in *map files*. Each step in the process uses map files to transform data for use in your Magento 2 store. + +For example, when you transform data from a Magento CE 1.8.0.0 database to Magento 2.0.4, the map file accounts for the fact that a table was renamed and renames it accordingly in the destination database. If there are no differences in data structure or data format, the Data Migration Tool transfers it as-is to the Magento 2 database, including data from tables created by extensions. -There are many differences between Magento 1 and Magento 2 in the structure and format of data that is stored in database. Each version of Magento 1, for example 1.8.0.0 or 1.9.0.0, has its own unique changes in data structure. The Data Migration Tool understands all these changes and can properly transform it for usage in Magento 2 store. Most of these differences are declared in *Map files*. Using the Map file a Step will know that, for example, a table from Magento 1 was renamed in Magento 2 and will be able to transfer data properly to destination table. In the case where there are no differences in data structure or data format the Data Migration Tool will transfer data as is to the Magento 2 database, including data from tables created by extensions. When differences are not declared in Map files then the Data Migration Tool will not start migration process and will display an error. +When differences are not declared in map files, then the Data Migration Tool displays an error and does not start. Mapping files are discussed in more detail in Data Migration Tool Internal Specification. From a36f404953d971bf27bc502b45ff81b73bd5eb0f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafael=20Corr=C3=AAa=20Gomes?= Date: Tue, 3 May 2016 14:33:49 -0300 Subject: [PATCH 835/902] Break HTTPS --- _includes/header.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/_includes/header.html b/_includes/header.html index 2d0143876c3..ba8e212f3fe 100644 --- a/_includes/header.html +++ b/_includes/header.html @@ -8,13 +8,13 @@ {% if page.title %}{{ page.title }}{% else %}{{ site.title }}{% endif %} - + - + From 9b2f2f1e137b7de1ed311409c68549670535205e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafael=20Corr=C3=AAa=20Gomes?= Date: Tue, 3 May 2016 16:43:48 -0300 Subject: [PATCH 836/902] HTTPS Broken --- _includes/header.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/_includes/header.html b/_includes/header.html index ba8e212f3fe..08f9aa13bda 100644 --- a/_includes/header.html +++ b/_includes/header.html @@ -8,13 +8,13 @@ {% if page.title %}{{ page.title }}{% else %}{{ site.title }}{% endif %} - + - + From 03d6cae8ba26ab3bd55b4f5664a56ade4846a2b5 Mon Sep 17 00:00:00 2001 From: James Calcaben Date: Tue, 3 May 2016 16:55:37 -0500 Subject: [PATCH 837/902] Add jquery-ui.min.js file --- common/js/jquery-ui.min.js | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 common/js/jquery-ui.min.js diff --git a/common/js/jquery-ui.min.js b/common/js/jquery-ui.min.js new file mode 100644 index 00000000000..0245f83b55a --- /dev/null +++ b/common/js/jquery-ui.min.js @@ -0,0 +1,13 @@ +/*! jQuery UI - v1.11.4 - 2015-03-11 +* http://jqueryui.com +* Includes: core.js, widget.js, mouse.js, position.js, accordion.js, autocomplete.js, button.js, datepicker.js, dialog.js, draggable.js, droppable.js, effect.js, effect-blind.js, effect-bounce.js, effect-clip.js, effect-drop.js, effect-explode.js, effect-fade.js, effect-fold.js, effect-highlight.js, effect-puff.js, effect-pulsate.js, effect-scale.js, effect-shake.js, effect-size.js, effect-slide.js, effect-transfer.js, menu.js, progressbar.js, resizable.js, selectable.js, selectmenu.js, slider.js, sortable.js, spinner.js, tabs.js, tooltip.js +* Copyright 2015 jQuery Foundation and other contributors; Licensed MIT */ + +(function(e){"function"==typeof define&&define.amd?define(["jquery"],e):e(jQuery)})(function(e){function t(t,s){var n,a,o,r=t.nodeName.toLowerCase();return"area"===r?(n=t.parentNode,a=n.name,t.href&&a&&"map"===n.nodeName.toLowerCase()?(o=e("img[usemap='#"+a+"']")[0],!!o&&i(o)):!1):(/^(input|select|textarea|button|object)$/.test(r)?!t.disabled:"a"===r?t.href||s:s)&&i(t)}function i(t){return e.expr.filters.visible(t)&&!e(t).parents().addBack().filter(function(){return"hidden"===e.css(this,"visibility")}).length}function s(e){for(var t,i;e.length&&e[0]!==document;){if(t=e.css("position"),("absolute"===t||"relative"===t||"fixed"===t)&&(i=parseInt(e.css("zIndex"),10),!isNaN(i)&&0!==i))return i;e=e.parent()}return 0}function n(){this._curInst=null,this._keyEvent=!1,this._disabledInputs=[],this._datepickerShowing=!1,this._inDialog=!1,this._mainDivId="ui-datepicker-div",this._inlineClass="ui-datepicker-inline",this._appendClass="ui-datepicker-append",this._triggerClass="ui-datepicker-trigger",this._dialogClass="ui-datepicker-dialog",this._disableClass="ui-datepicker-disabled",this._unselectableClass="ui-datepicker-unselectable",this._currentClass="ui-datepicker-current-day",this._dayOverClass="ui-datepicker-days-cell-over",this.regional=[],this.regional[""]={closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su","Mo","Tu","We","Th","Fr","Sa"],weekHeader:"Wk",dateFormat:"mm/dd/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},this._defaults={showOn:"focus",showAnim:"fadeIn",showOptions:{},defaultDate:null,appendText:"",buttonText:"...",buttonImage:"",buttonImageOnly:!1,hideIfNoPrevNext:!1,navigationAsDateFormat:!1,gotoCurrent:!1,changeMonth:!1,changeYear:!1,yearRange:"c-10:c+10",showOtherMonths:!1,selectOtherMonths:!1,showWeek:!1,calculateWeek:this.iso8601Week,shortYearCutoff:"+10",minDate:null,maxDate:null,duration:"fast",beforeShowDay:null,beforeShow:null,onSelect:null,onChangeMonthYear:null,onClose:null,numberOfMonths:1,showCurrentAtPos:0,stepMonths:1,stepBigMonths:12,altField:"",altFormat:"",constrainInput:!0,showButtonPanel:!1,autoSize:!1,disabled:!1},e.extend(this._defaults,this.regional[""]),this.regional.en=e.extend(!0,{},this.regional[""]),this.regional["en-US"]=e.extend(!0,{},this.regional.en),this.dpDiv=a(e("
    "))}function a(t){var i="button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a";return t.delegate(i,"mouseout",function(){e(this).removeClass("ui-state-hover"),-1!==this.className.indexOf("ui-datepicker-prev")&&e(this).removeClass("ui-datepicker-prev-hover"),-1!==this.className.indexOf("ui-datepicker-next")&&e(this).removeClass("ui-datepicker-next-hover")}).delegate(i,"mouseover",o)}function o(){e.datepicker._isDisabledDatepicker(v.inline?v.dpDiv.parent()[0]:v.input[0])||(e(this).parents(".ui-datepicker-calendar").find("a").removeClass("ui-state-hover"),e(this).addClass("ui-state-hover"),-1!==this.className.indexOf("ui-datepicker-prev")&&e(this).addClass("ui-datepicker-prev-hover"),-1!==this.className.indexOf("ui-datepicker-next")&&e(this).addClass("ui-datepicker-next-hover"))}function r(t,i){e.extend(t,i);for(var s in i)null==i[s]&&(t[s]=i[s]);return t}function h(e){return function(){var t=this.element.val();e.apply(this,arguments),this._refresh(),t!==this.element.val()&&this._trigger("change")}}e.ui=e.ui||{},e.extend(e.ui,{version:"1.11.4",keyCode:{BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38}}),e.fn.extend({scrollParent:function(t){var i=this.css("position"),s="absolute"===i,n=t?/(auto|scroll|hidden)/:/(auto|scroll)/,a=this.parents().filter(function(){var t=e(this);return s&&"static"===t.css("position")?!1:n.test(t.css("overflow")+t.css("overflow-y")+t.css("overflow-x"))}).eq(0);return"fixed"!==i&&a.length?a:e(this[0].ownerDocument||document)},uniqueId:function(){var e=0;return function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++e)})}}(),removeUniqueId:function(){return this.each(function(){/^ui-id-\d+$/.test(this.id)&&e(this).removeAttr("id")})}}),e.extend(e.expr[":"],{data:e.expr.createPseudo?e.expr.createPseudo(function(t){return function(i){return!!e.data(i,t)}}):function(t,i,s){return!!e.data(t,s[3])},focusable:function(i){return t(i,!isNaN(e.attr(i,"tabindex")))},tabbable:function(i){var s=e.attr(i,"tabindex"),n=isNaN(s);return(n||s>=0)&&t(i,!n)}}),e("").outerWidth(1).jquery||e.each(["Width","Height"],function(t,i){function s(t,i,s,a){return e.each(n,function(){i-=parseFloat(e.css(t,"padding"+this))||0,s&&(i-=parseFloat(e.css(t,"border"+this+"Width"))||0),a&&(i-=parseFloat(e.css(t,"margin"+this))||0)}),i}var n="Width"===i?["Left","Right"]:["Top","Bottom"],a=i.toLowerCase(),o={innerWidth:e.fn.innerWidth,innerHeight:e.fn.innerHeight,outerWidth:e.fn.outerWidth,outerHeight:e.fn.outerHeight};e.fn["inner"+i]=function(t){return void 0===t?o["inner"+i].call(this):this.each(function(){e(this).css(a,s(this,t)+"px")})},e.fn["outer"+i]=function(t,n){return"number"!=typeof t?o["outer"+i].call(this,t):this.each(function(){e(this).css(a,s(this,t,!0,n)+"px")})}}),e.fn.addBack||(e.fn.addBack=function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}),e("").data("a-b","a").removeData("a-b").data("a-b")&&(e.fn.removeData=function(t){return function(i){return arguments.length?t.call(this,e.camelCase(i)):t.call(this)}}(e.fn.removeData)),e.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase()),e.fn.extend({focus:function(t){return function(i,s){return"number"==typeof i?this.each(function(){var t=this;setTimeout(function(){e(t).focus(),s&&s.call(t)},i)}):t.apply(this,arguments)}}(e.fn.focus),disableSelection:function(){var e="onselectstart"in document.createElement("div")?"selectstart":"mousedown";return function(){return this.bind(e+".ui-disableSelection",function(e){e.preventDefault()})}}(),enableSelection:function(){return this.unbind(".ui-disableSelection")},zIndex:function(t){if(void 0!==t)return this.css("zIndex",t);if(this.length)for(var i,s,n=e(this[0]);n.length&&n[0]!==document;){if(i=n.css("position"),("absolute"===i||"relative"===i||"fixed"===i)&&(s=parseInt(n.css("zIndex"),10),!isNaN(s)&&0!==s))return s;n=n.parent()}return 0}}),e.ui.plugin={add:function(t,i,s){var n,a=e.ui[t].prototype;for(n in s)a.plugins[n]=a.plugins[n]||[],a.plugins[n].push([i,s[n]])},call:function(e,t,i,s){var n,a=e.plugins[t];if(a&&(s||e.element[0].parentNode&&11!==e.element[0].parentNode.nodeType))for(n=0;a.length>n;n++)e.options[a[n][0]]&&a[n][1].apply(e.element,i)}};var l=0,u=Array.prototype.slice;e.cleanData=function(t){return function(i){var s,n,a;for(a=0;null!=(n=i[a]);a++)try{s=e._data(n,"events"),s&&s.remove&&e(n).triggerHandler("remove")}catch(o){}t(i)}}(e.cleanData),e.widget=function(t,i,s){var n,a,o,r,h={},l=t.split(".")[0];return t=t.split(".")[1],n=l+"-"+t,s||(s=i,i=e.Widget),e.expr[":"][n.toLowerCase()]=function(t){return!!e.data(t,n)},e[l]=e[l]||{},a=e[l][t],o=e[l][t]=function(e,t){return this._createWidget?(arguments.length&&this._createWidget(e,t),void 0):new o(e,t)},e.extend(o,a,{version:s.version,_proto:e.extend({},s),_childConstructors:[]}),r=new i,r.options=e.widget.extend({},r.options),e.each(s,function(t,s){return e.isFunction(s)?(h[t]=function(){var e=function(){return i.prototype[t].apply(this,arguments)},n=function(e){return i.prototype[t].apply(this,e)};return function(){var t,i=this._super,a=this._superApply;return this._super=e,this._superApply=n,t=s.apply(this,arguments),this._super=i,this._superApply=a,t}}(),void 0):(h[t]=s,void 0)}),o.prototype=e.widget.extend(r,{widgetEventPrefix:a?r.widgetEventPrefix||t:t},h,{constructor:o,namespace:l,widgetName:t,widgetFullName:n}),a?(e.each(a._childConstructors,function(t,i){var s=i.prototype;e.widget(s.namespace+"."+s.widgetName,o,i._proto)}),delete a._childConstructors):i._childConstructors.push(o),e.widget.bridge(t,o),o},e.widget.extend=function(t){for(var i,s,n=u.call(arguments,1),a=0,o=n.length;o>a;a++)for(i in n[a])s=n[a][i],n[a].hasOwnProperty(i)&&void 0!==s&&(t[i]=e.isPlainObject(s)?e.isPlainObject(t[i])?e.widget.extend({},t[i],s):e.widget.extend({},s):s);return t},e.widget.bridge=function(t,i){var s=i.prototype.widgetFullName||t;e.fn[t]=function(n){var a="string"==typeof n,o=u.call(arguments,1),r=this;return a?this.each(function(){var i,a=e.data(this,s);return"instance"===n?(r=a,!1):a?e.isFunction(a[n])&&"_"!==n.charAt(0)?(i=a[n].apply(a,o),i!==a&&void 0!==i?(r=i&&i.jquery?r.pushStack(i.get()):i,!1):void 0):e.error("no such method '"+n+"' for "+t+" widget instance"):e.error("cannot call methods on "+t+" prior to initialization; "+"attempted to call method '"+n+"'")}):(o.length&&(n=e.widget.extend.apply(null,[n].concat(o))),this.each(function(){var t=e.data(this,s);t?(t.option(n||{}),t._init&&t._init()):e.data(this,s,new i(n,this))})),r}},e.Widget=function(){},e.Widget._childConstructors=[],e.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"
    ",options:{disabled:!1,create:null},_createWidget:function(t,i){i=e(i||this.defaultElement||this)[0],this.element=e(i),this.uuid=l++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=e(),this.hoverable=e(),this.focusable=e(),i!==this&&(e.data(i,this.widgetFullName,this),this._on(!0,this.element,{remove:function(e){e.target===i&&this.destroy()}}),this.document=e(i.style?i.ownerDocument:i.document||i),this.window=e(this.document[0].defaultView||this.document[0].parentWindow)),this.options=e.widget.extend({},this.options,this._getCreateOptions(),t),this._create(),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:e.noop,_getCreateEventData:e.noop,_create:e.noop,_init:e.noop,destroy:function(){this._destroy(),this.element.unbind(this.eventNamespace).removeData(this.widgetFullName).removeData(e.camelCase(this.widgetFullName)),this.widget().unbind(this.eventNamespace).removeAttr("aria-disabled").removeClass(this.widgetFullName+"-disabled "+"ui-state-disabled"),this.bindings.unbind(this.eventNamespace),this.hoverable.removeClass("ui-state-hover"),this.focusable.removeClass("ui-state-focus")},_destroy:e.noop,widget:function(){return this.element},option:function(t,i){var s,n,a,o=t;if(0===arguments.length)return e.widget.extend({},this.options);if("string"==typeof t)if(o={},s=t.split("."),t=s.shift(),s.length){for(n=o[t]=e.widget.extend({},this.options[t]),a=0;s.length-1>a;a++)n[s[a]]=n[s[a]]||{},n=n[s[a]];if(t=s.pop(),1===arguments.length)return void 0===n[t]?null:n[t];n[t]=i}else{if(1===arguments.length)return void 0===this.options[t]?null:this.options[t];o[t]=i}return this._setOptions(o),this},_setOptions:function(e){var t;for(t in e)this._setOption(t,e[t]);return this},_setOption:function(e,t){return this.options[e]=t,"disabled"===e&&(this.widget().toggleClass(this.widgetFullName+"-disabled",!!t),t&&(this.hoverable.removeClass("ui-state-hover"),this.focusable.removeClass("ui-state-focus"))),this},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_on:function(t,i,s){var n,a=this;"boolean"!=typeof t&&(s=i,i=t,t=!1),s?(i=n=e(i),this.bindings=this.bindings.add(i)):(s=i,i=this.element,n=this.widget()),e.each(s,function(s,o){function r(){return t||a.options.disabled!==!0&&!e(this).hasClass("ui-state-disabled")?("string"==typeof o?a[o]:o).apply(a,arguments):void 0}"string"!=typeof o&&(r.guid=o.guid=o.guid||r.guid||e.guid++);var h=s.match(/^([\w:-]*)\s*(.*)$/),l=h[1]+a.eventNamespace,u=h[2];u?n.delegate(u,l,r):i.bind(l,r)})},_off:function(t,i){i=(i||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,t.unbind(i).undelegate(i),this.bindings=e(this.bindings.not(t).get()),this.focusable=e(this.focusable.not(t).get()),this.hoverable=e(this.hoverable.not(t).get())},_delay:function(e,t){function i(){return("string"==typeof e?s[e]:e).apply(s,arguments)}var s=this;return setTimeout(i,t||0)},_hoverable:function(t){this.hoverable=this.hoverable.add(t),this._on(t,{mouseenter:function(t){e(t.currentTarget).addClass("ui-state-hover")},mouseleave:function(t){e(t.currentTarget).removeClass("ui-state-hover")}})},_focusable:function(t){this.focusable=this.focusable.add(t),this._on(t,{focusin:function(t){e(t.currentTarget).addClass("ui-state-focus")},focusout:function(t){e(t.currentTarget).removeClass("ui-state-focus")}})},_trigger:function(t,i,s){var n,a,o=this.options[t];if(s=s||{},i=e.Event(i),i.type=(t===this.widgetEventPrefix?t:this.widgetEventPrefix+t).toLowerCase(),i.target=this.element[0],a=i.originalEvent)for(n in a)n in i||(i[n]=a[n]);return this.element.trigger(i,s),!(e.isFunction(o)&&o.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},e.each({show:"fadeIn",hide:"fadeOut"},function(t,i){e.Widget.prototype["_"+t]=function(s,n,a){"string"==typeof n&&(n={effect:n});var o,r=n?n===!0||"number"==typeof n?i:n.effect||i:t;n=n||{},"number"==typeof n&&(n={duration:n}),o=!e.isEmptyObject(n),n.complete=a,n.delay&&s.delay(n.delay),o&&e.effects&&e.effects.effect[r]?s[t](n):r!==t&&s[r]?s[r](n.duration,n.easing,a):s.queue(function(i){e(this)[t](),a&&a.call(s[0]),i()})}}),e.widget;var d=!1;e(document).mouseup(function(){d=!1}),e.widget("ui.mouse",{version:"1.11.4",options:{cancel:"input,textarea,button,select,option",distance:1,delay:0},_mouseInit:function(){var t=this;this.element.bind("mousedown."+this.widgetName,function(e){return t._mouseDown(e)}).bind("click."+this.widgetName,function(i){return!0===e.data(i.target,t.widgetName+".preventClickEvent")?(e.removeData(i.target,t.widgetName+".preventClickEvent"),i.stopImmediatePropagation(),!1):void 0}),this.started=!1},_mouseDestroy:function(){this.element.unbind("."+this.widgetName),this._mouseMoveDelegate&&this.document.unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(t){if(!d){this._mouseMoved=!1,this._mouseStarted&&this._mouseUp(t),this._mouseDownEvent=t;var i=this,s=1===t.which,n="string"==typeof this.options.cancel&&t.target.nodeName?e(t.target).closest(this.options.cancel).length:!1;return s&&!n&&this._mouseCapture(t)?(this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){i.mouseDelayMet=!0},this.options.delay)),this._mouseDistanceMet(t)&&this._mouseDelayMet(t)&&(this._mouseStarted=this._mouseStart(t)!==!1,!this._mouseStarted)?(t.preventDefault(),!0):(!0===e.data(t.target,this.widgetName+".preventClickEvent")&&e.removeData(t.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(e){return i._mouseMove(e)},this._mouseUpDelegate=function(e){return i._mouseUp(e)},this.document.bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate),t.preventDefault(),d=!0,!0)):!0}},_mouseMove:function(t){if(this._mouseMoved){if(e.ui.ie&&(!document.documentMode||9>document.documentMode)&&!t.button)return this._mouseUp(t);if(!t.which)return this._mouseUp(t)}return(t.which||t.button)&&(this._mouseMoved=!0),this._mouseStarted?(this._mouseDrag(t),t.preventDefault()):(this._mouseDistanceMet(t)&&this._mouseDelayMet(t)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,t)!==!1,this._mouseStarted?this._mouseDrag(t):this._mouseUp(t)),!this._mouseStarted)},_mouseUp:function(t){return this.document.unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,t.target===this._mouseDownEvent.target&&e.data(t.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(t)),d=!1,!1},_mouseDistanceMet:function(e){return Math.max(Math.abs(this._mouseDownEvent.pageX-e.pageX),Math.abs(this._mouseDownEvent.pageY-e.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),function(){function t(e,t,i){return[parseFloat(e[0])*(p.test(e[0])?t/100:1),parseFloat(e[1])*(p.test(e[1])?i/100:1)]}function i(t,i){return parseInt(e.css(t,i),10)||0}function s(t){var i=t[0];return 9===i.nodeType?{width:t.width(),height:t.height(),offset:{top:0,left:0}}:e.isWindow(i)?{width:t.width(),height:t.height(),offset:{top:t.scrollTop(),left:t.scrollLeft()}}:i.preventDefault?{width:0,height:0,offset:{top:i.pageY,left:i.pageX}}:{width:t.outerWidth(),height:t.outerHeight(),offset:t.offset()}}e.ui=e.ui||{};var n,a,o=Math.max,r=Math.abs,h=Math.round,l=/left|center|right/,u=/top|center|bottom/,d=/[\+\-]\d+(\.[\d]+)?%?/,c=/^\w+/,p=/%$/,f=e.fn.position;e.position={scrollbarWidth:function(){if(void 0!==n)return n;var t,i,s=e("
    "),a=s.children()[0];return e("body").append(s),t=a.offsetWidth,s.css("overflow","scroll"),i=a.offsetWidth,t===i&&(i=s[0].clientWidth),s.remove(),n=t-i},getScrollInfo:function(t){var i=t.isWindow||t.isDocument?"":t.element.css("overflow-x"),s=t.isWindow||t.isDocument?"":t.element.css("overflow-y"),n="scroll"===i||"auto"===i&&t.widthi?"left":t>0?"right":"center",vertical:0>a?"top":s>0?"bottom":"middle"};d>m&&m>r(t+i)&&(h.horizontal="center"),c>g&&g>r(s+a)&&(h.vertical="middle"),h.important=o(r(t),r(i))>o(r(s),r(a))?"horizontal":"vertical",n.using.call(this,e,h)}),u.offset(e.extend(M,{using:l}))})},e.ui.position={fit:{left:function(e,t){var i,s=t.within,n=s.isWindow?s.scrollLeft:s.offset.left,a=s.width,r=e.left-t.collisionPosition.marginLeft,h=n-r,l=r+t.collisionWidth-a-n;t.collisionWidth>a?h>0&&0>=l?(i=e.left+h+t.collisionWidth-a-n,e.left+=h-i):e.left=l>0&&0>=h?n:h>l?n+a-t.collisionWidth:n:h>0?e.left+=h:l>0?e.left-=l:e.left=o(e.left-r,e.left)},top:function(e,t){var i,s=t.within,n=s.isWindow?s.scrollTop:s.offset.top,a=t.within.height,r=e.top-t.collisionPosition.marginTop,h=n-r,l=r+t.collisionHeight-a-n;t.collisionHeight>a?h>0&&0>=l?(i=e.top+h+t.collisionHeight-a-n,e.top+=h-i):e.top=l>0&&0>=h?n:h>l?n+a-t.collisionHeight:n:h>0?e.top+=h:l>0?e.top-=l:e.top=o(e.top-r,e.top)}},flip:{left:function(e,t){var i,s,n=t.within,a=n.offset.left+n.scrollLeft,o=n.width,h=n.isWindow?n.scrollLeft:n.offset.left,l=e.left-t.collisionPosition.marginLeft,u=l-h,d=l+t.collisionWidth-o-h,c="left"===t.my[0]?-t.elemWidth:"right"===t.my[0]?t.elemWidth:0,p="left"===t.at[0]?t.targetWidth:"right"===t.at[0]?-t.targetWidth:0,f=-2*t.offset[0];0>u?(i=e.left+c+p+f+t.collisionWidth-o-a,(0>i||r(u)>i)&&(e.left+=c+p+f)):d>0&&(s=e.left-t.collisionPosition.marginLeft+c+p+f-h,(s>0||d>r(s))&&(e.left+=c+p+f))},top:function(e,t){var i,s,n=t.within,a=n.offset.top+n.scrollTop,o=n.height,h=n.isWindow?n.scrollTop:n.offset.top,l=e.top-t.collisionPosition.marginTop,u=l-h,d=l+t.collisionHeight-o-h,c="top"===t.my[1],p=c?-t.elemHeight:"bottom"===t.my[1]?t.elemHeight:0,f="top"===t.at[1]?t.targetHeight:"bottom"===t.at[1]?-t.targetHeight:0,m=-2*t.offset[1];0>u?(s=e.top+p+f+m+t.collisionHeight-o-a,(0>s||r(u)>s)&&(e.top+=p+f+m)):d>0&&(i=e.top-t.collisionPosition.marginTop+p+f+m-h,(i>0||d>r(i))&&(e.top+=p+f+m))}},flipfit:{left:function(){e.ui.position.flip.left.apply(this,arguments),e.ui.position.fit.left.apply(this,arguments)},top:function(){e.ui.position.flip.top.apply(this,arguments),e.ui.position.fit.top.apply(this,arguments)}}},function(){var t,i,s,n,o,r=document.getElementsByTagName("body")[0],h=document.createElement("div");t=document.createElement(r?"div":"body"),s={visibility:"hidden",width:0,height:0,border:0,margin:0,background:"none"},r&&e.extend(s,{position:"absolute",left:"-1000px",top:"-1000px"});for(o in s)t.style[o]=s[o];t.appendChild(h),i=r||document.documentElement,i.insertBefore(t,i.firstChild),h.style.cssText="position: absolute; left: 10.7432222px;",n=e(h).offset().left,a=n>10&&11>n,t.innerHTML="",i.removeChild(t)}()}(),e.ui.position,e.widget("ui.accordion",{version:"1.11.4",options:{active:0,animate:{},collapsible:!1,event:"click",header:"> li > :first-child,> :not(li):even",heightStyle:"auto",icons:{activeHeader:"ui-icon-triangle-1-s",header:"ui-icon-triangle-1-e"},activate:null,beforeActivate:null},hideProps:{borderTopWidth:"hide",borderBottomWidth:"hide",paddingTop:"hide",paddingBottom:"hide",height:"hide"},showProps:{borderTopWidth:"show",borderBottomWidth:"show",paddingTop:"show",paddingBottom:"show",height:"show"},_create:function(){var t=this.options;this.prevShow=this.prevHide=e(),this.element.addClass("ui-accordion ui-widget ui-helper-reset").attr("role","tablist"),t.collapsible||t.active!==!1&&null!=t.active||(t.active=0),this._processPanels(),0>t.active&&(t.active+=this.headers.length),this._refresh()},_getCreateEventData:function(){return{header:this.active,panel:this.active.length?this.active.next():e()}},_createIcons:function(){var t=this.options.icons;t&&(e("").addClass("ui-accordion-header-icon ui-icon "+t.header).prependTo(this.headers),this.active.children(".ui-accordion-header-icon").removeClass(t.header).addClass(t.activeHeader),this.headers.addClass("ui-accordion-icons"))},_destroyIcons:function(){this.headers.removeClass("ui-accordion-icons").children(".ui-accordion-header-icon").remove()},_destroy:function(){var e;this.element.removeClass("ui-accordion ui-widget ui-helper-reset").removeAttr("role"),this.headers.removeClass("ui-accordion-header ui-accordion-header-active ui-state-default ui-corner-all ui-state-active ui-state-disabled ui-corner-top").removeAttr("role").removeAttr("aria-expanded").removeAttr("aria-selected").removeAttr("aria-controls").removeAttr("tabIndex").removeUniqueId(),this._destroyIcons(),e=this.headers.next().removeClass("ui-helper-reset ui-widget-content ui-corner-bottom ui-accordion-content ui-accordion-content-active ui-state-disabled").css("display","").removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeUniqueId(),"content"!==this.options.heightStyle&&e.css("height","")},_setOption:function(e,t){return"active"===e?(this._activate(t),void 0):("event"===e&&(this.options.event&&this._off(this.headers,this.options.event),this._setupEvents(t)),this._super(e,t),"collapsible"!==e||t||this.options.active!==!1||this._activate(0),"icons"===e&&(this._destroyIcons(),t&&this._createIcons()),"disabled"===e&&(this.element.toggleClass("ui-state-disabled",!!t).attr("aria-disabled",t),this.headers.add(this.headers.next()).toggleClass("ui-state-disabled",!!t)),void 0)},_keydown:function(t){if(!t.altKey&&!t.ctrlKey){var i=e.ui.keyCode,s=this.headers.length,n=this.headers.index(t.target),a=!1;switch(t.keyCode){case i.RIGHT:case i.DOWN:a=this.headers[(n+1)%s];break;case i.LEFT:case i.UP:a=this.headers[(n-1+s)%s];break;case i.SPACE:case i.ENTER:this._eventHandler(t);break;case i.HOME:a=this.headers[0];break;case i.END:a=this.headers[s-1]}a&&(e(t.target).attr("tabIndex",-1),e(a).attr("tabIndex",0),a.focus(),t.preventDefault())}},_panelKeyDown:function(t){t.keyCode===e.ui.keyCode.UP&&t.ctrlKey&&e(t.currentTarget).prev().focus()},refresh:function(){var t=this.options;this._processPanels(),t.active===!1&&t.collapsible===!0||!this.headers.length?(t.active=!1,this.active=e()):t.active===!1?this._activate(0):this.active.length&&!e.contains(this.element[0],this.active[0])?this.headers.length===this.headers.find(".ui-state-disabled").length?(t.active=!1,this.active=e()):this._activate(Math.max(0,t.active-1)):t.active=this.headers.index(this.active),this._destroyIcons(),this._refresh()},_processPanels:function(){var e=this.headers,t=this.panels;this.headers=this.element.find(this.options.header).addClass("ui-accordion-header ui-state-default ui-corner-all"),this.panels=this.headers.next().addClass("ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom").filter(":not(.ui-accordion-content-active)").hide(),t&&(this._off(e.not(this.headers)),this._off(t.not(this.panels)))},_refresh:function(){var t,i=this.options,s=i.heightStyle,n=this.element.parent();this.active=this._findActive(i.active).addClass("ui-accordion-header-active ui-state-active ui-corner-top").removeClass("ui-corner-all"),this.active.next().addClass("ui-accordion-content-active").show(),this.headers.attr("role","tab").each(function(){var t=e(this),i=t.uniqueId().attr("id"),s=t.next(),n=s.uniqueId().attr("id");t.attr("aria-controls",n),s.attr("aria-labelledby",i)}).next().attr("role","tabpanel"),this.headers.not(this.active).attr({"aria-selected":"false","aria-expanded":"false",tabIndex:-1}).next().attr({"aria-hidden":"true"}).hide(),this.active.length?this.active.attr({"aria-selected":"true","aria-expanded":"true",tabIndex:0}).next().attr({"aria-hidden":"false"}):this.headers.eq(0).attr("tabIndex",0),this._createIcons(),this._setupEvents(i.event),"fill"===s?(t=n.height(),this.element.siblings(":visible").each(function(){var i=e(this),s=i.css("position");"absolute"!==s&&"fixed"!==s&&(t-=i.outerHeight(!0))}),this.headers.each(function(){t-=e(this).outerHeight(!0)}),this.headers.next().each(function(){e(this).height(Math.max(0,t-e(this).innerHeight()+e(this).height()))}).css("overflow","auto")):"auto"===s&&(t=0,this.headers.next().each(function(){t=Math.max(t,e(this).css("height","").height())}).height(t))},_activate:function(t){var i=this._findActive(t)[0];i!==this.active[0]&&(i=i||this.active[0],this._eventHandler({target:i,currentTarget:i,preventDefault:e.noop}))},_findActive:function(t){return"number"==typeof t?this.headers.eq(t):e()},_setupEvents:function(t){var i={keydown:"_keydown"};t&&e.each(t.split(" "),function(e,t){i[t]="_eventHandler"}),this._off(this.headers.add(this.headers.next())),this._on(this.headers,i),this._on(this.headers.next(),{keydown:"_panelKeyDown"}),this._hoverable(this.headers),this._focusable(this.headers)},_eventHandler:function(t){var i=this.options,s=this.active,n=e(t.currentTarget),a=n[0]===s[0],o=a&&i.collapsible,r=o?e():n.next(),h=s.next(),l={oldHeader:s,oldPanel:h,newHeader:o?e():n,newPanel:r};t.preventDefault(),a&&!i.collapsible||this._trigger("beforeActivate",t,l)===!1||(i.active=o?!1:this.headers.index(n),this.active=a?e():n,this._toggle(l),s.removeClass("ui-accordion-header-active ui-state-active"),i.icons&&s.children(".ui-accordion-header-icon").removeClass(i.icons.activeHeader).addClass(i.icons.header),a||(n.removeClass("ui-corner-all").addClass("ui-accordion-header-active ui-state-active ui-corner-top"),i.icons&&n.children(".ui-accordion-header-icon").removeClass(i.icons.header).addClass(i.icons.activeHeader),n.next().addClass("ui-accordion-content-active")))},_toggle:function(t){var i=t.newPanel,s=this.prevShow.length?this.prevShow:t.oldPanel;this.prevShow.add(this.prevHide).stop(!0,!0),this.prevShow=i,this.prevHide=s,this.options.animate?this._animate(i,s,t):(s.hide(),i.show(),this._toggleComplete(t)),s.attr({"aria-hidden":"true"}),s.prev().attr({"aria-selected":"false","aria-expanded":"false"}),i.length&&s.length?s.prev().attr({tabIndex:-1,"aria-expanded":"false"}):i.length&&this.headers.filter(function(){return 0===parseInt(e(this).attr("tabIndex"),10)}).attr("tabIndex",-1),i.attr("aria-hidden","false").prev().attr({"aria-selected":"true","aria-expanded":"true",tabIndex:0})},_animate:function(e,t,i){var s,n,a,o=this,r=0,h=e.css("box-sizing"),l=e.length&&(!t.length||e.index()",delay:300,options:{icons:{submenu:"ui-icon-carat-1-e"},items:"> *",menus:"ul",position:{my:"left-1 top",at:"right top"},role:"menu",blur:null,focus:null,select:null},_create:function(){this.activeMenu=this.element,this.mouseHandled=!1,this.element.uniqueId().addClass("ui-menu ui-widget ui-widget-content").toggleClass("ui-menu-icons",!!this.element.find(".ui-icon").length).attr({role:this.options.role,tabIndex:0}),this.options.disabled&&this.element.addClass("ui-state-disabled").attr("aria-disabled","true"),this._on({"mousedown .ui-menu-item":function(e){e.preventDefault()},"click .ui-menu-item":function(t){var i=e(t.target);!this.mouseHandled&&i.not(".ui-state-disabled").length&&(this.select(t),t.isPropagationStopped()||(this.mouseHandled=!0),i.has(".ui-menu").length?this.expand(t):!this.element.is(":focus")&&e(this.document[0].activeElement).closest(".ui-menu").length&&(this.element.trigger("focus",[!0]),this.active&&1===this.active.parents(".ui-menu").length&&clearTimeout(this.timer)))},"mouseenter .ui-menu-item":function(t){if(!this.previousFilter){var i=e(t.currentTarget); +i.siblings(".ui-state-active").removeClass("ui-state-active"),this.focus(t,i)}},mouseleave:"collapseAll","mouseleave .ui-menu":"collapseAll",focus:function(e,t){var i=this.active||this.element.find(this.options.items).eq(0);t||this.focus(e,i)},blur:function(t){this._delay(function(){e.contains(this.element[0],this.document[0].activeElement)||this.collapseAll(t)})},keydown:"_keydown"}),this.refresh(),this._on(this.document,{click:function(e){this._closeOnDocumentClick(e)&&this.collapseAll(e),this.mouseHandled=!1}})},_destroy:function(){this.element.removeAttr("aria-activedescendant").find(".ui-menu").addBack().removeClass("ui-menu ui-widget ui-widget-content ui-menu-icons ui-front").removeAttr("role").removeAttr("tabIndex").removeAttr("aria-labelledby").removeAttr("aria-expanded").removeAttr("aria-hidden").removeAttr("aria-disabled").removeUniqueId().show(),this.element.find(".ui-menu-item").removeClass("ui-menu-item").removeAttr("role").removeAttr("aria-disabled").removeUniqueId().removeClass("ui-state-hover").removeAttr("tabIndex").removeAttr("role").removeAttr("aria-haspopup").children().each(function(){var t=e(this);t.data("ui-menu-submenu-carat")&&t.remove()}),this.element.find(".ui-menu-divider").removeClass("ui-menu-divider ui-widget-content")},_keydown:function(t){var i,s,n,a,o=!0;switch(t.keyCode){case e.ui.keyCode.PAGE_UP:this.previousPage(t);break;case e.ui.keyCode.PAGE_DOWN:this.nextPage(t);break;case e.ui.keyCode.HOME:this._move("first","first",t);break;case e.ui.keyCode.END:this._move("last","last",t);break;case e.ui.keyCode.UP:this.previous(t);break;case e.ui.keyCode.DOWN:this.next(t);break;case e.ui.keyCode.LEFT:this.collapse(t);break;case e.ui.keyCode.RIGHT:this.active&&!this.active.is(".ui-state-disabled")&&this.expand(t);break;case e.ui.keyCode.ENTER:case e.ui.keyCode.SPACE:this._activate(t);break;case e.ui.keyCode.ESCAPE:this.collapse(t);break;default:o=!1,s=this.previousFilter||"",n=String.fromCharCode(t.keyCode),a=!1,clearTimeout(this.filterTimer),n===s?a=!0:n=s+n,i=this._filterMenuItems(n),i=a&&-1!==i.index(this.active.next())?this.active.nextAll(".ui-menu-item"):i,i.length||(n=String.fromCharCode(t.keyCode),i=this._filterMenuItems(n)),i.length?(this.focus(t,i),this.previousFilter=n,this.filterTimer=this._delay(function(){delete this.previousFilter},1e3)):delete this.previousFilter}o&&t.preventDefault()},_activate:function(e){this.active.is(".ui-state-disabled")||(this.active.is("[aria-haspopup='true']")?this.expand(e):this.select(e))},refresh:function(){var t,i,s=this,n=this.options.icons.submenu,a=this.element.find(this.options.menus);this.element.toggleClass("ui-menu-icons",!!this.element.find(".ui-icon").length),a.filter(":not(.ui-menu)").addClass("ui-menu ui-widget ui-widget-content ui-front").hide().attr({role:this.options.role,"aria-hidden":"true","aria-expanded":"false"}).each(function(){var t=e(this),i=t.parent(),s=e("").addClass("ui-menu-icon ui-icon "+n).data("ui-menu-submenu-carat",!0);i.attr("aria-haspopup","true").prepend(s),t.attr("aria-labelledby",i.attr("id"))}),t=a.add(this.element),i=t.find(this.options.items),i.not(".ui-menu-item").each(function(){var t=e(this);s._isDivider(t)&&t.addClass("ui-widget-content ui-menu-divider")}),i.not(".ui-menu-item, .ui-menu-divider").addClass("ui-menu-item").uniqueId().attr({tabIndex:-1,role:this._itemRole()}),i.filter(".ui-state-disabled").attr("aria-disabled","true"),this.active&&!e.contains(this.element[0],this.active[0])&&this.blur()},_itemRole:function(){return{menu:"menuitem",listbox:"option"}[this.options.role]},_setOption:function(e,t){"icons"===e&&this.element.find(".ui-menu-icon").removeClass(this.options.icons.submenu).addClass(t.submenu),"disabled"===e&&this.element.toggleClass("ui-state-disabled",!!t).attr("aria-disabled",t),this._super(e,t)},focus:function(e,t){var i,s;this.blur(e,e&&"focus"===e.type),this._scrollIntoView(t),this.active=t.first(),s=this.active.addClass("ui-state-focus").removeClass("ui-state-active"),this.options.role&&this.element.attr("aria-activedescendant",s.attr("id")),this.active.parent().closest(".ui-menu-item").addClass("ui-state-active"),e&&"keydown"===e.type?this._close():this.timer=this._delay(function(){this._close()},this.delay),i=t.children(".ui-menu"),i.length&&e&&/^mouse/.test(e.type)&&this._startOpening(i),this.activeMenu=t.parent(),this._trigger("focus",e,{item:t})},_scrollIntoView:function(t){var i,s,n,a,o,r;this._hasScroll()&&(i=parseFloat(e.css(this.activeMenu[0],"borderTopWidth"))||0,s=parseFloat(e.css(this.activeMenu[0],"paddingTop"))||0,n=t.offset().top-this.activeMenu.offset().top-i-s,a=this.activeMenu.scrollTop(),o=this.activeMenu.height(),r=t.outerHeight(),0>n?this.activeMenu.scrollTop(a+n):n+r>o&&this.activeMenu.scrollTop(a+n-o+r))},blur:function(e,t){t||clearTimeout(this.timer),this.active&&(this.active.removeClass("ui-state-focus"),this.active=null,this._trigger("blur",e,{item:this.active}))},_startOpening:function(e){clearTimeout(this.timer),"true"===e.attr("aria-hidden")&&(this.timer=this._delay(function(){this._close(),this._open(e)},this.delay))},_open:function(t){var i=e.extend({of:this.active},this.options.position);clearTimeout(this.timer),this.element.find(".ui-menu").not(t.parents(".ui-menu")).hide().attr("aria-hidden","true"),t.show().removeAttr("aria-hidden").attr("aria-expanded","true").position(i)},collapseAll:function(t,i){clearTimeout(this.timer),this.timer=this._delay(function(){var s=i?this.element:e(t&&t.target).closest(this.element.find(".ui-menu"));s.length||(s=this.element),this._close(s),this.blur(t),this.activeMenu=s},this.delay)},_close:function(e){e||(e=this.active?this.active.parent():this.element),e.find(".ui-menu").hide().attr("aria-hidden","true").attr("aria-expanded","false").end().find(".ui-state-active").not(".ui-state-focus").removeClass("ui-state-active")},_closeOnDocumentClick:function(t){return!e(t.target).closest(".ui-menu").length},_isDivider:function(e){return!/[^\-\u2014\u2013\s]/.test(e.text())},collapse:function(e){var t=this.active&&this.active.parent().closest(".ui-menu-item",this.element);t&&t.length&&(this._close(),this.focus(e,t))},expand:function(e){var t=this.active&&this.active.children(".ui-menu ").find(this.options.items).first();t&&t.length&&(this._open(t.parent()),this._delay(function(){this.focus(e,t)}))},next:function(e){this._move("next","first",e)},previous:function(e){this._move("prev","last",e)},isFirstItem:function(){return this.active&&!this.active.prevAll(".ui-menu-item").length},isLastItem:function(){return this.active&&!this.active.nextAll(".ui-menu-item").length},_move:function(e,t,i){var s;this.active&&(s="first"===e||"last"===e?this.active["first"===e?"prevAll":"nextAll"](".ui-menu-item").eq(-1):this.active[e+"All"](".ui-menu-item").eq(0)),s&&s.length&&this.active||(s=this.activeMenu.find(this.options.items)[t]()),this.focus(i,s)},nextPage:function(t){var i,s,n;return this.active?(this.isLastItem()||(this._hasScroll()?(s=this.active.offset().top,n=this.element.height(),this.active.nextAll(".ui-menu-item").each(function(){return i=e(this),0>i.offset().top-s-n}),this.focus(t,i)):this.focus(t,this.activeMenu.find(this.options.items)[this.active?"last":"first"]())),void 0):(this.next(t),void 0)},previousPage:function(t){var i,s,n;return this.active?(this.isFirstItem()||(this._hasScroll()?(s=this.active.offset().top,n=this.element.height(),this.active.prevAll(".ui-menu-item").each(function(){return i=e(this),i.offset().top-s+n>0}),this.focus(t,i)):this.focus(t,this.activeMenu.find(this.options.items).first())),void 0):(this.next(t),void 0)},_hasScroll:function(){return this.element.outerHeight()",options:{appendTo:null,autoFocus:!1,delay:300,minLength:1,position:{my:"left top",at:"left bottom",collision:"none"},source:null,change:null,close:null,focus:null,open:null,response:null,search:null,select:null},requestIndex:0,pending:0,_create:function(){var t,i,s,n=this.element[0].nodeName.toLowerCase(),a="textarea"===n,o="input"===n;this.isMultiLine=a?!0:o?!1:this.element.prop("isContentEditable"),this.valueMethod=this.element[a||o?"val":"text"],this.isNewMenu=!0,this.element.addClass("ui-autocomplete-input").attr("autocomplete","off"),this._on(this.element,{keydown:function(n){if(this.element.prop("readOnly"))return t=!0,s=!0,i=!0,void 0;t=!1,s=!1,i=!1;var a=e.ui.keyCode;switch(n.keyCode){case a.PAGE_UP:t=!0,this._move("previousPage",n);break;case a.PAGE_DOWN:t=!0,this._move("nextPage",n);break;case a.UP:t=!0,this._keyEvent("previous",n);break;case a.DOWN:t=!0,this._keyEvent("next",n);break;case a.ENTER:this.menu.active&&(t=!0,n.preventDefault(),this.menu.select(n));break;case a.TAB:this.menu.active&&this.menu.select(n);break;case a.ESCAPE:this.menu.element.is(":visible")&&(this.isMultiLine||this._value(this.term),this.close(n),n.preventDefault());break;default:i=!0,this._searchTimeout(n)}},keypress:function(s){if(t)return t=!1,(!this.isMultiLine||this.menu.element.is(":visible"))&&s.preventDefault(),void 0;if(!i){var n=e.ui.keyCode;switch(s.keyCode){case n.PAGE_UP:this._move("previousPage",s);break;case n.PAGE_DOWN:this._move("nextPage",s);break;case n.UP:this._keyEvent("previous",s);break;case n.DOWN:this._keyEvent("next",s)}}},input:function(e){return s?(s=!1,e.preventDefault(),void 0):(this._searchTimeout(e),void 0)},focus:function(){this.selectedItem=null,this.previous=this._value()},blur:function(e){return this.cancelBlur?(delete this.cancelBlur,void 0):(clearTimeout(this.searching),this.close(e),this._change(e),void 0)}}),this._initSource(),this.menu=e("