From 95d3148fe6eebed7ad576fc7d31255308595958b Mon Sep 17 00:00:00 2001 From: Mikalai_Shostka <Mikalai_Shostka@epam.com> Date: Mon, 17 Oct 2016 16:06:43 +0300 Subject: [PATCH] MAGETWO-51655: [Improvement] Convert customer group identifier field from SMALLINT to INT - MAGETWO-59783: Modify 'My Account' menu in storefront - MAGETWO-59022: Order processing flow improvements - MAGETWO-59131: Add refund SPI for offline payment methods --- .../Magento/Bundle/Setup/InstallSchema.php | 6 +- .../Magento/Bundle/Setup/UpgradeSchema.php | 18 ++++ app/code/Magento/Bundle/etc/module.xml | 2 +- .../Magento/Catalog/Setup/InstallSchema.php | 9 +- .../Magento/Catalog/Setup/UpgradeSchema.php | 25 ++++++ app/code/Magento/Catalog/etc/module.xml | 2 +- .../CatalogRule/Setup/InstallSchema.php | 7 +- .../CatalogRule/Setup/UpgradeSchema.php | 14 +++ app/code/Magento/CatalogRule/etc/module.xml | 2 +- .../Block/Account/AuthorizationLink.php | 11 ++- .../Customer/Block/Account/Delimiter.php | 21 +++++ .../Magento/Customer/Block/Account/Link.php | 12 ++- .../Customer/Block/Account/Navigation.php | 47 ++++++++++ .../Customer/Block/Account/SortLink.php | 21 +++++ .../Block/Account/SortLinkInterface.php | 27 ++++++ .../Customer/Model/ResourceModel/Group.php | 61 +++++++++++++ .../Magento/Customer/Setup/UpgradeSchema.php | 90 +++++++++++++++++++ .../Unit/Model/ResourceModel/GroupTest.php | 73 ++++++++++++++- app/code/Magento/Customer/etc/di.xml | 2 + app/code/Magento/Customer/etc/module.xml | 2 +- .../view/frontend/layout/customer_account.xml | 53 +++++++---- .../Customer/view/frontend/layout/default.xml | 1 + .../account/navigation-delimiter.phtml | 9 ++ .../Downloadable/Setup/UpgradeSchema.php | 41 +++++++++ app/code/Magento/Downloadable/etc/module.xml | 2 +- .../view/frontend/layout/customer_account.xml | 3 +- .../view/frontend/layout/customer_account.xml | 3 +- .../view/frontend/layout/customer_account.xml | 3 +- .../Magento/Persistent/etc/persistent.xml | 2 +- .../view/frontend/layout/customer_account.xml | 3 +- .../Magento/Sales/Model/Order/Payment.php | 62 +++++++------ .../Magento/Sales/Setup/UpgradeSchema.php | 14 +++ app/code/Magento/Sales/etc/module.xml | 2 +- .../view/frontend/layout/customer_account.xml | 3 +- .../Magento/SalesRule/Setup/InstallSchema.php | 8 +- .../Theme/view/frontend/layout/default.xml | 2 +- .../view/frontend/layout/customer_account.xml | 3 +- app/code/Magento/Wishlist/Block/Link.php | 12 ++- .../view/frontend/layout/customer_account.xml | 3 +- .../Wishlist/view/frontend/layout/default.xml | 6 +- .../web/css/source/_module.less | 8 ++ .../layout/customer_account.xml | 27 ++++-- .../luma/Magento_Customer/layout/default.xml | 6 +- .../module/_collapsible_navigation.less | 7 ++ 44 files changed, 654 insertions(+), 81 deletions(-) mode change 100644 => 100755 app/code/Magento/Bundle/Setup/UpgradeSchema.php mode change 100644 => 100755 app/code/Magento/Catalog/Setup/UpgradeSchema.php create mode 100644 app/code/Magento/Customer/Block/Account/Delimiter.php create mode 100644 app/code/Magento/Customer/Block/Account/Navigation.php create mode 100644 app/code/Magento/Customer/Block/Account/SortLink.php create mode 100644 app/code/Magento/Customer/Block/Account/SortLinkInterface.php mode change 100644 => 100755 app/code/Magento/Customer/Setup/UpgradeSchema.php create mode 100644 app/code/Magento/Customer/view/frontend/templates/account/navigation-delimiter.phtml create mode 100755 app/code/Magento/Downloadable/Setup/UpgradeSchema.php diff --git a/app/code/Magento/Bundle/Setup/InstallSchema.php b/app/code/Magento/Bundle/Setup/InstallSchema.php index 6f98cd38632..5c7d5a47da6 100644 --- a/app/code/Magento/Bundle/Setup/InstallSchema.php +++ b/app/code/Magento/Bundle/Setup/InstallSchema.php @@ -24,7 +24,9 @@ class InstallSchema implements InstallSchemaInterface $installer = $setup; $installer->startSetup(); - + $customerGroupTable = $setup->getConnection()->describeTable($setup->getTable('customer_group')); + $customerGroupIdType = $customerGroupTable['customer_group_id']['DATA_TYPE'] == 'int' + ? \Magento\Framework\DB\Ddl\Table::TYPE_INTEGER : $customerGroupTable['customer_group_id']['DATA_TYPE']; /** * Create table 'catalog_product_bundle_option' */ @@ -340,7 +342,7 @@ class InstallSchema implements InstallSchemaInterface ) ->addColumn( 'customer_group_id', - \Magento\Framework\DB\Ddl\Table::TYPE_SMALLINT, + $customerGroupIdType, null, ['unsigned' => true, 'nullable' => false, 'primary' => true], 'Customer Group Id' diff --git a/app/code/Magento/Bundle/Setup/UpgradeSchema.php b/app/code/Magento/Bundle/Setup/UpgradeSchema.php old mode 100644 new mode 100755 index e48ad97922d..ced66a03a3a --- a/app/code/Magento/Bundle/Setup/UpgradeSchema.php +++ b/app/code/Magento/Bundle/Setup/UpgradeSchema.php @@ -44,6 +44,24 @@ class UpgradeSchema implements UpgradeSchemaInterface } } + if (version_compare($context->getVersion(), '2.0.3', '<')) { + $tables = [ + 'catalog_product_index_price_bundle_idx', + 'catalog_product_index_price_bundle_opt_idx', + 'catalog_product_index_price_bundle_opt_tmp', + 'catalog_product_index_price_bundle_sel_idx', + 'catalog_product_index_price_bundle_sel_tmp', + 'catalog_product_index_price_bundle_tmp', + ]; + foreach ($tables as $table) { + $setup->getConnection()->modifyColumn( + $setup->getTable($table), + 'customer_group_id', + ['type' => 'integer', 'nullable' => false] + ); + } + } + $setup->endSetup(); } } diff --git a/app/code/Magento/Bundle/etc/module.xml b/app/code/Magento/Bundle/etc/module.xml index 982a33d00bc..34a88d4447c 100644 --- a/app/code/Magento/Bundle/etc/module.xml +++ b/app/code/Magento/Bundle/etc/module.xml @@ -6,7 +6,7 @@ */ --> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd"> - <module name="Magento_Bundle" setup_version="2.0.2"> + <module name="Magento_Bundle" setup_version="2.0.3"> <sequence> <module name="Magento_Catalog"/> </sequence> diff --git a/app/code/Magento/Catalog/Setup/InstallSchema.php b/app/code/Magento/Catalog/Setup/InstallSchema.php index 2ccd8af79a5..171e96efe9b 100644 --- a/app/code/Magento/Catalog/Setup/InstallSchema.php +++ b/app/code/Magento/Catalog/Setup/InstallSchema.php @@ -1853,6 +1853,9 @@ class InstallSchema implements InstallSchemaInterface $installer->getConnection() ->createTable($table); + $customerGroupTable = $setup->getConnection()->describeTable($setup->getTable('customer_group')); + $customerGroupIdType = $customerGroupTable['customer_group_id']['DATA_TYPE'] == 'int' + ? \Magento\Framework\DB\Ddl\Table::TYPE_INTEGER : $customerGroupTable['customer_group_id']['DATA_TYPE']; /** * Create table 'catalog_product_entity_tier_price' */ @@ -1883,7 +1886,7 @@ class InstallSchema implements InstallSchemaInterface ) ->addColumn( 'customer_group_id', - \Magento\Framework\DB\Ddl\Table::TYPE_SMALLINT, + $customerGroupIdType, null, ['unsigned' => true, 'nullable' => false, 'default' => '0'], 'Customer Group ID' @@ -2937,7 +2940,7 @@ class InstallSchema implements InstallSchemaInterface ) ->addColumn( 'customer_group_id', - \Magento\Framework\DB\Ddl\Table::TYPE_SMALLINT, + $customerGroupIdType, null, ['unsigned' => true, 'nullable' => false, 'primary' => true], 'Customer Group ID' @@ -3056,7 +3059,7 @@ class InstallSchema implements InstallSchemaInterface ) ->addColumn( 'customer_group_id', - \Magento\Framework\DB\Ddl\Table::TYPE_SMALLINT, + $customerGroupIdType, null, ['unsigned' => true, 'nullable' => false, 'primary' => true], 'Customer Group ID' diff --git a/app/code/Magento/Catalog/Setup/UpgradeSchema.php b/app/code/Magento/Catalog/Setup/UpgradeSchema.php old mode 100644 new mode 100755 index 9683632f121..cbcce1d427b --- a/app/code/Magento/Catalog/Setup/UpgradeSchema.php +++ b/app/code/Magento/Catalog/Setup/UpgradeSchema.php @@ -36,6 +36,31 @@ class UpgradeSchema implements UpgradeSchemaInterface if (version_compare($context->getVersion(), '2.1.0', '<')) { $this->addPercentageValueColumn($setup); } + + if (version_compare($context->getVersion(), '2.1.1', '<')) { + $tables = [ + 'catalog_product_index_price_cfg_opt_agr_idx', + 'catalog_product_index_price_cfg_opt_agr_tmp', + 'catalog_product_index_price_cfg_opt_idx', + 'catalog_product_index_price_cfg_opt_tmp', + 'catalog_product_index_price_final_idx', + 'catalog_product_index_price_final_tmp', + 'catalog_product_index_price_idx', + 'catalog_product_index_price_opt_agr_idx', + 'catalog_product_index_price_opt_agr_tmp', + 'catalog_product_index_price_opt_idx', + 'catalog_product_index_price_opt_tmp', + 'catalog_product_index_price_tmp', + ]; + foreach ($tables as $table) { + $setup->getConnection()->modifyColumn( + $setup->getTable($table), + 'customer_group_id', + ['type' => 'integer', 'nullable' => false] + ); + } + } + $setup->endSetup(); } diff --git a/app/code/Magento/Catalog/etc/module.xml b/app/code/Magento/Catalog/etc/module.xml index 1250b55b968..c629bf6a180 100644 --- a/app/code/Magento/Catalog/etc/module.xml +++ b/app/code/Magento/Catalog/etc/module.xml @@ -6,7 +6,7 @@ */ --> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd"> - <module name="Magento_Catalog" setup_version="2.1.0"> + <module name="Magento_Catalog" setup_version="2.1.1"> <sequence> <module name="Magento_Eav"/> <module name="Magento_Cms"/> diff --git a/app/code/Magento/CatalogRule/Setup/InstallSchema.php b/app/code/Magento/CatalogRule/Setup/InstallSchema.php index 70c5724d446..cb36f6efbdc 100644 --- a/app/code/Magento/CatalogRule/Setup/InstallSchema.php +++ b/app/code/Magento/CatalogRule/Setup/InstallSchema.php @@ -25,6 +25,9 @@ class InstallSchema implements InstallSchemaInterface $installer->startSetup(); + $customerGroupTable = $setup->getConnection()->describeTable($setup->getTable('customer_group')); + $customerGroupIdType = $customerGroupTable['customer_group_id']['DATA_TYPE'] == 'int' + ? \Magento\Framework\DB\Ddl\Table::TYPE_INTEGER : $customerGroupTable['customer_group_id']['DATA_TYPE']; /** * Create table 'catalogrule' */ @@ -372,7 +375,7 @@ class InstallSchema implements InstallSchemaInterface ) ->addColumn( 'customer_group_id', - \Magento\Framework\DB\Ddl\Table::TYPE_SMALLINT, + $customerGroupIdType, null, ['unsigned' => true, 'nullable' => false, 'primary' => true, 'default' => '0'], 'Customer Group Id' @@ -477,7 +480,7 @@ class InstallSchema implements InstallSchemaInterface ) ->addColumn( 'customer_group_id', - \Magento\Framework\DB\Ddl\Table::TYPE_SMALLINT, + $customerGroupIdType, null, ['unsigned' => true, 'nullable' => false, 'primary' => true], 'Customer Group Id' diff --git a/app/code/Magento/CatalogRule/Setup/UpgradeSchema.php b/app/code/Magento/CatalogRule/Setup/UpgradeSchema.php index 1d576e74c4c..6bfb927c9c8 100644 --- a/app/code/Magento/CatalogRule/Setup/UpgradeSchema.php +++ b/app/code/Magento/CatalogRule/Setup/UpgradeSchema.php @@ -26,6 +26,20 @@ class UpgradeSchema implements UpgradeSchemaInterface $this->removeSubProductDiscounts($setup); } + if (version_compare($context->getVersion(), '2.0.2', '<')) { + $tables = [ + 'catalogrule_product', + 'catalogrule_product_price', + ]; + foreach ($tables as $table) { + $setup->getConnection()->modifyColumn( + $setup->getTable($table), + 'customer_group_id', + ['type' => 'integer'] + ); + } + } + $setup->endSetup(); } diff --git a/app/code/Magento/CatalogRule/etc/module.xml b/app/code/Magento/CatalogRule/etc/module.xml index ea6a730279e..d7db233e1eb 100644 --- a/app/code/Magento/CatalogRule/etc/module.xml +++ b/app/code/Magento/CatalogRule/etc/module.xml @@ -6,7 +6,7 @@ */ --> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd"> - <module name="Magento_CatalogRule" setup_version="2.0.1"> + <module name="Magento_CatalogRule" setup_version="2.0.2"> <sequence> <module name="Magento_Rule"/> <module name="Magento_Catalog"/> diff --git a/app/code/Magento/Customer/Block/Account/AuthorizationLink.php b/app/code/Magento/Customer/Block/Account/AuthorizationLink.php index f2e2f1d0bd7..9cb3f8fdd94 100644 --- a/app/code/Magento/Customer/Block/Account/AuthorizationLink.php +++ b/app/code/Magento/Customer/Block/Account/AuthorizationLink.php @@ -6,13 +6,14 @@ namespace Magento\Customer\Block\Account; use Magento\Customer\Model\Context; +use Magento\Customer\Block\Account\SortLinkInterface; /** * Customer authorization link * * @SuppressWarnings(PHPMD.DepthOfInheritance) */ -class AuthorizationLink extends \Magento\Framework\View\Element\Html\Link +class AuthorizationLink extends \Magento\Framework\View\Element\Html\Link implements SortLinkInterface { /** * Customer session @@ -88,4 +89,12 @@ class AuthorizationLink extends \Magento\Framework\View\Element\Html\Link { return $this->httpContext->getValue(Context::CONTEXT_AUTH); } + + /** + * {@inheritdoc} + */ + public function getSortOrder() + { + return $this->getData(self::SORT_ORDER); + } } diff --git a/app/code/Magento/Customer/Block/Account/Delimiter.php b/app/code/Magento/Customer/Block/Account/Delimiter.php new file mode 100644 index 00000000000..31ded827184 --- /dev/null +++ b/app/code/Magento/Customer/Block/Account/Delimiter.php @@ -0,0 +1,21 @@ +<?php +/** + * Copyright © 2016 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +namespace Magento\Customer\Block\Account; + +/** + * Class for delimiter. + */ +class Delimiter extends \Magento\Framework\View\Element\Template implements SortLinkInterface +{ + /** + * {@inheritdoc} + */ + public function getSortOrder() + { + return $this->getData(self::SORT_ORDER); + } +} diff --git a/app/code/Magento/Customer/Block/Account/Link.php b/app/code/Magento/Customer/Block/Account/Link.php index 59961971a0c..d37a9a548d4 100644 --- a/app/code/Magento/Customer/Block/Account/Link.php +++ b/app/code/Magento/Customer/Block/Account/Link.php @@ -5,12 +5,14 @@ */ namespace Magento\Customer\Block\Account; +use Magento\Customer\Block\Account\SortLinkInterface; + /** * Class Link * * @SuppressWarnings(PHPMD.DepthOfInheritance) */ -class Link extends \Magento\Framework\View\Element\Html\Link +class Link extends \Magento\Framework\View\Element\Html\Link implements SortLinkInterface { /** * @var \Magento\Customer\Model\Url @@ -38,4 +40,12 @@ class Link extends \Magento\Framework\View\Element\Html\Link { return $this->_customerUrl->getAccountUrl(); } + + /** + * {@inheritdoc} + */ + public function getSortOrder() + { + return $this->getData(self::SORT_ORDER); + } } diff --git a/app/code/Magento/Customer/Block/Account/Navigation.php b/app/code/Magento/Customer/Block/Account/Navigation.php new file mode 100644 index 00000000000..d8644f5565f --- /dev/null +++ b/app/code/Magento/Customer/Block/Account/Navigation.php @@ -0,0 +1,47 @@ +<?php +/** + * Copyright © 2016 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +namespace Magento\Customer\Block\Account; + +use \Magento\Framework\View\Element\Html\Links; +use \Magento\Customer\Block\Account\SortLinkInterface; + +/** + * Class for sorting links in navigation panels. + */ +class Navigation extends Links +{ + /** + * {@inheritdoc} + */ + public function getLinks() + { + $links = $this->_layout->getChildBlocks($this->getNameInLayout()); + $sortableLink = []; + foreach ($links as $key => $link) { + if ($link instanceof SortLinkInterface) { + $sortableLink[] = $link; + unset($links[$key]); + } + } + + usort($sortableLink, [$this, "compare"]); + return array_merge($sortableLink, $links); + } + + /** + * Compare sortOrder in links. + * + * @param SortLinkInterface $firstLink + * @param SortLinkInterface $secondLink + * @return int + * @SuppressWarnings(PHPMD.UnusedPrivateMethod) + */ + private function compare(SortLinkInterface $firstLink, SortLinkInterface $secondLink) + { + return ($firstLink->getSortOrder() < $secondLink->getSortOrder()); + } +} diff --git a/app/code/Magento/Customer/Block/Account/SortLink.php b/app/code/Magento/Customer/Block/Account/SortLink.php new file mode 100644 index 00000000000..2c60e804b7b --- /dev/null +++ b/app/code/Magento/Customer/Block/Account/SortLink.php @@ -0,0 +1,21 @@ +<?php +/** + * Copyright © 2016 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +namespace Magento\Customer\Block\Account; + +/** + * Class for sortable links. + */ +class SortLink extends \Magento\Framework\View\Element\Html\Link\Current implements SortLinkInterface +{ + /** + * {@inheritdoc} + */ + public function getSortOrder() + { + return $this->getData(self::SORT_ORDER); + } +} diff --git a/app/code/Magento/Customer/Block/Account/SortLinkInterface.php b/app/code/Magento/Customer/Block/Account/SortLinkInterface.php new file mode 100644 index 00000000000..815f4e5adf2 --- /dev/null +++ b/app/code/Magento/Customer/Block/Account/SortLinkInterface.php @@ -0,0 +1,27 @@ +<?php +/** + * Copyright © 2016 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +namespace Magento\Customer\Block\Account; + +/** + * Interface for sortable links. + * @api + */ +interface SortLinkInterface +{ + /**#@+ + * Constant for confirmation status + */ + const SORT_ORDER = 'sortOrder'; + /**#@-*/ + + /** + * Get sort order for block. + * + * @return int + */ + public function getSortOrder(); +} diff --git a/app/code/Magento/Customer/Model/ResourceModel/Group.php b/app/code/Magento/Customer/Model/ResourceModel/Group.php index 7496940fe33..5fb02997cd7 100644 --- a/app/code/Magento/Customer/Model/ResourceModel/Group.php +++ b/app/code/Magento/Customer/Model/ResourceModel/Group.php @@ -129,4 +129,65 @@ class Group extends \Magento\Framework\Model\ResourceModel\Db\VersionControl\Abs $group->setCode(substr($group->getCode(), 0, $group::GROUP_CODE_MAX_LENGTH)); return parent::_beforeSave($group); } + + /** + * {@inheritdoc} + */ + protected function _afterSave(\Magento\Framework\Model\AbstractModel $object) + { + if ($object->getId() == \Magento\Customer\Model\Group::CUST_GROUP_ALL) { + $this->skipReservedId($object); + } + + return $this; + } + + /** + * Here we do not allow to save systems reserved ID. + * + * @param \Magento\Framework\Model\AbstractModel $object + * @throws \Magento\Framework\Exception\LocalizedException + * @return void + */ + private function skipReservedId(\Magento\Framework\Model\AbstractModel $object) + { + $tableFieldsWithoutIdField = $this->getTableFieldsWithoutIdField(); + $select = $this->getConnection()->select(); + $select->from( + [$this->getMainTable()], + $tableFieldsWithoutIdField + ) + ->where('customer_group_id = ?', \Magento\Customer\Model\Group::CUST_GROUP_ALL); + + $query = $this->getConnection()->insertFromSelect( + $select, + $this->getMainTable(), + $tableFieldsWithoutIdField + ); + $this->getConnection()->query($query); + $lastInsertId = $this->getConnection()->lastInsertId(); + + $query = $this->getConnection()->deleteFromSelect( + $select, + $this->getMainTable() + ); + $this->getConnection()->query($query); + + $object->setId($lastInsertId); + } + + /** + * Get main table fields except of ID field. + * + * @return array + */ + private function getTableFieldsWithoutIdField() + { + $fields = $this->getConnection()->describeTable($this->getMainTable()); + if (isset($fields['customer_group_id'])) { + unset($fields['customer_group_id']); + } + + return array_keys($fields); + } } diff --git a/app/code/Magento/Customer/Setup/UpgradeSchema.php b/app/code/Magento/Customer/Setup/UpgradeSchema.php old mode 100644 new mode 100755 index 18fc9b9f8d5..33ec2352e86 --- a/app/code/Magento/Customer/Setup/UpgradeSchema.php +++ b/app/code/Magento/Customer/Setup/UpgradeSchema.php @@ -108,6 +108,96 @@ class UpgradeSchema implements UpgradeSchemaInterface ); } + if (version_compare($context->getVersion(), '2.0.10', '<')) { + $foreignKeys = $this->getForeignKeys($setup); + $this->dropForeignKeys($setup, $foreignKeys); + $this->alterTables($setup, $foreignKeys); + $this->createForeignKeys($setup, $foreignKeys); + } + $setup->endSetup(); } + + /** + * @param SchemaSetupInterface $setup + * @param array $keys + * @return void + */ + private function alterTables(SchemaSetupInterface $setup, array $keys) + { + $setup->getConnection()->modifyColumn( + $setup->getTable('customer_group'), + 'customer_group_id', + [ + 'type' => 'integer', + 'unsigned' => true, + 'identity' => true, + 'nullable' => false + ] + ); + foreach ($keys as $key) { + $setup->getConnection()->modifyColumn( + $key['TABLE_NAME'], + $key['COLUMN_NAME'], + [ + 'type' => 'integer', + 'unsigned' => true, + 'nullable' => false + ] + ); + } + } + + /** + * @param SchemaSetupInterface $setup + * @param array $keys + * @return void + */ + private function dropForeignKeys(SchemaSetupInterface $setup, array $keys) + { + foreach ($keys as $key) { + $setup->getConnection()->dropForeignKey($key['TABLE_NAME'], $key['FK_NAME']); + } + } + + /** + * @param SchemaSetupInterface $setup + * @param array $keys + * @return void + */ + private function createForeignKeys(SchemaSetupInterface $setup, array $keys) + { + foreach ($keys as $key) { + $setup->getConnection()->addForeignKey( + $key['FK_NAME'], + $key['TABLE_NAME'], + $key['COLUMN_NAME'], + $key['REF_TABLE_NAME'], + $key['REF_COLUMN_NAME'], + $key['ON_DELETE'] + ); + } + } + + /** + * @param SchemaSetupInterface $setup + * @return array + */ + private function getForeignKeys(SchemaSetupInterface $setup) + { + $foreignKeys = []; + $keysTree = $setup->getConnection()->getForeignKeysTree(); + foreach ($keysTree as $indexes) { + foreach ($indexes as $index) { + if ( + $index['REF_TABLE_NAME'] == $setup->getTable('customer_group') + && $index['REF_COLUMN_NAME'] == 'customer_group_id' + ) { + $foreignKeys[] = $index; + } + + } + } + return $foreignKeys; + } } diff --git a/app/code/Magento/Customer/Test/Unit/Model/ResourceModel/GroupTest.php b/app/code/Magento/Customer/Test/Unit/Model/ResourceModel/GroupTest.php index 6520556842a..8305114ad70 100644 --- a/app/code/Magento/Customer/Test/Unit/Model/ResourceModel/GroupTest.php +++ b/app/code/Magento/Customer/Test/Unit/Model/ResourceModel/GroupTest.php @@ -9,6 +9,7 @@ namespace Magento\Customer\Test\Unit\Model\ResourceModel; use Magento\Framework\TestFramework\Unit\Helper\ObjectManager as ObjectManagerHelper; +use Magento\Framework\Model\ResourceModel\Db\VersionControl\Snapshot; /** * @SuppressWarnings(PHPMD.CouplingBetweenObjects) @@ -36,6 +37,16 @@ class GroupTest extends \PHPUnit_Framework_TestCase /** @var \PHPUnit_Framework_MockObject_MockObject */ protected $relationProcessorMock; + /** + * @var Snapshot|\PHPUnit_Framework_MockObject_MockObject + */ + private $snapshotMock; + + /** + * Setting up dependencies. + * + * @return void + */ protected function setUp() { $this->resource = $this->getMock(\Magento\Framework\App\ResourceConnection::class, [], [], '', false); @@ -67,10 +78,18 @@ class GroupTest extends \PHPUnit_Framework_TestCase false ); + $this->snapshotMock = $this->getMock( + \Magento\Framework\Model\ResourceModel\Db\VersionControl\Snapshot::class, + [], + [], + '', + false + ); + $transactionManagerMock = $this->getMock( \Magento\Framework\Model\ResourceModel\Db\TransactionManagerInterface::class ); - $transactionManagerMock->expects($this->once()) + $transactionManagerMock->expects($this->any()) ->method('start') ->willReturn($this->getMock(\Magento\Framework\DB\Adapter\AdapterInterface::class)); $contextMock->expects($this->once()) @@ -86,10 +105,62 @@ class GroupTest extends \PHPUnit_Framework_TestCase 'context' => $contextMock, 'groupManagement' => $this->groupManagement, 'customersFactory' => $this->customersFactory, + 'entitySnapshot' => $this->snapshotMock ] ); } + /** + * Test for save() method when we try to save entity with system's reserved ID. + * + * @return void + */ + public function testSaveWithReservedId() + { + $expectedId = 55; + $this->snapshotMock->expects($this->once())->method('isModified')->willReturn(true); + $this->snapshotMock->expects($this->once())->method('registerSnapshot')->willReturnSelf(); + + $this->groupModel->expects($this->any())->method('getId') + ->willReturn(\Magento\Customer\Model\Group::CUST_GROUP_ALL); + $this->groupModel->expects($this->any())->method('getData') + ->willReturn([]); + $this->groupModel->expects($this->any())->method('isSaveAllowed') + ->willReturn(true); + $this->groupModel->expects($this->any())->method('getStoredData') + ->willReturn([]); + $this->groupModel->expects($this->once())->method('setId') + ->with($expectedId); + + $dbAdapter = $this->getMockBuilder(\Magento\Framework\DB\Adapter\AdapterInterface::class) + ->disableOriginalConstructor() + ->setMethods( + [ + 'lastInsertId', + 'describeTable', + 'update', + 'select' + ] + ) + ->getMockForAbstractClass(); + $dbAdapter->expects($this->any())->method('describeTable')->willReturn([]); + $dbAdapter->expects($this->any())->method('update')->willReturnSelf(); + $dbAdapter->expects($this->once())->method('lastInsertId')->willReturn($expectedId); + $selectMock = $this->getMockBuilder(\Magento\Framework\DB\Select::class) + ->disableOriginalConstructor() + ->getMock(); + $dbAdapter->expects($this->any())->method('select')->willReturn($selectMock); + $selectMock->expects($this->any())->method('from')->willReturnSelf(); + $this->resource->expects($this->any())->method('getConnection')->willReturn($dbAdapter); + + $this->groupResourceModel->save($this->groupModel); + } + + /** + * Test for delete() method when we try to save entity with system's reserved ID. + * + * @return void + */ public function testDelete() { $dbAdapter = $this->getMock(\Magento\Framework\DB\Adapter\AdapterInterface::class); diff --git a/app/code/Magento/Customer/etc/di.xml b/app/code/Magento/Customer/etc/di.xml index b45d00ad0cd..9113895f2e5 100644 --- a/app/code/Magento/Customer/etc/di.xml +++ b/app/code/Magento/Customer/etc/di.xml @@ -55,6 +55,8 @@ type="Magento\Customer\Model\Customer\Source\Group" /> <preference for="Magento\Customer\Model\Customer\Attribute\Source\GroupSourceLoggedInOnlyInterface" type="Magento\Customer\Model\Customer\Attribute\Source\Group"/> + <preference for="Magento\Customer\Block\Account\SortLinkInterface" + type="Magento\Customer\Block\Account\SortLink"/> <type name="Magento\Customer\Model\Session"> <arguments> <argument name="configShare" xsi:type="object">Magento\Customer\Model\Config\Share\Proxy</argument> diff --git a/app/code/Magento/Customer/etc/module.xml b/app/code/Magento/Customer/etc/module.xml index fd8307fc366..f505adb98a0 100644 --- a/app/code/Magento/Customer/etc/module.xml +++ b/app/code/Magento/Customer/etc/module.xml @@ -6,7 +6,7 @@ */ --> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd"> - <module name="Magento_Customer" setup_version="2.0.9"> + <module name="Magento_Customer" setup_version="2.0.10"> <sequence> <module name="Magento_Eav"/> <module name="Magento_Directory"/> diff --git a/app/code/Magento/Customer/view/frontend/layout/customer_account.xml b/app/code/Magento/Customer/view/frontend/layout/customer_account.xml index a96dfcd86e5..0f95cde6798 100644 --- a/app/code/Magento/Customer/view/frontend/layout/customer_account.xml +++ b/app/code/Magento/Customer/view/frontend/layout/customer_account.xml @@ -9,24 +9,45 @@ <body> <attribute name="class" value="account"/> <referenceContainer name="sidebar.main"> - <block class="Magento\Framework\View\Element\Html\Links" name="customer_account_navigation" before="-" template="Magento_Customer::account/navigation.phtml"> - <block class="Magento\Framework\View\Element\Html\Link\Current" name="customer-account-navigation-account-link"> + <block class="Magento\Framework\View\Element\Template" template="Magento_Theme::html/collapsible.phtml" before="-"> + <arguments> + <argument name="block_css" xsi:type="string">account-nav</argument> + </arguments> + <block class="Magento\Customer\Block\Account\Navigation" name="customer_account_navigation" before="-"> <arguments> - <argument name="label" xsi:type="string" translate="true">Account Dashboard</argument> - <argument name="path" xsi:type="string">customer/account</argument> - </arguments> - </block> - <block class="Magento\Framework\View\Element\Html\Link\Current" name="customer-account-navigation-account-edit-link"> - <arguments> - <argument name="label" xsi:type="string" translate="true">Account Information</argument> - <argument name="path" xsi:type="string">customer/account/edit</argument> - </arguments> - </block> - <block class="Magento\Framework\View\Element\Html\Link\Current" name="customer-account-navigation-address-link"> - <arguments> - <argument name="label" xsi:type="string" translate="true">Address Book</argument> - <argument name="path" xsi:type="string">customer/address</argument> + <argument name="css_class" xsi:type="string">nav items</argument> </arguments> + <block class="Magento\Customer\Block\Account\SortLinkInterface" name="customer-account-navigation-account-link"> + <arguments> + <argument name="label" xsi:type="string" translate="true">Account Dashboard</argument> + <argument name="path" xsi:type="string">customer/account</argument> + <argument name="sortOrder" xsi:type="number">250</argument> + </arguments> + </block> + <block class="Magento\Customer\Block\Account\Delimiter" name="customer-account-navigation-delimiter-1" template="Magento_Customer::account/navigation-delimiter.phtml"> + <arguments> + <argument name="sortOrder" xsi:type="number">200</argument> + </arguments> + </block> + <block class="Magento\Customer\Block\Account\SortLinkInterface" name="customer-account-navigation-address-link"> + <arguments> + <argument name="label" xsi:type="string" translate="true">Address Book</argument> + <argument name="path" xsi:type="string">customer/address</argument> + <argument name="sortOrder" xsi:type="number">190</argument> + </arguments> + </block> + <block class="Magento\Customer\Block\Account\SortLinkInterface" name="customer-account-navigation-account-edit-link"> + <arguments> + <argument name="label" xsi:type="string" translate="true">Account Information</argument> + <argument name="path" xsi:type="string">customer/account/edit</argument> + <argument name="sortOrder" xsi:type="number">180</argument> + </arguments> + </block> + <block class="Magento\Customer\Block\Account\Delimiter" name="customer-account-navigation-delimiter-2" template="Magento_Customer::account/navigation-delimiter.phtml"> + <arguments> + <argument name="sortOrder" xsi:type="number">130</argument> + </arguments> + </block> </block> </block> </referenceContainer> diff --git a/app/code/Magento/Customer/view/frontend/layout/default.xml b/app/code/Magento/Customer/view/frontend/layout/default.xml index 50580f73a9d..278c16b324d 100644 --- a/app/code/Magento/Customer/view/frontend/layout/default.xml +++ b/app/code/Magento/Customer/view/frontend/layout/default.xml @@ -11,6 +11,7 @@ <block class="Magento\Customer\Block\Account\Link" name="my-account-link"> <arguments> <argument name="label" xsi:type="string" translate="true">My Account</argument> + <argument name="sortOrder" xsi:type="number">110</argument> </arguments> </block> <block class="Magento\Customer\Block\Account\RegisterLink" name="register-link"> diff --git a/app/code/Magento/Customer/view/frontend/templates/account/navigation-delimiter.phtml b/app/code/Magento/Customer/view/frontend/templates/account/navigation-delimiter.phtml new file mode 100644 index 00000000000..bbc80e6686c --- /dev/null +++ b/app/code/Magento/Customer/view/frontend/templates/account/navigation-delimiter.phtml @@ -0,0 +1,9 @@ +<?php +/** + * Copyright © 2016 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +?> +<li class="nav item"> + <span class="delimiter"></span> +</li> diff --git a/app/code/Magento/Downloadable/Setup/UpgradeSchema.php b/app/code/Magento/Downloadable/Setup/UpgradeSchema.php new file mode 100755 index 00000000000..76ed3f2aae2 --- /dev/null +++ b/app/code/Magento/Downloadable/Setup/UpgradeSchema.php @@ -0,0 +1,41 @@ +<?php +/** + * Copyright © 2016 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +namespace Magento\Downloadable\Setup; + +use Magento\Framework\Setup\UpgradeSchemaInterface; +use Magento\Framework\Setup\ModuleContextInterface; +use Magento\Framework\Setup\SchemaSetupInterface; + +/** + * @codeCoverageIgnore + */ +class UpgradeSchema implements UpgradeSchemaInterface +{ + /** + * {@inheritdoc} + */ + public function upgrade(SchemaSetupInterface $setup, ModuleContextInterface $context) + { + $setup->startSetup(); + + if (version_compare($context->getVersion(), '2.0.2', '<')) { + $tables = [ + 'catalog_product_index_price_downlod_idx', + 'catalog_product_index_price_downlod_tmp', + ]; + foreach ($tables as $table) { + $setup->getConnection()->modifyColumn( + $setup->getTable($table), + 'customer_group_id', + ['type' => 'integer', 'nullable' => false] + ); + } + } + + $setup->endSetup(); + } +} diff --git a/app/code/Magento/Downloadable/etc/module.xml b/app/code/Magento/Downloadable/etc/module.xml index a2fa1d9d569..c6fd9c6a982 100644 --- a/app/code/Magento/Downloadable/etc/module.xml +++ b/app/code/Magento/Downloadable/etc/module.xml @@ -6,7 +6,7 @@ */ --> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd"> - <module name="Magento_Downloadable" setup_version="2.0.1"> + <module name="Magento_Downloadable" setup_version="2.0.2"> <sequence> <module name="Magento_Catalog"/> </sequence> diff --git a/app/code/Magento/Downloadable/view/frontend/layout/customer_account.xml b/app/code/Magento/Downloadable/view/frontend/layout/customer_account.xml index 8d4f13f2bfb..96bcb556edf 100644 --- a/app/code/Magento/Downloadable/view/frontend/layout/customer_account.xml +++ b/app/code/Magento/Downloadable/view/frontend/layout/customer_account.xml @@ -8,10 +8,11 @@ <page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd"> <body> <referenceBlock name="customer_account_navigation"> - <block class="Magento\Framework\View\Element\Html\Link\Current" name="customer-account-navigation-downloadable-products-link"> + <block class="Magento\Customer\Block\Account\SortLinkInterface" name="customer-account-navigation-downloadable-products-link"> <arguments> <argument name="path" xsi:type="string">downloadable/customer/products</argument> <argument name="label" xsi:type="string">My Downloadable Products</argument> + <argument name="sortOrder" xsi:type="number">220</argument> </arguments> </block> </referenceBlock> diff --git a/app/code/Magento/Newsletter/view/frontend/layout/customer_account.xml b/app/code/Magento/Newsletter/view/frontend/layout/customer_account.xml index 2daee81846c..f1b8340b1b8 100644 --- a/app/code/Magento/Newsletter/view/frontend/layout/customer_account.xml +++ b/app/code/Magento/Newsletter/view/frontend/layout/customer_account.xml @@ -8,10 +8,11 @@ <page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd"> <body> <referenceBlock name="customer_account_navigation"> - <block class="Magento\Framework\View\Element\Html\Link\Current" name="customer-account-navigation-newsletter-subscriptions-link"> + <block class="Magento\Customer\Block\Account\SortLinkInterface" name="customer-account-navigation-newsletter-subscriptions-link"> <arguments> <argument name="path" xsi:type="string">newsletter/manage</argument> <argument name="label" xsi:type="string" translate="true">Newsletter Subscriptions</argument> + <argument name="sortOrder" xsi:type="number">40</argument> </arguments> </block> </referenceBlock> diff --git a/app/code/Magento/Paypal/view/frontend/layout/customer_account.xml b/app/code/Magento/Paypal/view/frontend/layout/customer_account.xml index 5a355a2c399..27fa1511d09 100644 --- a/app/code/Magento/Paypal/view/frontend/layout/customer_account.xml +++ b/app/code/Magento/Paypal/view/frontend/layout/customer_account.xml @@ -11,10 +11,11 @@ </head> <body> <referenceBlock name="customer_account_navigation"> - <block class="Magento\Framework\View\Element\Html\Link\Current" name="customer-account-navigation-billing-agreements-link"> + <block class="Magento\Customer\Block\Account\SortLinkInterface" name="customer-account-navigation-billing-agreements-link"> <arguments> <argument name="path" xsi:type="string">paypal/billing_agreement</argument> <argument name="label" xsi:type="string" translate="true">Billing Agreements</argument> + <argument name="sortOrder" xsi:type="number">140</argument> </arguments> </block> </referenceBlock> diff --git a/app/code/Magento/Persistent/etc/persistent.xml b/app/code/Magento/Persistent/etc/persistent.xml index fb67e9d976a..b4b87cb8e76 100644 --- a/app/code/Magento/Persistent/etc/persistent.xml +++ b/app/code/Magento/Persistent/etc/persistent.xml @@ -18,7 +18,7 @@ <name_in_layout>top.links</name_in_layout> <class>Magento\Persistent\Model\Observer</class> <method>emulateTopLinks</method> - <block_type>Magento\Theme\Block\Template\Links</block_type> + <block_type>Magento\Customer\Block\Account\Navigation</block_type> </reference> </blocks> </instances> diff --git a/app/code/Magento/Review/view/frontend/layout/customer_account.xml b/app/code/Magento/Review/view/frontend/layout/customer_account.xml index 9de10e43fa4..5506a904ce0 100644 --- a/app/code/Magento/Review/view/frontend/layout/customer_account.xml +++ b/app/code/Magento/Review/view/frontend/layout/customer_account.xml @@ -8,10 +8,11 @@ <page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd"> <body> <referenceBlock name="customer_account_navigation"> - <block class="Magento\Framework\View\Element\Html\Link\Current" name="customer-account-navigation-product-reviews-link"> + <block class="Magento\Customer\Block\Account\SortLinkInterface" name="customer-account-navigation-product-reviews-link"> <arguments> <argument name="path" xsi:type="string">review/customer</argument> <argument name="label" xsi:type="string">My Product Reviews</argument> + <argument name="sortOrder" xsi:type="number">50</argument> </arguments> </block> </referenceBlock> diff --git a/app/code/Magento/Sales/Model/Order/Payment.php b/app/code/Magento/Sales/Model/Order/Payment.php index 5deb24a068d..a0f56d6ea9a 100644 --- a/app/code/Magento/Sales/Model/Order/Payment.php +++ b/app/code/Magento/Sales/Model/Order/Payment.php @@ -632,42 +632,48 @@ class Payment extends Info implements OrderPaymentInterface $this->transactionManager->generateTransactionId($this, Transaction::TYPE_REFUND) ); - // call refund from gateway if required $isOnline = false; $gateway = $this->getMethodInstance(); $invoice = null; - if ($gateway->canRefund() && $creditmemo->getDoTransaction()) { + if ($gateway->canRefund()) { $this->setCreditmemo($creditmemo); - $invoice = $creditmemo->getInvoice(); - if ($invoice) { - $isOnline = true; - $captureTxn = $this->transactionRepository->getByTransactionId( - $invoice->getTransactionId(), - $this->getId(), - $this->getOrder()->getId() - ); - if ($captureTxn) { - $this->setTransactionIdsForRefund($captureTxn); - } - $this->setShouldCloseParentTransaction(true); - // TODO: implement multiple refunds per capture - try { - $gateway->setStore( - $this->getOrder()->getStoreId() + if ($creditmemo->getDoTransaction()) { + $invoice = $creditmemo->getInvoice(); + if ($invoice) { + $isOnline = true; + $captureTxn = $this->transactionRepository->getByTransactionId( + $invoice->getTransactionId(), + $this->getId(), + $this->getOrder()->getId() ); - $this->setRefundTransactionId($invoice->getTransactionId()); - $gateway->refund($this, $baseAmountToRefund); - - $creditmemo->setTransactionId($this->getLastTransId()); - } catch (\Magento\Framework\Exception\LocalizedException $e) { - if (!$captureTxn) { - throw new \Magento\Framework\Exception\LocalizedException( - __('If the invoice was created offline, try creating an offline credit memo.'), - $e + if ($captureTxn) { + $this->setTransactionIdsForRefund($captureTxn); + } + $this->setShouldCloseParentTransaction(true); + // TODO: implement multiple refunds per capture + try { + $gateway->setStore( + $this->getOrder()->getStoreId() ); + $this->setRefundTransactionId($invoice->getTransactionId()); + $gateway->refund($this, $baseAmountToRefund); + + $creditmemo->setTransactionId($this->getLastTransId()); + } catch (\Magento\Framework\Exception\LocalizedException $e) { + if (!$captureTxn) { + throw new \Magento\Framework\Exception\LocalizedException( + __('If the invoice was created offline, try creating an offline credit memo.'), + $e + ); + } + throw $e; } - throw $e; } + } else if ($gateway->isOffline()) { + $gateway->setStore( + $this->getOrder()->getStoreId() + ); + $gateway->refund($this, $baseAmountToRefund); } } diff --git a/app/code/Magento/Sales/Setup/UpgradeSchema.php b/app/code/Magento/Sales/Setup/UpgradeSchema.php index b977cb28596..d35825242fb 100644 --- a/app/code/Magento/Sales/Setup/UpgradeSchema.php +++ b/app/code/Magento/Sales/Setup/UpgradeSchema.php @@ -69,6 +69,20 @@ class UpgradeSchema implements UpgradeSchemaInterface $this->addColumnBaseGrandTotal($installer); $this->addIndexBaseGrandTotal($installer); } + if (version_compare($context->getVersion(), '2.0.4', '<')) { + $tables = [ + 'sales_invoice_grid', + 'sales_order', + 'sales_shipment_grid', + ]; + foreach ($tables as $table) { + $setup->getConnection()->modifyColumn( + $setup->getTable($table), + 'customer_group_id', + ['type' => 'integer'] + ); + } + } } /** diff --git a/app/code/Magento/Sales/etc/module.xml b/app/code/Magento/Sales/etc/module.xml index 88d6e25d31f..980395e965e 100644 --- a/app/code/Magento/Sales/etc/module.xml +++ b/app/code/Magento/Sales/etc/module.xml @@ -6,7 +6,7 @@ */ --> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd"> - <module name="Magento_Sales" setup_version="2.0.3"> + <module name="Magento_Sales" setup_version="2.0.4"> <sequence> <module name="Magento_Rule"/> <module name="Magento_Catalog"/> diff --git a/app/code/Magento/Sales/view/frontend/layout/customer_account.xml b/app/code/Magento/Sales/view/frontend/layout/customer_account.xml index a3933b8b221..239a38c09f5 100644 --- a/app/code/Magento/Sales/view/frontend/layout/customer_account.xml +++ b/app/code/Magento/Sales/view/frontend/layout/customer_account.xml @@ -8,10 +8,11 @@ <page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd"> <body> <referenceBlock name="customer_account_navigation"> - <block class="Magento\Framework\View\Element\Html\Link\Current" name="customer-account-navigation-orders-link"> + <block class="Magento\Customer\Block\Account\SortLinkInterface" name="customer-account-navigation-orders-link"> <arguments> <argument name="path" xsi:type="string">sales/order/history</argument> <argument name="label" xsi:type="string" translate="true">My Orders</argument> + <argument name="sortOrder" xsi:type="number">230</argument> </arguments> </block> </referenceBlock> diff --git a/app/code/Magento/SalesRule/Setup/InstallSchema.php b/app/code/Magento/SalesRule/Setup/InstallSchema.php index 577d243cd6e..9adf43fc19c 100644 --- a/app/code/Magento/SalesRule/Setup/InstallSchema.php +++ b/app/code/Magento/SalesRule/Setup/InstallSchema.php @@ -23,7 +23,9 @@ class InstallSchema implements InstallSchemaInterface { $installer = $setup; $installer->startSetup(); - + $customerGroupTable = $setup->getConnection()->describeTable($setup->getTable('customer_group')); + $customerGroupIdType = $customerGroupTable['customer_group_id']['DATA_TYPE'] == 'int' + ? \Magento\Framework\DB\Ddl\Table::TYPE_INTEGER : $customerGroupTable['customer_group_id']['DATA_TYPE']; /** * Create table 'salesrule' */ @@ -441,7 +443,7 @@ class InstallSchema implements InstallSchemaInterface 'Website Id' )->addColumn( 'customer_group_id', - \Magento\Framework\DB\Ddl\Table::TYPE_SMALLINT, + $customerGroupIdType, null, ['unsigned' => true, 'nullable' => false, 'primary' => true], 'Customer Group Id' @@ -757,7 +759,7 @@ class InstallSchema implements InstallSchemaInterface 'Rule Id' )->addColumn( 'customer_group_id', - \Magento\Framework\DB\Ddl\Table::TYPE_SMALLINT, + $customerGroupIdType, null, ['unsigned' => true, 'nullable' => false, 'primary' => true], 'Customer Group Id' diff --git a/app/code/Magento/Theme/view/frontend/layout/default.xml b/app/code/Magento/Theme/view/frontend/layout/default.xml index a2e89afcce1..0f020db7501 100644 --- a/app/code/Magento/Theme/view/frontend/layout/default.xml +++ b/app/code/Magento/Theme/view/frontend/layout/default.xml @@ -40,7 +40,7 @@ </arguments> </block> <block class="Magento\Store\Block\Switcher" name="store_language" as="store_language" template="switch/languages.phtml"/> - <block class="Magento\Framework\View\Element\Html\Links" name="top.links"> + <block class="Magento\Customer\Block\Account\Navigation" name="top.links"> <arguments> <argument name="css_class" xsi:type="string">header links</argument> </arguments> diff --git a/app/code/Magento/Vault/view/frontend/layout/customer_account.xml b/app/code/Magento/Vault/view/frontend/layout/customer_account.xml index 2042721d9d3..01edaa1f093 100644 --- a/app/code/Magento/Vault/view/frontend/layout/customer_account.xml +++ b/app/code/Magento/Vault/view/frontend/layout/customer_account.xml @@ -8,10 +8,11 @@ <page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd"> <body> <referenceBlock name="customer_account_navigation"> - <block class="Magento\Framework\View\Element\Html\Link\Current" name="customer-account-navigation-my-credit-cards-link"> + <block class="Magento\Customer\Block\Account\SortLinkInterface" name="customer-account-navigation-my-credit-cards-link"> <arguments> <argument name="path" xsi:type="string">vault/cards/listaction</argument> <argument name="label" xsi:type="string" translate="true">Stored Payment Methods</argument> + <argument name="sortOrder" xsi:type="number">160</argument> </arguments> </block> </referenceBlock> diff --git a/app/code/Magento/Wishlist/Block/Link.php b/app/code/Magento/Wishlist/Block/Link.php index fea2ad5941c..51e59998339 100644 --- a/app/code/Magento/Wishlist/Block/Link.php +++ b/app/code/Magento/Wishlist/Block/Link.php @@ -9,12 +9,14 @@ */ namespace Magento\Wishlist\Block; +use Magento\Customer\Block\Account\SortLinkInterface; + /** * Class Link * * @SuppressWarnings(PHPMD.DepthOfInheritance) */ -class Link extends \Magento\Framework\View\Element\Html\Link +class Link extends \Magento\Framework\View\Element\Html\Link implements SortLinkInterface { /** * Template name @@ -68,4 +70,12 @@ class Link extends \Magento\Framework\View\Element\Html\Link { return __('My Wish List'); } + + /** + * {@inheritdoc} + */ + public function getSortOrder() + { + return $this->getData(self::SORT_ORDER); + } } diff --git a/app/code/Magento/Wishlist/view/frontend/layout/customer_account.xml b/app/code/Magento/Wishlist/view/frontend/layout/customer_account.xml index c1dc653efbe..9083fcdc8d1 100644 --- a/app/code/Magento/Wishlist/view/frontend/layout/customer_account.xml +++ b/app/code/Magento/Wishlist/view/frontend/layout/customer_account.xml @@ -8,10 +8,11 @@ <page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd"> <body> <referenceBlock name="customer_account_navigation"> - <block class="Magento\Framework\View\Element\Html\Link\Current" ifconfig="wishlist/general/active" name="customer-account-navigation-wish-list-link"> + <block class="Magento\Customer\Block\Account\SortLinkInterface" ifconfig="wishlist/general/active" name="customer-account-navigation-wish-list-link"> <arguments> <argument name="path" xsi:type="string">wishlist</argument> <argument name="label" xsi:type="string">My Wish List</argument> + <argument name="sortOrder" xsi:type="number">210</argument> </arguments> </block> </referenceBlock> diff --git a/app/code/Magento/Wishlist/view/frontend/layout/default.xml b/app/code/Magento/Wishlist/view/frontend/layout/default.xml index a0fc577547c..dffa4ec79d6 100644 --- a/app/code/Magento/Wishlist/view/frontend/layout/default.xml +++ b/app/code/Magento/Wishlist/view/frontend/layout/default.xml @@ -11,7 +11,11 @@ <block class="Magento\Framework\View\Element\Js\Components" name="wishlist_page_head_components" template="Magento_Wishlist::js/components.phtml"/> </referenceBlock> <referenceBlock name="top.links"> - <block class="Magento\Wishlist\Block\Link" name="wish-list-link" after="my-account-link"/> + <block class="Magento\Wishlist\Block\Link" name="wish-list-link" after="my-account-link"> + <arguments> + <argument name="sortOrder" xsi:type="number">60</argument> + </arguments> + </block> </referenceBlock> <referenceContainer name="sidebar.additional"> <block class="Magento\Wishlist\Block\Customer\Sidebar" name="wishlist_sidebar" as="wishlist" template="Magento_Wishlist::sidebar.phtml"/> diff --git a/app/design/frontend/Magento/blank/Magento_Customer/web/css/source/_module.less b/app/design/frontend/Magento/blank/Magento_Customer/web/css/source/_module.less index 369e100506c..2d54baf8f8e 100644 --- a/app/design/frontend/Magento/blank/Magento_Customer/web/css/source/_module.less +++ b/app/design/frontend/Magento/blank/Magento_Customer/web/css/source/_module.less @@ -15,6 +15,8 @@ @account-nav-current-color: false; @account-nav-current-font-weight: @font-weight__semibold; +@account-nav-delimiter__border-color: @color-gray82; + @account-nav-item-hover: @color-gray91; @_password-default: @color-gray-light01; @@ -219,6 +221,12 @@ .lib-css(border-color, @account-nav-current-border-color); } } + + .delimiter { + border-top: 1px solid @account-nav-delimiter__border-color; + display: block; + margin: @indent__s 1.8rem; + } } } diff --git a/app/design/frontend/Magento/luma/Magento_Customer/layout/customer_account.xml b/app/design/frontend/Magento/luma/Magento_Customer/layout/customer_account.xml index 5d02aec14be..be8aa1200f2 100644 --- a/app/design/frontend/Magento/luma/Magento_Customer/layout/customer_account.xml +++ b/app/design/frontend/Magento/luma/Magento_Customer/layout/customer_account.xml @@ -13,26 +13,41 @@ <argument name="block_title" translate="true" xsi:type="string">Account Dashboard</argument> <argument name="block_css" xsi:type="string">block-collapsible-nav</argument> </arguments> - <block class="Magento\Framework\View\Element\Html\Links" name="customer_account_navigation" before="-"> + <block class="Magento\Customer\Block\Account\Navigation" name="customer_account_navigation" before="-"> <arguments> <argument name="css_class" xsi:type="string">nav items</argument> </arguments> - <block class="Magento\Framework\View\Element\Html\Link\Current" name="customer-account-navigation-account-link"> + <block class="Magento\Customer\Block\Account\SortLinkInterface" name="customer-account-navigation-account-link"> <arguments> <argument name="label" xsi:type="string" translate="true">Account Dashboard</argument> <argument name="path" xsi:type="string">customer/account</argument> + <argument name="sortOrder" xsi:type="number">250</argument> </arguments> </block> - <block class="Magento\Framework\View\Element\Html\Link\Current" name="customer-account-navigation-account-edit-link"> + <block class="Magento\Customer\Block\Account\Delimiter" name="customer-account-navigation-delimiter-1" + template="Magento_Customer::account/navigation-delimiter.phtml"> <arguments> - <argument name="label" xsi:type="string" translate="true">Account Information</argument> - <argument name="path" xsi:type="string">customer/account/edit</argument> + <argument name="sortOrder" xsi:type="number">200</argument> </arguments> </block> - <block class="Magento\Framework\View\Element\Html\Link\Current" name="customer-account-navigation-address-link"> + <block class="Magento\Customer\Block\Account\SortLinkInterface" name="customer-account-navigation-address-link"> <arguments> <argument name="label" xsi:type="string" translate="true">Address Book</argument> <argument name="path" xsi:type="string">customer/address</argument> + <argument name="sortOrder" xsi:type="number">190</argument> + </arguments> + </block> + <block class="Magento\Customer\Block\Account\SortLinkInterface" name="customer-account-navigation-account-edit-link"> + <arguments> + <argument name="label" xsi:type="string" translate="true">Account Information</argument> + <argument name="path" xsi:type="string">customer/account/edit</argument> + <argument name="sortOrder" xsi:type="number">180</argument> + </arguments> + </block> + <block class="Magento\Customer\Block\Account\Delimiter" name="customer-account-navigation-delimiter-2" + template="Magento_Customer::account/navigation-delimiter.phtml"> + <arguments> + <argument name="sortOrder" xsi:type="number">130</argument> </arguments> </block> </block> diff --git a/app/design/frontend/Magento/luma/Magento_Customer/layout/default.xml b/app/design/frontend/Magento/luma/Magento_Customer/layout/default.xml index bd1fd91d6d3..2592f9def7f 100644 --- a/app/design/frontend/Magento/luma/Magento_Customer/layout/default.xml +++ b/app/design/frontend/Magento/luma/Magento_Customer/layout/default.xml @@ -9,7 +9,11 @@ <body> <referenceBlock name="header.links"> <block class="Magento\Customer\Block\Account\Customer" name="customer" template="account/customer.phtml" before="-"/> - <block class="Magento\Customer\Block\Account\AuthorizationLink" name="authorization-link-login" template="account/link/authorization.phtml"/> + <block class="Magento\Customer\Block\Account\AuthorizationLink" name="authorization-link-login" template="account/link/authorization.phtml"> + <arguments> + <argument name="sortOrder" xsi:type="number">10</argument> + </arguments> + </block> </referenceBlock> <block class="Magento\Theme\Block\Html\Header" name="header" as="header"> <arguments> diff --git a/app/design/frontend/Magento/luma/Magento_Theme/web/css/source/module/_collapsible_navigation.less b/app/design/frontend/Magento/luma/Magento_Theme/web/css/source/module/_collapsible_navigation.less index 95c7ec15ebb..33c0dacb8d9 100644 --- a/app/design/frontend/Magento/luma/Magento_Theme/web/css/source/module/_collapsible_navigation.less +++ b/app/design/frontend/Magento/luma/Magento_Theme/web/css/source/module/_collapsible_navigation.less @@ -13,6 +13,7 @@ @collapsible-nav-current-border-color: @color-orange-red1; @collapsible-nav-current-color: @color-black; @collapsible-nav-current-font-weight: @font-weight__semibold; +@collapsible-nav-delimiter__border-color: @color-gray82; @collapsible-nav-item-hover: @color-gray91; // @@ -64,6 +65,12 @@ .lib-css(border-color, @collapsible-nav-current-border-color); } } + + .delimiter { + border-top: 1px solid @collapsible-nav-delimiter__border-color; + display: block; + margin: @indent__s 1.8rem; + } } } } -- GitLab